(usage): Warn that the +N form will be withdrawn.
[platform/upstream/coreutils.git] / src / tail.c
1 /* tail -- output the last part of file(s)
2    Copyright (C) 1989, 90, 91, 1995-2001 Free Software Foundation, Inc.
3
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.
8
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.
13
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.  */
17
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.
21
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>.  */
25
26 #include <config.h>
27
28 #include <stdio.h>
29 #include <assert.h>
30 #include <getopt.h>
31 #include <sys/types.h>
32 #include <signal.h>
33
34 #include "system.h"
35 #include "closeout.h"
36 #include "argmatch.h"
37 #include "error.h"
38 #include "safe-read.h"
39 #include "xstrtol.h"
40
41 /* The official name of this program (e.g., no `g' prefix).  */
42 #define PROGRAM_NAME "tail"
43
44 #define AUTHORS \
45   "Paul Rubin, David MacKenzie, Ian Lance Taylor, and Jim Meyering"
46
47 #ifndef ENOSYS
48   /* Some systems don't have ENOSYS -- this should be a big enough
49      value that no valid errno value will match it.  */
50 # define ENOSYS 99999
51 #endif
52
53 /* Number of items to tail.  */
54 #define DEFAULT_N_LINES 10
55
56 /* Size of atomic reads.  */
57 #ifndef BUFSIZ
58 # define BUFSIZ (512 * 8)
59 #endif
60
61 /* A special value for dump_remainder's N_BYTES parameter.  */
62 #define COPY_TO_EOF OFF_T_MAX
63
64 /* FIXME: make Follow_name the default?  */
65 #define DEFAULT_FOLLOW_MODE Follow_descriptor
66
67 enum Follow_mode
68 {
69   /* Follow the name of each file: if the file is renamed, try to reopen
70      that name and track the end of the new file if/when it's recreated.
71      This is useful for tracking logs that are occasionally rotated.  */
72   Follow_name = 1,
73
74   /* Follow each descriptor obtained upon opening a file.
75      That means we'll continue to follow the end of a file even after
76      it has been renamed or unlinked.  */
77   Follow_descriptor = 2
78 };
79
80 /* The types of files for which tail works.  */
81 #define IS_TAILABLE_FILE_TYPE(Mode) \
82   (S_ISREG (Mode) || S_ISFIFO (Mode) || S_ISCHR (Mode))
83
84 static char const *const follow_mode_string[] =
85 {
86   "descriptor", "name", 0
87 };
88
89 static enum Follow_mode const follow_mode_map[] =
90 {
91   Follow_descriptor, Follow_name,
92 };
93
94 struct File_spec
95 {
96   /* The actual file name, or "-" for stdin.  */
97   char *name;
98
99   /* File descriptor on which the file is open; -1 if it's not open.  */
100   int fd;
101
102   /* The size of the file the last time we checked.  */
103   off_t size;
104
105   /* The device and inode of the file the last time we checked.  */
106   dev_t dev;
107   ino_t ino;
108
109   /* The specified name initially referred to a directory or some other
110      type for which tail isn't meaningful.  Unlike for a permission problem
111      (tailable, below) once this is set, the name is not checked ever again.  */
112   int ignore;
113
114   /* See description of DEFAULT_MAX_N_... below.  */
115   unsigned int n_unchanged_stats;
116
117   /* See description of DEFAULT_MAX_N_... below.  */
118   unsigned int n_consecutive_size_changes;
119
120   /* A file is tailable if it exists, is readable, and is of type
121      IS_TAILABLE_FILE_TYPE.  */
122   int tailable;
123
124   /* The value of errno seen last time we checked this file.  */
125   int errnum;
126
127 };
128
129 /* Keep trying to open a file even if it is inaccessible when tail starts
130    or if it becomes inaccessible later -- useful only with -f.  */
131 static int reopen_inaccessible_files;
132
133 /* If nonzero, interpret the numeric argument as the number of lines.
134    Otherwise, interpret it as the number of bytes.  */
135 static int count_lines;
136
137 /* Whether we follow the name of each file or the file descriptor
138    that is initially associated with each name.  */
139 static enum Follow_mode follow_mode = Follow_descriptor;
140
141 /* If nonzero, read from the ends of all specified files until killed.  */
142 static int forever;
143
144 /* If nonzero, count from start of file instead of end.  */
145 static int from_start;
146
147 /* If nonzero, print filename headers.  */
148 static int print_headers;
149
150 /* When to print the filename banners.  */
151 enum header_mode
152 {
153   multiple_files, always, never
154 };
155
156 /* When tailing a file by name, if there have been this many consecutive
157    iterations for which the size has remained the same, then open/fstat
158    the file to determine if that file name is still associated with the
159    same device/inode-number pair as before.  This option is meaningful only
160    when following by name.  --max-unchanged-stats=N  */
161 #define DEFAULT_MAX_N_UNCHANGED_STATS_BETWEEN_OPENS 5
162 static unsigned long max_n_unchanged_stats_between_opens =
163   DEFAULT_MAX_N_UNCHANGED_STATS_BETWEEN_OPENS;
164
165 /* This variable is used to ensure that a file that is unlinked or moved
166    aside, yet always growing will be recognized as having been renamed.
167    After detecting this many consecutive size changes for a file, open/fstat
168    the file to determine if that file name is still associated with the
169    same device/inode-number pair as before.  This option is meaningful only
170    when following by name.  --max-consecutive-size-changes=N  */
171 #define DEFAULT_MAX_N_CONSECUTIVE_SIZE_CHANGES 200
172 static unsigned long max_n_consecutive_size_changes_between_opens =
173   DEFAULT_MAX_N_CONSECUTIVE_SIZE_CHANGES;
174
175 /* The name this program was run with.  */
176 char *program_name;
177
178 /* The number of seconds to sleep between iterations.
179    During one iteration, every file name or descriptor is checked to
180    see if it has changed.  */
181 /* FIXME: allow fractional seconds */
182 static unsigned int sleep_interval = 1;
183
184 /* The process ID of the process (presumably on the current host)
185    that is writing to all followed files.  */
186 static pid_t pid;
187
188 /* Nonzero if we have ever read standard input.  */
189 static int have_read_stdin;
190
191 /* For long options that have no equivalent short option, use a
192    non-character as a pseudo short option, starting with CHAR_MAX + 1.  */
193 enum
194 {
195   RETRY_OPTION = CHAR_MAX + 1,
196   MAX_UNCHANGED_STATS_OPTION,
197
198   /* FIXME: remove this in 2001, unless someone can show a good
199      reason to keep it.  */
200   MAX_CONSECUTIVE_SIZE_CHANGES_OPTION,
201
202   PID_OPTION,
203   LONG_FOLLOW_OPTION
204 };
205
206 static struct option const long_options[] =
207 {
208   /* --allow-missing is deprecated; use --retry instead
209      FIXME: remove it some day */
210   {"allow-missing", no_argument, NULL, RETRY_OPTION},
211   {"bytes", required_argument, NULL, 'c'},
212   {"follow", optional_argument, NULL, LONG_FOLLOW_OPTION},
213   {"lines", required_argument, NULL, 'n'},
214   {"max-unchanged-stats", required_argument, NULL, MAX_UNCHANGED_STATS_OPTION},
215   {"max-consecutive-size-changes", required_argument, NULL,
216    MAX_CONSECUTIVE_SIZE_CHANGES_OPTION},
217   {"pid", required_argument, NULL, PID_OPTION},
218   {"quiet", no_argument, NULL, 'q'},
219   {"retry", no_argument, NULL, RETRY_OPTION},
220   {"silent", no_argument, NULL, 'q'},
221   {"sleep-interval", required_argument, NULL, 's'},
222   {"verbose", no_argument, NULL, 'v'},
223   {GETOPT_HELP_OPTION_DECL},
224   {GETOPT_VERSION_OPTION_DECL},
225   {NULL, 0, NULL, 0}
226 };
227
228 void
229 usage (int status)
230 {
231   if (status != 0)
232     fprintf (stderr, _("Try `%s --help' for more information.\n"),
233              program_name);
234   else
235     {
236       printf (_("\
237 Usage: %s [OPTION]... [FILE]...\n\
238 "),
239               program_name);
240       printf (_("\
241 Print the last %d lines of each FILE to standard output.\n\
242 With more than one FILE, precede each with a header giving the file name.\n\
243 With no FILE, or when FILE is -, read standard input.\n\
244 \n\
245       --retry              keep trying to open a file even if it is\n\
246                              inaccessible when tail starts or if it becomes\n\
247                              inaccessible later -- useful only with -f\n\
248   -c, --bytes=N            output the last N bytes\n\
249   -f, --follow[={name|descriptor}] output appended data as the file grows;\n\
250                              -f, --follow, and --follow=descriptor are\n\
251                              equivalent\n\
252   -n, --lines=N            output the last N lines, instead of the last %d\n\
253       --max-unchanged-stats=N\n\
254                            with --follow=name, reopen a FILE which has not\n\
255                              changed size after N (default %d) iterations\n\
256                              to see if it has been unlinked or renamed\n\
257                              (this is the usual case of rotated log files)\n\
258       --pid=PID            with -f, terminate after process ID, PID dies\n\
259   -q, --quiet, --silent    never output headers giving file names\n\
260   -s, --sleep-interval=S   with -f, each iteration lasts approximately S\n\
261                              (default 1) seconds\n\
262   -v, --verbose            always output headers giving file names\n\
263       --help               display this help and exit\n\
264       --version            output version information and exit\n\
265 \n\
266 "),
267               DEFAULT_N_LINES, DEFAULT_N_LINES,
268               DEFAULT_MAX_N_UNCHANGED_STATS_BETWEEN_OPENS
269               );
270       printf (_("\
271 If the first character of N (the number of bytes or lines) is a `+',\n\
272 print beginning with the Nth item from the start of each file, otherwise,\n\
273 print the last N items in the file.  N may have a multiplier suffix:\n\
274 b for 512, k for 1024, m for 1048576 (1 Meg).  A first OPTION of -VALUE\n\
275 or +VALUE is treated like -n VALUE or -n +VALUE unless VALUE has one of\n\
276 the [bkm] suffix multipliers, in which case it is treated like -c VALUE\n\
277 or -c +VALUE.  Warning: a first option of +VALUE is obsolescent, and support\n\
278 for it will be withdrawn.\n\
279 \n\
280 With --follow (-f), tail defaults to following the file descriptor, which\n\
281 means that even if a tail'ed file is renamed, tail will continue to track\n\
282 its end.  This default behavior is not desirable when you really want to\n\
283 track the actual name of the file, not the file descriptor (e.g., log\n\
284 rotation).  Use --follow=name in that case.  That causes tail to track the\n\
285 named file by reopening it periodically to see if it has been removed and\n\
286 recreated by some other program.\n\
287 \n\
288 "));
289       puts (_("\nReport bugs to <bug-textutils@gnu.org>."));
290     }
291   exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
292 }
293
294 static int
295 valid_file_spec (struct File_spec const *f)
296 {
297   /* Exactly one of the following subexpressions must be true. */
298   return ((f->fd == -1) ^ (f->errnum == 0));
299 }
300
301 static char *
302 pretty_name (struct File_spec const *f)
303 {
304   return (STREQ (f->name, "-") ? "standard input" : f->name);
305 }
306
307 static void
308 xwrite (int fd, char *const buffer, size_t n_bytes)
309 {
310   assert (fd == STDOUT_FILENO);
311   assert (n_bytes >= 0);
312   if (n_bytes > 0 && fwrite (buffer, 1, n_bytes, stdout) == 0)
313     error (EXIT_FAILURE, errno, _("write error"));
314 }
315
316 static void
317 close_fd (int fd, const char *filename)
318 {
319   if (fd != -1 && fd != STDIN_FILENO && close (fd))
320     {
321       error (0, errno, _("closing %s (fd=%d)"), filename, fd);
322     }
323 }
324
325 static void
326 write_header (const char *pretty_filename)
327 {
328   static int first_file = 1;
329
330   printf ("%s==> %s <==\n", (first_file ? "" : "\n"), pretty_filename);
331   first_file = 0;
332 }
333
334 /* Read and output N_BYTES of file PRETTY_FILENAME starting at the current
335    position in FD.  If N_BYTES is COPY_TO_EOF, then copy until end of file.
336    Return the number of bytes read from the file.  */
337
338 static long
339 dump_remainder (const char *pretty_filename, int fd, off_t n_bytes)
340 {
341   char buffer[BUFSIZ];
342   int bytes_read;
343   long n_written;
344   off_t n_remaining = n_bytes;
345
346   n_written = 0;
347   while (1)
348     {
349       long n = MIN (n_remaining, (off_t) BUFSIZ);
350       bytes_read = safe_read (fd, buffer, n);
351       if (bytes_read <= 0)
352         break;
353       xwrite (STDOUT_FILENO, buffer, bytes_read);
354       n_remaining -= bytes_read;
355       n_written += bytes_read;
356     }
357   if (bytes_read == -1)
358     error (EXIT_FAILURE, errno, "%s", pretty_filename);
359
360   return n_written;
361 }
362
363 /* Print the last N_LINES lines from the end of file FD.
364    Go backward through the file, reading `BUFSIZ' bytes at a time (except
365    probably the first), until we hit the start of the file or have
366    read NUMBER newlines.
367    FILE_LENGTH is the length of the file (one more than the offset of the
368    last byte of the file).
369    Return 0 if successful, 1 if an error occurred.  */
370
371 static int
372 file_lines (const char *pretty_filename, int fd, long int n_lines,
373             off_t file_length)
374 {
375   char buffer[BUFSIZ];
376   int bytes_read;
377   int i;                        /* Index into `buffer' for scanning.  */
378   off_t pos = file_length;
379
380   if (n_lines == 0)
381     return 0;
382
383   /* Set `bytes_read' to the size of the last, probably partial, buffer;
384      0 < `bytes_read' <= `BUFSIZ'.  */
385   bytes_read = pos % BUFSIZ;
386   if (bytes_read == 0)
387     bytes_read = BUFSIZ;
388   /* Make `pos' a multiple of `BUFSIZ' (0 if the file is short), so that all
389      reads will be on block boundaries, which might increase efficiency.  */
390   pos -= bytes_read;
391   /* FIXME: check lseek return value  */
392   lseek (fd, pos, SEEK_SET);
393   bytes_read = safe_read (fd, buffer, bytes_read);
394   if (bytes_read == -1)
395     {
396       error (0, errno, "%s", pretty_filename);
397       return 1;
398     }
399
400   /* Count the incomplete line on files that don't end with a newline.  */
401   if (bytes_read && buffer[bytes_read - 1] != '\n')
402     --n_lines;
403
404   do
405     {
406       /* Scan backward, counting the newlines in this bufferfull.  */
407       for (i = bytes_read - 1; i >= 0; i--)
408         {
409           /* Have we counted the requested number of newlines yet?  */
410           if (buffer[i] == '\n' && n_lines-- == 0)
411             {
412               /* If this newline wasn't the last character in the buffer,
413                  print the text after it.  */
414               if (i != bytes_read - 1)
415                 xwrite (STDOUT_FILENO, &buffer[i + 1], bytes_read - (i + 1));
416               dump_remainder (pretty_filename, fd,
417                               file_length - (pos + bytes_read));
418               return 0;
419             }
420         }
421       /* Not enough newlines in that bufferfull.  */
422       if (pos == 0)
423         {
424           /* Not enough lines in the file; print the entire file.  */
425           /* FIXME: check lseek return value  */
426           lseek (fd, (off_t) 0, SEEK_SET);
427           dump_remainder (pretty_filename, fd, file_length);
428           return 0;
429         }
430       pos -= BUFSIZ;
431       /* FIXME: check lseek return value  */
432       lseek (fd, pos, SEEK_SET);
433     }
434   while ((bytes_read = safe_read (fd, buffer, BUFSIZ)) > 0);
435
436   if (bytes_read == -1)
437     {
438       error (0, errno, "%s", pretty_filename);
439       return 1;
440     }
441
442   return 0;
443 }
444
445 /* Print the last N_LINES lines from the end of the standard input,
446    open for reading as pipe FD.
447    Buffer the text as a linked list of LBUFFERs, adding them as needed.
448    Return 0 if successful, 1 if an error occured.  */
449
450 static int
451 pipe_lines (const char *pretty_filename, int fd, long int n_lines)
452 {
453   struct linebuffer
454   {
455     int nbytes, nlines;
456     char buffer[BUFSIZ];
457     struct linebuffer *next;
458   };
459   typedef struct linebuffer LBUFFER;
460   LBUFFER *first, *last, *tmp;
461   int i;                        /* Index into buffers.  */
462   int total_lines = 0;          /* Total number of newlines in all buffers.  */
463   int errors = 0;
464   int nbytes;                   /* Size of most recent read */
465
466   first = last = (LBUFFER *) xmalloc (sizeof (LBUFFER));
467   first->nbytes = first->nlines = 0;
468   first->next = NULL;
469   tmp = (LBUFFER *) xmalloc (sizeof (LBUFFER));
470
471   /* Input is always read into a fresh buffer.  */
472   while ((nbytes = tmp->nbytes = safe_read (fd, tmp->buffer, BUFSIZ)) > 0)
473     {
474       tmp->nlines = 0;
475       tmp->next = NULL;
476
477       /* Count the number of newlines just read.  */
478       for (i = 0; i < tmp->nbytes; i++)
479         if (tmp->buffer[i] == '\n')
480           ++tmp->nlines;
481       total_lines += tmp->nlines;
482
483       /* If there is enough room in the last buffer read, just append the new
484          one to it.  This is because when reading from a pipe, `nbytes' can
485          often be very small.  */
486       if (tmp->nbytes + last->nbytes < BUFSIZ)
487         {
488           memcpy (&last->buffer[last->nbytes], tmp->buffer, tmp->nbytes);
489           last->nbytes += tmp->nbytes;
490           last->nlines += tmp->nlines;
491         }
492       else
493         {
494           /* If there's not enough room, link the new buffer onto the end of
495              the list, then either free up the oldest buffer for the next
496              read if that would leave enough lines, or else malloc a new one.
497              Some compaction mechanism is possible but probably not
498              worthwhile.  */
499           last = last->next = tmp;
500           if (total_lines - first->nlines > n_lines)
501             {
502               tmp = first;
503               total_lines -= first->nlines;
504               first = first->next;
505             }
506           else
507             tmp = (LBUFFER *) xmalloc (sizeof (LBUFFER));
508         }
509     }
510
511   free ((char *) tmp);
512
513   if (nbytes < 0)
514     {
515       error (0, errno, "%s", pretty_filename);
516       errors = 1;
517       goto free_lbuffers;
518     }
519
520   /* If the file is empty, then bail out.  */
521   if (last->nbytes == 0)
522     goto free_lbuffers;
523
524   /* This prevents a core dump when the pipe contains no newlines.  */
525   if (n_lines == 0)
526     goto free_lbuffers;
527
528   /* Count the incomplete line on files that don't end with a newline.  */
529   if (last->buffer[last->nbytes - 1] != '\n')
530     {
531       ++last->nlines;
532       ++total_lines;
533     }
534
535   /* Run through the list, printing lines.  First, skip over unneeded
536      buffers.  */
537   for (tmp = first; total_lines - tmp->nlines > n_lines; tmp = tmp->next)
538     total_lines -= tmp->nlines;
539
540   /* Find the correct beginning, then print the rest of the file.  */
541   if (total_lines > n_lines)
542     {
543       const char *cp;
544
545       /* Skip `total_lines' - `n_lines' newlines.  We made sure that
546          `total_lines' - `n_lines' <= `tmp->nlines'.  */
547       cp = tmp->buffer;
548       for (i = total_lines - n_lines; i; --i)
549         while (*cp++ != '\n')
550           /* Do nothing.  */ ;
551       i = cp - tmp->buffer;
552     }
553   else
554     i = 0;
555   xwrite (STDOUT_FILENO, &tmp->buffer[i], tmp->nbytes - i);
556
557   for (tmp = tmp->next; tmp; tmp = tmp->next)
558     xwrite (STDOUT_FILENO, tmp->buffer, tmp->nbytes);
559
560 free_lbuffers:
561   while (first)
562     {
563       tmp = first->next;
564       free ((char *) first);
565       first = tmp;
566     }
567   return errors;
568 }
569
570 /* Print the last N_BYTES characters from the end of pipe FD.
571    This is a stripped down version of pipe_lines.
572    Return 0 if successful, 1 if an error occurred.  */
573
574 static int
575 pipe_bytes (const char *pretty_filename, int fd, off_t n_bytes)
576 {
577   struct charbuffer
578   {
579     int nbytes;
580     char buffer[BUFSIZ];
581     struct charbuffer *next;
582   };
583   typedef struct charbuffer CBUFFER;
584   CBUFFER *first, *last, *tmp;
585   int i;                        /* Index into buffers.  */
586   int total_bytes = 0;          /* Total characters in all buffers.  */
587   int errors = 0;
588
589   first = last = (CBUFFER *) xmalloc (sizeof (CBUFFER));
590   first->nbytes = 0;
591   first->next = NULL;
592   tmp = (CBUFFER *) xmalloc (sizeof (CBUFFER));
593
594   /* Input is always read into a fresh buffer.  */
595   while ((tmp->nbytes = safe_read (fd, tmp->buffer, BUFSIZ)) > 0)
596     {
597       tmp->next = NULL;
598
599       total_bytes += tmp->nbytes;
600       /* If there is enough room in the last buffer read, just append the new
601          one to it.  This is because when reading from a pipe, `nbytes' can
602          often be very small.  */
603       if (tmp->nbytes + last->nbytes < BUFSIZ)
604         {
605           memcpy (&last->buffer[last->nbytes], tmp->buffer, tmp->nbytes);
606           last->nbytes += tmp->nbytes;
607         }
608       else
609         {
610           /* If there's not enough room, link the new buffer onto the end of
611              the list, then either free up the oldest buffer for the next
612              read if that would leave enough characters, or else malloc a new
613              one.  Some compaction mechanism is possible but probably not
614              worthwhile.  */
615           last = last->next = tmp;
616           if (total_bytes - first->nbytes > n_bytes)
617             {
618               tmp = first;
619               total_bytes -= first->nbytes;
620               first = first->next;
621             }
622           else
623             {
624               tmp = (CBUFFER *) xmalloc (sizeof (CBUFFER));
625             }
626         }
627     }
628   if (tmp->nbytes == -1)
629     {
630       error (0, errno, "%s", pretty_filename);
631       errors = 1;
632       free ((char *) tmp);
633       goto free_cbuffers;
634     }
635
636   free ((char *) tmp);
637
638   /* Run through the list, printing characters.  First, skip over unneeded
639      buffers.  */
640   for (tmp = first; total_bytes - tmp->nbytes > n_bytes; tmp = tmp->next)
641     total_bytes -= tmp->nbytes;
642
643   /* Find the correct beginning, then print the rest of the file.
644      We made sure that `total_bytes' - `n_bytes' <= `tmp->nbytes'.  */
645   if (total_bytes > n_bytes)
646     i = total_bytes - n_bytes;
647   else
648     i = 0;
649   xwrite (STDOUT_FILENO, &tmp->buffer[i], tmp->nbytes - i);
650
651   for (tmp = tmp->next; tmp; tmp = tmp->next)
652     xwrite (STDOUT_FILENO, tmp->buffer, tmp->nbytes);
653
654 free_cbuffers:
655   while (first)
656     {
657       tmp = first->next;
658       free ((char *) first);
659       first = tmp;
660     }
661   return errors;
662 }
663
664 /* Skip N_BYTES characters from the start of pipe FD, and print
665    any extra characters that were read beyond that.
666    Return 1 on error, 0 if ok.  */
667
668 static int
669 start_bytes (const char *pretty_filename, int fd, off_t n_bytes)
670 {
671   char buffer[BUFSIZ];
672   int bytes_read = 0;
673
674   while (n_bytes > 0 && (bytes_read = safe_read (fd, buffer, BUFSIZ)) > 0)
675     n_bytes -= bytes_read;
676   if (bytes_read == -1)
677     {
678       error (0, errno, "%s", pretty_filename);
679       return 1;
680     }
681   else if (n_bytes < 0)
682     xwrite (STDOUT_FILENO, &buffer[bytes_read + n_bytes], -n_bytes);
683   return 0;
684 }
685
686 /* Skip N_LINES lines at the start of file or pipe FD, and print
687    any extra characters that were read beyond that.
688    Return 1 on error, 0 if ok.  */
689
690 static int
691 start_lines (const char *pretty_filename, int fd, long int n_lines)
692 {
693   char buffer[BUFSIZ];
694   int bytes_read = 0;
695   int bytes_to_skip = 0;
696
697   while (n_lines && (bytes_read = safe_read (fd, buffer, BUFSIZ)) > 0)
698     {
699       bytes_to_skip = 0;
700       while (bytes_to_skip < bytes_read)
701         if (buffer[bytes_to_skip++] == '\n' && --n_lines == 0)
702           break;
703     }
704   if (bytes_read == -1)
705     {
706       error (0, errno, "%s", pretty_filename);
707       return 1;
708     }
709   else if (bytes_to_skip < bytes_read)
710     {
711       xwrite (STDOUT_FILENO, &buffer[bytes_to_skip],
712               bytes_read - bytes_to_skip);
713     }
714   return 0;
715 }
716
717 /* FIXME: describe */
718
719 static void
720 recheck (struct File_spec *f)
721 {
722   /* open/fstat the file and announce if dev/ino have changed */
723   struct stat new_stats;
724   int fd;
725   int fail = 0;
726   int is_stdin = (STREQ (f->name, "-"));
727   int was_tailable = f->tailable;
728   int prev_errnum = f->errnum;
729   int new_file;
730
731   assert (valid_file_spec (f));
732
733   fd = (is_stdin ? STDIN_FILENO : open (f->name, O_RDONLY));
734
735   /* If the open fails because the file doesn't exist,
736      then mark the file as not tailable.  */
737   f->tailable = !(reopen_inaccessible_files && fd == -1);
738
739   if (fd == -1 || fstat (fd, &new_stats) < 0)
740     {
741       fail = 1;
742       f->errnum = errno;
743       if (!f->tailable)
744         {
745           if (was_tailable)
746             {
747               /* FIXME-maybe: detect the case in which the file first becomes
748                  unreadable (perms), and later becomes readable again and can
749                  be seen to be the same file (dev/ino).  Otherwise, tail prints
750                  the entire contents of the file when it becomes readable.  */
751               error (0, f->errnum, _("`%s' has become inaccessible"),
752                      pretty_name (f));
753             }
754           else
755             {
756               /* say nothing... it's still not tailable */
757             }
758         }
759       else if (prev_errnum != errno)
760         {
761           error (0, errno, "%s", pretty_name (f));
762         }
763     }
764   else if (!IS_TAILABLE_FILE_TYPE (new_stats.st_mode))
765     {
766       fail = 1;
767       f->errnum = -1;
768       error (0, 0, _("`%s' has been replaced with an untailable file;\
769  giving up on this name"),
770              pretty_name (f));
771       f->ignore = 1;
772     }
773   else
774     {
775       f->errnum = 0;
776     }
777
778   new_file = 0;
779   if (fail)
780     {
781       close_fd (fd, pretty_name (f));
782       close_fd (f->fd, pretty_name (f));
783       f->fd = -1;
784     }
785   else if (prev_errnum && prev_errnum != ENOENT)
786     {
787       new_file = 1;
788       assert (f->fd == -1);
789       error (0, 0, _("`%s' has become accessible"), pretty_name (f));
790     }
791   else if (f->ino != new_stats.st_ino || f->dev != new_stats.st_dev)
792     {
793       new_file = 1;
794       if (f->fd == -1)
795         {
796           error (0, 0,
797                  _("`%s' has appeared;  following end of new file"),
798                  pretty_name (f));
799         }
800       else
801         {
802           /* Close the old one.  */
803           close_fd (f->fd, pretty_name (f));
804
805           /* File has been replaced (e.g., via log rotation) --
806              tail the new one.  */
807           error (0, 0,
808                  _("`%s' has been replaced;  following end of new file"),
809                  pretty_name (f));
810         }
811     }
812   else
813     {
814       if (f->fd == -1)
815         {
816           /* This happens when one iteration finds the file missing,
817              then the preceding <dev,inode> pair is reused as the
818              file is recreated.  */
819           new_file = 1;
820         }
821       else
822         {
823           close_fd (fd, pretty_name (f));
824         }
825     }
826
827   if (new_file)
828     {
829       /* Record new file info in f.  */
830       f->fd = fd;
831       f->size = 0; /* Start at the beginning of the file...  */
832       f->dev = new_stats.st_dev;
833       f->ino = new_stats.st_ino;
834       f->n_unchanged_stats = 0;
835       f->n_consecutive_size_changes = 0;
836       f->ignore = 0;
837       /* FIXME: check lseek return value  */
838       lseek (f->fd, f->size, SEEK_SET);
839     }
840 }
841
842 /* FIXME: describe */
843
844 static unsigned int
845 n_live_files (const struct File_spec *f, int n_files)
846 {
847   int i;
848   unsigned int n_live = 0;
849
850   for (i = 0; i < n_files; i++)
851     {
852       if (f[i].fd >= 0)
853         ++n_live;
854     }
855   return n_live;
856 }
857
858 /* Tail NFILES files forever, or until killed.
859    The pertinent information for each file is stored in an entry of F.
860    Loop over each of them, doing an fstat to see if they have changed size,
861    and an occasional open/fstat to see if any dev/ino pair has changed.
862    If none of them have changed size in one iteration, sleep for a
863    while and try again.  Continue until the user interrupts us.  */
864
865 static void
866 tail_forever (struct File_spec *f, int nfiles)
867 {
868   int last;
869   int writer_is_dead = 0;
870
871   last = nfiles - 1;
872
873   while (1)
874     {
875       int i;
876       int any_changed;
877
878       any_changed = 0;
879       for (i = 0; i < nfiles; i++)
880         {
881           struct stat stats;
882
883           if (f[i].ignore)
884             continue;
885
886           if (f[i].fd < 0)
887             {
888               recheck (&f[i]);
889               continue;
890             }
891
892           if (fstat (f[i].fd, &stats) < 0)
893             {
894               f[i].fd = -1;
895               f[i].errnum = errno;
896               error (0, errno, "%s", pretty_name (&f[i]));
897               continue;
898             }
899
900           if (stats.st_size == f[i].size)
901             {
902               f[i].n_consecutive_size_changes = 0;
903               if (++f[i].n_unchanged_stats > max_n_unchanged_stats_between_opens
904                   && follow_mode == Follow_name)
905                 {
906                   recheck (&f[i]);
907                   f[i].n_unchanged_stats = 0;
908                 }
909               continue;
910             }
911
912           /* Size changed.  */
913           ++f[i].n_consecutive_size_changes;
914
915           /* Ensure that a file that's unlinked or moved aside, yet always
916              growing will be recognized as having been renamed.  */
917           if (follow_mode == Follow_name
918               && (f[i].n_consecutive_size_changes
919                   > max_n_consecutive_size_changes_between_opens))
920             {
921               f[i].n_consecutive_size_changes = 0;
922               recheck (&f[i]);
923               continue;
924             }
925
926           /* This file has changed size.  Print out what we can, and
927              then keep looping.  */
928
929           any_changed = 1;
930
931           /* reset counter */
932           f[i].n_unchanged_stats = 0;
933
934           if (stats.st_size < f[i].size)
935             {
936               error (0, 0, _("%s: file truncated"), pretty_name (&f[i]));
937               last = i;
938               /* FIXME: check lseek return value  */
939               lseek (f[i].fd, stats.st_size, SEEK_SET);
940               f[i].size = stats.st_size;
941               continue;
942             }
943
944           if (i != last)
945             {
946               if (print_headers)
947                 write_header (pretty_name (&f[i]));
948               last = i;
949             }
950           f[i].size += dump_remainder (pretty_name (&f[i]), f[i].fd,
951                                        COPY_TO_EOF);
952         }
953
954       if (n_live_files (f, nfiles) == 0 && ! reopen_inaccessible_files)
955         {
956           error (0, 0, _("no files remaining"));
957           break;
958         }
959
960       /* If none of the files changed size, sleep.  */
961       if (!any_changed)
962         {
963           if (writer_is_dead)
964             break;
965           sleep (sleep_interval);
966
967           /* Once the writer is dead, read the files once more to
968              avoid a race condition.  */
969           writer_is_dead = (pid != 0
970                             && kill (pid, 0) != 0
971                             /* Handle the case in which you cannot send a
972                                signal to the writer, so kill fails and sets
973                                errno to EPERM.  */
974                             && errno != EPERM);
975         }
976     }
977 }
978
979 /* Output the last N_BYTES bytes of file FILENAME open for reading in FD.
980    Return 0 if successful, 1 if an error occurred.  */
981
982 static int
983 tail_bytes (const char *pretty_filename, int fd, off_t n_bytes)
984 {
985   struct stat stats;
986
987   /* We need binary input, since `tail' relies on `lseek' and byte counts,
988      while binary output will preserve the style (Unix/DOS) of text file.  */
989   SET_BINARY2 (fd, STDOUT_FILENO);
990
991   if (fstat (fd, &stats))
992     {
993       error (0, errno, "%s", pretty_filename);
994       return 1;
995     }
996
997   if (from_start)
998     {
999       if (S_ISREG (stats.st_mode))
1000         {
1001           /* FIXME: check lseek return value  */
1002           lseek (fd, n_bytes, SEEK_CUR);
1003         }
1004       else if (start_bytes (pretty_filename, fd, n_bytes))
1005         {
1006           return 1;
1007         }
1008       dump_remainder (pretty_filename, fd, COPY_TO_EOF);
1009     }
1010   else
1011     {
1012       if (S_ISREG (stats.st_mode))
1013         {
1014           off_t current_pos, end_pos;
1015           size_t bytes_remaining;
1016
1017           if ((current_pos = lseek (fd, (off_t) 0, SEEK_CUR)) != -1
1018               && (end_pos = lseek (fd, (off_t) 0, SEEK_END)) != -1)
1019             {
1020               off_t diff;
1021               /* Be careful here.  The current position may actually be
1022                  beyond the end of the file.  */
1023               bytes_remaining = (diff = end_pos - current_pos) < 0 ? 0 : diff;
1024             }
1025           else
1026             {
1027               error (0, errno, "%s", pretty_filename);
1028               return 1;
1029             }
1030
1031           if (bytes_remaining <= n_bytes)
1032             {
1033               /* From the current position to end of file, there are no
1034                  more bytes than have been requested.  So reposition the
1035                  file pointer to the incoming current position and print
1036                  everything after that.  */
1037               /* FIXME: check lseek return value  */
1038               lseek (fd, current_pos, SEEK_SET);
1039             }
1040           else
1041             {
1042               /* There are more bytes remaining than were requested.
1043                  Back up.  */
1044               /* FIXME: check lseek return value  */
1045               lseek (fd, -n_bytes, SEEK_END);
1046             }
1047           dump_remainder (pretty_filename, fd, n_bytes);
1048         }
1049       else
1050         return pipe_bytes (pretty_filename, fd, n_bytes);
1051     }
1052   return 0;
1053 }
1054
1055 /* Output the last N_LINES lines of file FILENAME open for reading in FD.
1056    Return 0 if successful, 1 if an error occurred.  */
1057
1058 static int
1059 tail_lines (const char *pretty_filename, int fd, long int n_lines)
1060 {
1061   struct stat stats;
1062   off_t length;
1063
1064   /* We need binary input, since `tail' relies on `lseek' and byte counts,
1065      while binary output will preserve the style (Unix/DOS) of text file.  */
1066   SET_BINARY2 (fd, STDOUT_FILENO);
1067
1068   if (fstat (fd, &stats))
1069     {
1070       error (0, errno, "%s", pretty_filename);
1071       return 1;
1072     }
1073
1074   if (from_start)
1075     {
1076       if (start_lines (pretty_filename, fd, n_lines))
1077         return 1;
1078       dump_remainder (pretty_filename, fd, COPY_TO_EOF);
1079     }
1080   else
1081     {
1082       /* Use file_lines only if FD refers to a regular file with
1083          its file pointer positioned at beginning of file.  */
1084       /* FIXME: adding the lseek conjunct is a kludge.
1085          Once there's a reasonable test suite, fix the true culprit:
1086          file_lines.  file_lines shouldn't presume that the input
1087          file pointer is initially positioned to beginning of file.  */
1088       if (S_ISREG (stats.st_mode)
1089           && lseek (fd, (off_t) 0, SEEK_CUR) == (off_t) 0)
1090         {
1091           length = lseek (fd, (off_t) 0, SEEK_END);
1092           if (length != 0 && file_lines (pretty_filename, fd, n_lines, length))
1093             return 1;
1094         }
1095       else
1096         return pipe_lines (pretty_filename, fd, n_lines);
1097     }
1098   return 0;
1099 }
1100
1101 /* Display the last N_UNITS units of file FILENAME, open for reading
1102    in FD.
1103    Return 0 if successful, 1 if an error occurred.  */
1104
1105 static int
1106 tail (const char *pretty_filename, int fd, off_t n_units)
1107 {
1108   if (count_lines)
1109     return tail_lines (pretty_filename, fd, (long) n_units);
1110   else
1111     return tail_bytes (pretty_filename, fd, n_units);
1112 }
1113
1114 /* Display the last N_UNITS units of the file described by F.
1115    Return 0 if successful, 1 if an error occurred.  */
1116
1117 static int
1118 tail_file (struct File_spec *f, off_t n_units)
1119 {
1120   int fd, errors;
1121   struct stat stats;
1122
1123   int is_stdin = (STREQ (f->name, "-"));
1124
1125   if (is_stdin)
1126     {
1127       have_read_stdin = 1;
1128       fd = STDIN_FILENO;
1129     }
1130   else
1131     {
1132       fd = open (f->name, O_RDONLY);
1133     }
1134
1135   f->tailable = !(reopen_inaccessible_files && fd == -1);
1136
1137   if (fd == -1)
1138     {
1139       if (forever)
1140         {
1141           f->fd = -1;
1142           f->errnum = errno;
1143           f->ignore = 0;
1144           f->ino = 0;
1145           f->dev = 0;
1146         }
1147       error (0, errno, "%s", pretty_name (f));
1148       errors = 1;
1149     }
1150   else
1151     {
1152       if (print_headers)
1153         write_header (pretty_name (f));
1154       errors = tail (pretty_name (f), fd, n_units);
1155       if (forever)
1156         {
1157           f->errnum = 0;
1158           /* FIXME: duplicate code */
1159           if (fstat (fd, &stats) < 0)
1160             {
1161               errors = 1;
1162               f->errnum = errno;
1163               error (0, errno, "%s", pretty_name (f));
1164             }
1165           else if (!IS_TAILABLE_FILE_TYPE (stats.st_mode))
1166             {
1167               error (0, 0, _("%s: cannot follow end of this type of file;\
1168  giving up on this name"),
1169                      pretty_name (f));
1170               errors = 1;
1171               f->errnum = -1;
1172               f->ignore = 1;
1173             }
1174
1175           if (errors)
1176             {
1177               close_fd (fd, pretty_name (f));
1178               f->fd = -1;
1179             }
1180           else
1181             {
1182               f->fd = fd;
1183               f->size = stats.st_size;
1184               f->dev = stats.st_dev;
1185               f->ino = stats.st_ino;
1186               f->n_unchanged_stats = 0;
1187               f->n_consecutive_size_changes = 0;
1188               f->ignore = 0;
1189             }
1190         }
1191       else
1192         {
1193           if (!is_stdin && close (fd))
1194             {
1195               error (0, errno, "%s", pretty_name (f));
1196               errors = 1;
1197             }
1198         }
1199     }
1200
1201   return errors;
1202 }
1203
1204 /* If the command line arguments are of the obsolescent form and the
1205    option string is well-formed, set *FAIL to zero, set *N_UNITS, the
1206    globals COUNT_LINES, FOREVER, and FROM_START, and return non-zero.
1207    Otherwise, if the command line arguments appear to be of the
1208    obsolescent form but the option string is malformed, set *FAIL to
1209    non-zero, don't modify any other parameter or global variable, and
1210    return non-zero. Otherwise, return zero and don't modify any parameter
1211    or global variable.  */
1212
1213 static int
1214 parse_obsolescent_option (int argc, const char *const *argv,
1215                           off_t *n_units, int *fail)
1216 {
1217   const char *p = argv[1];
1218   const char *n_string = NULL;
1219   const char *n_string_end;
1220
1221   int t_from_start;
1222   int t_count_lines;
1223   int t_forever;
1224
1225   /* With the obsolescent form, there is one option string and
1226      (technically) at most one file argument.  But we allow two or more
1227      by default.  */
1228   if (argc < 2)
1229     return 0;
1230
1231   /* If P starts with `+', `-N' (where N is a digit), or `-l',
1232      then it is obsolescent.  Return zero otherwise.  */
1233   if ( ! (p[0] == '+' || (p[0] == '-' && (p[1] == 'l' || ISDIGIT (p[1])))) )
1234     return 0;
1235
1236   if (*p == '+')
1237     t_from_start = 1;
1238   else if (*p == '-')
1239     t_from_start = 0;
1240   else
1241     return 0;
1242
1243   ++p;
1244   if (ISDIGIT (*p))
1245     {
1246       n_string = p;
1247       do
1248         {
1249           ++p;
1250         }
1251       while (ISDIGIT (*p));
1252     }
1253   n_string_end = p;
1254
1255   t_count_lines = 1;
1256   if (*p == 'c')
1257     {
1258       t_count_lines = 0;
1259       ++p;
1260     }
1261   else if (*p == 'l')
1262     {
1263       ++p;
1264     }
1265
1266   t_forever = 0;
1267   if (*p == 'f')
1268     {
1269       t_forever = 1;
1270       ++p;
1271     }
1272
1273   if (*p != '\0')
1274     {
1275       /* If (argv[1] begins with a `+' or if it begins with `-' followed
1276          by a digit), but has an invalid suffix character, give a diagnostic
1277          and indicate to caller that this *is* of the obsolescent form,
1278          but that it's an invalid option.  */
1279       if (t_from_start || n_string)
1280         {
1281           error (0, 0,
1282                  _("%c: invalid suffix character in obsolescent option" ), *p);
1283           *fail = 1;
1284           return 1;
1285         }
1286
1287       /* Otherwise, it might be a valid non-obsolescent option like -n.  */
1288       return 0;
1289     }
1290
1291   *fail = 0;
1292   if (n_string == NULL)
1293     *n_units = DEFAULT_N_LINES;
1294   else
1295     {
1296       strtol_error s_err;
1297       unsigned long int tmp_ulong;
1298       char *end;
1299       s_err = xstrtoul (n_string, &end, 10, &tmp_ulong, NULL);
1300       if (s_err == LONGINT_OK && tmp_ulong <= OFF_T_MAX)
1301         *n_units = (off_t) tmp_ulong;
1302       else
1303         {
1304           /* Extract a NUL-terminated string for the error message.  */
1305           size_t len = n_string_end - n_string;
1306           char *n_string_tmp = xmalloc (len + 1);
1307
1308           strncpy (n_string_tmp, n_string, len);
1309           n_string_tmp[len] = '\0';
1310
1311           error (0, 0,
1312                  _("%s: %s is so large that it is not representable"),
1313                  n_string_tmp, (count_lines
1314                                 ? _("number of lines")
1315                                 : _("number of bytes")));
1316           free (n_string_tmp);
1317           *fail = 1;
1318         }
1319     }
1320
1321   if (!*fail)
1322     {
1323       if (argc > 3)
1324         {
1325           int posix_pedantic = (getenv ("POSIXLY_CORRECT") != NULL);
1326
1327           /* When POSIXLY_CORRECT is set, enforce the `at most one
1328              file argument' requirement.  */
1329           if (posix_pedantic)
1330             {
1331               error (0, 0, _("\
1332 too many arguments;  When using tail's obsolescent option syntax (%s)\n\
1333 there may be no more than one file argument.  Use the equivalent -n or -c\n\
1334 option instead."), argv[1]);
1335               *fail = 1;
1336               return 1;
1337             }
1338
1339 #if DISABLED  /* FIXME: enable or remove this warning.  */
1340           error (0, 0, _("\
1341 Warning: it is not portable to use two or more file arguments with\n\
1342 tail's obsolescent option syntax (%s).  Use the equivalent -n or -c\n\
1343 option instead."), argv[1]);
1344 #endif
1345         }
1346
1347       /* Set globals.  */
1348       from_start = t_from_start;
1349       count_lines = t_count_lines;
1350       forever = t_forever;
1351     }
1352
1353   return 1;
1354 }
1355
1356 static void
1357 parse_options (int argc, char **argv,
1358                off_t *n_units, enum header_mode *header_mode)
1359 {
1360   int c;
1361
1362   count_lines = 1;
1363   forever = from_start = print_headers = 0;
1364
1365   while ((c = getopt_long (argc, argv, "c:n:fqs:v", long_options, NULL))
1366          != -1)
1367     {
1368       switch (c)
1369         {
1370         case 0:
1371           break;
1372
1373         case 'c':
1374         case 'n':
1375           count_lines = (c == 'n');
1376           if (*optarg == '+')
1377             from_start = 1;
1378           else if (*optarg == '-')
1379             ++optarg;
1380
1381           {
1382             strtol_error s_err;
1383             uintmax_t n;
1384             s_err = xstrtoumax (optarg, NULL, 10, &n, "bkm");
1385             if (s_err == LONGINT_INVALID)
1386               {
1387                 error (EXIT_FAILURE, 0, "%s: %s", optarg,
1388                        (c == 'n'
1389                         ? _("invalid number of lines")
1390                         : _("invalid number of bytes")));
1391               }
1392
1393             if (s_err != LONGINT_OK)
1394               error (EXIT_FAILURE, 0,
1395                      _("%s: is so large that it is not representable"), optarg);
1396
1397             if (OFF_T_MAX < n)
1398               error (EXIT_FAILURE, 0,
1399                      _("%s is larger than the maximum file size on this system"),
1400                      optarg);
1401             *n_units = (off_t) n;
1402           }
1403           break;
1404
1405         case 'f':
1406         case LONG_FOLLOW_OPTION:
1407           forever = 1;
1408           if (optarg == NULL)
1409             follow_mode = DEFAULT_FOLLOW_MODE;
1410           else
1411             follow_mode = XARGMATCH ("--follow", optarg,
1412                                      follow_mode_string, follow_mode_map);
1413           break;
1414
1415         case RETRY_OPTION:
1416           reopen_inaccessible_files = 1;
1417           break;
1418
1419         case MAX_UNCHANGED_STATS_OPTION:
1420           /* --max-unchanged-stats=N */
1421           if (xstrtoul (optarg, NULL, 10,
1422                         &max_n_unchanged_stats_between_opens, "") != LONGINT_OK)
1423             {
1424               error (EXIT_FAILURE, 0,
1425                _("%s: invalid maximum number of unchanged stats between opens"),
1426                      optarg);
1427             }
1428           break;
1429
1430         case MAX_CONSECUTIVE_SIZE_CHANGES_OPTION:
1431           /* --max-consecutive-size-changes=N */
1432           if (xstrtoul (optarg, NULL, 10,
1433                         &max_n_consecutive_size_changes_between_opens, "")
1434               != LONGINT_OK)
1435             {
1436               error (EXIT_FAILURE, 0,
1437                    _("%s: invalid maximum number of consecutive size changes"),
1438                      optarg);
1439             }
1440           break;
1441
1442         case PID_OPTION:
1443           {
1444             strtol_error s_err;
1445             unsigned long int tmp_ulong;
1446             s_err = xstrtoul (optarg, NULL, 10, &tmp_ulong, "");
1447             if (s_err != LONGINT_OK || tmp_ulong > PID_T_MAX)
1448               {
1449                 error (EXIT_FAILURE, 0, _("%s: invalid PID"), optarg);
1450               }
1451             pid = tmp_ulong;
1452           }
1453           break;
1454
1455         case 'q':
1456           *header_mode = never;
1457           break;
1458
1459         case 's':
1460           {
1461             strtol_error s_err;
1462             unsigned long int tmp_ulong;
1463             s_err = xstrtoul (optarg, NULL, 10, &tmp_ulong, "");
1464             if (s_err != LONGINT_OK || tmp_ulong > UINT_MAX)
1465               {
1466                 error (EXIT_FAILURE, 0,
1467                        _("%s: invalid number of seconds"), optarg);
1468               }
1469             sleep_interval = tmp_ulong;
1470           }
1471           break;
1472
1473         case 'v':
1474           *header_mode = always;
1475           break;
1476
1477         case_GETOPT_HELP_CHAR;
1478
1479         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1480
1481         default:
1482           usage (1);
1483         }
1484     }
1485
1486   if (reopen_inaccessible_files && follow_mode != Follow_name)
1487     error (0, 0, _("warning: --retry is useful only when following by name"));
1488
1489   if (pid && !forever)
1490     error (0, 0,
1491            _("warning: PID ignored; --pid=PID is useful only when following"));
1492   else if (pid && kill (pid, 0) != 0 && errno == ENOSYS)
1493     {
1494       error (0, 0, _("warning: --pid=PID is not supported on this system"));
1495       pid = 0;
1496     }
1497 }
1498
1499 int
1500 main (int argc, char **argv)
1501 {
1502   enum header_mode header_mode = multiple_files;
1503   int exit_status = 0;
1504   /* If from_start, the number of items to skip before printing; otherwise,
1505      the number of items at the end of the file to print.  Although the type
1506      is signed, the value is never negative.  */
1507   off_t n_units = DEFAULT_N_LINES;
1508   int n_files;
1509   char **file;
1510   struct File_spec *F;
1511   int i;
1512
1513   program_name = argv[0];
1514   setlocale (LC_ALL, "");
1515   bindtextdomain (PACKAGE, LOCALEDIR);
1516   textdomain (PACKAGE);
1517
1518   atexit (close_stdout);
1519
1520   have_read_stdin = 0;
1521
1522   {
1523     int found_obsolescent;
1524     int fail;
1525     found_obsolescent = parse_obsolescent_option (argc,
1526                                                   (const char *const *) argv,
1527                                                   &n_units, &fail);
1528     if (found_obsolescent)
1529       {
1530         if (fail)
1531           exit (EXIT_FAILURE);
1532         optind = 2;
1533       }
1534     else
1535       {
1536         parse_options (argc, argv, &n_units, &header_mode);
1537       }
1538   }
1539
1540   /* To start printing with item N_UNITS from the start of the file, skip
1541      N_UNITS - 1 items.  `tail +0' is actually meaningless, but for Unix
1542      compatibility it's treated the same as `tail +1'.  */
1543   if (from_start)
1544     {
1545       if (n_units)
1546         --n_units;
1547     }
1548
1549   n_files = argc - optind;
1550   file = argv + optind;
1551
1552   if (n_files == 0)
1553     {
1554       static char *dummy_stdin = "-";
1555       n_files = 1;
1556       file = &dummy_stdin;
1557     }
1558
1559   F = (struct File_spec *) xmalloc (n_files * sizeof (F[0]));
1560   for (i = 0; i < n_files; i++)
1561     F[i].name = file[i];
1562
1563   if (header_mode == always
1564       || (header_mode == multiple_files && n_files > 1))
1565     print_headers = 1;
1566
1567   for (i = 0; i < n_files; i++)
1568     exit_status |= tail_file (&F[i], n_units);
1569
1570   if (forever)
1571     {
1572       /* This fflush appears to be required only on Solaris2.7.  */
1573       if (fflush (stdout) < 0)
1574         error (EXIT_FAILURE, errno, _("write error"));
1575
1576       SETVBUF (stdout, NULL, _IONBF, 0);
1577       tail_forever (F, n_files);
1578     }
1579
1580   if (have_read_stdin && close (0) < 0)
1581     error (EXIT_FAILURE, errno, "-");
1582   exit (exit_status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
1583 }