From 22e3eec15302eac28c1a2ac3f9af29c2c9e82a3c Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Thu, 28 May 2020 23:21:35 +0200 Subject: [PATCH] getdents-debug: loop and stop on first error Also try to improve and unify output a little. $ ./getdents /usr/share/man/man1 1: unix.Getdents: n=9984; n=9984; n=9968; n=9976; n=9984; n=9968; n=10000; n=9976; n=9992; n=10000; n=9976; n=9992; n=2312; n=0; err=; total 122112 bytes 2: unix.Getdents: n=9984; n=48; n=9976; n=9968; n=9976; n=9976; n=9992; n=9984; n=9992; n=10000; n=9976; n=9968; n=10000; n=2272; n=0; err=; total 122112 bytes 3: unix.Getdents: n=9984; n=9984; n=9968; n=704; n=10000; n=10000; n=9968; n=9968; n=9992; n=10000; n=9960; n=9992; n=9992; n=1600; n=0; err=; total 122112 bytes 4: unix.Getdents: n=9984; n=9984; n=9968; n=9976; n=9984; n=32; n=9992; n=9984; n=9992; n=10000; n=9976; n=9968; n=10000; n=2272; n=0; err=; total 122112 bytes $ ./getdents_c /usr/share/man/man1 1: getdents64: n=9984; n=9984; n=9968; n=9976; n=9984; n=9968; n=10000; n=9976; n=9992; n=10000; n=9976; n=9992; n=2312; n=0; errno=0 total 122112 bytes 2: getdents64: n=9984; n=9984; n=9968; n=9976; n=9984; n=9968; n=10000; n=9976; n=9992; n=10000; n=9976; n=9992; n=2312; n=0; errno=0 total 122112 bytes 3: getdents64: n=9984; n=9984; n=9968; n=9976; n=9984; n=9968; n=10000; n=9976; n=9992; n=10000; n=9976; n=9992; n=2312; n=0; errno=0 total 122112 bytes 4: getdents64: n=9984; n=9984; n=9968; n=9976; n=9984; n=9968; n=10000; n=9976; n=9992; n=10000; n=9976; n=9992; n=2312; n=0; errno=0 total 122112 bytes --- contrib/getdents-debug/getdents/getdents.go | 18 ++++----- contrib/getdents-debug/getdents_c/getdents.c | 41 ++++++++++++-------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/contrib/getdents-debug/getdents/getdents.go b/contrib/getdents-debug/getdents/getdents.go index cd1e49d..d7dac78 100644 --- a/contrib/getdents-debug/getdents/getdents.go +++ b/contrib/getdents-debug/getdents/getdents.go @@ -40,6 +40,7 @@ import ( "flag" "fmt" "os" + "time" "golang.org/x/sys/unix" ) @@ -50,11 +51,10 @@ const ( func main() { flag.Usage = func() { - fmt.Fprintf(os.Stderr, "Usage: %s [-loop] PATH\n", myName) - fmt.Fprintf(os.Stderr, "Run getdents(2) on PATH\n") + fmt.Fprintf(os.Stderr, "Usage: %s PATH\n", myName) + fmt.Fprintf(os.Stderr, "Run getdents(2) on PATH in a 100ms loop until we hit an error\n") os.Exit(1) } - loop := flag.Bool("loop", false, "Run in a loop") flag.Parse() if flag.NArg() != 1 { flag.Usage() @@ -62,14 +62,14 @@ func main() { path := flag.Arg(0) tmp := make([]byte, 10000) - for { + for i := 1; ; i++ { sum := 0 fd, err := unix.Open(path, unix.O_RDONLY, 0) if err != nil { - fmt.Printf("unix.Open returned err=%v\n", err) - continue + fmt.Printf("%3d: unix.Open returned err=%v\n", err) + os.Exit(1) } - fmt.Printf("unix.Getdents: ") + fmt.Printf("%3d: unix.Getdents: ", i) for { n, err := unix.Getdents(fd, tmp) fmt.Printf("n=%d; ", n) @@ -83,8 +83,6 @@ func main() { sum += n } unix.Close(fd) - if !*loop { - break - } + time.Sleep(100 * time.Millisecond) } } diff --git a/contrib/getdents-debug/getdents_c/getdents.c b/contrib/getdents-debug/getdents_c/getdents.c index 98c2346..936bd0b 100644 --- a/contrib/getdents-debug/getdents_c/getdents.c +++ b/contrib/getdents-debug/getdents_c/getdents.c @@ -12,28 +12,37 @@ int main(int argc, char *argv[]) { - if(argc < 2) { + if(argc != 2) { printf("Usage: %s PATH\n", argv[0]); - printf("Run getdents(2) on PATH\n"); + printf("Run getdents(2) on PATH in a 100ms loop\n"); exit(1); } const char *path = argv[1]; - int fd = open(path, O_RDONLY); - if (fd == -1) { - perror("open"); - exit(1); - } - char tmp[10000]; - int sum = 0; - for ( ; ; ) { - int n = syscall(SYS_getdents64, fd, tmp, sizeof(tmp)); - printf("getdents64 fd%d: n=%d, errno=%d\n", fd, n, errno); - if (n <= 0) { - printf("total %d bytes\n", sum); - break; + for (int i = 1 ; ; i ++ ) { + int fd = open(path, O_RDONLY); + if (fd == -1) { + perror("open"); + exit(1); } - sum += n; + + char tmp[10000]; + int sum = 0; + printf("%3d: getdents64: ", i); + for ( ; ; ) { + int n = syscall(SYS_getdents64, fd, tmp, sizeof(tmp)); + printf("n=%d; ", n); + if (n <= 0) { + printf("errno=%d total %d bytes\n", errno, sum); + if (n < 0) { + exit(1); + } + break; + } + sum += n; + } + close(fd); + usleep(100000); } }