Implement suggestion from Adam Slattery, (don't default to killing closing bug #1190.
[oweals/busybox.git] / tail.c
diff --git a/tail.c b/tail.c
index a85256c807dce801c0f2d04e634f22cec9f312e2..90cc2a6efad9e5d9e09ce90296953768eba99544 100644 (file)
--- a/tail.c
+++ b/tail.c
@@ -44,14 +44,14 @@ static char *tailbuf;
 static int taillen;
 static int newline;
 
-void tailbuf_append(char *buf, int len)
+static void tailbuf_append(char *buf, int len)
 {
        tailbuf = xrealloc(tailbuf, taillen + len);
        memcpy(tailbuf + taillen, buf, len);
        taillen += len;
 }
 
-void tailbuf_trunc()
+static void tailbuf_trunc()
 {
        char *s;
        s = memchr(tailbuf, '\n', taillen);
@@ -73,7 +73,7 @@ int tail_main(int argc, char **argv)
                        case 'f':
                                follow = 1;
                                break;
-#ifndef BB_FEATURE_SIMPLE_TAIL
+#ifdef BB_FEATURE_FANCY_TAIL
                        case 'c':
                                units = BYTES;
                                /* FALLS THROUGH */
@@ -85,7 +85,7 @@ int tail_main(int argc, char **argv)
                                if (optarg[0] == '+')
                                        from_top = 1;
                                break;
-#ifndef BB_FEATURE_SIMPLE_TAIL
+#ifdef BB_FEATURE_FANCY_TAIL
                        case 'q':
                                hide_headers = 1;
                                break;
@@ -118,7 +118,7 @@ int tail_main(int argc, char **argv)
                }
        }
        
-#ifndef BB_FEATURE_SIMPLE_TAIL
+#ifdef BB_FEATURE_FANCY_TAIL
        /* tail the files */
        if (!from_top && units == BYTES)
                tailbuf = xmalloc(count);
@@ -127,12 +127,16 @@ int tail_main(int argc, char **argv)
        for (i = 0; i < nfiles; i++) {
                if (fds[i] == -1)
                        continue;
+               if (!count) {
+                       lseek(fds[i], 0, SEEK_END);
+                       continue;
+               }
                seen = 0;
                if (show_headers || (!hide_headers && nfiles > 1))
                        printf("%s==> %s <==\n", i == 0 ? "" : "\n", argv[optind + i]);
                while ((nread = safe_read(fds[i], buf, sizeof(buf))) > 0) {
                        if (from_top) {
-#ifndef BB_FEATURE_SIMPLE_TAIL
+#ifdef BB_FEATURE_FANCY_TAIL
                                if (units == BYTES) {
                                        if (count - 1 <= seen)
                                                nwrite = nread;
@@ -165,7 +169,7 @@ int tail_main(int argc, char **argv)
                                        break;
                                }
                        } else {
-#ifndef BB_FEATURE_SIMPLE_TAIL
+#ifdef BB_FEATURE_FANCY_TAIL
                                if (units == BYTES) {
                                        if (nread < count) {
                                                memmove(tailbuf, tailbuf + nread, count - nread);
@@ -199,7 +203,7 @@ int tail_main(int argc, char **argv)
                        status = EXIT_FAILURE;
                }
 
-#ifndef BB_FEATURE_SIMPLE_TAIL
+#ifdef BB_FEATURE_FANCY_TAIL
                if (!from_top && units == BYTES) {
                        if (count < seen)
                                seen = count;