#define _GNU_SOURCE #include /* Defines DT_* constants */ #include #include #include #include #include #include #define handle_error(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*1024*5 int main(int argc, char *argv[]) { int fd, nread; char buf[BUF_SIZE]; struct linux_dirent *d; int bpos; char d_type; FILE *fn; fd = open(argc > 1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY); fn = fopen("/home/alcjunio/hardlist.output", "w"); if (fd == -1) handle_error("open"); for ( ; ; ) { nread = syscall(SYS_getdents, fd, buf, BUF_SIZE); if (nread == -1) handle_error("getdents"); if (nread == 0) break; for (bpos = 0; bpos < nread;) { d = (struct linux_dirent *) (buf + bpos); if (d->d_ino != 0) { printf("%s\n", (char *) d->d_name); fwrite(d,sizeof(d),sizeof(d),fn); } bpos += d->d_reclen; } } fclose(fn); exit(EXIT_SUCCESS); }