1 /* @(#)dirent.h	1.29 11/08/04 Copyright 1987, 1998, 2000-2011 J. Schilling */
2 /*
3  *	Copyright (c) 1987, 1998, 2000-2011 J. Schilling
4  */
5 /*
6  * The contents of this file are subject to the terms of the
7  * Common Development and Distribution License, Version 1.0 only
8  * (the "License").  You may not use this file except in compliance
9  * with the License.
10  *
11  * See the file CDDL.Schily.txt in this distribution for details.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file CDDL.Schily.txt from this distribution.
15  */
16 
17 #ifndef	_SCHILY_DIRENT_H
18 #define	_SCHILY_DIRENT_H
19 
20 #ifndef _SCHILY_MCONFIG_H
21 #include <schily/mconfig.h>
22 #endif
23 
24 #ifdef	__cplusplus
25 extern "C" {
26 #endif
27 
28 #ifdef JOS
29 #	ifdef	HAVE_SYS_STYPES_H
30 #		ifndef	_INCL_SYS_STYPES_H
31 #		include <sys/stypes.h>
32 #		define	_INCL_SYS_STYPES_H
33 #		endif
34 #	endif
35 #	ifdef	HAVE_SYS_FILEDESC_H
36 #		ifndef	_INCL_SYS_FILEDESC_H
37 #		include <sys/filedesc.h>
38 #		define	_INCL_SYS_FILEDESC_H
39 #		endif
40 #	endif
41 #	define	NEED_READDIR
42 #	define 	dirent			_direct
43 #	define	DIR_NAMELEN(dirent)	strlen((dirent)->d_name)
44 #	define	DIRSIZE	30
45 #	define	FOUND_DIRSIZE
46 	typedef struct _dirent {
47 		char	name[DIRSIZE];
48 		short	ino;
49 	} dirent;
50 
51 #else	/* !JOS */
52 
53 #	ifndef	_SCHILY_TYPES_H
54 #		include <schily/types.h>
55 #	endif
56 #	ifndef	_SCHILY_STAT_H
57 #		include <schily/stat.h>
58 #	endif
59 #	ifndef	_SCHILY_LIMITS_H
60 #		include	<schily/limits.h>
61 #	endif
62 #	ifndef	_SCHILY_PARAM_H
63 #		include <schily/param.h>
64 #	endif
65 #	ifndef	_SCHILY_STDLIB_H
66 #	include <schily/stdlib.h>	/* MSVC: get _MAX_DIR */
67 #	endif
68 
69 #	ifdef	HAVE_DIRENT_H		/* This a POSIX compliant system */
70 #		ifndef	_INCL_DIRENT_H
71 #		include <dirent.h>
72 #		define	_INCL_DIRENT_H
73 #		endif
74 #		define	DIR_NAMELEN(dirent)	strlen((dirent)->d_name)
75 #		define	_FOUND_DIR_
76 #	else				/* This is a Pre POSIX system	 */
77 
78 #	define 	dirent	direct
79 #	define	DIR_NAMELEN(dirent)	(dirent)->d_namlen
80 
81 #	if	defined(HAVE_SYS_DIR_H)
82 #		ifndef	_INCL_SYS_DIR_H
83 #		include <sys/dir.h>
84 #		define	_INCL_SYS_DIR_H
85 #		endif
86 #		define	_FOUND_DIR_
87 #	endif
88 
89 #	if	defined(HAVE_NDIR_H) && !defined(_FOUND_DIR_)
90 #		ifndef	_INCL_NDIR_H
91 #		include <ndir.h>
92 #		define	_INCL_NDIR_H
93 #		endif
94 #		define	_FOUND_DIR_
95 #	endif
96 
97 #	if	defined(HAVE_SYS_NDIR_H) && !defined(_FOUND_DIR_)
98 #		ifndef	_INCL_SYS_NDIR_H
99 #		include <sys/ndir.h>
100 #		define	_INCL_SYS_NDIR_H
101 #		endif
102 #		define	_FOUND_DIR_
103 #	endif
104 #	endif	/* HAVE_DIRENT_H */
105 
106 #	if	defined(_FOUND_DIR_)
107 /*
108  * Don't use defaults here to allow recognition of problems.
109  */
110 #	if !defined(FOUND_DIRSIZE) && defined(MAXNAMELEN)
111 #		define	DIRSIZE		MAXNAMELEN	/* From sys/param.h */
112 #		define	FOUND_DIRSIZE
113 #	endif
114 
115 #	if !defined(FOUND_DIRSIZE) && defined(MAXNAMLEN)
116 #		define	DIRSIZE		MAXNAMLEN	/* From dirent.h    */
117 #		define	FOUND_DIRSIZE
118 #	endif
119 
120 #	ifdef	__never__
121 	/*
122 	 * DIRSIZ(dp) is a parameterized macro, we cannot use it here.
123 	 */
124 #	if !defined(FOUND_DIRSIZE) && defined(DIRSIZ)
125 #		define	DIRSIZE		DIRSIZ		/* From sys/dir.h   */
126 #		define	FOUND_DIRSIZE
127 #	endif
128 #	endif	/* __never__ */
129 
130 #	if !defined(FOUND_DIRSIZE) && defined(NAME_MAX)
131 #		define	DIRSIZE		NAME_MAX	/* From limits.h    */
132 #		define	FOUND_DIRSIZE
133 #	endif
134 
135 #	else	/* !_FOUND_DIR_ */
136 
137 #	if !defined(FOUND_DIRSIZE) && defined(_MAX_DIR)
138 #	if	defined(__MINGW32__) || defined(_MSC_VER)
139 #		define	DIRSIZE		_MAX_DIR	/* From stdlib.h    */
140 #		define	FOUND_DIRSIZE
141 #		define	NEED_READDIR
142 #		undef	dirent
143 #		define 	dirent			_direct
144 #		undef	DIR_NAMELEN
145 #		define	DIR_NAMELEN(dirent)	strlen((dirent)->d_name)
146 #	endif
147 #	endif
148 
149 #		ifndef	NEED_READDIR
150 #		define	NEED_DIRENT
151 #		define	NEED_READDIR
152 #		undef	dirent
153 #		define 	dirent			_direct
154 #		undef	DIR_NAMELEN
155 #		define	DIR_NAMELEN(dirent)	strlen((dirent)->d_name)
156 #		endif	/* !NEED_READDIR */
157 
158 #	endif	/* _FOUND_DIR_ */
159 
160 
161 #ifdef	NEED_DIRENT
162 
163 #ifndef	FOUND_DIRSIZE
164 #define	DIRSIZE		14	/* The old UNIX standard value */
165 #define	FOUND_DIRSIZE
166 #endif
167 
168 typedef struct _dirent {
169 	short	ino;
170 	char	name[DIRSIZE];
171 } dirent;
172 
173 #endif	/* NEED_DIRENT */
174 
175 #endif	/* !JOS */
176 
177 #ifdef	NEED_READDIR
178 
179 #ifndef _SCHILY_STDIO_H
180 #include <schily/stdio.h>
181 #endif
182 #if	defined(__MINGW32__) || defined(_MSC_VER)
183 #ifndef	_SCHILY_IO_H
184 #include <schily/io.h>		/* for _findfirst() */
185 #endif
186 #ifndef _SCHILY_UTYPES_H
187 #include <schily/utypes.h>
188 #endif
189 #endif
190 
191 	struct _direct {
192 		unsigned long	d_ino;
193 		unsigned short	d_reclen;
194 		unsigned short	d_namlen;
195 		char		d_name[DIRSIZE +1];
196 	};
197 #define	HAVE_DIRENT_D_INO
198 
199 	typedef struct __dirdesc {
200 		FILE		*dd_fd;
201 
202 #if	defined(__MINGW32__) || defined(_MSC_VER)
203 		struct _direct	dd_dir;		/* dirent for this dir	*/
204 		struct _finddata_t dd_data;	/* _findnext() results	*/
205 		intptr_t	dd_handle;	/* _findnext() handle	*/
206 		int		dd_state;	/* Current Dir state	*/
207 		char		dd_dirname[1];	/* Dir to open		*/
208 #endif
209 	} DIR;
210 
211 extern	DIR		*opendir __PR((const char *));
212 extern	int		closedir __PR((DIR *));
213 extern	struct dirent	*readdir __PR((DIR *));
214 
215 #endif	/* NEED_READDIR */
216 
217 #if	!defined(HAVE_DIRFD) && defined(HAVE_DIR_DD_FD)
218 #	define	dirfd(dirp)	((dirp)->dd_fd)
219 #endif
220 
221 #ifdef	__cplusplus
222 }
223 #endif
224 
225 #endif	/* _SCHILY_DIRENT_H */
226