tail: work correctly on /proc files (Kazuo TAKADA <kztakada@sm.sony.co.jp>)
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 2 Oct 2007 10:17:56 +0000 (10:17 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 2 Oct 2007 10:17:56 +0000 (10:17 -0000)
coreutils/tail.c

index 74e14232dad4f970f0fcd8b89e62844bdaddec28..8a112346d23a3abb048eebf9e4d919a0b1c25052 100644 (file)
@@ -47,13 +47,16 @@ static void tail_xprint_header(const char *fmt, const char *filename)
 static ssize_t tail_read(int fd, char *buf, size_t count)
 {
        ssize_t r;
-       off_t current, end;
+       off_t current;
        struct stat sbuf;
 
-       end = current = lseek(fd, 0, SEEK_CUR);
-       if (!fstat(fd, &sbuf))
-               end = sbuf.st_size;
-       lseek(fd, end < current ? 0 : current, SEEK_SET);
+       /* (A good comment is missing here) */
+       current = lseek(fd, 0, SEEK_CUR);
+       /* /proc files report zero st_size, don't lseek them. */
+       if (fstat(fd, &sbuf) == 0 && sbuf.st_size)
+               if (sbuf.st_size < current)
+                       lseek(fd, 0, SEEK_SET);
+
        r = safe_read(fd, buf, count);
        if (r < 0) {
                bb_perror_msg(bb_msg_read_error);
@@ -67,8 +70,12 @@ static const char header_fmt[] ALIGN1 = "\n==> %s <==\n";
 
 static unsigned eat_num(const char *p)
 {
-       if (*p == '-') p++;
-       else if (*p == '+') { p++; G.status = EXIT_FAILURE; }
+       if (*p == '-')
+               p++;
+       else if (*p == '+') {
+               p++;
+               G.status = EXIT_FAILURE;
+       }
        return xatou_sfx(p, tail_suffixes);
 }