#include #include #include #include #include #include #include struct linux_dirent64 { uint64_t d_ino; int64_t d_off; unsigned short d_reclen; unsigned char d_type; char d_name[0]; }; #define BUF_SIZE 4096 int main(int argc, char *argv[]) { int fd, nread; char buf[BUF_SIZE]; struct linux_dirent64 *d; int bpos; fd = open(argv[1], O_RDONLY | O_DIRECTORY); if (fd < 0) { perror("open"); exit(EXIT_FAILURE); } for ( ; ; ) { nread = syscall(SYS_getdents64, fd, buf, BUF_SIZE); if (nread == -1) { perror("getdents"); exit(EXIT_FAILURE); } if (nread == 0) break; for (bpos = 0; bpos < nread;) { d = (struct linux_dirent64 *) (buf + bpos); /* * Can't use off_t here xfsqa is compiled with * -D_FILE_OFFSET_BITS=64 */ if (d->d_off != (long)d->d_off) { fprintf(stderr, "detected d_off truncation " "d_name = %s, d_off = %lld\n", d->d_name, (long long)d->d_off); exit(EXIT_FAILURE); } bpos += d->d_reclen; } } exit(EXIT_SUCCESS); }