From db767e93a313902cfbdfd33a6f9b3e4054bcf1f0 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Fri, 17 Jul 2009 14:14:18 +0200 Subject: [PATCH] src/oping.c: Added -D command line option. This option sets the outgoing network device to use. I decided not to reuse the -I command line option for that purpose (which is what GNU ping is doing), for the following reasons: * In theory, an interface name could be confused with a host name. * Imho, it's better to specify things explicitly. * This approach is more flexible. --- src/mans/oping.pod | 9 +++++++-- src/oping.c | 17 ++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/mans/oping.pod b/src/mans/oping.pod index 29784a8..8a3cb58 100644 --- a/src/mans/oping.pod +++ b/src/mans/oping.pod @@ -45,8 +45,13 @@ including) 1EandE255. If omitted, the value B<64> is used. =item B<-I> I
-Set the source address to use. You B pass the interface name, as you -can with GNU's L. +Set the source address to use. You may either specify an IP number or a +hostname. You B pass the interface name, as you can with GNU's +L - use the B<-D> option for that purpose. + +=item B<-D> I + +Set the outgoing network device to use. =item B<-f> I diff --git a/src/oping.c b/src/oping.c index a1dbade..fc4cb5f 100644 --- a/src/oping.c +++ b/src/oping.c @@ -73,6 +73,7 @@ typedef struct ping_context static double opt_interval = 1.0; static int opt_addrfamily = PING_DEF_AF; static char *opt_srcaddr = NULL; +static char *opt_device = NULL; static char *opt_filename = NULL; static int opt_count = -1; static int opt_send_ttl = 64; @@ -122,6 +123,7 @@ static void usage_exit (const char *name, int status) " -i interval interval with which to send ICMP packets\n" " -t ttl time to live for each ICMP packet\n" " -I srcaddr source address\n" + " -D device outgoing interface name\n" " -f filename filename to read hosts from\n" "\noping "PACKAGE_VERSION", http://verplant.org/liboping/\n" @@ -137,7 +139,7 @@ static int read_options (int argc, char **argv) while (1) { - optchar = getopt (argc, argv, "46c:hi:I:t:f:"); + optchar = getopt (argc, argv, "46c:hi:I:t:f:D:"); if (optchar == -1) break; @@ -188,6 +190,10 @@ static int read_options (int argc, char **argv) } break; + case 'D': + opt_device = optarg; + break; + case 't': { int new_send_ttl; @@ -375,6 +381,15 @@ int main (int argc, char **argv) } } + if (opt_device != NULL) + { + if (ping_setopt (ping, PING_OPT_DEVICE, (void *) opt_device) != 0) + { + fprintf (stderr, "Setting device failed: %s\n", + ping_get_error (ping)); + } + } + if (opt_filename != NULL) { FILE *infile; -- 2.11.0