xref: /illumos-gate/usr/src/ucbhead/sys/dir.h (revision 440a8a36792bdf9ef51639066aab0b7771ffcab8)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved	*/
29 
30 /*
31  * University Copyright- Copyright (c) 1982, 1986, 1988
32  * The Regents of the University of California
33  * All Rights Reserved
34  *
35  * University Acknowledgment- Portions of this document are derived from
36  * software developed by the University of California, Berkeley, and its
37  * contributors.
38  */
39 
40 #ifndef _SYS_DIR_H
41 #define	_SYS_DIR_H
42 
43 #pragma ident	"%Z%%M%	%I%	%E% SMI"
44 
45 #include <sys/isa_defs.h>
46 #include <sys/int_types.h>
47 
48 /*
49  * This header file provides BSD compatibility for DIR and direct structures.
50  * The fields in the BSD DIR structure are identical to to the SVR4 DIR
51  * structure, except for the fact that the dd_buf field in SVR4 is not
52  * statically allocated.
53  * The BSD direct structure is similar (not identical) to the dirent
54  * structure. All fields of the direct structure can be obtained using
55  * the information provided by dirent.
56  * All routines manipulating DIR structures are compatible, only readdir
57  * is not. The BSD version of this routine returns a direct structure.
58  */
59 
60 #ifdef __cplusplus
61 extern "C" {
62 #endif
63 
64 #if !defined(KERNEL) && !defined(DEV_BSIZE)
65 #define	DEV_BSIZE	512
66 #endif
67 #define	DIRBUF		8192
68 #define	DIRBLKSIZ	DIRBUF
69 #define	MAXNAMLEN	255
70 
71 #if _FILE_OFFSET_BITS == 32
72 struct	direct {
73 	ulong_t	d_ino;			/* inode number of entry */
74 	ushort_t d_reclen;		/* length of this record */
75 	ushort_t d_namlen;		/* length of string in d_name */
76 	char	d_name[MAXNAMLEN+1];	/* name of entry */
77 };
78 #elif _FILE_OFFSET_BITS == 64
79 struct	direct {
80 	ino_t	d_ino;			/* inode number of entry */
81 	ushort_t d_reclen;		/* length of this record */
82 	ushort_t d_namlen;		/* length of string in d_name */
83 	char	d_name[MAXNAMLEN+1];	/* name of entry */
84 };
85 #endif
86 #if	defined(_LARGEFILE64_SOURCE)
87 struct	direct64 {
88 	ino64_t	d_ino;			/* inode number of entry */
89 	ushort_t d_reclen;		/* length of this record */
90 	ushort_t d_namlen;		/* length of string in d_name */
91 	char	d_name[MAXNAMLEN+1];	/* name of entry */
92 };
93 #endif
94 
95 /*
96  * The macro DIRSIZ(dp) gives an amount of space required to represent
97  * a directory entry.
98  */
99 #undef DIRSIZ
100 #undef DIRSIZ64
101 
102 #if _FILE_OFFSET_BITS == 32
103 #define	DIRSIZ(dp)  \
104 	((sizeof (struct direct) - sizeof ((dp)->d_name) + \
105 	(strlen((dp)->d_name)+1) + 3) & ~3)
106 #elif _FILE_OFFSET_BITS == 64
107 #define	DIRSIZ(dp)  \
108 	((sizeof (struct direct64) - sizeof ((dp)->d_name) + \
109 	(strlen((dp)->d_name)+1) + 3) & ~3)
110 #endif
111 #if	defined(_LARGEFILE64_SOURCE)
112 #define	DIRSIZ64(dp)  \
113 	((sizeof (struct direct64) - sizeof ((dp)->d_name) + \
114 	(strlen((dp)->d_name)+1) + 3) & ~3)
115 #endif
116 
117 #ifndef KERNEL
118 /*
119  * Definitions for library routines operating on directories.
120  */
121 typedef struct _dirdesc {
122 	int	dd_fd;
123 	int	dd_loc;
124 	int	dd_size;
125 	char	*dd_buf;
126 } DIR;
127 
128 #ifndef NULL
129 #define	NULL 0
130 #endif
131 
132 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
133 #ifdef __PRAGMA_REDEFINE_EXTNAME
134 #pragma redefine_extname	readdir64		readdir
135 #pragma redefine_extname	scandir64		scandir
136 #pragma redefine_extname	alphasort64	alphasort
137 #else
138 #define	readdir64			readdir
139 #define	scandir64			scandir
140 #define	alphasort64		alphasort
141 #define	direct64		direct
142 #endif
143 #endif
144 
145 #if !defined(_LP64) && (_FILE_OFFSET_BITS == 64)
146 #ifdef __PRAGMA_REDEFINE_EXTNAME
147 #pragma redefine_extname	readdir		readdir64
148 #pragma redefine_extname	scandir		scandir64
149 #pragma redefine_extname	alphasort	alphasort64
150 #else
151 #define	readdir			readdir64
152 #define	scandir			scandir64
153 #define	alphasort		alphasort64
154 #define	direct			direct64
155 #endif
156 #endif
157 
158 #if defined(__STDC__)
159 extern DIR		*opendir(const char *);
160 extern struct direct    *readdir(DIR *);
161 extern long		telldir(DIR *);
162 extern void		seekdir(DIR *, long);
163 extern int		scandir(char *, struct direct *(*[]),
164 			    int (*)(struct direct *),
165 			    int (*)(struct direct **, struct direct **));
166 extern int		alphasort(struct direct **, struct direct **);
167 extern void		rewinddir(DIR *);
168 extern int		closedir(DIR *);
169 #else
170 extern	DIR *opendir();
171 extern	struct direct *readdir();
172 extern	long telldir();
173 extern	void seekdir();
174 extern	int scandir();
175 extern	int alphasort();
176 extern  void rewinddir();
177 extern	void closedir();
178 #endif
179 
180 #if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
181 	    !defined(__PRAGMA_REDEFINE_EXTNAME))
182 #if defined(__STDC__)
183 extern struct direct64	*readdir64(DIR *);
184 extern int		scandir64(char *, struct direct64 *(*[]),
185 			    int (*)(struct direct64 *),
186 			    int (*)(struct direct64 **, struct direct64 **));
187 extern int		alphasort64(struct direct64 **, struct direct64 **);
188 #else
189 extern struct direct64	*readdir64();
190 extern int		scandir64();
191 extern int		alphasort64();
192 #endif
193 #endif	/* _LARGEFILE64_SOURCE... */
194 
195 #define	rewinddir(dirp)	seekdir((dirp), 0)
196 
197 #endif
198 
199 #ifdef __cplusplus
200 }
201 #endif
202 
203 #endif	/* _SYS_DIR_H */
204