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
61extern "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
72struct	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
79struct	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)
87struct	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 */
121typedef 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__)
159extern DIR		*opendir(const char *);
160extern struct direct    *readdir(DIR *);
161extern long		telldir(DIR *);
162extern void		seekdir(DIR *, long);
163extern int		scandir(char *, struct direct *(*[]),
164			    int (*)(struct direct *),
165			    int (*)(struct direct **, struct direct **));
166extern int		alphasort(struct direct **, struct direct **);
167extern void		rewinddir(DIR *);
168extern int		closedir(DIR *);
169#else
170extern	DIR *opendir();
171extern	struct direct *readdir();
172extern	long telldir();
173extern	void seekdir();
174extern	int scandir();
175extern	int alphasort();
176extern  void rewinddir();
177extern	void closedir();
178#endif
179
180#if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
181	    !defined(__PRAGMA_REDEFINE_EXTNAME))
182#if defined(__STDC__)
183extern struct direct64	*readdir64(DIR *);
184extern int		scandir64(char *, struct direct64 *(*[]),
185			    int (*)(struct direct64 *),
186			    int (*)(struct direct64 **, struct direct64 **));
187extern int		alphasort64(struct direct64 **, struct direct64 **);
188#else
189extern struct direct64	*readdir64();
190extern int		scandir64();
191extern 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