From 1ab4ac60ff891ee4dcd0ca729e9f897c4f4a1f42 Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Mon, 3 Jul 2017 14:58:51 -0700 Subject: [PATCH] tail: Use fstat in case file is removed --- tail.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/tail.c b/tail.c index 1ab9d18..ce65a01 100644 --- a/tail.c +++ b/tail.c @@ -175,8 +175,8 @@ main(int argc, char *argv[]) } if (many) printf("%s==> %s <==\n", newline ? "\n" : "", *argv); - if (stat(*argv, &st1) < 0) - eprintf("stat %s:", *argv); + if (fstat(fd, &st1) < 0) + eprintf("fstat %s:", *argv); if (!(S_ISFIFO(st1.st_mode) || S_ISREG(st1.st_mode))) fflag = 0; newline = 1; @@ -193,16 +193,14 @@ main(int argc, char *argv[]) for (;;) { if (concat(fd, *argv, 1, "") < 0) exit(1); - /* ignore error in case file was removed, we continue - * tracking the existing open file descriptor */ - if (!stat(*argv, &st2)) { - if (st2.st_size < st1.st_size) { - fprintf(stderr, "%s: file truncated\n", *argv); - if (lseek(fd, SEEK_SET, 0) < 0) - eprintf("lseek:"); - } - st1 = st2; + if (fstat(fd, &st2) < 0) + eprintf("fstat %s:", *argv); + if (st2.st_size < st1.st_size) { + fprintf(stderr, "%s: file truncated\n", *argv); + if (lseek(fd, SEEK_SET, 0) < 0) + eprintf("lseek:"); } + st1 = st2; sleep(1); } }