1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_DIRENT_H
#define _SYS_DIRENT_H
#include <sys/feature_tests.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* File-system independent directory entry.
*/
typedef struct dirent {
ino_t d_ino; /* "inode number" of entry */
off_t d_off; /* offset of disk directory entry */
unsigned short d_reclen; /* length of this record */
char d_name[1]; /* name of file */
} dirent_t;
#if defined(_SYSCALL32)
/* kernel's view of user ILP32 dirent */
typedef struct dirent32 {
ino32_t d_ino; /* "inode number" of entry */
off32_t d_off; /* offset of disk directory entry */
uint16_t d_reclen; /* length of this record */
char d_name[1]; /* name of file */
} dirent32_t;
#endif /* _SYSCALL32 */
#ifdef _LARGEFILE64_SOURCE
/*
* transitional large file interface version AND kernel internal version
*/
typedef struct dirent64 {
ino64_t d_ino; /* "inode number" of entry */
off64_t d_off; /* offset of disk directory entry */
unsigned short d_reclen; /* length of this record */
char d_name[1]; /* name of file */
} dirent64_t;
#endif /* _LARGEFILE64_SOURCE */
#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
#if defined(_KERNEL)
#define DIRENT64_RECLEN(namelen) \
((offsetof(dirent64_t, d_name[0]) + 1 + (namelen) + 7) & ~ 7)
#define DIRENT64_NAMELEN(reclen) \
((reclen) - (offsetof(dirent64_t, d_name[0])))
#define DIRENT32_RECLEN(namelen) \
((offsetof(dirent32_t, d_name[0]) + 1 + (namelen) + 3) & ~ 3)
#define DIRENT32_NAMELEN(reclen) \
((reclen) - (offsetof(dirent32_t, d_name[0])))
#endif
/*
* This is the maximum number of bytes that getdents(2) will store in
* user-supplied dirent buffers.
*/
#define MAXGETDENTS_SIZE (64 * 1024)
#if !defined(_KERNEL)
/*
* large file compilation environment setup
*
* In the LP64 compilation environment, map large file interfaces
* back to native versions where possible. (This only works because
* a 'struct dirent' == 'struct dirent64').
*/
#if !defined(_LP64) && _FILE_OFFSET_BITS == 64
#ifdef __PRAGMA_REDEFINE_EXTNAME
#pragma redefine_extname getdents getdents64
#else
#define getdents getdents64
#endif
#endif /* !_LP64 && _FILE_OFFSET_BITS == 64 */
#if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
#ifdef __PRAGMA_REDEFINE_EXTNAME
#pragma redefine_extname getdents64 getdents
#else
#define getdents64 getdents
#define dirent64 dirent
#define dirent64_t dirent_t
#endif
#endif /* _LP64 && _LARGEFILE64_SOURCE */
#if defined(__STDC__)
extern int getdents(int, struct dirent *, size_t);
#else
extern int getdents();
#endif
/* N.B.: transitional large file interface version deliberately not provided */
#endif /* !defined(_KERNEL) */
#endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_DIRENT_H */
|