From b1ccf302bd559f34ab0eb9642f756477ee525e7a Mon Sep 17 00:00:00 2001 From: short <> Date: Tue, 29 Nov 2005 09:05:04 +0000 Subject: [PATCH] getdents64(2) test case. --- src/getdents64.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/getdents64.c diff --git a/src/getdents64.c b/src/getdents64.c new file mode 100644 index 0000000..20936dd --- /dev/null +++ b/src/getdents64.c @@ -0,0 +1,65 @@ +/* $Id$ */ + +#define _GNU_SOURCE 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +static _syscall3(long, getdents64, uint, fd, struct dirent64 *, dirp, uint, count); + +int main(int argc,char **argv) +{ +int fd; + + if (argc!=2) { + fprintf(stderr,"Required directory name argument!\n"); + exit(EXIT_FAILURE); + } + if (-1==(fd=open(argv[1],O_RDONLY /* |O_DIRECTORY */))) { + fprintf(stderr,"open(\"%s\"): %m\n",argv[1]); + exit(EXIT_FAILURE); + } + for (;;) { +off_t off; +char buf[100]; +struct dirent64 *dirent64; +int got; + + if ((off_t)-1==(off=lseek(fd,0,SEEK_CUR))) { + fprintf(stderr,"lseek(): %m\n"); + exit(EXIT_FAILURE); + } + printf("@=%lld\n",(long long)off); + memset(buf,0,sizeof(buf)); + got=getdents64(fd,(void *)buf,sizeof(buf)); + printf("got=%d\n",got); + if (got==-1) + perror("getdents()"); + assert(got<=sizeof(buf)); + if (!got) + break; + for ( + dirent64=(void *)buf; + (char *)dirent64d_reclen) + ) { + printf("dirent64_rel=%d, d_off=0x%llx; d_ino=%llu, d_reclen=%u, d_type=%u, d_name=%s\n", + (char *)dirent64-buf, + (long long)dirent64->d_off,(unsigned long long)dirent64->d_ino, + (unsigned)dirent64->d_reclen, + (unsigned)dirent64->d_type,dirent64->d_name); + } + printf("trailing=%d\n",(buf+got)-(char *)dirent64); + } + puts("done"); + return EXIT_SUCCESS; +} -- 1.8.3.1