diff options
author | Jim Meyering <jim@meyering.net> | 2002-09-12 11:38:47 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2002-09-12 11:38:47 +0000 |
commit | 7a7926601414a8025c9d9e2e55c4ac25cf954a3c (patch) | |
tree | b4bd153b1fa558ea99050bfd7c55e03847eb51ab /src | |
parent | d7a4a48c83153bb5837cf9c8168bddb72219db86 (diff) | |
download | coreutils-7a7926601414a8025c9d9e2e55c4ac25cf954a3c.tar.xz |
Include xnanosleep.h and xstrtod.h.
Move declaration of global variable, sleep_interval, to ...
(main): ...here.
(usage): Update description of --sleep-interval option.
(tail_forever): New parameter, sleep_interval. Update caller.
Use xnanosleep, rather than sleep.
(parse_options): New parameter, sleep_interval. Update caller.
Use xstrtod, now that we accept floating point values.
Diffstat (limited to 'src')
-rw-r--r-- | src/tail.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/src/tail.c b/src/tail.c index 7c3240e9b..d9b1b2c74 100644 --- a/src/tail.c +++ b/src/tail.c @@ -38,7 +38,9 @@ #include "human.h" #include "posixver.h" #include "safe-read.h" +#include "xnanosleep.h" #include "xstrtol.h" +#include "xstrtod.h" /* The official name of this program (e.g., no `g' prefix). */ #define PROGRAM_NAME "tail" @@ -177,12 +179,6 @@ static unsigned long max_n_consecutive_size_changes_between_opens = /* The name this program was run with. */ char *program_name; -/* The number of seconds to sleep between iterations. - During one iteration, every file name or descriptor is checked to - see if it has changed. */ -/* FIXME: allow fractional seconds */ -static unsigned int sleep_interval = 1; - /* The process ID of the process (presumably on the current host) that is writing to all followed files. */ static pid_t pid; @@ -275,8 +271,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\ fputs (_("\ --pid=PID with -f, terminate after process ID, PID dies\n\ -q, --quiet, --silent never output headers giving file names\n\ - -s, --sleep-interval=S with -f, each iteration lasts approximately S\n\ - (default 1) seconds\n\ + -s, --sleep-interval=S with -f, sleep for approximately S seconds\n\ + (default 1.0) between iterations.\n\ -v, --verbose always output headers giving file names\n\ "), stdout); fputs (HELP_OPTION_DESCRIPTION, stdout); @@ -926,7 +922,7 @@ n_live_files (const struct File_spec *f, int n_files) while and try again. Continue until the user interrupts us. */ static void -tail_forever (struct File_spec *f, int nfiles) +tail_forever (struct File_spec *f, int nfiles, double sleep_interval) { int last; int writer_is_dead = 0; @@ -1023,7 +1019,9 @@ tail_forever (struct File_spec *f, int nfiles) { if (writer_is_dead) break; - sleep (sleep_interval); + + if (xnanosleep (sleep_interval)) + error (EXIT_FAILURE, errno, _("cannot read realtime clock")); /* Once the writer is dead, read the files once more to avoid a race condition. */ @@ -1428,7 +1426,8 @@ option instead."), argv[1]); static void parse_options (int argc, char **argv, - off_t *n_units, enum header_mode *header_mode) + off_t *n_units, enum header_mode *header_mode, + double *sleep_interval) { int c; @@ -1537,15 +1536,11 @@ parse_options (int argc, char **argv, case 's': { - strtol_error s_err; - unsigned long int tmp_ulong; - s_err = xstrtoul (optarg, NULL, 10, &tmp_ulong, ""); - if (s_err != LONGINT_OK || tmp_ulong > UINT_MAX) - { - error (EXIT_FAILURE, 0, - _("%s: invalid number of seconds"), optarg); - } - sleep_interval = tmp_ulong; + double s; + if (xstrtod (optarg, NULL, &s) || ! (0 <= s)) + error (EXIT_FAILURE, 0, + _("%s: invalid number of seconds"), optarg); + *sleep_interval = s; } break; @@ -1589,6 +1584,11 @@ main (int argc, char **argv) struct File_spec *F; int i; + /* The number of seconds to sleep between iterations. + During one iteration, every file name or descriptor is checked to + see if it has changed. */ + double sleep_interval = 1.0; + program_name = argv[0]; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); @@ -1611,7 +1611,7 @@ main (int argc, char **argv) } else { - parse_options (argc, argv, &n_units, &header_mode); + parse_options (argc, argv, &n_units, &header_mode, &sleep_interval); } } @@ -1652,7 +1652,7 @@ main (int argc, char **argv) error (EXIT_FAILURE, errno, _("write error")); SETVBUF (stdout, NULL, _IONBF, 0); - tail_forever (F, n_files); + tail_forever (F, n_files, sleep_interval); } if (have_read_stdin && close (STDIN_FILENO) < 0) |