[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option
From: |
Rakesh Pandit |
Subject: |
Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option |
Date: |
Tue, 6 Oct 2009 16:53:47 +0530 |
2009/10/6 Alfred M. Szmidt wrote:
> The ChangeLog needs work, it doesn't document the changes you did, and
> it documents things incorrectly.
>
> If you can suggest something better here I will change the name
> accordingly. But as there is a conflict I have kept it ping_timeout,
> which seemed apt to me.
>
> I don't know, figure something out that is nice :-)
>
[..]
I have changed private variable to resp_time which made more sense. It
not only solves the global variable name, but also we can cleanly
choice a suitable name for other new option --timeout-response in
future.
Included all changes and fixed changelog.
--
Rakesh Pandit
https://fedoraproject.org/
freedom, friends, features, first
>From d5b25476f44cbb72b65bfae3eeff6a517b12b721 Mon Sep 17 00:00:00 2001
From: Rakesh Pandit <address@hidden>
Date: Tue, 6 Oct 2009 17:01:00 +0530
Subject: [PATCH] Added new option --timeout to ping/ping6 for setting timeout
before ping exits.
---
ChangeLog | 26 ++++++++++++++++++++++++++
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, 104 insertions(+), 25 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index a7ec4c7..579e467 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2009-10-06 Rakesh <address@hidden>
+
+ * ping/ping.c: New option --timeout, to specify time in seconds
+ after which ping should stop sending packets.
+ (timeout): New global variable.
+ (argp_options): New option entry.
+ * ping/ping6.c: Likewise.
+
+ * ping/ping_common.c (ping_timeout_p): New function.
+ * ping/ping_common.h: Add prototype for ping_timeout_p.
+ * ping/ping_common.h (ping_data): Added ping_start_time member.
+
+ * ping/ping.c (ping_run): Renaming timeout to resp_time.
+ * ping/ping6.c: Likewise.
+
+ * ping/ping.c (ping_run): Calls to ping_timeout_p after each
+ packet is sent.
+ * ping/ping6.c (ping_run): Likewise.
+
+ * ping/libping.c (ping_init): Set ping_data member ping_start_time
+ with gettimeofday.
+ * ping/ping6.c (ping_init): Likewise.
+
+ * NEWS: Updated about new timeout option.
+ * doc/inetutils.texi: Added timeout option details.
+
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..40494dd 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);
--
1.6.4.4
- [bug-inetutils] [PATCH] ping/ping6 --deadline option, Rakesh Pandit, 2009/10/03
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Alfred M. Szmidt, 2009/10/04
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Rakesh Pandit, 2009/10/04
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Alfred M. Szmidt, 2009/10/04
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Rakesh Pandit, 2009/10/05
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Alfred M. Szmidt, 2009/10/05
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Rakesh Pandit, 2009/10/05
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Rakesh Pandit, 2009/10/06
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Alfred M. Szmidt, 2009/10/06
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option,
Rakesh Pandit <=
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Rakesh Pandit, 2009/10/06
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Rakesh Pandit, 2009/10/06
- Re: [bug-inetutils] [PATCH] ping/ping6 --deadline option, Alfred M. Szmidt, 2009/10/06