.\" Derived from 'readdir.2'.
.\" Modified Tue Oct 22 08:11:14 EDT 1996 by Eric S. Raymond <esr@thyrsus.com>
.\"
-.TH GETDENTS 2 2012-08-03 "Linux" "Linux Programmer's Manual"
+.TH GETDENTS 2 2019-03-06 "Linux" "Linux Programmer's Manual"
.SH NAME
getdents, getdents64 \- get directory entries
.SH SYNOPSIS
.BI "int getdents64(unsigned int " fd ", struct linux_dirent64 *" dirp ,
.BI " unsigned int " count );
.fi
-
+.PP
.IR Note :
-There are no glibc wrappers for these system calls; see NOTES.
+There is no glibc wrapper for
+.BR getdents ();
+see NOTES.
.SH DESCRIPTION
These are not the interfaces you are interested in.
Look at
structure is declared as follows:
.PP
.in +4n
-.nf
+.EX
struct linux_dirent {
unsigned long d_ino; /* Inode number */
unsigned long d_off; /* Offset to next \fIlinux_dirent\fP */
// 2.6.4); offset is (d_reclen \- 1)
*/
}
-.fi
+.EE
.in
.PP
.I d_ino
.IR linux_dirent .
.I d_name
is a null-terminated filename.
-
+.PP
.I d_type
is a byte at the end of the structure that indicates the file type.
It contains one of the following values (defined in
supports an explicit
.I d_type
field.
-
+.PP
The
.BR getdents64 ()
system call is like
.BR getdents (),
except that its second argument is a pointer to a buffer containing
structures of the following type:
-
-.nf
+.PP
+.EX
.in +4n
struct linux_dirent64 {
ino64_t d_ino; /* 64-bit inode number */
unsigned char d_type; /* File type */
char d_name[]; /* Filename (null-terminated) */
};
+.EE
.in
-.fi
.SH RETURN VALUE
On success, the number of bytes read is returned.
On end of directory, 0 is returned.
SVr4.
.\" SVr4 documents additional ENOLINK, EIO error conditions.
.SH NOTES
-Glibc does not provide a wrapper for these system calls; call them using
+Library support for
+.BR getdents64 ()
+was added in glibc 2.30;
+there is no glibc wrapper for
+.BR getdents ().
+Calling
+.BR getdents ()
+(or
+.BR getdents64 ()
+on earlier glibc versions) requires the use of
.BR syscall (2).
-You will need to define the
+In that case you will need to define the
.I linux_dirent
or
.I linux_dirent64
structure yourself.
-However, you probably want to use
+.PP
+Probably, you probably want to use
.BR readdir (3)
-instead.
-
+instead of these system calls.
+.PP
These calls supersede
.BR readdir (2).
.SH EXAMPLE
.BR getdents ().
The following output shows an example of what we see when running this
program on an ext2 directory:
-
+.PP
.in +4n
-.nf
+.EX
.RB "$" " ./a.out /testfs/"
--------------- nread=120 ---------------
inode# file type d_reclen d_off d_name
228929 directory 16 68 sub
16353 directory 16 80 sub2
130817 directory 16 4096 sub3
-.fi
+.EE
.in
.SS Program source
\&
-.nf
+.EX
#define _GNU_SOURCE
#include <dirent.h> /* Defines DT_* constants */
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/syscall.h>
-#define handle_error(msg) \\
+#define handle_error(msg) \e
do { perror(msg); exit(EXIT_FAILURE); } while (0)
struct linux_dirent {
- long d_ino;
+ unsigned long d_ino;
off_t d_off;
unsigned short d_reclen;
char d_name[];
if (nread == 0)
break;
- printf("\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- nread=%d \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\\n", nread);
- printf("inode# file type d_reclen d_off d_name\\n");
+ printf("\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- nread=%d \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\en", nread);
+ printf("inode# file type d_reclen d_off d_name\en");
for (bpos = 0; bpos < nread;) {
d = (struct linux_dirent *) (buf + bpos);
printf("%8ld ", d\->d_ino);
(d_type == DT_LNK) ? "symlink" :
(d_type == DT_BLK) ? "block dev" :
(d_type == DT_CHR) ? "char dev" : "???");
- printf("%4d %10lld %s\\n", d\->d_reclen,
+ printf("%4d %10lld %s\en", d\->d_reclen,
(long long) d\->d_off, d\->d_name);
bpos += d\->d_reclen;
}
exit(EXIT_SUCCESS);
}
-.fi
+.EE
.SH SEE ALSO
.BR readdir (2),
-.BR readdir (3)
+.BR readdir (3),
+.BR inode (7)