diff --git a/man2/getdents.2 b/man2/getdents.2 index 7a86fa8aa..fa5096702 100644 --- a/man2/getdents.2 +++ b/man2/getdents.2 @@ -157,6 +157,97 @@ structure yourself. This call supersedes .BR readdir (2). +.SH EXAMPLE +The program below demonstrates the use of +.BR getdents (). +The following output shows an example of what we see when running this +program on an ext2 directory: + +.in +4n +.nf +$ ./a.out /testfs/ +--------------- nread=120 --------------- +i-node# file type d_reclen d_off d_name + 2 directory 16 12 . + 2 directory 16 24 .. + 11 directory 24 44 lost+found + 12 regular 16 56 a + 228929 directory 16 68 sub + 16353 directory 16 80 sub2 + 130817 directory 16 4096 sub3 +.fi +.in + +.nf +#define HAVE_D_TYPE /* Remove for kernels < 2.6.4 */ +#define _GNU_SOURCE +#include /* Defines DT_* constants */ +#include +#include +#include +#include +#include +#include + +#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \\ + } while (0) + +struct linux_dirent { + long d_ino; + off_t d_off; + unsigned short d_reclen; + char d_name[]; +}; + +#define BUF_SIZE 1024 + +int +main(int argc, char *argv[]) +{ + int fd, nread; + char buf[BUF_SIZE]; + struct linux_dirent *d; + int bpos; +#ifdef HAVE_D_TYPE + char d_type; +#endif + + fd = open(argc > 1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY); + if (fd == \-1) + errExit("open"); + + for ( ; ; ) { + nread = syscall(SYS_getdents, fd, buf, BUF_SIZE); + if (nread == \-1) + errExit("getdents"); + + if (nread == 0) + break; + + printf("\--------------- nread=%d ---------------\\n", nread); + printf("i\-node# file type d_reclen d_off d_name\\n"); + for (bpos = 0; bpos < nread;) { + d = (struct linux_dirent *) (buf + bpos); + printf("%8ld ", d\->d_ino); +#ifdef HAVE_D_TYPE + d_type = *(buf + bpos + d\->d_reclen - 1); + printf("%\-10s ", (d_type == DT_REG) ? "regular" : + (d_type == DT_DIR) ? "directory" : + (d_type == DT_FIFO) ? "FIFO" : + (d_type == DT_SOCK) ? "socket" : + (d_type == DT_LNK) ? "symlink" : + (d_type == DT_BLK) ? "block dev" : + (d_type == DT_CHR) ? "char dev" : "???"); +#endif + printf("%4d %10lld %s\\n", d\->d_reclen, + (long long) d\->d_off, (char *) d->d_name); + bpos += d\->d_reclen; + } + } + + exit(EXIT_SUCCESS); +} +.fi .SH "SEE ALSO" .BR readdir (2), .BR readdir (3)