summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 744bca1)
raw | patch | inline | side by side (parent: 744bca1)
author | Holger Weiss <hweiss@users.sourceforge.net> | |
Fri, 21 Dec 2007 13:25:28 +0000 (13:25 +0000) | ||
committer | Holger Weiss <hweiss@users.sourceforge.net> | |
Fri, 21 Dec 2007 13:25:28 +0000 (13:25 +0000) |
for providing the patch and to Patrick Cervicek for looking into it!)
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1882 f882894a-f735-0410-b71e-b25c423dba1c
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1882 f882894a-f735-0410-b71e-b25c423dba1c
NEWS | patch | blob | history | |
THANKS.in | patch | blob | history | |
plugins-root/check_icmp.c | patch | blob | history |
index 372498e4efa806df83a92d8cf269a0de8b1b0e27..8efceba1e82426c0411dd4928e57c8bdfb82c6ba 100644 (file)
--- a/NEWS
+++ b/NEWS
1.4.12 or 1.5 ??
Added ./check_nt -v INSTANCES to count number of instances (Alessandro Ren)
check_tcp now returns UNKNOWN with invalid hostname
+ New check_icmp -s option to specify the source IP address
1.4.11 13th December 2007
Fixed check_http regression in 1.4.10 where following redirects to
diff --git a/THANKS.in b/THANKS.in
index 8d64f656e2145aaca379034612b5ef0ae61d2ae5..36ae0b9fa410a2d9fd7067d62135b2f2d66bfc45 100644 (file)
--- a/THANKS.in
+++ b/THANKS.in
fabiodds
Tom Payerle
Alessandro Ren
+Harald Jenny
index 7636bc714a5fe5ecdde9e3b63e234686731a098f..80fbf61339c9e21f14c47999336813f1ea671e64 100644 (file)
#include "netutils.h"
#include "utils.h"
+#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <stdio.h>
#include <ctype.h>
#include <netdb.h>
#include <sys/socket.h>
+#include <net/if.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip.h>
void print_usage (void);
static u_int get_timevar(const char *);
static u_int get_timevaldiff(struct timeval *, struct timeval *);
+static in_addr_t get_ip_address(const char *);
static int wait_for_reply(int, u_int);
static int recvfrom_wto(int, char *, unsigned int, struct sockaddr *, u_int *);
static int send_icmp_ping(int, struct rta_host *);
static int get_threshold(char *str, threshold *th);
static void run_checks(void);
+static void set_source_ip(char *);
static int add_target(char *);
static int add_target_ip(char *, struct in_addr *);
static int handle_random_icmp(struct icmp *, struct sockaddr_in *);
/* parse the arguments */
for(i = 1; i < argc; i++) {
- while((arg = getopt(argc, argv, "vhVw:c:n:p:t:H:i:b:I:l:m:")) != EOF) {
+ while((arg = getopt(argc, argv, "vhVw:c:n:p:t:H:s:i:b:I:l:m:")) != EOF) {
switch(arg) {
case 'v':
debug++;
crit_down = (unsigned char)strtoul(ptr + 1, NULL, 0);
}
break;
+ case 's': /* specify source IP address */
+ set_source_ip(optarg);
+ break;
case 'V': /* version */
/*print_revision (progname, revision);*/ /* FIXME: Why? */
exit (STATE_OK);
return 0;
}
+
+static void
+set_source_ip(char *arg)
+{
+ struct sockaddr_in src;
+
+ memset(&src, 0, sizeof(src));
+ src.sin_family = AF_INET;
+ if((src.sin_addr.s_addr = inet_addr(arg)) == INADDR_NONE)
+ src.sin_addr.s_addr = get_ip_address(arg);
+ if(bind(icmp_sock, (struct sockaddr *)&src, sizeof(src)) == -1)
+ crash("Cannot bind to IP address %s", arg);
+}
+
+/* TODO: Move this to netutils.c and also change check_dhcp to use that. */
+static in_addr_t
+get_ip_address(const char *ifname)
+{
+#if defined(SIOCGIFADDR)
+ struct ifreq ifr;
+
+ strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
+ ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';
+ if(ioctl(icmp_sock, SIOCGIFADDR, &ifr) == -1)
+ crash("Cannot determine IP address of interface %s", ifname);
+ return ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr;
+#else
+ errno = 0;
+ crash("Cannot get interface IP address on this platform.");
+#endif
+}
+
/*
* u = micro
* m = milli
printf (" %s\n", "-c");
printf (" %s", _("critical threshold (currently "));
printf ("%0.3fms,%u%%)\n", (float)crit.rta, crit.pl);
+ printf (" %s\n", "-s");
+ printf (" %s\n", _("specify a source IP address or device name"));
printf (" %s\n", "-n");
printf (" %s", _("number of packets to send (currently "));
printf ("%u)\n",packets);