{ NULL, 0 }
};
-static int status;
+struct globals {
+ bool status;
+};
+#define G (*(struct globals*)&bb_common_bufsiz1)
static void tail_xprint_header(const char *fmt, const char *filename)
{
r = safe_read(fd, buf, count);
if (r < 0) {
bb_perror_msg(bb_msg_read_error);
- status = EXIT_FAILURE;
+ G.status = EXIT_FAILURE;
}
return r;
static const char header_fmt[] = "\n==> %s <==\n";
+static unsigned eat_num(const char *p) {
+ if (*p == '-') p++;
+ else if (*p == '+') { p++; G.status = EXIT_FAILURE; }
+ return xatou_sfx(p, tail_suffixes);
+}
+
+int tail_main(int argc, char **argv);
int tail_main(int argc, char **argv)
{
unsigned count = 10;
unsigned sleep_period = 1;
- bool from_top = 0;
+ bool from_top;
int header_threshhold = 1;
const char *str_c, *str_n, *str_s;
char *s, *buf;
const char *fmt;
- void eat_num(const char *p) {
- if (*p == '-') p++;
- else if (*p == '+') { p++; from_top = 1; }
- count = xatou_sfx(p, tail_suffixes);
- }
-
-
#if ENABLE_INCLUDE_SUSv2 || ENABLE_FEATURE_FANCY_TAIL
/* Allow legacy syntax of an initial numeric option without -n. */
if (argc >= 2 && (argv[1][0] == '+' || argv[1][0] == '-')
&& isdigit(argv[1][1])
) {
- argv[0] = "-n";
+ argv[0] = (char*)"-n";
argv--;
argc++;
}
#define FOLLOW (opt & 0x1)
#define COUNT_BYTES (opt & 0x2)
//if (opt & 0x1) // -f
- if (opt & 0x2) eat_num(str_c); // -c
- if (opt & 0x4) eat_num(str_n); // -n
+ if (opt & 0x2) count = eat_num(str_c); // -c
+ if (opt & 0x4) count = eat_num(str_n); // -n
#if ENABLE_FEATURE_FANCY_TAIL
if (opt & 0x8) header_threshhold = INT_MAX; // -q
if (opt & 0x10) sleep_period = xatou(str_s); // -s
#endif
argc -= optind;
argv += optind;
+ from_top = G.status;
/* open all the files */
fds = xmalloc(sizeof(int) * (argc + 1));
nfiles = i = 0;
+ G.status = EXIT_SUCCESS;
if (argc == 0) {
struct stat statbuf;
opt &= ~1; /* clear FOLLOW */
}
*argv = (char *) bb_msg_standard_input;
- goto DO_STDIN;
}
-
do {
- if (NOT_LONE_DASH(argv[i])) {
- fds[nfiles] = open(argv[i], O_RDONLY);
- if (fds[nfiles] < 0) {
- bb_perror_msg("%s", argv[i]);
- status = EXIT_FAILURE;
- continue;
- }
- } else {
- DO_STDIN: /* "-" */
- fds[nfiles] = STDIN_FILENO;
+ FILE* fil = fopen_or_warn_stdin(argv[i]);
+ if (!fil) {
+ G.status = EXIT_FAILURE;
+ continue;
}
- argv[nfiles] = argv[i];
- ++nfiles;
+ fds[nfiles] = fileno(fil);
+ argv[nfiles++] = argv[i];
} while (++i < argc);
if (!nfiles)
if (newline + nbuf < count) {
newline += nbuf;
taillen += nread;
-
} else {
int extra = 0;
- if (buf[nread-1] != '\n') {
- extra = 1;
- }
+ if (buf[nread-1] != '\n')
+ extra = 1;
k = newline + nbuf + extra - count;
s = tailbuf;
while (k) {
}
++s;
}
-
taillen += nread - (s - tailbuf);
memmove(tailbuf, s, taillen);
newline = count - extra;
}
} while (++i < nfiles);
}
-
- return status;
+ if (ENABLE_FEATURE_CLEAN_UP) {
+ free(fds);
+ }
+ return G.status;
}