bug-textutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

tail patch - allows fractional seconds with -s


From: Matt Rickard
Subject: tail patch - allows fractional seconds with -s
Date: Mon, 9 Dec 2002 02:37:04 -0500

I have modified the GNU textutils tail.c to allow for fractional seconds
with the -s option.  e.g. "tail -f -s 1.325 filename", rather than only
whole number, as per the FIXME in the current tail.c code.  The diff
follows.

Matt Rickard

--- tail.c.old  2002-07-29 04:40:21.000000000 -0400
+++ tail.c      2002-12-09 02:21:30.000000000 -0500
@@ -21,7 +21,8 @@
 
    Original version by Paul Rubin <address@hidden>.
    Extensions by David MacKenzie <address@hidden>.
-   tail -f for multiple files by Ian Lance Taylor <address@hidden>.  */
+   tail -f for multiple files by Ian Lance Taylor <address@hidden>. 
+   Allowing fractional seconds for -s by Matt Rickard <address@hidden>. */
 
 #include <config.h>
 
@@ -66,6 +67,9 @@
 /* FIXME: make Follow_name the default?  */
 #define DEFAULT_FOLLOW_MODE Follow_descriptor
 
+/* Seconds to microseconds conversion factor (10^6) */
+#define SECONDS_TO_MICROSECONDS 1000000
+
 enum Follow_mode
 {
   /* Follow the name of each file: if the file is renamed, try to reopen
@@ -177,11 +181,10 @@
 /* The name this program was run with.  */
 char *program_name;
 
-/* The number of seconds to sleep between iterations.
+/* The number of microseconds 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;
+static unsigned long sleep_interval = 1000000;
 
 /* The process ID of the process (presumably on the current host)
    that is writing to all followed files.  */
@@ -276,7 +279,7 @@
       --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\
+                           (default 1.0) seconds\n\
   -v, --verbose            always output headers giving file names\n\
 "), stdout);
      fputs (HELP_OPTION_DESCRIPTION, stdout);
@@ -1022,7 +1025,7 @@
        {
          if (writer_is_dead)
            break;
-         sleep (sleep_interval);
+         usleep(sleep_interval);
 
          /* Once the writer is dead, read the files once more to
             avoid a race condition.  */
@@ -1536,15 +1539,28 @@
 
        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 tmp_double, other_tmp_double;
+           char *endp;
+           tmp_double = strtod(optarg, &endp);
+           if(endp > optarg) /* valid double */
+           {
+              other_tmp_double = tmp_double * SECONDS_TO_MICROSECONDS;
+              if(other_tmp_double <= (double)ULONG_MAX) /* valid
+                                                     unsigned long) */
+              {
+                 sleep_interval = other_tmp_double;
+              }
+              else
+              {
+                 error (EXIT_FAILURE, 0, 
+                   _("%s: invalid number of seconds"), optarg);   
+              }
+           }
+           else
+           {
+              error (EXIT_FAILURE, 0,
+                _("%s: invalid number of seconds"), optarg);
+           }
          }
          break;
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]