/* * gendents.cpp: getdents tester. * * Copyright (C) 1999, 2001, 2003 by Manfred Spraul. * All rights reserved except the rights granted by the GPL. * * Redistribution of this file is permitted under the terms of the GNU * General Public License (GPL) version 2 or later. * $Header: /pub/home/manfred/cvs-tree/getdents/getdents.cpp,v 1.2 2003/03/22 16:01:34 manfred Exp $ */ #include #include #include #include #include #include #include #include #include #include #define BUFSZ 131072 unsigned char entries[BUFSZ]; #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ type name(type1 arg1,type2 arg2,type3 arg3) \ { \ long __res; \ __asm__ volatile ("int $0x80" \ : "=a" (__res) \ : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ "d" ((long)(arg3))); \ __syscall_return(type,__res); \ } _syscall3(int, getdents, uint, fd, struct dirent *, dirp, uint, count); static void hexdump(unsigned char* array, int len) { int i; for(i=0;i []\n"); if (argc < 3 || argc > 4) return 1; fd = open(argv[1],O_RDONLY); if (fd < 0) { printf("open failed, errno %d.\n", errno); return 2; } if (argc == 4) bufsz = atoi(argv[3]); else bufsz = BUFSZ; lseek(fd, atoi(argv[2]), SEEK_SET); for(;;) { int offset = 0; retval = getdents(fd, (struct dirent *)entries, bufsz); printf("retval is %d.\n", retval); if (retval <= 0) break; while (offset < retval) { struct dirent *walk = (struct dirent *)(&entries[offset]); // printf("dirent: %lxh.\n", (unsigned long)walk); // printf("dirent->d_ino = %ld.\n", walk->d_ino); // printf("dirent->d_off = %ld.\n", walk->d_off); // printf("dirent->d_reclen = %ld.\n", walk->d_reclen); printf("dirent->d_name = '%s'@%ld\n", walk->d_name, walk->d_off); offset += walk->d_reclen; } } return 0; }