*** empty log message ***
[coreutils.git] / src / tail.c
blobda757ad15b4002cf051aa506a229c03bac7495fb
1 /* tail -- output the last part of file(s)
2 Copyright (C) 1989, 90, 91, 1995-2001 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
7 any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
18 /* Can display any amount of data, unlike the Unix version, which uses
19 a fixed size buffer and therefore can only deliver a limited number
20 of lines.
22 Original version by Paul Rubin <phr@ocf.berkeley.edu>.
23 Extensions by David MacKenzie <djm@gnu.ai.mit.edu>.
24 tail -f for multiple files by Ian Lance Taylor <ian@airs.com>. */
26 #include <config.h>
28 #include <stdio.h>
29 #include <assert.h>
30 #include <getopt.h>
31 #include <sys/types.h>
32 #include <signal.h>
34 #include "system.h"
35 #include "closeout.h"
36 #include "argmatch.h"
37 #include "error.h"
38 #include "human.h"
39 #include "safe-read.h"
40 #include "xstrtol.h"
42 /* The official name of this program (e.g., no `g' prefix). */
43 #define PROGRAM_NAME "tail"
45 #define AUTHORS \
46 "Paul Rubin, David MacKenzie, Ian Lance Taylor, and Jim Meyering"
48 #ifndef ENOSYS
49 /* Some systems don't have ENOSYS -- this should be a big enough
50 value that no valid errno value will match it. */
51 # define ENOSYS 99999
52 #endif
54 /* Number of items to tail. */
55 #define DEFAULT_N_LINES 10
57 /* Size of atomic reads. */
58 #ifndef BUFSIZ
59 # define BUFSIZ (512 * 8)
60 #endif
62 /* A special value for dump_remainder's N_BYTES parameter. */
63 #define COPY_TO_EOF OFF_T_MAX
65 /* FIXME: make Follow_name the default? */
66 #define DEFAULT_FOLLOW_MODE Follow_descriptor
68 enum Follow_mode
70 /* Follow the name of each file: if the file is renamed, try to reopen
71 that name and track the end of the new file if/when it's recreated.
72 This is useful for tracking logs that are occasionally rotated. */
73 Follow_name = 1,
75 /* Follow each descriptor obtained upon opening a file.
76 That means we'll continue to follow the end of a file even after
77 it has been renamed or unlinked. */
78 Follow_descriptor = 2
81 /* The types of files for which tail works. */
82 #define IS_TAILABLE_FILE_TYPE(Mode) \
83 (S_ISREG (Mode) || S_ISFIFO (Mode) || S_ISCHR (Mode))
85 static char const *const follow_mode_string[] =
87 "descriptor", "name", 0
90 static enum Follow_mode const follow_mode_map[] =
92 Follow_descriptor, Follow_name,
95 struct File_spec
97 /* The actual file name, or "-" for stdin. */
98 char *name;
100 /* File descriptor on which the file is open; -1 if it's not open. */
101 int fd;
103 /* The size of the file the last time we checked. */
104 off_t size;
106 /* The device and inode of the file the last time we checked. */
107 dev_t dev;
108 ino_t ino;
110 /* The specified name initially referred to a directory or some other
111 type for which tail isn't meaningful. Unlike for a permission problem
112 (tailable, below) once this is set, the name is not checked ever again. */
113 int ignore;
115 /* See description of DEFAULT_MAX_N_... below. */
116 unsigned int n_unchanged_stats;
118 /* See description of DEFAULT_MAX_N_... below. */
119 unsigned int n_consecutive_size_changes;
121 /* A file is tailable if it exists, is readable, and is of type
122 IS_TAILABLE_FILE_TYPE. */
123 int tailable;
125 /* The value of errno seen last time we checked this file. */
126 int errnum;
130 /* Keep trying to open a file even if it is inaccessible when tail starts
131 or if it becomes inaccessible later -- useful only with -f. */
132 static int reopen_inaccessible_files;
134 /* If nonzero, interpret the numeric argument as the number of lines.
135 Otherwise, interpret it as the number of bytes. */
136 static int count_lines;
138 /* Whether we follow the name of each file or the file descriptor
139 that is initially associated with each name. */
140 static enum Follow_mode follow_mode = Follow_descriptor;
142 /* If nonzero, read from the ends of all specified files until killed. */
143 static int forever;
145 /* If nonzero, count from start of file instead of end. */
146 static int from_start;
148 /* If nonzero, print filename headers. */
149 static int print_headers;
151 /* When to print the filename banners. */
152 enum header_mode
154 multiple_files, always, never
157 /* When tailing a file by name, if there have been this many consecutive
158 iterations for which the size has remained the same, then open/fstat
159 the file to determine if that file name is still associated with the
160 same device/inode-number pair as before. This option is meaningful only
161 when following by name. --max-unchanged-stats=N */
162 #define DEFAULT_MAX_N_UNCHANGED_STATS_BETWEEN_OPENS 5
163 static unsigned long max_n_unchanged_stats_between_opens =
164 DEFAULT_MAX_N_UNCHANGED_STATS_BETWEEN_OPENS;
166 /* This variable is used to ensure that a file that is unlinked or moved
167 aside, yet always growing will be recognized as having been renamed.
168 After detecting this many consecutive size changes for a file, open/fstat
169 the file to determine if that file name is still associated with the
170 same device/inode-number pair as before. This option is meaningful only
171 when following by name. --max-consecutive-size-changes=N */
172 #define DEFAULT_MAX_N_CONSECUTIVE_SIZE_CHANGES 200
173 static unsigned long max_n_consecutive_size_changes_between_opens =
174 DEFAULT_MAX_N_CONSECUTIVE_SIZE_CHANGES;
176 /* The name this program was run with. */
177 char *program_name;
179 /* The number of seconds to sleep between iterations.
180 During one iteration, every file name or descriptor is checked to
181 see if it has changed. */
182 /* FIXME: allow fractional seconds */
183 static unsigned int sleep_interval = 1;
185 /* The process ID of the process (presumably on the current host)
186 that is writing to all followed files. */
187 static pid_t pid;
189 /* Nonzero if we have ever read standard input. */
190 static int have_read_stdin;
192 /* For long options that have no equivalent short option, use a
193 non-character as a pseudo short option, starting with CHAR_MAX + 1. */
194 enum
196 RETRY_OPTION = CHAR_MAX + 1,
197 MAX_UNCHANGED_STATS_OPTION,
199 /* FIXME: remove this in 2001, unless someone can show a good
200 reason to keep it. */
201 MAX_CONSECUTIVE_SIZE_CHANGES_OPTION,
203 PID_OPTION,
204 LONG_FOLLOW_OPTION
207 static struct option const long_options[] =
209 /* --allow-missing is deprecated; use --retry instead
210 FIXME: remove it some day */
211 {"allow-missing", no_argument, NULL, RETRY_OPTION},
212 {"bytes", required_argument, NULL, 'c'},
213 {"follow", optional_argument, NULL, LONG_FOLLOW_OPTION},
214 {"lines", required_argument, NULL, 'n'},
215 {"max-unchanged-stats", required_argument, NULL, MAX_UNCHANGED_STATS_OPTION},
216 {"max-consecutive-size-changes", required_argument, NULL,
217 MAX_CONSECUTIVE_SIZE_CHANGES_OPTION},
218 {"pid", required_argument, NULL, PID_OPTION},
219 {"quiet", no_argument, NULL, 'q'},
220 {"retry", no_argument, NULL, RETRY_OPTION},
221 {"silent", no_argument, NULL, 'q'},
222 {"sleep-interval", required_argument, NULL, 's'},
223 {"verbose", no_argument, NULL, 'v'},
224 {GETOPT_HELP_OPTION_DECL},
225 {GETOPT_VERSION_OPTION_DECL},
226 {NULL, 0, NULL, 0}
229 void
230 usage (int status)
232 if (status != 0)
233 fprintf (stderr, _("Try `%s --help' for more information.\n"),
234 program_name);
235 else
237 printf (_("\
238 Usage: %s [OPTION]... [FILE]...\n\
240 program_name);
241 printf (_("\
242 Print the last %d lines of each FILE to standard output.\n\
243 With more than one FILE, precede each with a header giving the file name.\n\
244 With no FILE, or when FILE is -, read standard input.\n\
246 "), DEFAULT_N_LINES);
247 fputs (_("\
248 Mandatory arguments to long options are mandatory for short options too.\n\
249 "), stdout);
250 fputs (_("\
251 --retry keep trying to open a file even if it is\n\
252 inaccessible when tail starts or if it becomes\n\
253 inaccessible later -- useful only with -f\n\
254 -c, --bytes=N output the last N bytes\n\
255 "), stdout);
256 fputs (_("\
257 -f, --follow[={name|descriptor}]\n\
258 output appended data as the file grows;\n\
259 -f, --follow, and --follow=descriptor are\n\
260 equivalent\n\
261 -F same as --follow=name --retry\n\
262 "), stdout);
263 printf (_("\
264 -n, --lines=N output the last N lines, instead of the last %d\n\
265 --max-unchanged-stats=N\n\
266 with --follow=name, reopen a FILE which has not\n\
267 changed size after N (default %d) iterations\n\
268 to see if it has been unlinked or renamed\n\
269 (this is the usual case of rotated log files)\n\
271 DEFAULT_N_LINES,
272 DEFAULT_MAX_N_UNCHANGED_STATS_BETWEEN_OPENS
274 fputs (_("\
275 --pid=PID with -f, terminate after process ID, PID dies\n\
276 -q, --quiet, --silent never output headers giving file names\n\
277 -s, --sleep-interval=S with -f, each iteration lasts approximately S\n\
278 (default 1) seconds\n\
279 -v, --verbose always output headers giving file names\n\
280 "), stdout);
281 fputs (HELP_OPTION_DESCRIPTION, stdout);
282 fputs (VERSION_OPTION_DESCRIPTION, stdout);
283 fputs (_("\
285 If the first character of N (the number of bytes or lines) is a `+',\n\
286 print beginning with the Nth item from the start of each file, otherwise,\n\
287 print the last N items in the file. N may have a multiplier suffix:\n\
288 b for 512, k for 1024, m for 1048576 (1 Meg). \
289 "), stdout);
290 fputs (_("\
291 A first OPTION of -VALUE\n\
292 or +VALUE is treated like -n VALUE or -n +VALUE unless VALUE has one of\n\
293 the [bkm] suffix multipliers, in which case it is treated like -c VALUE\n\
294 or -c +VALUE. \
295 "), stdout);
296 fputs (_("\
297 Warning: a first option of +VALUE is obsolescent, and support\n\
298 for it will be withdrawn.\n\
300 "), stdout);
301 fputs (_("\
302 With --follow (-f), tail defaults to following the file descriptor, which\n\
303 means that even if a tail'ed file is renamed, tail will continue to track\n\
304 its end. \
305 "), stdout);
306 fputs (_("\
307 This default behavior is not desirable when you really want to\n\
308 track the actual name of the file, not the file descriptor (e.g., log\n\
309 rotation). Use --follow=name in that case. That causes tail to track the\n\
310 named file by reopening it periodically to see if it has been removed and\n\
311 recreated by some other program.\n\
313 "), stdout);
314 puts (_("\nReport bugs to <bug-textutils@gnu.org>."));
316 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
319 static int
320 valid_file_spec (struct File_spec const *f)
322 /* Exactly one of the following subexpressions must be true. */
323 return ((f->fd == -1) ^ (f->errnum == 0));
326 static char *
327 pretty_name (struct File_spec const *f)
329 return (STREQ (f->name, "-") ? "standard input" : f->name);
332 static void
333 xwrite (int fd, char *const buffer, size_t n_bytes)
335 assert (fd == STDOUT_FILENO);
336 if (n_bytes > 0 && fwrite (buffer, 1, n_bytes, stdout) == 0)
337 error (EXIT_FAILURE, errno, _("write error"));
340 static void
341 close_fd (int fd, const char *filename)
343 if (fd != -1 && fd != STDIN_FILENO && close (fd))
345 error (0, errno, _("closing %s (fd=%d)"), filename, fd);
349 static void
350 write_header (const char *pretty_filename)
352 static int first_file = 1;
354 printf ("%s==> %s <==\n", (first_file ? "" : "\n"), pretty_filename);
355 first_file = 0;
358 /* Read and output N_BYTES of file PRETTY_FILENAME starting at the current
359 position in FD. If N_BYTES is COPY_TO_EOF, then copy until end of file.
360 Return the number of bytes read from the file. */
362 static long
363 dump_remainder (const char *pretty_filename, int fd, off_t n_bytes)
365 char buffer[BUFSIZ];
366 int bytes_read;
367 long n_written;
368 off_t n_remaining = n_bytes;
370 n_written = 0;
371 while (1)
373 long n = MIN (n_remaining, (off_t) BUFSIZ);
374 bytes_read = safe_read (fd, buffer, n);
375 if (bytes_read <= 0)
376 break;
377 xwrite (STDOUT_FILENO, buffer, bytes_read);
378 n_remaining -= bytes_read;
379 n_written += bytes_read;
381 if (bytes_read == -1)
382 error (EXIT_FAILURE, errno, "%s", pretty_filename);
384 return n_written;
387 /* Call lseek with the specified arguments, where file descriptor FD
388 corresponds to the file, FILENAME.
389 Give a diagnostic and exit nonzero if lseek fails. */
391 static void
392 xlseek (int fd, off_t offset, int whence, char const *filename)
394 off_t new_offset = lseek (fd, offset, whence);
395 char buf[LONGEST_HUMAN_READABLE + 1];
396 char *s;
397 char const *sign;
399 if (0 <= new_offset)
400 return;
402 sign = offset < 0 ? "-" : "";
403 if (offset < 0)
404 offset = -offset;
406 s = human_readable ((uintmax_t) offset, buf, 1, 1);
407 switch (whence)
409 case SEEK_SET:
410 error (1, errno, _("%s: cannot seek to offset %s%s"),
411 filename, sign, s);
412 break;
413 case SEEK_CUR:
414 error (1, errno, _("%s: cannot seek to relative offset %s%s"),
415 filename, sign, s);
416 break;
417 case SEEK_END:
418 error (1, errno, _("%s: cannot seek to end-relative offset %s%s"),
419 filename, sign, s);
420 break;
421 default:
422 abort ();
426 /* Print the last N_LINES lines from the end of file FD.
427 Go backward through the file, reading `BUFSIZ' bytes at a time (except
428 probably the first), until we hit the start of the file or have
429 read NUMBER newlines.
430 START_POS is the starting position of the read pointer for the file
431 associated with FD (may be nonzero).
432 FILE_LENGTH is the length of the file (one more than the offset of the
433 last byte of the file).
434 Return 0 if successful, 1 if an error occurred. */
436 static int
437 file_lines (const char *pretty_filename, int fd, long int n_lines,
438 off_t start_pos, off_t file_length)
440 char buffer[BUFSIZ];
441 int bytes_read;
442 off_t pos = file_length;
444 if (n_lines == 0)
445 return 0;
447 /* Set `bytes_read' to the size of the last, probably partial, buffer;
448 0 < `bytes_read' <= `BUFSIZ'. */
449 bytes_read = (pos - start_pos) % BUFSIZ;
450 if (bytes_read == 0)
451 bytes_read = BUFSIZ;
452 /* Make `pos' a multiple of `BUFSIZ' (0 if the file is short), so that all
453 reads will be on block boundaries, which might increase efficiency. */
454 pos -= bytes_read;
455 xlseek (fd, pos, SEEK_SET, pretty_filename);
456 bytes_read = safe_read (fd, buffer, bytes_read);
457 if (bytes_read == -1)
459 error (0, errno, "%s", pretty_filename);
460 return 1;
463 /* Count the incomplete line on files that don't end with a newline. */
464 if (bytes_read && buffer[bytes_read - 1] != '\n')
465 --n_lines;
469 int i; /* Index into `buffer' for scanning. */
470 /* Scan backward, counting the newlines in this bufferfull. */
471 for (i = bytes_read - 1; i >= 0; i--)
473 /* Have we counted the requested number of newlines yet? */
474 if (buffer[i] == '\n' && n_lines-- == 0)
476 /* If this newline wasn't the last character in the buffer,
477 print the text after it. */
478 if (i != bytes_read - 1)
479 xwrite (STDOUT_FILENO, &buffer[i + 1], bytes_read - (i + 1));
480 dump_remainder (pretty_filename, fd,
481 file_length - (pos + bytes_read));
482 return 0;
485 /* Not enough newlines in that bufferfull. */
486 if (pos == start_pos)
488 /* Not enough lines in the file; print the entire file. */
489 xlseek (fd, start_pos, SEEK_SET, pretty_filename);
490 dump_remainder (pretty_filename, fd, file_length);
491 return 0;
493 pos -= BUFSIZ;
494 xlseek (fd, pos, SEEK_SET, pretty_filename);
496 while ((bytes_read = safe_read (fd, buffer, BUFSIZ)) > 0);
498 if (bytes_read == -1)
500 error (0, errno, "%s", pretty_filename);
501 return 1;
504 return 0;
507 /* Print the last N_LINES lines from the end of the standard input,
508 open for reading as pipe FD.
509 Buffer the text as a linked list of LBUFFERs, adding them as needed.
510 Return 0 if successful, 1 if an error occured. */
512 static int
513 pipe_lines (const char *pretty_filename, int fd, long int n_lines)
515 struct linebuffer
517 int nbytes, nlines;
518 char buffer[BUFSIZ];
519 struct linebuffer *next;
521 typedef struct linebuffer LBUFFER;
522 LBUFFER *first, *last, *tmp;
523 int i; /* Index into buffers. */
524 int total_lines = 0; /* Total number of newlines in all buffers. */
525 int errors = 0;
526 int nbytes; /* Size of most recent read */
528 first = last = (LBUFFER *) xmalloc (sizeof (LBUFFER));
529 first->nbytes = first->nlines = 0;
530 first->next = NULL;
531 tmp = (LBUFFER *) xmalloc (sizeof (LBUFFER));
533 /* Input is always read into a fresh buffer. */
534 while ((nbytes = tmp->nbytes = safe_read (fd, tmp->buffer, BUFSIZ)) > 0)
536 tmp->nlines = 0;
537 tmp->next = NULL;
539 /* Count the number of newlines just read. */
540 for (i = 0; i < tmp->nbytes; i++)
541 if (tmp->buffer[i] == '\n')
542 ++tmp->nlines;
543 total_lines += tmp->nlines;
545 /* If there is enough room in the last buffer read, just append the new
546 one to it. This is because when reading from a pipe, `nbytes' can
547 often be very small. */
548 if (tmp->nbytes + last->nbytes < BUFSIZ)
550 memcpy (&last->buffer[last->nbytes], tmp->buffer, tmp->nbytes);
551 last->nbytes += tmp->nbytes;
552 last->nlines += tmp->nlines;
554 else
556 /* If there's not enough room, link the new buffer onto the end of
557 the list, then either free up the oldest buffer for the next
558 read if that would leave enough lines, or else malloc a new one.
559 Some compaction mechanism is possible but probably not
560 worthwhile. */
561 last = last->next = tmp;
562 if (total_lines - first->nlines > n_lines)
564 tmp = first;
565 total_lines -= first->nlines;
566 first = first->next;
568 else
569 tmp = (LBUFFER *) xmalloc (sizeof (LBUFFER));
573 free ((char *) tmp);
575 if (nbytes < 0)
577 error (0, errno, "%s", pretty_filename);
578 errors = 1;
579 goto free_lbuffers;
582 /* If the file is empty, then bail out. */
583 if (last->nbytes == 0)
584 goto free_lbuffers;
586 /* This prevents a core dump when the pipe contains no newlines. */
587 if (n_lines == 0)
588 goto free_lbuffers;
590 /* Count the incomplete line on files that don't end with a newline. */
591 if (last->buffer[last->nbytes - 1] != '\n')
593 ++last->nlines;
594 ++total_lines;
597 /* Run through the list, printing lines. First, skip over unneeded
598 buffers. */
599 for (tmp = first; total_lines - tmp->nlines > n_lines; tmp = tmp->next)
600 total_lines -= tmp->nlines;
602 /* Find the correct beginning, then print the rest of the file. */
603 if (total_lines > n_lines)
605 const char *cp;
607 /* Skip `total_lines' - `n_lines' newlines. We made sure that
608 `total_lines' - `n_lines' <= `tmp->nlines'. */
609 cp = tmp->buffer;
610 for (i = total_lines - n_lines; i; --i)
611 while (*cp++ != '\n')
612 /* Do nothing. */ ;
613 i = cp - tmp->buffer;
615 else
616 i = 0;
617 xwrite (STDOUT_FILENO, &tmp->buffer[i], tmp->nbytes - i);
619 for (tmp = tmp->next; tmp; tmp = tmp->next)
620 xwrite (STDOUT_FILENO, tmp->buffer, tmp->nbytes);
622 free_lbuffers:
623 while (first)
625 tmp = first->next;
626 free ((char *) first);
627 first = tmp;
629 return errors;
632 /* Print the last N_BYTES characters from the end of pipe FD.
633 This is a stripped down version of pipe_lines.
634 Return 0 if successful, 1 if an error occurred. */
636 static int
637 pipe_bytes (const char *pretty_filename, int fd, off_t n_bytes)
639 struct charbuffer
641 int nbytes;
642 char buffer[BUFSIZ];
643 struct charbuffer *next;
645 typedef struct charbuffer CBUFFER;
646 CBUFFER *first, *last, *tmp;
647 int i; /* Index into buffers. */
648 int total_bytes = 0; /* Total characters in all buffers. */
649 int errors = 0;
651 first = last = (CBUFFER *) xmalloc (sizeof (CBUFFER));
652 first->nbytes = 0;
653 first->next = NULL;
654 tmp = (CBUFFER *) xmalloc (sizeof (CBUFFER));
656 /* Input is always read into a fresh buffer. */
657 while ((tmp->nbytes = safe_read (fd, tmp->buffer, BUFSIZ)) > 0)
659 tmp->next = NULL;
661 total_bytes += tmp->nbytes;
662 /* If there is enough room in the last buffer read, just append the new
663 one to it. This is because when reading from a pipe, `nbytes' can
664 often be very small. */
665 if (tmp->nbytes + last->nbytes < BUFSIZ)
667 memcpy (&last->buffer[last->nbytes], tmp->buffer, tmp->nbytes);
668 last->nbytes += tmp->nbytes;
670 else
672 /* If there's not enough room, link the new buffer onto the end of
673 the list, then either free up the oldest buffer for the next
674 read if that would leave enough characters, or else malloc a new
675 one. Some compaction mechanism is possible but probably not
676 worthwhile. */
677 last = last->next = tmp;
678 if (total_bytes - first->nbytes > n_bytes)
680 tmp = first;
681 total_bytes -= first->nbytes;
682 first = first->next;
684 else
686 tmp = (CBUFFER *) xmalloc (sizeof (CBUFFER));
690 if (tmp->nbytes == -1)
692 error (0, errno, "%s", pretty_filename);
693 errors = 1;
694 free ((char *) tmp);
695 goto free_cbuffers;
698 free ((char *) tmp);
700 /* Run through the list, printing characters. First, skip over unneeded
701 buffers. */
702 for (tmp = first; total_bytes - tmp->nbytes > n_bytes; tmp = tmp->next)
703 total_bytes -= tmp->nbytes;
705 /* Find the correct beginning, then print the rest of the file.
706 We made sure that `total_bytes' - `n_bytes' <= `tmp->nbytes'. */
707 if (total_bytes > n_bytes)
708 i = total_bytes - n_bytes;
709 else
710 i = 0;
711 xwrite (STDOUT_FILENO, &tmp->buffer[i], tmp->nbytes - i);
713 for (tmp = tmp->next; tmp; tmp = tmp->next)
714 xwrite (STDOUT_FILENO, tmp->buffer, tmp->nbytes);
716 free_cbuffers:
717 while (first)
719 tmp = first->next;
720 free ((char *) first);
721 first = tmp;
723 return errors;
726 /* Skip N_BYTES characters from the start of pipe FD, and print
727 any extra characters that were read beyond that.
728 Return 1 on error, 0 if ok. */
730 static int
731 start_bytes (const char *pretty_filename, int fd, off_t n_bytes)
733 char buffer[BUFSIZ];
734 int bytes_read = 0;
736 while (n_bytes > 0 && (bytes_read = safe_read (fd, buffer, BUFSIZ)) > 0)
737 n_bytes -= bytes_read;
738 if (bytes_read == -1)
740 error (0, errno, "%s", pretty_filename);
741 return 1;
743 else if (n_bytes < 0)
744 xwrite (STDOUT_FILENO, &buffer[bytes_read + n_bytes], -n_bytes);
745 return 0;
748 /* Skip N_LINES lines at the start of file or pipe FD, and print
749 any extra characters that were read beyond that.
750 Return 1 on error, 0 if ok. */
752 static int
753 start_lines (const char *pretty_filename, int fd, long int n_lines)
755 char buffer[BUFSIZ];
756 int bytes_read = 0;
757 int bytes_to_skip = 0;
759 while (n_lines && (bytes_read = safe_read (fd, buffer, BUFSIZ)) > 0)
761 bytes_to_skip = 0;
762 while (bytes_to_skip < bytes_read)
763 if (buffer[bytes_to_skip++] == '\n' && --n_lines == 0)
764 break;
766 if (bytes_read == -1)
768 error (0, errno, "%s", pretty_filename);
769 return 1;
771 else if (bytes_to_skip < bytes_read)
773 xwrite (STDOUT_FILENO, &buffer[bytes_to_skip],
774 bytes_read - bytes_to_skip);
776 return 0;
779 /* FIXME: describe */
781 static void
782 recheck (struct File_spec *f)
784 /* open/fstat the file and announce if dev/ino have changed */
785 struct stat new_stats;
786 int fd;
787 int fail = 0;
788 int is_stdin = (STREQ (f->name, "-"));
789 int was_tailable = f->tailable;
790 int prev_errnum = f->errnum;
791 int new_file;
793 assert (valid_file_spec (f));
795 fd = (is_stdin ? STDIN_FILENO : open (f->name, O_RDONLY));
797 /* If the open fails because the file doesn't exist,
798 then mark the file as not tailable. */
799 f->tailable = !(reopen_inaccessible_files && fd == -1);
801 if (fd == -1 || fstat (fd, &new_stats) < 0)
803 fail = 1;
804 f->errnum = errno;
805 if (!f->tailable)
807 if (was_tailable)
809 /* FIXME-maybe: detect the case in which the file first becomes
810 unreadable (perms), and later becomes readable again and can
811 be seen to be the same file (dev/ino). Otherwise, tail prints
812 the entire contents of the file when it becomes readable. */
813 error (0, f->errnum, _("`%s' has become inaccessible"),
814 pretty_name (f));
816 else
818 /* say nothing... it's still not tailable */
821 else if (prev_errnum != errno)
823 error (0, errno, "%s", pretty_name (f));
826 else if (!IS_TAILABLE_FILE_TYPE (new_stats.st_mode))
828 fail = 1;
829 f->errnum = -1;
830 error (0, 0, _("`%s' has been replaced with an untailable file;\
831 giving up on this name"),
832 pretty_name (f));
833 f->ignore = 1;
835 else
837 f->errnum = 0;
840 new_file = 0;
841 if (fail)
843 close_fd (fd, pretty_name (f));
844 close_fd (f->fd, pretty_name (f));
845 f->fd = -1;
847 else if (prev_errnum && prev_errnum != ENOENT)
849 new_file = 1;
850 assert (f->fd == -1);
851 error (0, 0, _("`%s' has become accessible"), pretty_name (f));
853 else if (f->ino != new_stats.st_ino || f->dev != new_stats.st_dev)
855 new_file = 1;
856 if (f->fd == -1)
858 error (0, 0,
859 _("`%s' has appeared; following end of new file"),
860 pretty_name (f));
862 else
864 /* Close the old one. */
865 close_fd (f->fd, pretty_name (f));
867 /* File has been replaced (e.g., via log rotation) --
868 tail the new one. */
869 error (0, 0,
870 _("`%s' has been replaced; following end of new file"),
871 pretty_name (f));
874 else
876 if (f->fd == -1)
878 /* This happens when one iteration finds the file missing,
879 then the preceding <dev,inode> pair is reused as the
880 file is recreated. */
881 new_file = 1;
883 else
885 close_fd (fd, pretty_name (f));
889 if (new_file)
891 /* Record new file info in f. */
892 f->fd = fd;
893 f->size = 0; /* Start at the beginning of the file... */
894 f->dev = new_stats.st_dev;
895 f->ino = new_stats.st_ino;
896 f->n_unchanged_stats = 0;
897 f->n_consecutive_size_changes = 0;
898 f->ignore = 0;
899 xlseek (f->fd, f->size, SEEK_SET, pretty_name (f));
903 /* FIXME: describe */
905 static unsigned int
906 n_live_files (const struct File_spec *f, int n_files)
908 int i;
909 unsigned int n_live = 0;
911 for (i = 0; i < n_files; i++)
913 if (f[i].fd >= 0)
914 ++n_live;
916 return n_live;
919 /* Tail NFILES files forever, or until killed.
920 The pertinent information for each file is stored in an entry of F.
921 Loop over each of them, doing an fstat to see if they have changed size,
922 and an occasional open/fstat to see if any dev/ino pair has changed.
923 If none of them have changed size in one iteration, sleep for a
924 while and try again. Continue until the user interrupts us. */
926 static void
927 tail_forever (struct File_spec *f, int nfiles)
929 int last;
930 int writer_is_dead = 0;
932 last = nfiles - 1;
934 while (1)
936 int i;
937 int any_changed;
939 any_changed = 0;
940 for (i = 0; i < nfiles; i++)
942 struct stat stats;
944 if (f[i].ignore)
945 continue;
947 if (f[i].fd < 0)
949 recheck (&f[i]);
950 continue;
953 if (fstat (f[i].fd, &stats) < 0)
955 f[i].fd = -1;
956 f[i].errnum = errno;
957 error (0, errno, "%s", pretty_name (&f[i]));
958 continue;
961 if (stats.st_size == f[i].size)
963 f[i].n_consecutive_size_changes = 0;
964 if (++f[i].n_unchanged_stats > max_n_unchanged_stats_between_opens
965 && follow_mode == Follow_name)
967 recheck (&f[i]);
968 f[i].n_unchanged_stats = 0;
970 continue;
973 /* Size changed. */
974 ++f[i].n_consecutive_size_changes;
976 /* Ensure that a file that's unlinked or moved aside, yet always
977 growing will be recognized as having been renamed. */
978 if (follow_mode == Follow_name
979 && (f[i].n_consecutive_size_changes
980 > max_n_consecutive_size_changes_between_opens))
982 f[i].n_consecutive_size_changes = 0;
983 recheck (&f[i]);
984 continue;
987 /* This file has changed size. Print out what we can, and
988 then keep looping. */
990 any_changed = 1;
992 /* reset counter */
993 f[i].n_unchanged_stats = 0;
995 if (stats.st_size < f[i].size)
997 error (0, 0, _("%s: file truncated"), pretty_name (&f[i]));
998 last = i;
999 xlseek (f[i].fd, (off_t) stats.st_size, SEEK_SET,
1000 pretty_name (&f[i]));
1001 f[i].size = stats.st_size;
1002 continue;
1005 if (i != last)
1007 if (print_headers)
1008 write_header (pretty_name (&f[i]));
1009 last = i;
1011 f[i].size += dump_remainder (pretty_name (&f[i]), f[i].fd,
1012 COPY_TO_EOF);
1015 if (n_live_files (f, nfiles) == 0 && ! reopen_inaccessible_files)
1017 error (0, 0, _("no files remaining"));
1018 break;
1021 /* If none of the files changed size, sleep. */
1022 if (!any_changed)
1024 if (writer_is_dead)
1025 break;
1026 sleep (sleep_interval);
1028 /* Once the writer is dead, read the files once more to
1029 avoid a race condition. */
1030 writer_is_dead = (pid != 0
1031 && kill (pid, 0) != 0
1032 /* Handle the case in which you cannot send a
1033 signal to the writer, so kill fails and sets
1034 errno to EPERM. */
1035 && errno != EPERM);
1040 /* Output the last N_BYTES bytes of file FILENAME open for reading in FD.
1041 Return 0 if successful, 1 if an error occurred. */
1043 static int
1044 tail_bytes (const char *pretty_filename, int fd, off_t n_bytes)
1046 struct stat stats;
1048 /* We need binary input, since `tail' relies on `lseek' and byte counts,
1049 while binary output will preserve the style (Unix/DOS) of text file. */
1050 SET_BINARY2 (fd, STDOUT_FILENO);
1052 if (fstat (fd, &stats))
1054 error (0, errno, "%s", pretty_filename);
1055 return 1;
1058 if (from_start)
1060 if (S_ISREG (stats.st_mode))
1062 xlseek (fd, n_bytes, SEEK_CUR, pretty_filename);
1064 else if (start_bytes (pretty_filename, fd, n_bytes))
1066 return 1;
1068 dump_remainder (pretty_filename, fd, COPY_TO_EOF);
1070 else
1072 if (S_ISREG (stats.st_mode))
1074 off_t current_pos, end_pos;
1075 size_t bytes_remaining;
1077 if ((current_pos = lseek (fd, (off_t) 0, SEEK_CUR)) != -1
1078 && (end_pos = lseek (fd, (off_t) 0, SEEK_END)) != -1)
1080 off_t diff;
1081 /* Be careful here. The current position may actually be
1082 beyond the end of the file. */
1083 bytes_remaining = (diff = end_pos - current_pos) < 0 ? 0 : diff;
1085 else
1087 error (0, errno, "%s", pretty_filename);
1088 return 1;
1091 if (bytes_remaining <= n_bytes)
1093 /* From the current position to end of file, there are no
1094 more bytes than have been requested. So reposition the
1095 file pointer to the incoming current position and print
1096 everything after that. */
1097 xlseek (fd, current_pos, SEEK_SET, pretty_filename);
1099 else
1101 /* There are more bytes remaining than were requested.
1102 Back up. */
1103 xlseek (fd, -n_bytes, SEEK_END, pretty_filename);
1105 dump_remainder (pretty_filename, fd, n_bytes);
1107 else
1108 return pipe_bytes (pretty_filename, fd, n_bytes);
1110 return 0;
1113 /* Output the last N_LINES lines of file FILENAME open for reading in FD.
1114 Return 0 if successful, 1 if an error occurred. */
1116 static int
1117 tail_lines (const char *pretty_filename, int fd, long int n_lines)
1119 struct stat stats;
1121 /* We need binary input, since `tail' relies on `lseek' and byte counts,
1122 while binary output will preserve the style (Unix/DOS) of text file. */
1123 SET_BINARY2 (fd, STDOUT_FILENO);
1125 if (fstat (fd, &stats))
1127 error (0, errno, "%s", pretty_filename);
1128 return 1;
1131 if (from_start)
1133 if (start_lines (pretty_filename, fd, n_lines))
1134 return 1;
1135 dump_remainder (pretty_filename, fd, COPY_TO_EOF);
1137 else
1139 off_t length;
1140 off_t start_pos;
1142 /* Use file_lines only if FD refers to a regular file for
1143 which lseek (... SEEK_END) works. */
1144 if (S_ISREG (stats.st_mode)
1145 && (start_pos = lseek (fd, (off_t) 0, SEEK_CUR)) != -1
1146 && start_pos < (length = lseek (fd, (off_t) 0, SEEK_END)))
1148 if (length != 0 && file_lines (pretty_filename, fd, n_lines,
1149 start_pos, length))
1150 return 1;
1152 else
1153 return pipe_lines (pretty_filename, fd, n_lines);
1155 return 0;
1158 /* Display the last N_UNITS units of file FILENAME, open for reading
1159 in FD.
1160 Return 0 if successful, 1 if an error occurred. */
1162 static int
1163 tail (const char *pretty_filename, int fd, off_t n_units)
1165 if (count_lines)
1166 return tail_lines (pretty_filename, fd, (long) n_units);
1167 else
1168 return tail_bytes (pretty_filename, fd, n_units);
1171 /* Display the last N_UNITS units of the file described by F.
1172 Return 0 if successful, 1 if an error occurred. */
1174 static int
1175 tail_file (struct File_spec *f, off_t n_units)
1177 int fd, errors;
1179 int is_stdin = (STREQ (f->name, "-"));
1181 if (is_stdin)
1183 have_read_stdin = 1;
1184 fd = STDIN_FILENO;
1186 else
1188 fd = open (f->name, O_RDONLY);
1191 f->tailable = !(reopen_inaccessible_files && fd == -1);
1193 if (fd == -1)
1195 if (forever)
1197 f->fd = -1;
1198 f->errnum = errno;
1199 f->ignore = 0;
1200 f->ino = 0;
1201 f->dev = 0;
1203 error (0, errno, "%s", pretty_name (f));
1204 errors = 1;
1206 else
1208 if (print_headers)
1209 write_header (pretty_name (f));
1210 errors = tail (pretty_name (f), fd, n_units);
1211 if (forever)
1213 struct stat stats;
1215 f->errnum = 0;
1216 if (fstat (fd, &stats) < 0)
1218 errors = 1;
1219 f->errnum = errno;
1220 error (0, errno, "%s", pretty_name (f));
1222 else if (!IS_TAILABLE_FILE_TYPE (stats.st_mode))
1224 error (0, 0, _("%s: cannot follow end of this type of file;\
1225 giving up on this name"),
1226 pretty_name (f));
1227 errors = 1;
1228 f->errnum = -1;
1229 f->ignore = 1;
1232 if (errors)
1234 close_fd (fd, pretty_name (f));
1235 f->fd = -1;
1237 else
1239 f->fd = fd;
1240 f->size = stats.st_size;
1241 f->dev = stats.st_dev;
1242 f->ino = stats.st_ino;
1243 f->n_unchanged_stats = 0;
1244 f->n_consecutive_size_changes = 0;
1245 f->ignore = 0;
1248 else
1250 if (!is_stdin && close (fd))
1252 error (0, errno, "%s", pretty_name (f));
1253 errors = 1;
1258 return errors;
1261 /* If the command line arguments are of the obsolescent form and the
1262 option string is well-formed, set *FAIL to zero, set *N_UNITS, the
1263 globals COUNT_LINES, FOREVER, and FROM_START, and return non-zero.
1264 Otherwise, if the command line arguments appear to be of the
1265 obsolescent form but the option string is malformed, set *FAIL to
1266 non-zero, don't modify any other parameter or global variable, and
1267 return non-zero. Otherwise, return zero and don't modify any parameter
1268 or global variable. */
1270 static int
1271 parse_obsolescent_option (int argc, const char *const *argv,
1272 off_t *n_units, int *fail)
1274 const char *p = argv[1];
1275 const char *n_string = NULL;
1276 const char *n_string_end;
1278 int t_from_start;
1279 int t_count_lines;
1280 int t_forever;
1282 /* With the obsolescent form, there is one option string and
1283 (technically) at most one file argument. But we allow two or more
1284 by default. */
1285 if (argc < 2)
1286 return 0;
1288 /* If P starts with `+', `-N' (where N is a digit), or `-l',
1289 then it is obsolescent. Return zero otherwise. */
1290 if ( ! (p[0] == '+' || (p[0] == '-' && (p[1] == 'l' || ISDIGIT (p[1])))) )
1291 return 0;
1293 if (*p == '+')
1294 t_from_start = 1;
1295 else if (*p == '-')
1296 t_from_start = 0;
1297 else
1298 return 0;
1300 ++p;
1301 if (ISDIGIT (*p))
1303 n_string = p;
1306 ++p;
1308 while (ISDIGIT (*p));
1310 n_string_end = p;
1312 t_count_lines = 1;
1313 if (*p == 'c' || *p == 'b')
1315 t_count_lines = 0;
1316 ++p;
1318 else if (*p == 'l')
1320 ++p;
1323 t_forever = 0;
1324 if (*p == 'f')
1326 t_forever = 1;
1327 ++p;
1330 if (*p != '\0')
1332 /* If (argv[1] begins with a `+' or if it begins with `-' followed
1333 by a digit), but has an invalid suffix character, give a diagnostic
1334 and indicate to caller that this *is* of the obsolescent form,
1335 but that it's an invalid option. */
1336 if (t_from_start || n_string)
1338 error (0, 0,
1339 _("%c: invalid suffix character in obsolescent option" ), *p);
1340 *fail = 1;
1341 return 1;
1344 /* Otherwise, it might be a valid non-obsolescent option like -n. */
1345 return 0;
1348 *fail = 0;
1349 if (n_string == NULL)
1350 *n_units = DEFAULT_N_LINES;
1351 else
1353 strtol_error s_err;
1354 unsigned long int tmp_ulong;
1355 char *end;
1357 s_err = xstrtoul (n_string, &end, 10, &tmp_ulong,
1358 *n_string_end == 'b' ? "b" : NULL);
1359 if (s_err == LONGINT_OK && tmp_ulong <= OFF_T_MAX)
1360 *n_units = (off_t) tmp_ulong;
1361 else
1363 /* Extract a NUL-terminated string for the error message. */
1364 size_t len = n_string_end - n_string;
1365 char *n_string_tmp = xmalloc (len + 1);
1367 strncpy (n_string_tmp, n_string, len);
1368 n_string_tmp[len] = '\0';
1370 error (0, 0,
1371 _("%s: %s is so large that it is not representable"),
1372 n_string_tmp, (t_count_lines
1373 ? _("number of lines")
1374 : _("number of bytes")));
1375 free (n_string_tmp);
1376 *fail = 1;
1380 if (!*fail)
1382 if (argc > 3)
1384 int posix_pedantic = (getenv ("POSIXLY_CORRECT") != NULL);
1386 /* When POSIXLY_CORRECT is set, enforce the `at most one
1387 file argument' requirement. */
1388 if (posix_pedantic)
1390 error (0, 0, _("\
1391 too many arguments; When using tail's obsolescent option syntax (%s)\n\
1392 there may be no more than one file argument. Use the equivalent -n or -c\n\
1393 option instead."), argv[1]);
1394 *fail = 1;
1395 return 1;
1398 #if DISABLED /* FIXME: enable or remove this warning. */
1399 error (0, 0, _("\
1400 Warning: it is not portable to use two or more file arguments with\n\
1401 tail's obsolescent option syntax (%s). Use the equivalent -n or -c\n\
1402 option instead."), argv[1]);
1403 #endif
1406 /* Set globals. */
1407 from_start = t_from_start;
1408 count_lines = t_count_lines;
1409 forever = t_forever;
1412 return 1;
1415 static void
1416 parse_options (int argc, char **argv,
1417 off_t *n_units, enum header_mode *header_mode)
1419 int c;
1421 count_lines = 1;
1422 forever = from_start = print_headers = 0;
1424 while ((c = getopt_long (argc, argv, "c:n:fFqs:v", long_options, NULL))
1425 != -1)
1427 switch (c)
1429 case 0:
1430 break;
1432 case 'F':
1433 forever = 1;
1434 follow_mode = Follow_name;
1435 reopen_inaccessible_files = 1;
1436 break;
1438 case 'c':
1439 case 'n':
1440 count_lines = (c == 'n');
1441 if (*optarg == '+')
1442 from_start = 1;
1443 else if (*optarg == '-')
1444 ++optarg;
1447 strtol_error s_err;
1448 uintmax_t n;
1449 s_err = xstrtoumax (optarg, NULL, 10, &n, "bkm");
1450 if (s_err == LONGINT_INVALID)
1452 error (EXIT_FAILURE, 0, "%s: %s", optarg,
1453 (c == 'n'
1454 ? _("invalid number of lines")
1455 : _("invalid number of bytes")));
1458 if (s_err != LONGINT_OK)
1459 error (EXIT_FAILURE, 0,
1460 _("%s: is so large that it is not representable"), optarg);
1462 if (OFF_T_MAX < n)
1463 error (EXIT_FAILURE, 0,
1464 _("%s is larger than the maximum file size on this system"),
1465 optarg);
1466 *n_units = (off_t) n;
1468 break;
1470 case 'f':
1471 case LONG_FOLLOW_OPTION:
1472 forever = 1;
1473 if (optarg == NULL)
1474 follow_mode = DEFAULT_FOLLOW_MODE;
1475 else
1476 follow_mode = XARGMATCH ("--follow", optarg,
1477 follow_mode_string, follow_mode_map);
1478 break;
1480 case RETRY_OPTION:
1481 reopen_inaccessible_files = 1;
1482 break;
1484 case MAX_UNCHANGED_STATS_OPTION:
1485 /* --max-unchanged-stats=N */
1486 if (xstrtoul (optarg, NULL, 10,
1487 &max_n_unchanged_stats_between_opens, "") != LONGINT_OK)
1489 error (EXIT_FAILURE, 0,
1490 _("%s: invalid maximum number of unchanged stats between opens"),
1491 optarg);
1493 break;
1495 case MAX_CONSECUTIVE_SIZE_CHANGES_OPTION:
1496 /* --max-consecutive-size-changes=N */
1497 if (xstrtoul (optarg, NULL, 10,
1498 &max_n_consecutive_size_changes_between_opens, "")
1499 != LONGINT_OK)
1501 error (EXIT_FAILURE, 0,
1502 _("%s: invalid maximum number of consecutive size changes"),
1503 optarg);
1505 break;
1507 case PID_OPTION:
1509 strtol_error s_err;
1510 unsigned long int tmp_ulong;
1511 s_err = xstrtoul (optarg, NULL, 10, &tmp_ulong, "");
1512 if (s_err != LONGINT_OK || tmp_ulong > PID_T_MAX)
1514 error (EXIT_FAILURE, 0, _("%s: invalid PID"), optarg);
1516 pid = tmp_ulong;
1518 break;
1520 case 'q':
1521 *header_mode = never;
1522 break;
1524 case 's':
1526 strtol_error s_err;
1527 unsigned long int tmp_ulong;
1528 s_err = xstrtoul (optarg, NULL, 10, &tmp_ulong, "");
1529 if (s_err != LONGINT_OK || tmp_ulong > UINT_MAX)
1531 error (EXIT_FAILURE, 0,
1532 _("%s: invalid number of seconds"), optarg);
1534 sleep_interval = tmp_ulong;
1536 break;
1538 case 'v':
1539 *header_mode = always;
1540 break;
1542 case_GETOPT_HELP_CHAR;
1544 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1546 default:
1547 usage (1);
1551 if (reopen_inaccessible_files && follow_mode != Follow_name)
1552 error (0, 0, _("warning: --retry is useful only when following by name"));
1554 if (pid && !forever)
1555 error (0, 0,
1556 _("warning: PID ignored; --pid=PID is useful only when following"));
1557 else if (pid && kill (pid, 0) != 0 && errno == ENOSYS)
1559 error (0, 0, _("warning: --pid=PID is not supported on this system"));
1560 pid = 0;
1565 main (int argc, char **argv)
1567 enum header_mode header_mode = multiple_files;
1568 int exit_status = 0;
1569 /* If from_start, the number of items to skip before printing; otherwise,
1570 the number of items at the end of the file to print. Although the type
1571 is signed, the value is never negative. */
1572 off_t n_units = DEFAULT_N_LINES;
1573 int n_files;
1574 char **file;
1575 struct File_spec *F;
1576 int i;
1578 program_name = argv[0];
1579 setlocale (LC_ALL, "");
1580 bindtextdomain (PACKAGE, LOCALEDIR);
1581 textdomain (PACKAGE);
1583 atexit (close_stdout);
1585 have_read_stdin = 0;
1588 int found_obsolescent;
1589 int fail;
1590 found_obsolescent = parse_obsolescent_option (argc,
1591 (const char *const *) argv,
1592 &n_units, &fail);
1593 if (found_obsolescent)
1595 if (fail)
1596 exit (EXIT_FAILURE);
1597 optind = 2;
1599 else
1601 parse_options (argc, argv, &n_units, &header_mode);
1605 /* To start printing with item N_UNITS from the start of the file, skip
1606 N_UNITS - 1 items. `tail +0' is actually meaningless, but for Unix
1607 compatibility it's treated the same as `tail +1'. */
1608 if (from_start)
1610 if (n_units)
1611 --n_units;
1614 n_files = argc - optind;
1615 file = argv + optind;
1617 if (n_files == 0)
1619 static char *dummy_stdin = "-";
1620 n_files = 1;
1621 file = &dummy_stdin;
1624 F = (struct File_spec *) xmalloc (n_files * sizeof (F[0]));
1625 for (i = 0; i < n_files; i++)
1626 F[i].name = file[i];
1628 if (header_mode == always
1629 || (header_mode == multiple_files && n_files > 1))
1630 print_headers = 1;
1632 for (i = 0; i < n_files; i++)
1633 exit_status |= tail_file (&F[i], n_units);
1635 if (forever)
1637 /* This fflush appears to be required only on Solaris2.7. */
1638 if (fflush (stdout) < 0)
1639 error (EXIT_FAILURE, errno, _("write error"));
1641 SETVBUF (stdout, NULL, _IONBF, 0);
1642 tail_forever (F, n_files);
1645 if (have_read_stdin && close (0) < 0)
1646 error (EXIT_FAILURE, errno, "-");
1647 exit (exit_status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);