set	prototyped

lib	opendir
lib	stat64 -D_LARGEFILE64_SOURCE
typ	off64_t -D_LARGEFILE64_SOURCE
hdr	dirent,ndir
sys	dir

tst	botch_d_ino_dirent64 note{ dirent64.d_ino vs. readdir64 mismatch }end compile{
	#if !__arm__
	)
	#endif
	#define _LARGEFILE64_SOURCE	1
	#include <dirent.h>
	main()
	{
		struct dirent64	ent;
		char		aha[5-((int)sizeof(ent.d_ino))];
		return sizeof(aha);
	}
}end

exp	_inc_dirent !_lib_opendir yes{
	/*
	 * <dirent.h> for systems with no opendir()
	 */

	#ifndef _DIRENT_H
	#define _DIRENT_H

	typedef struct
	{
		int		dd_fd;		/* file descriptor		*/
	#ifdef _DIR_PRIVATE_
		_DIR_PRIVATE_
	#endif
	} DIR;

	struct dirent
	{
		long		d_fileno;	/* entry serial number		*/
		int		d_reclen;	/* entry length			*/
		int		d_namlen;	/* entry name length		*/
		char		d_name[1];	/* entry name			*/
	};

	#ifndef _DIR_PRIVATE_

	#ifdef	rewinddir
	#undef	rewinddir
	#define rewinddir(p)	seekdir(p,0L)
	#endif

	extern DIR*		opendir(const char*);
	extern void		closedir(DIR*);
	extern struct dirent*	readdir(DIR*);
	extern void		seekdir(DIR*, long);
	extern long		telldir(DIR*);

	#endif

	#endif
}end

exp	_inc_dirent !_inc_dirent&_lib_stat64&&_typ_off64_t&&_botch_d_ino_dirent64 yes{
	/*
	 * <dirent.h> for [fl]stat64 and off64_t with sizeof(ino64_t)==4
	 */

	#ifndef _DIR64_H
	#define _DIR64_H

	#include <ast_std.h>

	#if _typ_off64_t
	#undef	off_t
	#endif

	#undef	__ino64_t
	#define __ino64_t	_ast_int8_t

	#include <../include/dirent.h>

	#undef	__ino64_t
	#define __ino64_t	__ino64_t

	#if _typ_off64_t
	#define	off_t		off64_t
	#endif

	#if _lib_readdir64 && _typ_struct_dirent64
	#ifndef	dirent
	#define dirent		dirent64
	#endif
	#ifndef	readdir
	#define readdir		readdir64
	#endif
	#endif

	#endif
}end

exp	_inc_dirent !_inc_dirent&_lib_stat64&&_typ_off64_t yes{
	/*
	 * <dirent.h> for [fl]stat64 and off64_t
	 */

	#ifndef _DIR64_H
	#define _DIR64_H

	#include <ast_std.h>

	#if _typ_off64_t
	#undef	off_t
	#endif

	#include <../include/dirent.h>

	#if _typ_off64_t
	#define	off_t		off64_t
	#endif

	#if _lib_readdir64 && _typ_struct_dirent64
	#ifndef	dirent
	#define dirent		dirent64
	#endif
	#ifndef	readdir
	#define readdir		readdir64
	#endif
	#endif

	#endif
}end

exp	_inc_dirent !_inc_dirent&_hdr_dirent yes{
	/*
	 * <dirent.h> for systems with ok <dirent.h>
	 */

	#ifndef _DIRENT_H

	#include <../include/dirent.h>

	#ifndef _DIRENT_H
	#define _DIRENT_H
	#endif

	#endif
}end

exp	_inc_dirent !_inc_dirent&_hdr_ndir yes{
	/*
	 * <dirent.h> for systems with opendir() and <ndir.h>
	 */

	#ifndef _DIRENT_H
	#define _DIRENT_H

	#if defined(__STDPP__directive) && defined(__STDPP__hide)
	__STDPP__directive pragma pp:hide closedir opendir readdir seekdir telldir
	#else
	#define closedir	______closedir
	#define opendir		______opendir
	#define readdir		______readdir
	#define seekdir		______seekdir
	#define telldir		______telldir
	#endif

	#include <ndir.h>

	#if defined(__STDPP__directive) && defined(__STDPP__hide)
	__STDPP__directive pragma pp:nohide closedir opendir readdir seekdir telldir
	#else
	#undef	closedir
	#undef	opendir
	#undef	readdir
	#undef	seekdir
	#undef	telldir
	#endif

	#ifndef dirent
	#define dirent	direct
	#endif

	#if !defined(d_fileno) && !defined(d_ino)
	#define d_fileno	d_ino
	#endif

	#ifdef	rewinddir
	#undef	rewinddir
	#define rewinddir(p)	seekdir(p,0L)
	#endif

	extern DIR*		opendir(const char*);
	extern void		closedir(DIR*);
	extern struct dirent*	readdir(DIR*);
	extern void		seekdir(DIR*, long);
	extern long		telldir(DIR*);

	#endif
}end

exp	_inc_dirent !_inc_dirent&_sys_dir yes{
	/*
	 * <dirent.h> for systems with opendir() and no <ndir.h>
	 */

	#ifndef _DIRENT_H
	#define _DIRENT_H

	#if defined(__STDPP__directive) && defined(__STDPP__hide)
	__STDPP__directive pragma pp:hide closedir opendir readdir seekdir telldir
	#else
	#define closedir	______closedir
	#define opendir		______opendir
	#define readdir		______readdir
	#define seekdir		______seekdir
	#define telldir		______telldir
	#endif

	#include <sys/dir.h>

	#if defined(__STDPP__directive) && defined(__STDPP__hide)
	__STDPP__directive pragma pp:nohide closedir opendir readdir seekdir telldir
	#else
	#undef	closedir
	#undef	opendir
	#undef	readdir
	#undef	seekdir
	#undef	telldir
	#endif

	#ifndef dirent
	#define dirent	direct
	#endif

	#if !defined(d_fileno) && !defined(d_ino)
	#define d_fileno	d_ino
	#endif

	#ifdef	rewinddir
	#undef	rewinddir
	#define rewinddir(p)	seekdir(p,0L)
	#endif

	extern DIR*		opendir(const char*);
	extern void		closedir(DIR*);
	extern struct dirent*	readdir(DIR*);
	extern void		seekdir(DIR*, long);
	extern long		telldir(DIR*);

	#endif
}end
