X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Ftail.c;h=e352ab627b2e86b9e45c6ae59b1b17e4b0dd6ff1;hb=17f8418ea75410c3fbf9c9558f50f22cb8808e3e;hp=fb07ca27b840515b6af11a0722f6220c0149b461;hpb=6651e4260955d159e6a4f794d0a69c1b3f8e670c;p=oweals%2Fbusybox.git diff --git a/coreutils/tail.c b/coreutils/tail.c index fb07ca27b..e352ab627 100644 --- a/coreutils/tail.c +++ b/coreutils/tail.c @@ -25,7 +25,6 @@ */ //kbuild:lib-$(CONFIG_TAIL) += tail.o -//kbuild:lib-$(CONFIG_TAIL) += head_tail.o //usage:#define tail_trivial_usage //usage: "[OPTIONS] [FILE]..." @@ -33,15 +32,14 @@ //usage: "Print last 10 lines of each FILE (or stdin) to stdout.\n" //usage: "With more than one FILE, precede each with a filename header.\n" //usage: "\n -f Print data as file grows" -//usage: IF_FEATURE_FANCY_TAIL( -//usage: "\n -s SECONDS Wait SECONDS between reads with -f" -//usage: ) +//usage: "\n -c [+]N[kbm] Print last N bytes" //usage: "\n -n N[kbm] Print last N lines" //usage: "\n -n +N[kbm] Start on Nth line and print the rest" //usage: IF_FEATURE_FANCY_TAIL( -//usage: "\n -c [+]N[kbm] Print last N bytes" //usage: "\n -q Never print headers" +//usage: "\n -s SECONDS Wait SECONDS between reads with -f" //usage: "\n -v Always print headers" +//usage: "\n -F Same as -f, but keep retrying" //usage: "\n" //usage: "\nN may be suffixed by k (x1024), b (x512), or m (x1024^2)." //usage: ) @@ -51,7 +49,6 @@ //usage: "nameserver 10.0.0.1\n" #include "libbb.h" -#include "head_tail.h" struct globals { bool from_top; @@ -66,23 +63,10 @@ static void tail_xprint_header(const char *fmt, const char *filename) bb_perror_nomsg_and_die(); } -static ssize_t tail_read(int fd, char *buf, size_t count, int follow) +static ssize_t tail_read(int fd, char *buf, size_t count) { ssize_t r; - if (follow) { - /* tail -f keeps following files even if they are truncated */ - off_t current; - struct stat sbuf; - - /* /proc files report zero st_size, don't lseek them */ - if (fstat(fd, &sbuf) == 0 && sbuf.st_size > 0) { - current = lseek(fd, 0, SEEK_CUR); - if (sbuf.st_size < current) - xlseek(fd, 0, SEEK_SET); - } - } - r = full_read(fd, buf, count); if (r < 0) { bb_perror_msg(bb_msg_read_error); @@ -102,7 +86,7 @@ static unsigned eat_num(const char *p) p++; G.from_top = 1; } - return xatou_sfx(p, head_tail_suffixes); + return xatou_sfx(p, bkm_suffixes); } int tail_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; @@ -120,6 +104,7 @@ int tail_main(int argc, char **argv) int *fds; const char *fmt; + int prev_fd; INIT_G(); @@ -255,7 +240,7 @@ int tail_main(int argc, char **argv) * Used only by +N code ("start from Nth", 1-based): */ seen = 1; newlines_seen = 0; - while ((nread = tail_read(fd, buf, tailbufsize - taillen, /*follow:*/ 0)) > 0) { + while ((nread = tail_read(fd, buf, tailbufsize - taillen)) > 0) { if (G.from_top) { int nwrite = nread; if (seen < count) { @@ -324,6 +309,7 @@ int tail_main(int argc, char **argv) xwrite(STDOUT_FILENO, tailbuf, taillen); } } while (++i < nfiles); + prev_fd = fds[i-1]; tailbuf = xrealloc(tailbuf, BUFSIZ); @@ -367,10 +353,23 @@ int tail_main(int argc, char **argv) if (nfiles > header_threshhold) { fmt = header_fmt_str; } - while ((nread = tail_read(fd, tailbuf, BUFSIZ, /*follow:*/ 1)) > 0) { - if (fmt) { + for (;;) { + /* tail -f keeps following files even if they are truncated */ + struct stat sbuf; + /* /proc files report zero st_size, don't lseek them */ + if (fstat(fd, &sbuf) == 0 && sbuf.st_size > 0) { + off_t current = lseek(fd, 0, SEEK_CUR); + if (sbuf.st_size < current) + xlseek(fd, 0, SEEK_SET); + } + + nread = tail_read(fd, tailbuf, BUFSIZ); + if (nread <= 0) + break; + if (fmt && (fd != prev_fd)) { tail_xprint_header(fmt, filename); fmt = NULL; + prev_fd = fd; } xwrite(STDOUT_FILENO, tailbuf, nread); }