]> git.ipfire.org Git - thirdparty/man-pages.git/blob - man2/getdents.2
getdents.2: The d_type field is fully supported on Btrfs
[thirdparty/man-pages.git] / man2 / getdents.2
1 .\" Copyright (C) 1995 Andries Brouwer (aeb@cwi.nl)
2 .\"
3 .\" Permission is granted to make and distribute verbatim copies of this
4 .\" manual provided the copyright notice and this permission notice are
5 .\" preserved on all copies.
6 .\"
7 .\" Permission is granted to copy and distribute modified versions of this
8 .\" manual under the conditions for verbatim copying, provided that the
9 .\" entire resulting derived work is distributed under the terms of a
10 .\" permission notice identical to this one.
11 .\"
12 .\" Since the Linux kernel and libraries are constantly changing, this
13 .\" manual page may be incorrect or out-of-date. The author(s) assume no
14 .\" responsibility for errors or omissions, or for damages resulting from
15 .\" the use of the information contained herein. The author(s) may not
16 .\" have taken the same level of care in the production of this manual,
17 .\" which is licensed free of charge, as they might when working
18 .\" professionally.
19 .\"
20 .\" Formatted or processed versions of this manual, if unaccompanied by
21 .\" the source, must acknowledge the copyright and authors of this work.
22 .\"
23 .\" Written 11 June 1995 by Andries Brouwer <aeb@cwi.nl>
24 .\" Modified 22 July 1995 by Michael Chastain <mec@duracef.shout.net>:
25 .\" Derived from 'readdir.2'.
26 .\" Modified Tue Oct 22 08:11:14 EDT 1996 by Eric S. Raymond <esr@thyrsus.com>
27 .TH GETDENTS 2 2009-07-04 "Linux" "Linux Programmer's Manual"
28 .SH NAME
29 getdents \- get directory entries
30 .SH SYNOPSIS
31 .nf
32 .BI "int getdents(unsigned int " fd ", struct linux_dirent *" dirp ,
33 .BI " unsigned int " count );
34 .fi
35 .SH DESCRIPTION
36 This is not the function you are interested in.
37 Look at
38 .BR readdir (3)
39 for the POSIX conforming C library interface.
40 This page documents the bare kernel system call interface.
41 .PP
42 The system call
43 .BR getdents ()
44 reads several
45 .I linux_dirent
46 structures from the directory
47 referred to by the open file descriptor
48 .I fd
49 into the buffer pointed to by
50 .IR dirp .
51 The argument
52 .I count
53 specifies the size of that buffer.
54 .PP
55 The
56 .I linux_dirent
57 structure is declared as follows:
58 .PP
59 .in +4n
60 .nf
61 struct linux_dirent {
62 unsigned long d_ino; /* Inode number */
63 unsigned long d_off; /* Offset to next \fIlinux_dirent\fP */
64 unsigned short d_reclen; /* Length of this \fIlinux_dirent\fP */
65 char d_name[]; /* Filename (null-terminated) */
66 /* length is actually (d_reclen \- 2 \-
67 offsetof(struct linux_dirent, d_name) */
68 /*
69 char pad; // Zero padding byte */
70 char d_type; // File type (only since Linux 2.6.4;
71 // offset is (d_reclen \- 1))
72 */
73
74 }
75 .fi
76 .in
77 .PP
78 .I d_ino
79 is an inode number.
80 .I d_off
81 is the distance from the start of the directory to the start of the next
82 .IR linux_dirent .
83 .I d_reclen
84 is the size of this entire
85 .IR linux_dirent .
86 .I d_name
87 is a null-terminated filename.
88
89 .I d_type
90 is a byte at the end of the structure that indicates the file type.
91 It contains one of the following values (defined in
92 .IR <dirent.h> ):
93 .TP 12
94 .B DT_BLK
95 This is a block device.
96 .TP
97 .B DT_CHR
98 This is a character device.
99 .TP
100 .B DT_DIR
101 This is a directory.
102 .TP
103 .B DT_FIFO
104 This is a named pipe (FIFO).
105 .TP
106 .B DT_LNK
107 This is a symbolic link.
108 .TP
109 .B DT_REG
110 This is a regular file.
111 .TP
112 .B DT_SOCK
113 This is a Unix domain socket.
114 .TP
115 .B DT_UNKNOWN
116 The file type is unknown.
117 .PP
118 The
119 .I d_type
120 field is implemented since Linux 2.6.4.
121 It occupies a space that was previously a zero-filled padding byte in the
122 .IR linux_dirent
123 structure.
124 Thus, on kernels before 2.6.3,
125 attempting to access this field always provides the value 0
126 .RB ( DT_UNKNOWN ).
127 .PP
128 Currently,
129 .\" kernel 2.6.27
130 .\" The same sentence is in readdir.2
131 only some file systems (among them: Btrfs, ext2, etx3, and ext4)
132 have full support for returning the file type in
133 .IR d_type .
134 All applications must properly handle a return of
135 .BR DT_UNKNOWN .
136 .SH "RETURN VALUE"
137 On success, the number of bytes read is returned.
138 On end of directory, 0 is returned.
139 On error, \-1 is returned, and
140 .I errno
141 is set appropriately.
142 .SH ERRORS
143 .TP
144 .B EBADF
145 Invalid file descriptor
146 .IR fd .
147 .TP
148 .B EFAULT
149 Argument points outside the calling process's address space.
150 .TP
151 .B EINVAL
152 Result buffer is too small.
153 .TP
154 .B ENOENT
155 No such directory.
156 .TP
157 .B ENOTDIR
158 File descriptor does not refer to a directory.
159 .SH "CONFORMING TO"
160 SVr4.
161 .\" SVr4 documents additional ENOLINK, EIO error conditions.
162 .SH NOTES
163 Glibc does not provide a wrapper for this system call; call it using
164 .BR syscall (2).
165 You will need to define the
166 .I linux_dirent
167 structure yourself.
168
169 This call supersedes
170 .BR readdir (2).
171 .SH EXAMPLE
172 The program below demonstrates the use of
173 .BR getdents ().
174 The following output shows an example of what we see when running this
175 program on an ext2 directory:
176
177 .in +4n
178 .nf
179 .RB "$" " ./a.out /testfs/"
180 --------------- nread=120 ---------------
181 i-node# file type d_reclen d_off d_name
182 2 directory 16 12 .
183 2 directory 16 24 ..
184 11 directory 24 44 lost+found
185 12 regular 16 56 a
186 228929 directory 16 68 sub
187 16353 directory 16 80 sub2
188 130817 directory 16 4096 sub3
189 .fi
190 .in
191 .SS Program source
192 \&
193 .nf
194 #define _GNU_SOURCE
195 #include <dirent.h> /* Defines DT_* constants */
196 #include <fcntl.h>
197 #include <stdio.h>
198 #include <unistd.h>
199 #include <stdlib.h>
200 #include <sys/stat.h>
201 #include <sys/syscall.h>
202
203 #define handle_error(msg) \\
204 do { perror(msg); exit(EXIT_FAILURE); } while (0)
205
206 struct linux_dirent {
207 long d_ino;
208 off_t d_off;
209 unsigned short d_reclen;
210 char d_name[];
211 };
212
213 #define BUF_SIZE 1024
214
215 int
216 main(int argc, char *argv[])
217 {
218 int fd, nread;
219 char buf[BUF_SIZE];
220 struct linux_dirent *d;
221 int bpos;
222 char d_type;
223
224 fd = open(argc > 1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY);
225 if (fd == \-1)
226 handle_error("open");
227
228 for ( ; ; ) {
229 nread = syscall(SYS_getdents, fd, buf, BUF_SIZE);
230 if (nread == \-1)
231 handle_error("getdents");
232
233 if (nread == 0)
234 break;
235
236 printf("\--------------- nread=%d ---------------\\n", nread);
237 printf("i\-node# file type d_reclen d_off d_name\\n");
238 for (bpos = 0; bpos < nread;) {
239 d = (struct linux_dirent *) (buf + bpos);
240 printf("%8ld ", d\->d_ino);
241 d_type = *(buf + bpos + d\->d_reclen - 1);
242 printf("%\-10s ", (d_type == DT_REG) ? "regular" :
243 (d_type == DT_DIR) ? "directory" :
244 (d_type == DT_FIFO) ? "FIFO" :
245 (d_type == DT_SOCK) ? "socket" :
246 (d_type == DT_LNK) ? "symlink" :
247 (d_type == DT_BLK) ? "block dev" :
248 (d_type == DT_CHR) ? "char dev" : "???");
249 printf("%4d %10lld %s\\n", d\->d_reclen,
250 (long long) d\->d_off, (char *) d->d_name);
251 bpos += d\->d_reclen;
252 }
253 }
254
255 exit(EXIT_SUCCESS);
256 }
257 .fi
258 .SH "SEE ALSO"
259 .BR readdir (2),
260 .BR readdir (3)