commit-inetutils
[Top][All Lists]
Advanced

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

[SCM] GNU Inetutils branch, master, updated. release_1_5-192-g4299d66


From: Rakesh
Subject: [SCM] GNU Inetutils branch, master, updated. release_1_5-192-g4299d66
Date: Wed, 07 Oct 2009 03:16:28 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Inetutils ".

http://git.savannah.gnu.org/cgit/inetutils.git/commit/?id=4299d66e8781996d61843a656c432703693d8fd3

The branch, master has been updated
       via  4299d66e8781996d61843a656c432703693d8fd3 (commit)
      from  92d51eead20e07719ba9ec6512a043b857aa1b1a (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 4299d66e8781996d61843a656c432703693d8fd3
Author: Rakesh Pandit <address@hidden>
Date:   Wed Oct 7 08:57:37 2009 +0530

    Added new option --timeout to ping/ping6 for setting timeout
    before ping exits.

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog          |   21 +++++++++++++++++++++
 NEWS               |    6 +++++-
 doc/inetutils.texi |    6 ++++++
 ping/libping.c     |    1 +
 ping/ping.c        |   37 +++++++++++++++++++++++++------------
 ping/ping6.c       |   38 ++++++++++++++++++++++++++------------
 ping/ping_common.c |   13 +++++++++++++
 ping/ping_common.h |    2 ++
 8 files changed, 99 insertions(+), 25 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 63b128b..325f5ef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2009-10-06  Rakesh Pandit  <address@hidden>
+
+       * ping/ping_common.h (ping_data): New member `ping_start_time'.
+       (ping_timeout_p): New prototype.
+       * ping/ping_common.c (ping_timeout_p): New function.
+
+       * ping/ping6.c: Rename `timeout' to `resp_time', and use `timeout'
+       for --timeout.
+       (argp_options, parse_opt): New option --timeout.
+       (ping_run): Check if we should abort due to timeout.
+       (ping_init): Initialise P->ping_start_time.
+
+       * ping/ping.c: Rename `timeout' to `resp_time', and use `timeout'
+       for --timeout.
+       (argp_options, parse_opt): New option --timeout.
+       (ping_run): Check if we should abort due to timeout.
+       * ping/libping.c (ping_init): Initialise P->ping_start_time.
+
+       * doc/inetutils.texi (ping invocation): Updated.
+       * NEWS: Updated.
+
 2009-10-01  Rakesh Pandit <address@hidden>
 
        * talkd/talkd.c [HAVE_CONFIG_H]: Include config.h.
diff --git a/NEWS b/NEWS
index f256ee3..30beda0 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU inetutils NEWS -- history of user-visible changes. 2009-06-28
+GNU inetutils NEWS -- history of user-visible changes. 2009-10-06
 
 Copyright (C) 2002, 2004, 2006, 2007, 2008, 2009 
          Free Software Foundation, Inc.
@@ -10,6 +10,10 @@ Please send inetutils bug reports to <address@hidden>.
 Unreleased
 Version 1.7:
 
+* ping
+
+New option --timeout=N, stop sending packets after N seconds.
+
 * New logger implementation
 
 The `logger' utility has been rewritten from scratch.  The new
diff --git a/doc/inetutils.texi b/doc/inetutils.texi
index ec011ee..aba0c28 100644
--- a/doc/inetutils.texi
+++ b/doc/inetutils.texi
@@ -468,6 +468,12 @@ routes.  Many hosts ignore or discard this option.
 Specifies the number of data bytes to be sent.  The default is 56,
 which translates into 64 @acronym{ICMP} data bytes when combined with
 the 8 bytes of ICMP header data.
+
address@hidden -w @var{n}
address@hidden address@hidden
address@hidden -w
address@hidden --timeout
+Stop after @var{n} seconds.
 @end table
 
 @section Using ping for network fault isolation
diff --git a/ping/libping.c b/ping/libping.c
index c0d1d65..7e56d3d 100644
--- a/ping/libping.c
+++ b/ping/libping.c
@@ -89,6 +89,7 @@ ping_init (int type, int ident)
   /* Make sure we use only 16 bits in this field, id for icmp is a u_short.  */
   p->ping_ident = ident & 0xFFFF;
   p->ping_cktab_size = PING_CKTABSIZE;
+  gettimeofday (&p->ping_start_time, NULL);
   return p;
 }
 
diff --git a/ping/ping.c b/ping/ping.c
index b83332f..e3be687 100644
--- a/ping/ping.c
+++ b/ping/ping.c
@@ -67,6 +67,7 @@ size_t interval;
 size_t data_length = PING_DATALEN;
 unsigned options;
 unsigned long preload = 0;
+int timeout = -1;
 int (*ping_type) (char *hostname) = ping_echo;
 
 int (*decode_type (const char *arg)) (char *hostname);
@@ -113,6 +114,7 @@ static struct argp_option argp_options[] = {
   {"ignore-routing", 'r', NULL, 0, "send directly to a host on an attached "
    "network", GRP+1},
   {"verbose", 'v', NULL, 0, "verbose output", GRP+1},
+  {"timeout", 'w', "N", 0, "stop after N seconds", GRP+1},
 #undef GRP
 #define GRP 20
   {NULL, 0, NULL, 0, "Options valid for --echo requests:", GRP},
@@ -176,6 +178,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
       options |= OPT_QUIET;
       break;
 
+    case 'w':
+      timeout = ping_cvt_number (arg, INT_MAX, 0);
+      break;
+
     case 'R':
       options |= OPT_RROUTE;
       break;
@@ -310,7 +316,7 @@ ping_run (PING * ping, int (*finish) ())
 {
   fd_set fdset;
   int fdmax;
-  struct timeval timeout;
+  struct timeval resp_time;
   struct timeval last, intvl, now;
   struct timeval *t = NULL;
   int finishing = 0;
@@ -342,24 +348,24 @@ ping_run (PING * ping, int (*finish) ())
       FD_ZERO (&fdset);
       FD_SET (ping->ping_fd, &fdset);
       gettimeofday (&now, NULL);
-      timeout.tv_sec = last.tv_sec + intvl.tv_sec - now.tv_sec;
-      timeout.tv_usec = last.tv_usec + intvl.tv_usec - now.tv_usec;
+      resp_time.tv_sec = last.tv_sec + intvl.tv_sec - now.tv_sec;
+      resp_time.tv_usec = last.tv_usec + intvl.tv_usec - now.tv_usec;
 
-      while (timeout.tv_usec < 0)
+      while (resp_time.tv_usec < 0)
        {
-         timeout.tv_usec += 1000000;
-         timeout.tv_sec--;
+         resp_time.tv_usec += 1000000;
+         resp_time.tv_sec--;
        }
-      while (timeout.tv_usec >= 1000000)
+      while (resp_time.tv_usec >= 1000000)
        {
-         timeout.tv_usec -= 1000000;
-         timeout.tv_sec++;
+         resp_time.tv_usec -= 1000000;
+         resp_time.tv_sec++;
        }
 
-      if (timeout.tv_sec < 0)
-       timeout.tv_sec = timeout.tv_usec = 0;
+      if (resp_time.tv_sec < 0)
+       resp_time.tv_sec = resp_time.tv_usec = 0;
 
-      n = select (fdmax, &fdset, NULL, NULL, &timeout);
+      n = select (fdmax, &fdset, NULL, NULL, &resp_time);
       if (n < 0)
        {
          if (errno != EINTR)
@@ -375,6 +381,10 @@ ping_run (PING * ping, int (*finish) ())
              gettimeofday (&now, NULL);
              t = &now;
            }
+
+         if (ping_timeout_p (&ping->ping_start_time, timeout))
+           break;
+
          if (ping->ping_count && nresp >= ping->ping_count)
            break;
        }
@@ -385,6 +395,9 @@ ping_run (PING * ping, int (*finish) ())
              send_echo (ping);
              if (!(options & OPT_QUIET) && options & OPT_FLOOD)
                putchar ('.');
+
+             if (ping_timeout_p (&ping->ping_start_time, timeout))
+               break;
            }
          else if (finishing)
            break;
diff --git a/ping/ping6.c b/ping/ping6.c
index 6a7fbff..bf89352 100644
--- a/ping/ping6.c
+++ b/ping/ping6.c
@@ -54,6 +54,7 @@ size_t data_length = PING_DATALEN;
 size_t count = DEFAULT_PING_COUNT;
 size_t interval;
 int socket_type;
+int timeout = -1;
 static unsigned int options;
 static unsigned long preload = 0;
 
@@ -80,6 +81,7 @@ static struct argp_option argp_options[] = {
   {"numeric", 'n', NULL, 0, "so not resolve host addresses", GRP+1},
   {"ignore-routing", 'r', NULL, 0, "send directly to a host on an attached "
    "network", GRP+1},
+  {"timeout", 'w', "N", 0, "stop after N seconds", GRP+1},
 #undef GRP
 #define GRP 10
   {NULL, 0, NULL, 0, "Options valid for --echo requests:", GRP},
@@ -151,6 +153,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
       socket_type = SO_DEBUG;
       break;
 
+    case 'w':
+      timeout = ping_cvt_number (arg, INT_MAX, 0);
+      break;
+
     case 's':
       data_length = ping_cvt_number (arg, PING_MAX_DATALEN, 1);
       break;
@@ -266,7 +272,7 @@ ping_run (PING * ping, int (*finish) ())
 {
   fd_set fdset;
   int fdmax;
-  struct timeval timeout;
+  struct timeval resp_time;
   struct timeval last, intvl, now;
   struct timeval *t = NULL;
   int finishing = 0;
@@ -298,24 +304,24 @@ ping_run (PING * ping, int (*finish) ())
       FD_ZERO (&fdset);
       FD_SET (ping->ping_fd, &fdset);
       gettimeofday (&now, NULL);
-      timeout.tv_sec = last.tv_sec + intvl.tv_sec - now.tv_sec;
-      timeout.tv_usec = last.tv_usec + intvl.tv_usec - now.tv_usec;
+      resp_time.tv_sec = last.tv_sec + intvl.tv_sec - now.tv_sec;
+      resp_time.tv_usec = last.tv_usec + intvl.tv_usec - now.tv_usec;
 
-      while (timeout.tv_usec < 0)
+      while (resp_time.tv_usec < 0)
        {
-         timeout.tv_usec += 1000000;
-         timeout.tv_sec--;
+         resp_time.tv_usec += 1000000;
+         resp_time.tv_sec--;
        }
-      while (timeout.tv_usec >= 1000000)
+      while (resp_time.tv_usec >= 1000000)
        {
-         timeout.tv_usec -= 1000000;
-         timeout.tv_sec++;
+         resp_time.tv_usec -= 1000000;
+         resp_time.tv_sec++;
        }
 
-      if (timeout.tv_sec < 0)
-       timeout.tv_sec = timeout.tv_usec = 0;
+      if (resp_time.tv_sec < 0)
+       resp_time.tv_sec = resp_time.tv_usec = 0;
 
-      n = select (fdmax, &fdset, NULL, NULL, &timeout);
+      n = select (fdmax, &fdset, NULL, NULL, &resp_time);
       if (n < 0)
        {
          if (errno != EINTR)
@@ -331,6 +337,10 @@ ping_run (PING * ping, int (*finish) ())
              gettimeofday (&now, NULL);
              t = &now;
            }
+
+         if (ping_timeout_p (&ping->ping_start_time, timeout))
+           break;
+
          if (ping->ping_count && nresp >= ping->ping_count)
            break;
        }
@@ -343,6 +353,9 @@ ping_run (PING * ping, int (*finish) ())
                {
                  putchar ('.');
                }
+
+             if (ping_timeout_p (&ping->ping_start_time, timeout))
+               break;
            }
          else if (finishing)
            break;
@@ -741,6 +754,7 @@ ping_init (int type, int ident)
   /* Make sure we use only 16 bits in this field, id for icmp is a u_short.  */
   p->ping_ident = ident & 0xFFFF;
   p->ping_cktab_size = PING_CKTABSIZE;
+  gettimeofday (&p->ping_start_time, NULL);
   return p;
 }
 
diff --git a/ping/ping_common.c b/ping/ping_common.c
index 67c4cad..9abb002 100644
--- a/ping/ping_common.c
+++ b/ping/ping_common.c
@@ -216,3 +216,16 @@ ping_unset_data (PING * p)
   _ping_freebuf (p);
 }
 
+int
+ping_timeout_p (struct timeval *start_time, int timeout)
+{
+  struct timeval now;
+  gettimeofday (&now, NULL);
+  if (timeout != -1)
+    {
+      tvsub (&now, start_time);
+      if (now.tv_sec >= timeout)
+        return 1;
+    }
+  return 0;
+}
diff --git a/ping/ping_common.h b/ping/ping_common.h
index 62cc77b..ac1b6a5 100644
--- a/ping/ping_common.h
+++ b/ping/ping_common.h
@@ -97,6 +97,7 @@ struct ping_data
   int ping_fd;                 /* Raw socket descriptor */
   int ping_type;               /* Type of packets to send */
   size_t ping_count;           /* Number of packets to send */
+  struct timeval ping_start_time; /* Start time */
   size_t ping_interval;        /* Number of seconds to wait between sending 
pkts */
   union ping_address ping_dest;/* whom to ping */
   char *ping_hostname;         /* Printable hostname */
@@ -156,4 +157,5 @@ void ping_set_count (PING * ping, size_t count);
 void ping_set_sockopt (PING * ping, int opt, void *val, int valsize);
 void ping_set_interval (PING * ping, size_t interval);
 void ping_unset_data (PING * p);
+int ping_timeout_p (struct timeval *start_time, int timeout);
 


hooks/post-receive
-- 
GNU Inetutils 




reply via email to

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