getdents.2: Add an example program

Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
Michael Kerrisk 2008-10-02 13:15:42 +02:00
parent 5ff3825e41
commit d03fa0d508
1 changed files with 91 additions and 0 deletions

View File

@ -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 <dirent.h> /* Defines DT_* constants */
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#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)