From 0caa47a50bae586173f40ca7544d4290de0097a5 Mon Sep 17 00:00:00 2001 From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:44:28 +0200 Subject: check_icmp: clang-format diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c index f788d42..5ad1d84 100644 --- a/plugins-root/check_icmp.c +++ b/plugins-root/check_icmp.c @@ -1,40 +1,40 @@ /***************************************************************************** -* -* Monitoring check_icmp plugin -* -* License: GPL -* Copyright (c) 2005-2008 Monitoring Plugins Development Team -* Original Author : Andreas Ericsson -* -* Description: -* -* This file contains the check_icmp plugin -* -* Relevant RFC's: 792 (ICMP), 791 (IP) -* -* This program was modeled somewhat after the check_icmp program, -* which was in turn a hack of fping (www.fping.org) but has been -* completely rewritten since to generate higher precision rta values, -* and support several different modes as well as setting ttl to control. -* redundant routes. The only remainders of fping is currently a few -* function names. -* -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* -*****************************************************************************/ + * + * Monitoring check_icmp plugin + * + * License: GPL + * Copyright (c) 2005-2008 Monitoring Plugins Development Team + * Original Author : Andreas Ericsson + * + * Description: + * + * This file contains the check_icmp plugin + * + * Relevant RFC's: 792 (ICMP), 791 (IP) + * + * This program was modeled somewhat after the check_icmp program, + * which was in turn a hack of fping (www.fping.org) but has been + * completely rewritten since to generate higher precision rta values, + * and support several different modes as well as setting ttl to control. + * redundant routes. The only remainders of fping is currently a few + * function names. + * + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + *****************************************************************************/ /* progname may change */ /* char *progname = "check_icmp"; */ @@ -48,7 +48,7 @@ const char *email = "devel@monitoring-plugins.org"; #include "utils.h" #if HAVE_SYS_SOCKIO_H -#include +# include #endif #include @@ -65,84 +65,83 @@ const char *email = "devel@monitoring-plugins.org"; #include #include - /** sometimes undefined system macros (quite a few, actually) **/ #ifndef MAXTTL -# define MAXTTL 255 +# define MAXTTL 255 #endif #ifndef INADDR_NONE -# define INADDR_NONE (in_addr_t)(-1) +# define INADDR_NONE (in_addr_t)(-1) #endif #ifndef SOL_IP -#define SOL_IP 0 +# define SOL_IP 0 #endif /* we bundle these in one #ifndef, since they're all from BSD * Put individual #ifndef's around those that bother you */ #ifndef ICMP_UNREACH_NET_UNKNOWN -# define ICMP_UNREACH_NET_UNKNOWN 6 -# define ICMP_UNREACH_HOST_UNKNOWN 7 -# define ICMP_UNREACH_ISOLATED 8 -# define ICMP_UNREACH_NET_PROHIB 9 -# define ICMP_UNREACH_HOST_PROHIB 10 -# define ICMP_UNREACH_TOSNET 11 -# define ICMP_UNREACH_TOSHOST 12 +# define ICMP_UNREACH_NET_UNKNOWN 6 +# define ICMP_UNREACH_HOST_UNKNOWN 7 +# define ICMP_UNREACH_ISOLATED 8 +# define ICMP_UNREACH_NET_PROHIB 9 +# define ICMP_UNREACH_HOST_PROHIB 10 +# define ICMP_UNREACH_TOSNET 11 +# define ICMP_UNREACH_TOSHOST 12 #endif /* tru64 has the ones above, but not these */ #ifndef ICMP_UNREACH_FILTER_PROHIB -# define ICMP_UNREACH_FILTER_PROHIB 13 -# define ICMP_UNREACH_HOST_PRECEDENCE 14 -# define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 +# define ICMP_UNREACH_FILTER_PROHIB 13 +# define ICMP_UNREACH_HOST_PRECEDENCE 14 +# define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 #endif -typedef unsigned short range_t; /* type for get_range() -- unimplemented */ +typedef unsigned short range_t; /* type for get_range() -- unimplemented */ typedef struct rta_host { - unsigned short id; /* id in **table, and icmp pkts */ - char *name; /* arg used for adding this host */ - char *msg; /* icmp error message, if any */ - struct sockaddr_storage saddr_in; /* the address of this host */ - struct sockaddr_storage error_addr; /* stores address of error replies */ - unsigned long long time_waited; /* total time waited, in usecs */ + unsigned short id; /* id in **table, and icmp pkts */ + char *name; /* arg used for adding this host */ + char *msg; /* icmp error message, if any */ + struct sockaddr_storage saddr_in; /* the address of this host */ + struct sockaddr_storage error_addr; /* stores address of error replies */ + unsigned long long time_waited; /* total time waited, in usecs */ unsigned int icmp_sent, icmp_recv, icmp_lost; /* counters */ - unsigned char icmp_type, icmp_code; /* type and code from errors */ - unsigned short flags; /* control/status flags */ - double rta; /* measured RTA */ - int rta_status; // check result for RTA checks - double rtmax; /* max rtt */ - double rtmin; /* min rtt */ - double jitter; /* measured jitter */ - int jitter_status; // check result for Jitter checks - double jitter_max; /* jitter rtt maximum */ - double jitter_min; /* jitter rtt minimum */ + unsigned char icmp_type, icmp_code; /* type and code from errors */ + unsigned short flags; /* control/status flags */ + double rta; /* measured RTA */ + int rta_status; // check result for RTA checks + double rtmax; /* max rtt */ + double rtmin; /* min rtt */ + double jitter; /* measured jitter */ + int jitter_status; // check result for Jitter checks + double jitter_max; /* jitter rtt maximum */ + double jitter_min; /* jitter rtt minimum */ double EffectiveLatency; - double mos; /* Mean opnion score */ - int mos_status; // check result for MOS checks - double score; /* score */ - int score_status; // check result for score checks + double mos; /* Mean opnion score */ + int mos_status; // check result for MOS checks + double score; /* score */ + int score_status; // check result for score checks u_int last_tdiff; - u_int last_icmp_seq; /* Last ICMP_SEQ to check out of order pkts */ - unsigned char pl; /* measured packet loss */ - int pl_status; // check result for packet loss checks - struct rta_host *next; /* linked list */ - int order_status; // check result for packet order checks + u_int last_icmp_seq; /* Last ICMP_SEQ to check out of order pkts */ + unsigned char pl; /* measured packet loss */ + int pl_status; // check result for packet loss checks + struct rta_host *next; /* linked list */ + int order_status; // check result for packet order checks } rta_host; -#define FLAG_LOST_CAUSE 0x01 /* decidedly dead target. */ +#define FLAG_LOST_CAUSE 0x01 /* decidedly dead target. */ /* threshold structure. all values are maximum allowed, exclusive */ typedef struct threshold { - unsigned char pl; /* max allowed packet loss in percent */ - unsigned int rta; /* roundtrip time average, microseconds */ - double jitter; /* jitter time average, microseconds */ - double mos; /* MOS */ - double score; /* Score */ + unsigned char pl; /* max allowed packet loss in percent */ + unsigned int rta; /* roundtrip time average, microseconds */ + double jitter; /* jitter time average, microseconds */ + double mos; /* MOS */ + double score; /* Score */ } threshold; /* the data structure */ typedef struct icmp_ping_data { - struct timeval stime; /* timestamp (saved in protocol struct as well) */ + struct timeval stime; /* timestamp (saved in protocol struct as well) */ unsigned short ping_id; } icmp_ping_data; @@ -171,48 +170,42 @@ typedef union icmp_packet { * MODE_ICMP: implement something similar to check_icmp (MODE_RTA without * tcp and udp args does this) */ -#define MODE_RTA 0 +#define MODE_RTA 0 #define MODE_HOSTCHECK 1 -#define MODE_ALL 2 -#define MODE_ICMP 3 +#define MODE_ALL 2 +#define MODE_ICMP 3 -enum enum_threshold_mode { - const_rta_mode, - const_packet_loss_mode, - const_jitter_mode, - const_mos_mode, - const_score_mode -}; +enum enum_threshold_mode { const_rta_mode, const_packet_loss_mode, const_jitter_mode, const_mos_mode, const_score_mode }; typedef enum enum_threshold_mode threshold_mode; /* the different ping types we can do * TODO: investigate ARP ping as well */ #define HAVE_ICMP 1 -#define HAVE_UDP 2 -#define HAVE_TCP 4 -#define HAVE_ARP 8 - -#define MIN_PING_DATA_SIZE sizeof(struct icmp_ping_data) -#define MAX_IP_PKT_SIZE 65536 /* (theoretical) max IP packet size */ -#define IP_HDR_SIZE 20 -#define MAX_PING_DATA (MAX_IP_PKT_SIZE - IP_HDR_SIZE - ICMP_MINLEN) +#define HAVE_UDP 2 +#define HAVE_TCP 4 +#define HAVE_ARP 8 + +#define MIN_PING_DATA_SIZE sizeof(struct icmp_ping_data) +#define MAX_IP_PKT_SIZE 65536 /* (theoretical) max IP packet size */ +#define IP_HDR_SIZE 20 +#define MAX_PING_DATA (MAX_IP_PKT_SIZE - IP_HDR_SIZE - ICMP_MINLEN) #define DEFAULT_PING_DATA_SIZE (MIN_PING_DATA_SIZE + 44) /* various target states */ -#define TSTATE_INACTIVE 0x01 /* don't ping this host anymore */ -#define TSTATE_WAITING 0x02 /* unanswered packets on the wire */ -#define TSTATE_ALIVE 0x04 /* target is alive (has answered something) */ -#define TSTATE_UNREACH 0x08 +#define TSTATE_INACTIVE 0x01 /* don't ping this host anymore */ +#define TSTATE_WAITING 0x02 /* unanswered packets on the wire */ +#define TSTATE_ALIVE 0x04 /* target is alive (has answered something) */ +#define TSTATE_UNREACH 0x08 /** prototypes **/ -void print_help (void); -void print_usage (void); +void print_help(void); +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, void *, unsigned int, struct sockaddr *, u_int *, struct timeval*); +static int recvfrom_wto(int, void *, unsigned int, struct sockaddr *, u_int *, struct timeval *); static int send_icmp_ping(int, struct rta_host *); static int get_threshold(char *str, threshold *th); static bool get_threshold2(char *str, size_t length, threshold *, threshold *, threshold_mode mode); @@ -235,20 +228,8 @@ extern char **environ; /** global variables **/ static struct rta_host **table, *cursor, *list; -static threshold crit = { - .pl = 80, - .rta = 500000, - .jitter = 0.0, - .mos = 0.0, - .score = 0.0 -}; -static threshold warn = { - .pl = 40, - .rta = 200000, - .jitter = 0.0, - .mos = 0.0, - .score = 0.0 -}; +static threshold crit = {.pl = 80, .rta = 500000, .jitter = 0.0, .mos = 0.0, .score = 0.0}; +static threshold warn = {.pl = 40, .rta = 200000, .jitter = 0.0, .mos = 0.0, .score = 0.0}; static int mode, protocols, sockets, debug = 0, timeout = 10; static unsigned short icmp_data_size = DEFAULT_PING_DATA_SIZE; @@ -268,17 +249,15 @@ static unsigned int warn_down = 1, crit_down = 1; /* host down threshold values static int min_hosts_alive = -1; float pkt_backoff_factor = 1.5; float target_backoff_factor = 1.5; -bool rta_mode=false; -bool pl_mode=false; -bool jitter_mode=false; -bool score_mode=false; -bool mos_mode=false; -bool order_mode=false; +bool rta_mode = false; +bool pl_mode = false; +bool jitter_mode = false; +bool score_mode = false; +bool mos_mode = false; +bool order_mode = false; /** code start **/ -static void -crash(const char *fmt, ...) -{ +static void crash(const char *fmt, ...) { va_list ap; printf("%s: ", progname); @@ -287,55 +266,100 @@ crash(const char *fmt, ...) vprintf(fmt, ap); va_end(ap); - if(errno) printf(": %s", strerror(errno)); + if (errno) + printf(": %s", strerror(errno)); puts(""); exit(3); } - -static const char * -get_icmp_error_msg(unsigned char icmp_type, unsigned char icmp_code) -{ +static const char *get_icmp_error_msg(unsigned char icmp_type, unsigned char icmp_code) { const char *msg = "unreachable"; - if(debug > 1) printf("get_icmp_error_msg(%u, %u)\n", icmp_type, icmp_code); - switch(icmp_type) { + if (debug > 1) + printf("get_icmp_error_msg(%u, %u)\n", icmp_type, icmp_code); + switch (icmp_type) { case ICMP_UNREACH: - switch(icmp_code) { - case ICMP_UNREACH_NET: msg = "Net unreachable"; break; - case ICMP_UNREACH_HOST: msg = "Host unreachable"; break; - case ICMP_UNREACH_PROTOCOL: msg = "Protocol unreachable (firewall?)"; break; - case ICMP_UNREACH_PORT: msg = "Port unreachable (firewall?)"; break; - case ICMP_UNREACH_NEEDFRAG: msg = "Fragmentation needed"; break; - case ICMP_UNREACH_SRCFAIL: msg = "Source route failed"; break; - case ICMP_UNREACH_ISOLATED: msg = "Source host isolated"; break; - case ICMP_UNREACH_NET_UNKNOWN: msg = "Unknown network"; break; - case ICMP_UNREACH_HOST_UNKNOWN: msg = "Unknown host"; break; - case ICMP_UNREACH_NET_PROHIB: msg = "Network denied (firewall?)"; break; - case ICMP_UNREACH_HOST_PROHIB: msg = "Host denied (firewall?)"; break; - case ICMP_UNREACH_TOSNET: msg = "Bad TOS for network (firewall?)"; break; - case ICMP_UNREACH_TOSHOST: msg = "Bad TOS for host (firewall?)"; break; - case ICMP_UNREACH_FILTER_PROHIB: msg = "Prohibited by filter (firewall)"; break; - case ICMP_UNREACH_HOST_PRECEDENCE: msg = "Host precedence violation"; break; - case ICMP_UNREACH_PRECEDENCE_CUTOFF: msg = "Precedence cutoff"; break; - default: msg = "Invalid code"; break; + switch (icmp_code) { + case ICMP_UNREACH_NET: + msg = "Net unreachable"; + break; + case ICMP_UNREACH_HOST: + msg = "Host unreachable"; + break; + case ICMP_UNREACH_PROTOCOL: + msg = "Protocol unreachable (firewall?)"; + break; + case ICMP_UNREACH_PORT: + msg = "Port unreachable (firewall?)"; + break; + case ICMP_UNREACH_NEEDFRAG: + msg = "Fragmentation needed"; + break; + case ICMP_UNREACH_SRCFAIL: + msg = "Source route failed"; + break; + case ICMP_UNREACH_ISOLATED: + msg = "Source host isolated"; + break; + case ICMP_UNREACH_NET_UNKNOWN: + msg = "Unknown network"; + break; + case ICMP_UNREACH_HOST_UNKNOWN: + msg = "Unknown host"; + break; + case ICMP_UNREACH_NET_PROHIB: + msg = "Network denied (firewall?)"; + break; + case ICMP_UNREACH_HOST_PROHIB: + msg = "Host denied (firewall?)"; + break; + case ICMP_UNREACH_TOSNET: + msg = "Bad TOS for network (firewall?)"; + break; + case ICMP_UNREACH_TOSHOST: + msg = "Bad TOS for host (firewall?)"; + break; + case ICMP_UNREACH_FILTER_PROHIB: + msg = "Prohibited by filter (firewall)"; + break; + case ICMP_UNREACH_HOST_PRECEDENCE: + msg = "Host precedence violation"; + break; + case ICMP_UNREACH_PRECEDENCE_CUTOFF: + msg = "Precedence cutoff"; + break; + default: + msg = "Invalid code"; + break; } break; case ICMP_TIMXCEED: /* really 'out of reach', or non-existent host behind a router serving * two different subnets */ - switch(icmp_code) { - case ICMP_TIMXCEED_INTRANS: msg = "Time to live exceeded in transit"; break; - case ICMP_TIMXCEED_REASS: msg = "Fragment reassembly time exceeded"; break; - default: msg = "Invalid code"; break; + switch (icmp_code) { + case ICMP_TIMXCEED_INTRANS: + msg = "Time to live exceeded in transit"; + break; + case ICMP_TIMXCEED_REASS: + msg = "Fragment reassembly time exceeded"; + break; + default: + msg = "Invalid code"; + break; } break; - case ICMP_SOURCEQUENCH: msg = "Transmitting too fast"; break; - case ICMP_REDIRECT: msg = "Redirect (change route)"; break; - case ICMP_PARAMPROB: msg = "Bad IP header (required option absent)"; break; + case ICMP_SOURCEQUENCH: + msg = "Transmitting too fast"; + break; + case ICMP_REDIRECT: + msg = "Redirect (change route)"; + break; + case ICMP_PARAMPROB: + msg = "Bad IP header (required option absent)"; + break; /* the following aren't error messages, so ignore */ case ICMP_TSTAMP: @@ -344,25 +368,26 @@ get_icmp_error_msg(unsigned char icmp_type, unsigned char icmp_code) case ICMP_IREQREPLY: case ICMP_MASKREQ: case ICMP_MASKREPLY: - default: msg = ""; break; + default: + msg = ""; + break; } return msg; } -static int -handle_random_icmp(unsigned char *packet, struct sockaddr_storage *addr) -{ +static int handle_random_icmp(unsigned char *packet, struct sockaddr_storage *addr) { struct icmp p, sent_icmp; struct rta_host *host = NULL; memcpy(&p, packet, sizeof(p)); - if(p.icmp_type == ICMP_ECHO && ntohs(p.icmp_id) == pid) { + if (p.icmp_type == ICMP_ECHO && ntohs(p.icmp_id) == pid) { /* echo request from us to us (pinging localhost) */ return 0; } - if(debug) printf("handle_random_icmp(%p, %p)\n", (void *)&p, (void *)addr); + if (debug) + printf("handle_random_icmp(%p, %p)\n", (void *)&p, (void *)addr); /* only handle a few types, since others can't possibly be replies to * us in a sane network (if it is anyway, it will be counted as lost @@ -374,44 +399,39 @@ handle_random_icmp(unsigned char *packet, struct sockaddr_storage *addr) * TIMXCEED actually sends a proper icmp response we will have passed * too many hops to have a hope of reaching it later, in which case it * indicates overconfidence in the network, poor routing or both. */ - if(p.icmp_type != ICMP_UNREACH && p.icmp_type != ICMP_TIMXCEED && - p.icmp_type != ICMP_SOURCEQUENCH && p.icmp_type != ICMP_PARAMPROB) - { + if (p.icmp_type != ICMP_UNREACH && p.icmp_type != ICMP_TIMXCEED && p.icmp_type != ICMP_SOURCEQUENCH && p.icmp_type != ICMP_PARAMPROB) { return 0; } /* might be for us. At least it holds the original package (according * to RFC 792). If it isn't, just ignore it */ memcpy(&sent_icmp, packet + 28, sizeof(sent_icmp)); - if(sent_icmp.icmp_type != ICMP_ECHO || ntohs(sent_icmp.icmp_id) != pid || - ntohs(sent_icmp.icmp_seq) >= targets*packets) - { - if(debug) printf("Packet is no response to a packet we sent\n"); + if (sent_icmp.icmp_type != ICMP_ECHO || ntohs(sent_icmp.icmp_id) != pid || ntohs(sent_icmp.icmp_seq) >= targets * packets) { + if (debug) + printf("Packet is no response to a packet we sent\n"); return 0; } /* it is indeed a response for us */ - host = table[ntohs(sent_icmp.icmp_seq)/packets]; - if(debug) { + host = table[ntohs(sent_icmp.icmp_seq) / packets]; + if (debug) { char address[INET6_ADDRSTRLEN]; parse_address(addr, address, sizeof(address)); - printf("Received \"%s\" from %s for ICMP ECHO sent to %s.\n", - get_icmp_error_msg(p.icmp_type, p.icmp_code), - address, host->name); + printf("Received \"%s\" from %s for ICMP ECHO sent to %s.\n", get_icmp_error_msg(p.icmp_type, p.icmp_code), address, host->name); } icmp_lost++; host->icmp_lost++; /* don't spend time on lost hosts any more */ - if(host->flags & FLAG_LOST_CAUSE) return 0; + if (host->flags & FLAG_LOST_CAUSE) + return 0; /* source quench means we're sending too fast, so increase the * interval and mark this packet lost */ - if(p.icmp_type == ICMP_SOURCEQUENCH) { + if (p.icmp_type == ICMP_SOURCEQUENCH) { pkt_interval *= pkt_backoff_factor; target_interval *= target_backoff_factor; - } - else { + } else { targets_down++; host->flags |= FLAG_LOST_CAUSE; } @@ -422,21 +442,18 @@ handle_random_icmp(unsigned char *packet, struct sockaddr_storage *addr) return 0; } -void parse_address(struct sockaddr_storage *addr, char *address, int size) -{ +void parse_address(struct sockaddr_storage *addr, char *address, int size) { switch (address_family) { case AF_INET: inet_ntop(address_family, &((struct sockaddr_in *)addr)->sin_addr, address, size); - break; + break; case AF_INET6: inet_ntop(address_family, &((struct sockaddr_in6 *)addr)->sin6_addr, address, size); - break; + break; } } -int -main(int argc, char **argv) -{ +int main(int argc, char **argv) { int i; char *ptr; long int arg; @@ -450,10 +467,10 @@ main(int argc, char **argv) int on = 1; #endif char *source_ip = NULL; - char * opts_str = "vhVw:c:n:p:t:H:s:i:b:I:l:m:P:R:J:S:M:O64"; - setlocale (LC_ALL, ""); - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); + char *opts_str = "vhVw:c:n:p:t:H:s:i:b:I:l:m:P:R:J:S:M:O64"; + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); /* we only need to be setsuid when we get the sockets, so do * that before pointer magic (esp. on network data) */ @@ -465,8 +482,10 @@ main(int argc, char **argv) /* get calling name the old-fashioned way for portability instead * of relying on the glibc-ism __progname */ ptr = strrchr(argv[0], '/'); - if(ptr) progname = &ptr[1]; - else progname = argv[0]; + if (ptr) + progname = &ptr[1]; + else + progname = argv[0]; /* now set defaults. Use progname to set them initially (allows for * superfast check_host program when target host is up */ @@ -478,31 +497,29 @@ main(int argc, char **argv) crit.rta = 500000; crit.pl = 80; crit.jitter = 50; - crit.mos= 3; - crit.score=70; + crit.mos = 3; + crit.score = 70; /* Default warning thresholds */ warn.rta = 200000; warn.pl = 40; warn.jitter = 40; - warn.mos= 3.5; - warn.score=80; + warn.mos = 3.5; + warn.score = 80; protocols = HAVE_ICMP | HAVE_UDP | HAVE_TCP; - pkt_interval = 80000; /* 80 msec packet interval by default */ + pkt_interval = 80000; /* 80 msec packet interval by default */ packets = 5; - if(!strcmp(progname, "check_icmp") || !strcmp(progname, "check_ping")) { + if (!strcmp(progname, "check_icmp") || !strcmp(progname, "check_ping")) { mode = MODE_ICMP; protocols = HAVE_ICMP; - } - else if(!strcmp(progname, "check_host")) { + } else if (!strcmp(progname, "check_host")) { mode = MODE_HOSTCHECK; pkt_interval = 1000000; packets = 5; crit.rta = warn.rta = 1000000; crit.pl = warn.pl = 100; - } - else if(!strcmp(progname, "check_rta_multi")) { + } else if (!strcmp(progname, "check_rta_multi")) { mode = MODE_ALL; target_interval = 0; pkt_interval = 50000; @@ -510,17 +527,17 @@ main(int argc, char **argv) } /* support "--help" and "--version" */ - if(argc == 2) { - if(!strcmp(argv[1], "--help")) + if (argc == 2) { + if (!strcmp(argv[1], "--help")) strcpy(argv[1], "-h"); - if(!strcmp(argv[1], "--version")) + if (!strcmp(argv[1], "--version")) strcpy(argv[1], "-V"); } /* Parse protocol arguments first */ - for(i = 1; i < argc; i++) { - while((arg = getopt(argc, argv, opts_str)) != EOF) { - switch(arg) { + for (i = 1; i < argc; i++) { + while ((arg = getopt(argc, argv, opts_str)) != EOF) { + switch (arg) { case '4': if (address_family != -1) crash("Multiple protocol versions not supported"); @@ -532,7 +549,7 @@ main(int argc, char **argv) crash("Multiple protocol versions not supported"); address_family = AF_INET6; #else - usage (_("IPv6 support not available\n")); + usage(_("IPv6 support not available\n")); #endif break; } @@ -545,22 +562,19 @@ main(int argc, char **argv) unsigned long size; bool err; /* parse the arguments */ - for(i = 1; i < argc; i++) { - while((arg = getopt(argc, argv, opts_str)) != EOF) { - switch(arg) { + for (i = 1; i < argc; i++) { + while ((arg = getopt(argc, argv, opts_str)) != EOF) { + switch (arg) { case 'v': debug++; break; case 'b': - size = strtol(optarg,NULL,0); - if (size >= (sizeof(struct icmp) + sizeof(struct icmp_ping_data)) && - size < MAX_PING_DATA) { + size = strtol(optarg, NULL, 0); + if (size >= (sizeof(struct icmp) + sizeof(struct icmp_ping_data)) && size < MAX_PING_DATA) { icmp_data_size = size; icmp_pkt_size = size + ICMP_MINLEN; } else - usage_va("ICMP data length must be between: %lu and %lu", - sizeof(struct icmp) + sizeof(struct icmp_ping_data), - MAX_PING_DATA - 1); + usage_va("ICMP data length must be between: %lu and %lu", sizeof(struct icmp) + sizeof(struct icmp_ping_data), MAX_PING_DATA - 1); break; case 'i': pkt_interval = get_timevar(optarg); @@ -580,7 +594,8 @@ main(int argc, char **argv) break; case 't': timeout = strtoul(optarg, NULL, 0); - if(!timeout) timeout = 10; + if (!timeout) + timeout = 10; break; case 'H': add_target(optarg); @@ -593,7 +608,7 @@ main(int argc, char **argv) break; case 'd': /* implement later, for cluster checks */ warn_down = (unsigned char)strtoul(optarg, &ptr, 0); - if(ptr) { + if (ptr) { crit_down = (unsigned char)strtoul(ptr + 1, NULL, 0); } break; @@ -601,54 +616,54 @@ main(int argc, char **argv) source_ip = optarg; break; case 'V': /* version */ - print_revision (progname, NP_VERSION); - exit (STATE_UNKNOWN); + print_revision(progname, NP_VERSION); + exit(STATE_UNKNOWN); case 'h': /* help */ - print_help (); - exit (STATE_UNKNOWN); + print_help(); + exit(STATE_UNKNOWN); break; case 'R': /* RTA mode */ err = get_threshold2(optarg, strlen(optarg), &warn, &crit, const_rta_mode); if (!err) { - crash("Failed to parse RTA threshold"); + crash("Failed to parse RTA threshold"); } - rta_mode=true; + rta_mode = true; break; case 'P': /* packet loss mode */ err = get_threshold2(optarg, strlen(optarg), &warn, &crit, const_packet_loss_mode); if (!err) { - crash("Failed to parse packet loss threshold"); + crash("Failed to parse packet loss threshold"); } - pl_mode=true; + pl_mode = true; break; case 'J': /* jitter mode */ err = get_threshold2(optarg, strlen(optarg), &warn, &crit, const_jitter_mode); if (!err) { - crash("Failed to parse jitter threshold"); + crash("Failed to parse jitter threshold"); } - jitter_mode=true; + jitter_mode = true; break; case 'M': /* MOS mode */ err = get_threshold2(optarg, strlen(optarg), &warn, &crit, const_mos_mode); if (!err) { - crash("Failed to parse MOS threshold"); + crash("Failed to parse MOS threshold"); } - mos_mode=true; + mos_mode = true; break; case 'S': /* score mode */ err = get_threshold2(optarg, strlen(optarg), &warn, &crit, const_score_mode); if (!err) { - crash("Failed to parse score threshold"); + crash("Failed to parse score threshold"); } - score_mode=true; + score_mode = true; break; case 'O': /* out of order mode */ - order_mode=true; + order_mode = true; break; } } @@ -663,37 +678,42 @@ main(int argc, char **argv) /* printf("pid = %u\n", pid); */ /* Parse extra opts if any */ - argv=np_extra_opts(&argc, argv, progname); + argv = np_extra_opts(&argc, argv, progname); argv = &argv[optind]; - while(*argv) { + while (*argv) { add_target(*argv); argv++; } - if(!targets) { + if (!targets) { errno = 0; crash("No hosts to check"); } // add_target might change address_family - switch ( address_family ){ - case AF_INET: icmp_proto = IPPROTO_ICMP; - break; - case AF_INET6: icmp_proto = IPPROTO_ICMPV6; - break; - default: crash("Address family not supported"); + switch (address_family) { + case AF_INET: + icmp_proto = IPPROTO_ICMP; + break; + case AF_INET6: + icmp_proto = IPPROTO_ICMPV6; + break; + default: + crash("Address family not supported"); } - if((icmp_sock = socket(address_family, SOCK_RAW, icmp_proto)) != -1) + if ((icmp_sock = socket(address_family, SOCK_RAW, icmp_proto)) != -1) sockets |= HAVE_ICMP; - else icmp_sockerrno = errno; + else + icmp_sockerrno = errno; - if( source_ip ) + if (source_ip) set_source_ip(source_ip); #ifdef SO_TIMESTAMP - if(setsockopt(icmp_sock, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on))) - if(debug) printf("Warning: no SO_TIMESTAMP support\n"); + if (setsockopt(icmp_sock, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on))) + if (debug) + printf("Warning: no SO_TIMESTAMP support\n"); #endif // SO_TIMESTAMP /* now drop privileges (no effect if not setsuid or geteuid() == 0) */ @@ -702,8 +722,8 @@ main(int argc, char **argv) return 1; } - if(!sockets) { - if(icmp_sock == -1) { + if (!sockets) { + if (icmp_sock == -1) { errno = icmp_sockerrno; crash("Failed to obtain ICMP socket"); return -1; @@ -719,13 +739,16 @@ main(int argc, char **argv) /* return -1; */ /* } */ } - if(!ttl) ttl = 64; + if (!ttl) + ttl = 64; - if(icmp_sock) { + if (icmp_sock) { result = setsockopt(icmp_sock, SOL_IP, IP_TTL, &ttl, sizeof(ttl)); - if(debug) { - if(result == -1) printf("setsockopt failed\n"); - else printf("ttl set to %u\n", ttl); + if (debug) { + if (result == -1) + printf("setsockopt failed\n"); + else + printf("ttl set to %u\n", ttl); } } @@ -733,85 +756,82 @@ main(int argc, char **argv) * (nothing will break if they do), but some anal plugin maintainer * will probably add some printf() thing here later, so it might be * best to at least show them where to do it. ;) */ - if(warn.pl > crit.pl) warn.pl = crit.pl; - if(warn.rta > crit.rta) warn.rta = crit.rta; - if(warn_down > crit_down) crit_down = warn_down; - if(warn.jitter > crit.jitter) crit.jitter = warn.jitter; - if(warn.mos < crit.mos) warn.mos = crit.mos; - if(warn.score < crit.score) warn.score = crit.score; + if (warn.pl > crit.pl) + warn.pl = crit.pl; + if (warn.rta > crit.rta) + warn.rta = crit.rta; + if (warn_down > crit_down) + crit_down = warn_down; + if (warn.jitter > crit.jitter) + crit.jitter = warn.jitter; + if (warn.mos < crit.mos) + warn.mos = crit.mos; + if (warn.score < crit.score) + warn.score = crit.score; #ifdef HAVE_SIGACTION sig_action.sa_sigaction = NULL; sig_action.sa_handler = finish; sigfillset(&sig_action.sa_mask); - sig_action.sa_flags = SA_NODEFER|SA_RESTART; + sig_action.sa_flags = SA_NODEFER | SA_RESTART; sigaction(SIGINT, &sig_action, NULL); sigaction(SIGHUP, &sig_action, NULL); sigaction(SIGTERM, &sig_action, NULL); sigaction(SIGALRM, &sig_action, NULL); -#else /* HAVE_SIGACTION */ +#else /* HAVE_SIGACTION */ signal(SIGINT, finish); signal(SIGHUP, finish); signal(SIGTERM, finish); signal(SIGALRM, finish); #endif /* HAVE_SIGACTION */ - if(debug) printf("Setting alarm timeout to %u seconds\n", timeout); + if (debug) + printf("Setting alarm timeout to %u seconds\n", timeout); alarm(timeout); /* make sure we don't wait any longer than necessary */ gettimeofday(&prog_start, &tz); - max_completion_time = - ((targets * packets * pkt_interval) + (targets * target_interval)) + - (targets * packets * crit.rta) + crit.rta; + max_completion_time = ((targets * packets * pkt_interval) + (targets * target_interval)) + (targets * packets * crit.rta) + crit.rta; - if(debug) { + if (debug) { printf("packets: %u, targets: %u\n" "target_interval: %0.3f, pkt_interval %0.3f\n" "crit.rta: %0.3f\n" "max_completion_time: %0.3f\n", - packets, targets, - (float)target_interval / 1000, (float)pkt_interval / 1000, - (float)crit.rta / 1000, - (float)max_completion_time / 1000); + packets, targets, (float)target_interval / 1000, (float)pkt_interval / 1000, (float)crit.rta / 1000, (float)max_completion_time / 1000); } - if(debug) { - if(max_completion_time > (u_int)timeout * 1000000) { - printf("max_completion_time: %llu timeout: %u\n", - max_completion_time, timeout); - printf("Timeout must be at least %llu\n", - max_completion_time / 1000000 + 1); + if (debug) { + if (max_completion_time > (u_int)timeout * 1000000) { + printf("max_completion_time: %llu timeout: %u\n", max_completion_time, timeout); + printf("Timeout must be at least %llu\n", max_completion_time / 1000000 + 1); } } - if(debug) { - printf("crit = {%u, %u%%}, warn = {%u, %u%%}\n", - crit.rta, crit.pl, warn.rta, warn.pl); - printf("pkt_interval: %u target_interval: %u retry_interval: %u\n", - pkt_interval, target_interval, retry_interval); - printf("icmp_pkt_size: %u timeout: %u\n", - icmp_pkt_size, timeout); + if (debug) { + printf("crit = {%u, %u%%}, warn = {%u, %u%%}\n", crit.rta, crit.pl, warn.rta, warn.pl); + printf("pkt_interval: %u target_interval: %u retry_interval: %u\n", pkt_interval, target_interval, retry_interval); + printf("icmp_pkt_size: %u timeout: %u\n", icmp_pkt_size, timeout); } - if(packets > 20) { + if (packets > 20) { errno = 0; crash("packets is > 20 (%d)", packets); } - if(min_hosts_alive < -1) { + if (min_hosts_alive < -1) { errno = 0; crash("minimum alive hosts is negative (%i)", min_hosts_alive); } host = list; table = malloc(sizeof(struct rta_host *) * targets); - if(!table) { + if (!table) { crash("main(): malloc failed for host table"); } i = 0; - while(host) { - host->id = i*packets; + while (host) { + host->id = i * packets; table[i] = host; host = host->next; i++; @@ -822,25 +842,24 @@ main(int argc, char **argv) errno = 0; finish(0); - return(0); + return (0); } -static void -run_checks() -{ +static void run_checks() { u_int i, t; u_int final_wait, time_passed; /* this loop might actually violate the pkt_interval or target_interval * settings, but only if there aren't any packets on the wire which * indicates that the target can handle an increased packet rate */ - for(i = 0; i < packets; i++) { - for(t = 0; t < targets; t++) { + for (i = 0; i < packets; i++) { + for (t = 0; t < targets; t++) { /* don't send useless packets */ - if(!targets_alive) finish(0); - if(table[t]->flags & FLAG_LOST_CAUSE) { - if(debug) printf("%s is a lost cause. not sending any more\n", - table[t]->name); + if (!targets_alive) + finish(0); + if (table[t]->flags & FLAG_LOST_CAUSE) { + if (debug) + printf("%s is a lost cause. not sending any more\n", table[t]->name); continue; } @@ -851,28 +870,27 @@ run_checks() wait_for_reply(icmp_sock, pkt_interval * targets); } - if(icmp_pkts_en_route && targets_alive) { + if (icmp_pkts_en_route && targets_alive) { time_passed = get_timevaldiff(NULL, NULL); final_wait = max_completion_time - time_passed; - if(debug) { - printf("time_passed: %u final_wait: %u max_completion_time: %llu\n", - time_passed, final_wait, max_completion_time); + if (debug) { + printf("time_passed: %u final_wait: %u max_completion_time: %llu\n", time_passed, final_wait, max_completion_time); } - if(time_passed > max_completion_time) { - if(debug) printf("Time passed. Finishing up\n"); + if (time_passed > max_completion_time) { + if (debug) + printf("Time passed. Finishing up\n"); finish(0); } /* catch the packets that might come in within the timeframe, but * haven't yet */ - if(debug) printf("Waiting for %u micro-seconds (%0.3f msecs)\n", - final_wait, (float)final_wait / 1000); + if (debug) + printf("Waiting for %u micro-seconds (%0.3f msecs)\n", final_wait, (float)final_wait / 1000); wait_for_reply(icmp_sock, final_wait); } } - /* response structure: * IPv4: * ip header : 20 bytes @@ -883,9 +901,7 @@ run_checks() * both: * icmp echo reply : the rest */ -static int -wait_for_reply(int sock, u_int t) -{ +static int wait_for_reply(int sock, u_int t) { int n, hlen; static unsigned char buf[65536]; struct sockaddr_storage resp_addr; @@ -898,15 +914,14 @@ wait_for_reply(int sock, u_int t) double jitter_tmp; if (!(packet.buf = malloc(icmp_pkt_size))) { - crash("send_icmp_ping(): failed to malloc %d bytes for send buffer", - icmp_pkt_size); - return -1; /* might be reached if we're in debug mode */ + crash("send_icmp_ping(): failed to malloc %d bytes for send buffer", icmp_pkt_size); + return -1; /* might be reached if we're in debug mode */ } memset(packet.buf, 0, icmp_pkt_size); /* if we can't listen or don't have anything to listen to, just return */ - if(!t || !icmp_pkts_en_route) { + if (!t || !icmp_pkts_en_route) { free(packet.buf); return 0; } @@ -915,29 +930,25 @@ wait_for_reply(int sock, u_int t) i = t; per_pkt_wait = t / icmp_pkts_en_route; - while(icmp_pkts_en_route && get_timevaldiff(&wait_start, NULL) < i) { + while (icmp_pkts_en_route && get_timevaldiff(&wait_start, NULL) < i) { t = per_pkt_wait; /* wrap up if all targets are declared dead */ - if(!targets_alive || - get_timevaldiff(&prog_start, NULL) >= max_completion_time || - (mode == MODE_HOSTCHECK && targets_down)) - { + if (!targets_alive || get_timevaldiff(&prog_start, NULL) >= max_completion_time || (mode == MODE_HOSTCHECK && targets_down)) { finish(0); } /* reap responses until we hit a timeout */ - n = recvfrom_wto(sock, buf, sizeof(buf), - (struct sockaddr *)&resp_addr, &t, &now); - if(!n) { - if(debug > 1) { - printf("recvfrom_wto() timed out during a %u usecs wait\n", - per_pkt_wait); + n = recvfrom_wto(sock, buf, sizeof(buf), (struct sockaddr *)&resp_addr, &t, &now); + if (!n) { + if (debug > 1) { + printf("recvfrom_wto() timed out during a %u usecs wait\n", per_pkt_wait); } - continue; /* timeout for this one, so keep trying */ + continue; /* timeout for this one, so keep trying */ } - if(n < 0) { - if(debug) printf("recvfrom_wto() returned errors\n"); + if (n < 0) { + if (debug) + printf("recvfrom_wto() returned errors\n"); free(packet.buf); return n; } @@ -946,31 +957,27 @@ wait_for_reply(int sock, u_int t) if (address_family != AF_INET6) { ip = (union ip_hdr *)buf; - if(debug > 1) { + if (debug > 1) { char address[INET6_ADDRSTRLEN]; parse_address(&resp_addr, address, sizeof(address)); - printf("received %u bytes from %s\n", - address_family == AF_INET6 ? ntohs(ip->ip6.ip6_plen) - : ntohs(ip->ip.ip_len), - address); + printf("received %u bytes from %s\n", address_family == AF_INET6 ? ntohs(ip->ip6.ip6_plen) : ntohs(ip->ip.ip_len), address); } } -/* obsolete. alpha on tru64 provides the necessary defines, but isn't broken */ -/* #if defined( __alpha__ ) && __STDC__ && !defined( __GLIBC__ ) */ + /* obsolete. alpha on tru64 provides the necessary defines, but isn't broken */ + /* #if defined( __alpha__ ) && __STDC__ && !defined( __GLIBC__ ) */ /* alpha headers are decidedly broken. Using an ansi compiler, * they provide ip_vhl instead of ip_hl and ip_v, so we mask * off the bottom 4 bits */ -/* hlen = (ip->ip_vhl & 0x0f) << 2; */ -/* #else */ + /* hlen = (ip->ip_vhl & 0x0f) << 2; */ + /* #else */ hlen = (address_family == AF_INET6) ? 0 : ip->ip.ip_hl << 2; -/* #endif */ + /* #endif */ - if(n < (hlen + ICMP_MINLEN)) { + if (n < (hlen + ICMP_MINLEN)) { char address[INET6_ADDRSTRLEN]; parse_address(&resp_addr, address, sizeof(address)); - crash("received packet too short for ICMP (%d bytes, expected %d) from %s\n", - n, hlen + icmp_pkt_size, address); + crash("received packet too short for ICMP (%d bytes, expected %d) from %s\n", n, hlen + icmp_pkt_size, address); } /* else if(debug) { */ /* printf("ip header size: %u, packet size: %u (expected %u, %u)\n", */ @@ -981,16 +988,14 @@ wait_for_reply(int sock, u_int t) /* check the response */ memcpy(packet.buf, buf + hlen, icmp_pkt_size); -/* address_family == AF_INET6 ? sizeof(struct icmp6_hdr) - : sizeof(struct icmp));*/ - - if( (address_family == PF_INET && - (ntohs(packet.icp->icmp_id) != pid || packet.icp->icmp_type != ICMP_ECHOREPLY - || ntohs(packet.icp->icmp_seq) >= targets * packets)) - || (address_family == PF_INET6 && - (ntohs(packet.icp6->icmp6_id) != pid || packet.icp6->icmp6_type != ICMP6_ECHO_REPLY - || ntohs(packet.icp6->icmp6_seq) >= targets * packets))) { - if(debug > 2) printf("not a proper ICMP_ECHOREPLY\n"); + /* address_family == AF_INET6 ? sizeof(struct icmp6_hdr) + : sizeof(struct icmp));*/ + + if ((address_family == PF_INET && (ntohs(packet.icp->icmp_id) != pid || packet.icp->icmp_type != ICMP_ECHOREPLY || ntohs(packet.icp->icmp_seq) >= targets * packets)) || + (address_family == PF_INET6 && + (ntohs(packet.icp6->icmp6_id) != pid || packet.icp6->icmp6_type != ICMP6_ECHO_REPLY || ntohs(packet.icp6->icmp6_seq) >= targets * packets))) { + if (debug > 2) + printf("not a proper ICMP_ECHOREPLY\n"); handle_random_icmp(buf + hlen, &resp_addr); continue; } @@ -999,22 +1004,20 @@ wait_for_reply(int sock, u_int t) if (address_family == PF_INET) { memcpy(&data, packet.icp->icmp_data, sizeof(data)); if (debug > 2) - printf("ICMP echo-reply of len %lu, id %u, seq %u, cksum 0x%X\n", - (unsigned long)sizeof(data), ntohs(packet.icp->icmp_id), - ntohs(packet.icp->icmp_seq), packet.icp->icmp_cksum); - host = table[ntohs(packet.icp->icmp_seq)/packets]; + printf("ICMP echo-reply of len %lu, id %u, seq %u, cksum 0x%X\n", (unsigned long)sizeof(data), ntohs(packet.icp->icmp_id), ntohs(packet.icp->icmp_seq), + packet.icp->icmp_cksum); + host = table[ntohs(packet.icp->icmp_seq) / packets]; } else { memcpy(&data, &packet.icp6->icmp6_dataun.icmp6_un_data8[4], sizeof(data)); if (debug > 2) - printf("ICMP echo-reply of len %lu, id %u, seq %u, cksum 0x%X\n", - (unsigned long)sizeof(data), ntohs(packet.icp6->icmp6_id), - ntohs(packet.icp6->icmp6_seq), packet.icp6->icmp6_cksum); - host = table[ntohs(packet.icp6->icmp6_seq)/packets]; + printf("ICMP echo-reply of len %lu, id %u, seq %u, cksum 0x%X\n", (unsigned long)sizeof(data), ntohs(packet.icp6->icmp6_id), ntohs(packet.icp6->icmp6_seq), + packet.icp6->icmp6_cksum); + host = table[ntohs(packet.icp6->icmp6_seq) / packets]; } tdiff = get_timevaldiff(&data.stime, &now); - if (host->last_tdiff>0) { + if (host->last_tdiff > 0) { /* Calculate jitter */ if (host->last_tdiff > tdiff) { jitter_tmp = host->last_tdiff - tdiff; @@ -1022,29 +1025,29 @@ wait_for_reply(int sock, u_int t) jitter_tmp = tdiff - host->last_tdiff; } - if (host->jitter==0) { - host->jitter=jitter_tmp; - host->jitter_max=jitter_tmp; - host->jitter_min=jitter_tmp; + if (host->jitter == 0) { + host->jitter = jitter_tmp; + host->jitter_max = jitter_tmp; + host->jitter_min = jitter_tmp; } else { - host->jitter+=jitter_tmp; + host->jitter += jitter_tmp; if (jitter_tmp < host->jitter_min) { - host->jitter_min=jitter_tmp; + host->jitter_min = jitter_tmp; } if (jitter_tmp > host->jitter_max) { - host->jitter_max=jitter_tmp; + host->jitter_max = jitter_tmp; } } /* Check if packets in order */ if (host->last_icmp_seq >= packet.icp->icmp_seq) - host->order_status=STATE_CRITICAL; + host->order_status = STATE_CRITICAL; } - host->last_tdiff=tdiff; + host->last_tdiff = tdiff; - host->last_icmp_seq=packet.icp->icmp_seq; + host->last_icmp_seq = packet.icp->icmp_seq; host->time_waited += tdiff; host->icmp_recv++; @@ -1054,39 +1057,27 @@ wait_for_reply(int sock, u_int t) if (tdiff < (unsigned int)host->rtmin) host->rtmin = tdiff; - if(debug) { + if (debug) { char address[INET6_ADDRSTRLEN]; parse_address(&resp_addr, address, sizeof(address)); - switch(address_family) { - case AF_INET: { - printf("%0.3f ms rtt from %s, outgoing ttl: %u, incoming ttl: %u, max: %0.3f, min: %0.3f\n", - (float)tdiff / 1000, - address, - ttl, - ip->ip.ip_ttl, - (float)host->rtmax / 1000, - (float)host->rtmin / 1000); - break; - }; - case AF_INET6: { - printf("%0.3f ms rtt from %s, outgoing ttl: %u, max: %0.3f, min: %0.3f\n", - (float)tdiff / 1000, - address, - ttl, - (float)host->rtmax / 1000, - (float)host->rtmin / 1000); - }; - } + switch (address_family) { + case AF_INET: { + printf("%0.3f ms rtt from %s, outgoing ttl: %u, incoming ttl: %u, max: %0.3f, min: %0.3f\n", (float)tdiff / 1000, address, ttl, ip->ip.ip_ttl, + (float)host->rtmax / 1000, (float)host->rtmin / 1000); + break; + }; + case AF_INET6: { + printf("%0.3f ms rtt from %s, outgoing ttl: %u, max: %0.3f, min: %0.3f\n", (float)tdiff / 1000, address, ttl, (float)host->rtmax / 1000, (float)host->rtmin / 1000); + }; + } } /* if we're in hostcheck mode, exit with limited printouts */ - if(mode == MODE_HOSTCHECK) { + if (mode == MODE_HOSTCHECK) { printf("OK - %s responds to ICMP. Packet %u, rta %0.3fms|" - "pkt=%u;;;0;%u rta=%0.3f;%0.3f;%0.3f;;\n", - host->name, icmp_recv, (float)tdiff / 1000, - icmp_recv, packets, (float)tdiff / 1000, - (float)warn.rta / 1000, (float)crit.rta / 1000); + "pkt=%u;;;0;%u rta=%0.3f;%0.3f;%0.3f;;\n", + host->name, icmp_recv, (float)tdiff / 1000, icmp_recv, packets, (float)tdiff / 1000, (float)warn.rta / 1000, (float)crit.rta / 1000); exit(STATE_OK); } } @@ -1096,9 +1087,7 @@ wait_for_reply(int sock, u_int t) } /* the ping functions */ -static int -send_icmp_ping(int sock, struct rta_host *host) -{ +static int send_icmp_ping(int sock, struct rta_host *host) { long int len; size_t addrlen; struct icmp_ping_data data; @@ -1107,22 +1096,21 @@ send_icmp_ping(int sock, struct rta_host *host) struct timeval tv; void *buf = NULL; - if(sock == -1) { + if (sock == -1) { errno = 0; crash("Attempt to send on bogus socket"); return -1; } - if(!buf) { + if (!buf) { if (!(buf = malloc(icmp_pkt_size))) { - crash("send_icmp_ping(): failed to malloc %d bytes for send buffer", - icmp_pkt_size); - return -1; /* might be reached if we're in debug mode */ + crash("send_icmp_ping(): failed to malloc %d bytes for send buffer", icmp_pkt_size); + return -1; /* might be reached if we're in debug mode */ } } memset(buf, 0, icmp_pkt_size); - if((gettimeofday(&tv, &tz)) == -1) { + if ((gettimeofday(&tv, &tz)) == -1) { free(buf); return -1; } @@ -1131,7 +1119,7 @@ send_icmp_ping(int sock, struct rta_host *host) memcpy(&data.stime, &tv, sizeof(tv)); if (address_family == AF_INET) { - struct icmp *icp = (struct icmp*)buf; + struct icmp *icp = (struct icmp *)buf; addrlen = sizeof(struct sockaddr_in); memcpy(&icp->icmp_data, &data, sizeof(data)); @@ -1141,14 +1129,13 @@ send_icmp_ping(int sock, struct rta_host *host) icp->icmp_cksum = 0; icp->icmp_id = htons(pid); icp->icmp_seq = htons(host->id++); - icp->icmp_cksum = icmp_checksum((uint16_t*)buf, (size_t)icmp_pkt_size); + icp->icmp_cksum = icmp_checksum((uint16_t *)buf, (size_t)icmp_pkt_size); if (debug > 2) - printf("Sending ICMP echo-request of len %lu, id %u, seq %u, cksum 0x%X to host %s\n", - (unsigned long)sizeof(data), ntohs(icp->icmp_id), ntohs(icp->icmp_seq), icp->icmp_cksum, host->name); - } - else { - struct icmp6_hdr *icp6 = (struct icmp6_hdr*)buf; + printf("Sending ICMP echo-request of len %lu, id %u, seq %u, cksum 0x%X to host %s\n", (unsigned long)sizeof(data), ntohs(icp->icmp_id), ntohs(icp->icmp_seq), + icp->icmp_cksum, host->name); + } else { + struct icmp6_hdr *icp6 = (struct icmp6_hdr *)buf; addrlen = sizeof(struct sockaddr_in6); memcpy(&icp6->icmp6_dataun.icmp6_un_data8[4], &data, sizeof(data)); @@ -1161,9 +1148,8 @@ send_icmp_ping(int sock, struct rta_host *host) // let checksum be calculated automatically if (debug > 2) { - printf("Sending ICMP echo-request of len %lu, id %u, seq %u, cksum 0x%X to host %s\n", - (unsigned long)sizeof(data), ntohs(icp6->icmp6_id), - ntohs(icp6->icmp6_seq), icp6->icmp6_cksum, host->name); + printf("Sending ICMP echo-request of len %lu, id %u, seq %u, cksum 0x%X to host %s\n", (unsigned long)sizeof(data), ntohs(icp6->icmp6_id), ntohs(icp6->icmp6_seq), + icp6->icmp6_cksum, host->name); } } @@ -1188,8 +1174,8 @@ send_icmp_ping(int sock, struct rta_host *host) free(buf); - if(len < 0 || (unsigned int)len != icmp_pkt_size) { - if(debug) { + if (len < 0 || (unsigned int)len != icmp_pkt_size) { + if (debug) { char address[INET6_ADDRSTRLEN]; parse_address((struct sockaddr_storage *)&host->saddr_in, address, sizeof(address)); printf("Failed to send ping to %s: %s\n", address, strerror(errno)); @@ -1204,10 +1190,7 @@ send_icmp_ping(int sock, struct rta_host *host) return 0; } -static int -recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr, - u_int *timo, struct timeval* tv) -{ +static int recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr, u_int *timo, struct timeval *tv) { u_int slen; int n, ret; struct timeval to, then, now; @@ -1218,11 +1201,12 @@ recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr, struct msghdr hdr; struct iovec iov; #ifdef SO_TIMESTAMP - struct cmsghdr* chdr; + struct cmsghdr *chdr; #endif - if(!*timo) { - if(debug) printf("*timo is not\n"); + if (!*timo) { + if (debug) + printf("*timo is not\n"); return 0; } @@ -1235,11 +1219,13 @@ recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr, errno = 0; gettimeofday(&then, &tz); n = select(sock + 1, &rd, &wr, NULL, &to); - if(n < 0) crash("select() in recvfrom_wto"); + if (n < 0) + crash("select() in recvfrom_wto"); gettimeofday(&now, &tz); *timo = get_timevaldiff(&then, &now); - if(!n) return 0; /* timeout */ + if (!n) + return 0; /* timeout */ slen = sizeof(struct sockaddr_storage); @@ -1259,12 +1245,10 @@ recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr, ret = recvmsg(sock, &hdr, 0); #ifdef SO_TIMESTAMP - for(chdr = CMSG_FIRSTHDR(&hdr); chdr; chdr = CMSG_NXTHDR(&hdr, chdr)) { - if(chdr->cmsg_level == SOL_SOCKET - && chdr->cmsg_type == SO_TIMESTAMP - && chdr->cmsg_len >= CMSG_LEN(sizeof(struct timeval))) { + for (chdr = CMSG_FIRSTHDR(&hdr); chdr; chdr = CMSG_NXTHDR(&hdr, chdr)) { + if (chdr->cmsg_level == SOL_SOCKET && chdr->cmsg_type == SO_TIMESTAMP && chdr->cmsg_len >= CMSG_LEN(sizeof(struct timeval))) { memcpy(tv, CMSG_DATA(chdr), sizeof(*tv)); - break ; + break; } } @@ -1274,54 +1258,55 @@ recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr, return (ret); } -static void -finish(int sig) -{ +static void finish(int sig) { u_int i = 0; unsigned char pl; double rta; struct rta_host *host; - const char *status_string[] = - {"OK", "WARNING", "CRITICAL", "UNKNOWN", "DEPENDENT"}; + const char *status_string[] = {"OK", "WARNING", "CRITICAL", "UNKNOWN", "DEPENDENT"}; int hosts_ok = 0; int hosts_warn = 0; int this_status; double R; alarm(0); - if(debug > 1) printf("finish(%d) called\n", sig); - - if(icmp_sock != -1) close(icmp_sock); - if(udp_sock != -1) close(udp_sock); - if(tcp_sock != -1) close(tcp_sock); - - if(debug) { - printf("icmp_sent: %u icmp_recv: %u icmp_lost: %u\n", - icmp_sent, icmp_recv, icmp_lost); + if (debug > 1) + printf("finish(%d) called\n", sig); + + if (icmp_sock != -1) + close(icmp_sock); + if (udp_sock != -1) + close(udp_sock); + if (tcp_sock != -1) + close(tcp_sock); + + if (debug) { + printf("icmp_sent: %u icmp_recv: %u icmp_lost: %u\n", icmp_sent, icmp_recv, icmp_lost); printf("targets: %u targets_alive: %u\n", targets, targets_alive); } /* iterate thrice to calculate values, give output, and print perfparse */ - status=STATE_OK; + status = STATE_OK; host = list; - while(host) { + while (host) { this_status = STATE_OK; - if(!host->icmp_recv) { + if (!host->icmp_recv) { /* rta 0 is ofcourse not entirely correct, but will still show up * conspicuously as missing entries in perfparse and cacti */ pl = 100; rta = 0; status = STATE_CRITICAL; /* up the down counter if not already counted */ - if(!(host->flags & FLAG_LOST_CAUSE) && targets_alive) targets_down++; + if (!(host->flags & FLAG_LOST_CAUSE) && targets_alive) + targets_down++; } else { pl = ((host->icmp_sent - host->icmp_recv) * 100) / host->icmp_sent; rta = (double)host->time_waited / host->icmp_recv; } - if (host->icmp_recv>1) { + if (host->icmp_recv > 1) { /* * This algorithm is probably pretty much blindly copied from * locations like this one: https://www.slac.stanford.edu/comp/net/wan-mon/tutorial.html#mos @@ -1336,19 +1321,19 @@ finish(int sig) * More links: * - https://confluence.slac.stanford.edu/display/IEPM/MOS */ - host->jitter=(host->jitter / (host->icmp_recv - 1)/1000); + host->jitter = (host->jitter / (host->icmp_recv - 1) / 1000); /* * Take the average round trip latency (in milliseconds), add * round trip jitter, but double the impact to latency * then add 10 for protocol latencies (in milliseconds). */ - host->EffectiveLatency = (rta/1000) + host->jitter * 2 + 10; + host->EffectiveLatency = (rta / 1000) + host->jitter * 2 + 10; if (host->EffectiveLatency < 160) { - R = 93.2 - (host->EffectiveLatency / 40); + R = 93.2 - (host->EffectiveLatency / 40); } else { - R = 93.2 - ((host->EffectiveLatency - 120) / 10); + R = 93.2 - ((host->EffectiveLatency - 120) / 10); } // Now, let us deduct 2.5 R values per percentage of packet loss (i.e. a @@ -1360,12 +1345,12 @@ finish(int sig) } host->score = R; - host->mos= 1 + ((0.035) * R) + ((.000007) * R * (R-60) * (100-R)); + host->mos = 1 + ((0.035) * R) + ((.000007) * R * (R - 60) * (100 - R)); } else { - host->jitter=0; - host->jitter_min=0; - host->jitter_max=0; - host->mos=0; + host->jitter = 0; + host->jitter_min = 0; + host->jitter_max = 0; + host->mos = 0; } host->pl = pl; @@ -1379,62 +1364,62 @@ finish(int sig) /* Check which mode is on and do the warn / Crit stuff */ if (rta_mode) { - if(rta >= crit.rta) { + if (rta >= crit.rta) { this_status = STATE_CRITICAL; status = STATE_CRITICAL; - host->rta_status=STATE_CRITICAL; - } else if(status!=STATE_CRITICAL && (rta >= warn.rta)) { + host->rta_status = STATE_CRITICAL; + } else if (status != STATE_CRITICAL && (rta >= warn.rta)) { this_status = (this_status <= STATE_WARNING ? STATE_WARNING : this_status); status = STATE_WARNING; - host->rta_status=STATE_WARNING; + host->rta_status = STATE_WARNING; } } if (pl_mode) { - if(pl >= crit.pl) { + if (pl >= crit.pl) { this_status = STATE_CRITICAL; status = STATE_CRITICAL; - host->pl_status=STATE_CRITICAL; - } else if(status!=STATE_CRITICAL && (pl >= warn.pl)) { + host->pl_status = STATE_CRITICAL; + } else if (status != STATE_CRITICAL && (pl >= warn.pl)) { this_status = (this_status <= STATE_WARNING ? STATE_WARNING : this_status); status = STATE_WARNING; - host->pl_status=STATE_WARNING; + host->pl_status = STATE_WARNING; } } if (jitter_mode) { - if(host->jitter >= crit.jitter) { + if (host->jitter >= crit.jitter) { this_status = STATE_CRITICAL; status = STATE_CRITICAL; - host->jitter_status=STATE_CRITICAL; - } else if(status!=STATE_CRITICAL && (host->jitter >= warn.jitter)) { + host->jitter_status = STATE_CRITICAL; + } else if (status != STATE_CRITICAL && (host->jitter >= warn.jitter)) { this_status = (this_status <= STATE_WARNING ? STATE_WARNING : this_status); status = STATE_WARNING; - host->jitter_status=STATE_WARNING; + host->jitter_status = STATE_WARNING; } } if (mos_mode) { - if(host->mos <= crit.mos) { + if (host->mos <= crit.mos) { this_status = STATE_CRITICAL; status = STATE_CRITICAL; - host->mos_status=STATE_CRITICAL; - } else if(status!=STATE_CRITICAL && (host->mos <= warn.mos)) { + host->mos_status = STATE_CRITICAL; + } else if (status != STATE_CRITICAL && (host->mos <= warn.mos)) { this_status = (this_status <= STATE_WARNING ? STATE_WARNING : this_status); status = STATE_WARNING; - host->mos_status=STATE_WARNING; + host->mos_status = STATE_WARNING; } } if (score_mode) { - if(host->score <= crit.score) { + if (host->score <= crit.score) { this_status = STATE_CRITICAL; status = STATE_CRITICAL; - host->score_status=STATE_CRITICAL; - } else if(status!=STATE_CRITICAL && (host->score <= warn.score)) { + host->score_status = STATE_CRITICAL; + } else if (status != STATE_CRITICAL && (host->score <= warn.score)) { this_status = (this_status <= STATE_WARNING ? STATE_WARNING : this_status); status = STATE_WARNING; - host->score_status=STATE_WARNING; + host->score_status = STATE_WARNING; } } @@ -1447,91 +1432,92 @@ finish(int sig) host = host->next; } - /* this is inevitable */ - if(!targets_alive) status = STATE_CRITICAL; - if(min_hosts_alive > -1) { - if(hosts_ok >= min_hosts_alive) status = STATE_OK; - else if((hosts_ok + hosts_warn) >= min_hosts_alive) status = STATE_WARNING; + if (!targets_alive) + status = STATE_CRITICAL; + if (min_hosts_alive > -1) { + if (hosts_ok >= min_hosts_alive) + status = STATE_OK; + else if ((hosts_ok + hosts_warn) >= min_hosts_alive) + status = STATE_WARNING; } printf("%s - ", status_string[status]); host = list; - while(host) { - - if(debug) puts(""); - if(i) { - if(i < targets) printf(" :: "); - else printf("\n"); + while (host) { + + if (debug) + puts(""); + if (i) { + if (i < targets) + printf(" :: "); + else + printf("\n"); } i++; - if(!host->icmp_recv) { + if (!host->icmp_recv) { status = STATE_CRITICAL; - host->rtmin=0; - host->jitter_min=0; - if(host->flags & FLAG_LOST_CAUSE) { + host->rtmin = 0; + host->jitter_min = 0; + if (host->flags & FLAG_LOST_CAUSE) { char address[INET6_ADDRSTRLEN]; parse_address(&host->error_addr, address, sizeof(address)); - printf("%s: %s @ %s. rta nan, lost %d%%", - host->name, - get_icmp_error_msg(host->icmp_type, host->icmp_code), - address, - 100); + printf("%s: %s @ %s. rta nan, lost %d%%", host->name, get_icmp_error_msg(host->icmp_type, host->icmp_code), address, 100); } else { /* not marked as lost cause, so we have no flags for it */ printf("%s: rta nan, lost 100%%", host->name); } - } else { /* !icmp_recv */ + } else { /* !icmp_recv */ printf("%s", host->name); /* rta text output */ if (rta_mode) { if (status == STATE_OK) printf(" rta %0.3fms", host->rta / 1000); - else if (status==STATE_WARNING && host->rta_status==status) - printf(" rta %0.3fms > %0.3fms", (float)host->rta / 1000, (float)warn.rta/1000); - else if (status==STATE_CRITICAL && host->rta_status==status) - printf(" rta %0.3fms > %0.3fms", (float)host->rta / 1000, (float)crit.rta/1000); + else if (status == STATE_WARNING && host->rta_status == status) + printf(" rta %0.3fms > %0.3fms", (float)host->rta / 1000, (float)warn.rta / 1000); + else if (status == STATE_CRITICAL && host->rta_status == status) + printf(" rta %0.3fms > %0.3fms", (float)host->rta / 1000, (float)crit.rta / 1000); } /* pl text output */ if (pl_mode) { if (status == STATE_OK) printf(" lost %u%%", host->pl); - else if (status==STATE_WARNING && host->pl_status==status) + else if (status == STATE_WARNING && host->pl_status == status) printf(" lost %u%% > %u%%", host->pl, warn.pl); - else if (status==STATE_CRITICAL && host->pl_status==status) + else if (status == STATE_CRITICAL && host->pl_status == status) printf(" lost %u%% > %u%%", host->pl, crit.pl); } /* jitter text output */ if (jitter_mode) { if (status == STATE_OK) printf(" jitter %0.3fms", (float)host->jitter); - else if (status==STATE_WARNING && host->jitter_status==status) + else if (status == STATE_WARNING && host->jitter_status == status) printf(" jitter %0.3fms > %0.3fms", (float)host->jitter, warn.jitter); - else if (status==STATE_CRITICAL && host->jitter_status==status) + else if (status == STATE_CRITICAL && host->jitter_status == status) printf(" jitter %0.3fms > %0.3fms", (float)host->jitter, crit.jitter); } /* mos text output */ if (mos_mode) { if (status == STATE_OK) printf(" MOS %0.1f", (float)host->mos); - else if (status==STATE_WARNING && host->mos_status==status) + else if (status == STATE_WARNING && host->mos_status == status) printf(" MOS %0.1f < %0.1f", (float)host->mos, (float)warn.mos); - else if (status==STATE_CRITICAL && host->mos_status==status) + else if (status == STATE_CRITICAL && host->mos_status == status) printf(" MOS %0.1f < %0.1f", (float)host->mos, (float)crit.mos); } /* score text output */ if (score_mode) { if (status == STATE_OK) printf(" Score %u", (int)host->score); - else if (status==STATE_WARNING && host->score_status==status ) + else if (status == STATE_WARNING && host->score_status == status) printf(" Score %u < %u", (int)host->score, (int)warn.score); - else if (status==STATE_CRITICAL && host->score_status==status ) + else if (status == STATE_CRITICAL && host->score_status == status) printf(" Score %u < %u", (int)host->score, (int)crit.score); } /* order statis text output */ if (order_mode) { if (status == STATE_OK) printf(" Packets in order"); - else if (status==STATE_CRITICAL && host->order_status==status) + else if (status == STATE_CRITICAL && host->order_status == status) printf(" Packets out of order"); } } @@ -1540,25 +1526,21 @@ finish(int sig) /* iterate once more for pretty perfparse output */ if (!(!rta_mode && !pl_mode && !jitter_mode && !score_mode && !mos_mode && order_mode)) { - printf("|"); + printf("|"); } i = 0; host = list; - while(host) { - if(debug) puts(""); + while (host) { + if (debug) + puts(""); if (rta_mode) { - if (host->pl<100) { - printf("%srta=%0.3fms;%0.3f;%0.3f;0; %srtmax=%0.3fms;;;; %srtmin=%0.3fms;;;; ", - (targets > 1) ? host->name : "", - host->rta / 1000, (float)warn.rta / 1000, (float)crit.rta / 1000, - (targets > 1) ? host->name : "", (float)host->rtmax / 1000, - (targets > 1) ? host->name : "", (host->rtmin < INFINITY) ? (float)host->rtmin / 1000 : (float)0); + if (host->pl < 100) { + printf("%srta=%0.3fms;%0.3f;%0.3f;0; %srtmax=%0.3fms;;;; %srtmin=%0.3fms;;;; ", (targets > 1) ? host->name : "", host->rta / 1000, (float)warn.rta / 1000, + (float)crit.rta / 1000, (targets > 1) ? host->name : "", (float)host->rtmax / 1000, (targets > 1) ? host->name : "", + (host->rtmin < INFINITY) ? (float)host->rtmin / 1000 : (float)0); } else { - printf("%srta=U;;;; %srtmax=U;;;; %srtmin=U;;;; ", - (targets > 1) ? host->name : "", - (targets > 1) ? host->name : "", - (targets > 1) ? host->name : ""); + printf("%srta=U;;;; %srtmax=U;;;; %srtmin=U;;;; ", (targets > 1) ? host->name : "", (targets > 1) ? host->name : "", (targets > 1) ? host->name : ""); } } @@ -1567,43 +1549,27 @@ finish(int sig) } if (jitter_mode) { - if (host->pl<100) { - printf("%sjitter_avg=%0.3fms;%0.3f;%0.3f;0; %sjitter_max=%0.3fms;;;; %sjitter_min=%0.3fms;;;; ", - (targets > 1) ? host->name : "", - (float)host->jitter, - (float)warn.jitter, - (float)crit.jitter, - (targets > 1) ? host->name : "", - (float)host->jitter_max / 1000, (targets > 1) ? host->name : "", - (float)host->jitter_min / 1000 - ); + if (host->pl < 100) { + printf("%sjitter_avg=%0.3fms;%0.3f;%0.3f;0; %sjitter_max=%0.3fms;;;; %sjitter_min=%0.3fms;;;; ", (targets > 1) ? host->name : "", (float)host->jitter, + (float)warn.jitter, (float)crit.jitter, (targets > 1) ? host->name : "", (float)host->jitter_max / 1000, (targets > 1) ? host->name : "", + (float)host->jitter_min / 1000); } else { - printf("%sjitter_avg=U;;;; %sjitter_max=U;;;; %sjitter_min=U;;;; ", - (targets > 1) ? host->name : "", - (targets > 1) ? host->name : "", - (targets > 1) ? host->name : ""); + printf("%sjitter_avg=U;;;; %sjitter_max=U;;;; %sjitter_min=U;;;; ", (targets > 1) ? host->name : "", (targets > 1) ? host->name : "", + (targets > 1) ? host->name : ""); } } if (mos_mode) { - if (host->pl<100) { - printf("%smos=%0.1f;%0.1f;%0.1f;0;5 ", - (targets > 1) ? host->name : "", - (float)host->mos, - (float)warn.mos, - (float)crit.mos); + if (host->pl < 100) { + printf("%smos=%0.1f;%0.1f;%0.1f;0;5 ", (targets > 1) ? host->name : "", (float)host->mos, (float)warn.mos, (float)crit.mos); } else { printf("%smos=U;;;; ", (targets > 1) ? host->name : ""); } } if (score_mode) { - if (host->pl<100) { - printf("%sscore=%u;%u;%u;0;100 ", - (targets > 1) ? host->name : "", - (int)host->score, - (int)warn.score, - (int)crit.score); + if (host->pl < 100) { + printf("%sscore=%u;%u;%u;0;100 ", (targets > 1) ? host->name : "", (int)host->score, (int)warn.score, (int)crit.score); } else { printf("%sscore=U;;;; ", (targets > 1) ? host->name : ""); } @@ -1612,35 +1578,34 @@ finish(int sig) host = host->next; } - if(min_hosts_alive > -1) { - if(hosts_ok >= min_hosts_alive) status = STATE_OK; - else if((hosts_ok + hosts_warn) >= min_hosts_alive) status = STATE_WARNING; + if (min_hosts_alive > -1) { + if (hosts_ok >= min_hosts_alive) + status = STATE_OK; + else if ((hosts_ok + hosts_warn) >= min_hosts_alive) + status = STATE_WARNING; } /* finish with an empty line */ puts(""); - if(debug) printf("targets: %u, targets_alive: %u, hosts_ok: %u, hosts_warn: %u, min_hosts_alive: %i\n", - targets, targets_alive, hosts_ok, hosts_warn, min_hosts_alive); + if (debug) + printf("targets: %u, targets_alive: %u, hosts_ok: %u, hosts_warn: %u, min_hosts_alive: %i\n", targets, targets_alive, hosts_ok, hosts_warn, min_hosts_alive); exit(status); } -static u_int -get_timevaldiff(struct timeval *early, struct timeval *later) -{ +static u_int get_timevaldiff(struct timeval *early, struct timeval *later) { u_int ret; struct timeval now; - if(!later) { + if (!later) { gettimeofday(&now, &tz); later = &now; } - if(!early) early = &prog_start; + if (!early) + early = &prog_start; /* if early > later we return 0 so as to indicate a timeout */ - if(early->tv_sec > later->tv_sec || - (early->tv_sec == later->tv_sec && early->tv_usec > later->tv_usec)) - { + if (early->tv_sec > later->tv_sec || (early->tv_sec == later->tv_sec && early->tv_usec > later->tv_usec)) { return 0; } ret = (later->tv_sec - early->tv_sec) * 1000000; @@ -1649,9 +1614,7 @@ get_timevaldiff(struct timeval *early, struct timeval *later) return ret; } -static int -add_target_ip(char *arg, struct sockaddr_storage *in) -{ +static int add_target_ip(char *arg, struct sockaddr_storage *in) { struct rta_host *host; struct sockaddr_in *sin, *host_sin; struct sockaddr_in6 *sin6, *host_sin6; @@ -1661,51 +1624,46 @@ add_target_ip(char *arg, struct sockaddr_storage *in) else sin6 = (struct sockaddr_in6 *)in; - - /* disregard obviously stupid addresses * (I didn't find an ipv6 equivalent to INADDR_NONE) */ - if (((address_family == AF_INET && (sin->sin_addr.s_addr == INADDR_NONE - || sin->sin_addr.s_addr == INADDR_ANY))) - || (address_family == AF_INET6 && (sin6->sin6_addr.s6_addr == in6addr_any.s6_addr))) { + if (((address_family == AF_INET && (sin->sin_addr.s_addr == INADDR_NONE || sin->sin_addr.s_addr == INADDR_ANY))) || + (address_family == AF_INET6 && (sin6->sin6_addr.s6_addr == in6addr_any.s6_addr))) { return -1; } /* no point in adding two identical IP's, so don't. ;) */ host = list; - while(host) { + while (host) { host_sin = (struct sockaddr_in *)&host->saddr_in; host_sin6 = (struct sockaddr_in6 *)&host->saddr_in; - if( (address_family == AF_INET && host_sin->sin_addr.s_addr == sin->sin_addr.s_addr) - || (address_family == AF_INET6 && host_sin6->sin6_addr.s6_addr == sin6->sin6_addr.s6_addr)) { - if(debug) printf("Identical IP already exists. Not adding %s\n", arg); + if ((address_family == AF_INET && host_sin->sin_addr.s_addr == sin->sin_addr.s_addr) || + (address_family == AF_INET6 && host_sin6->sin6_addr.s6_addr == sin6->sin6_addr.s6_addr)) { + if (debug) + printf("Identical IP already exists. Not adding %s\n", arg); return -1; } host = host->next; } /* add the fresh ip */ - host = (struct rta_host*)malloc(sizeof(struct rta_host)); - if(!host) { + host = (struct rta_host *)malloc(sizeof(struct rta_host)); + if (!host) { char straddr[INET6_ADDRSTRLEN]; - parse_address((struct sockaddr_storage*)&in, straddr, sizeof(straddr)); - crash("add_target_ip(%s, %s): malloc(%lu) failed", - arg, straddr, sizeof(struct rta_host)); + parse_address((struct sockaddr_storage *)&in, straddr, sizeof(straddr)); + crash("add_target_ip(%s, %s): malloc(%lu) failed", arg, straddr, sizeof(struct rta_host)); } memset(host, 0, sizeof(struct rta_host)); /* set the values. use calling name for output */ host->name = strdup(arg); - /* fill out the sockaddr_storage struct */ - if(address_family == AF_INET) { + if (address_family == AF_INET) { host_sin = (struct sockaddr_in *)&host->saddr_in; host_sin->sin_family = AF_INET; host_sin->sin_addr.s_addr = sin->sin_addr.s_addr; - } - else { + } else { host_sin6 = (struct sockaddr_in6 *)&host->saddr_in; host_sin6->sin6_family = AF_INET6; memcpy(host_sin6->sin6_addr.s6_addr, sin6->sin6_addr.s6_addr, sizeof host_sin6->sin6_addr.s6_addr); @@ -1714,22 +1672,23 @@ add_target_ip(char *arg, struct sockaddr_storage *in) /* fill out the sockaddr_in struct */ host->rtmin = INFINITY; host->rtmax = 0; - host->jitter=0; - host->jitter_max=0; - host->jitter_min=INFINITY; - host->last_tdiff=0; - host->order_status=STATE_OK; - host->last_icmp_seq=0; - host->rta_status=0; - host->pl_status=0; - host->jitter_status=0; - host->mos_status=0; - host->score_status=0; - host->pl_status=0; - - - if(!list) list = cursor = host; - else cursor->next = host; + host->jitter = 0; + host->jitter_max = 0; + host->jitter_min = INFINITY; + host->last_tdiff = 0; + host->order_status = STATE_OK; + host->last_icmp_seq = 0; + host->rta_status = 0; + host->pl_status = 0; + host->jitter_status = 0; + host->mos_status = 0; + host->score_status = 0; + host->pl_status = 0; + + if (!list) + list = cursor = host; + else + cursor->next = host; cursor = host; targets++; @@ -1738,9 +1697,7 @@ add_target_ip(char *arg, struct sockaddr_storage *in) } /* wrapper for add_target_ip */ -static int -add_target(char *arg) -{ +static int add_target(char *arg) { int error, result = -1; struct sockaddr_storage ip; struct addrinfo hints, *res, *p; @@ -1754,14 +1711,14 @@ add_target(char *arg) sin = (struct sockaddr_in *)&ip; result = inet_pton(address_family, arg, &sin->sin_addr); #ifdef USE_IPV6 - if( result != 1 ){ + if (result != 1) { address_family = AF_INET6; sin6 = (struct sockaddr_in6 *)&ip; result = inet_pton(address_family, arg, &sin6->sin6_addr); } #endif /* If we don't find any valid addresses, we still don't know the address_family */ - if ( result != 1) { + if (result != 1) { address_family = -1; } break; @@ -1773,15 +1730,15 @@ add_target(char *arg) sin6 = (struct sockaddr_in6 *)&ip; result = inet_pton(address_family, arg, &sin6->sin6_addr); break; - default: crash("Address family not supported"); + default: + crash("Address family not supported"); } /* don't resolve if we don't have to */ - if(result == 1) { + if (result == 1) { /* don't add all ip's if we were given a specific one */ return add_target_ip(arg, &ip); - } - else { + } else { errno = 0; memset(&hints, 0, sizeof(hints)); if (address_family == -1) { @@ -1790,7 +1747,7 @@ add_target(char *arg) hints.ai_family = address_family == AF_INET ? PF_INET : PF_INET6; } hints.ai_socktype = SOCK_RAW; - if((error = getaddrinfo(arg, NULL, &hints, &res)) != 0) { + if ((error = getaddrinfo(arg, NULL, &hints, &res)) != 0) { errno = 0; crash("Failed to resolve %s: %s", arg, gai_strerror(error)); return -1; @@ -1799,13 +1756,14 @@ add_target(char *arg) } /* possibly add all the IP's as targets */ - for(p = res; p != NULL; p = p->ai_next) { + for (p = res; p != NULL; p = p->ai_next) { memcpy(&ip, p->ai_addr, p->ai_addrlen); add_target_ip(arg, &ip); /* this is silly, but it works */ - if(mode == MODE_HOSTCHECK || mode == MODE_ALL) { - if(debug > 2) printf("mode: %d\n", mode); + if (mode == MODE_HOSTCHECK || mode == MODE_ALL) { + if (debug > 2) + printf("mode: %d\n", mode); continue; } break; @@ -1815,24 +1773,20 @@ add_target(char *arg) return 0; } -static void -set_source_ip(char *arg) -{ +static void set_source_ip(char *arg) { struct sockaddr_in src; memset(&src, 0, sizeof(src)); src.sin_family = address_family; - if((src.sin_addr.s_addr = inet_addr(arg)) == INADDR_NONE) + 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) + 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) -{ - // TODO: Rewrite this so the function return an error and we exit somewhere else +static in_addr_t get_ip_address(const char *ifname) { + // TODO: Rewrite this so the function return an error and we exit somewhere else struct sockaddr_in ip; ip.sin_addr.s_addr = 0; // Fake initialization to make compiler happy #if defined(SIOCGIFADDR) @@ -1842,12 +1796,12 @@ get_ip_address(const char *ifname) ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0'; - if(ioctl(icmp_sock, SIOCGIFADDR, &ifr) == -1) + if (ioctl(icmp_sock, SIOCGIFADDR, &ifr) == -1) crash("Cannot determine IP address of interface %s", ifname); memcpy(&ip, &ifr.ifr_addr, sizeof(ip)); #else - (void) ifname; + (void)ifname; errno = 0; crash("Cannot get interface IP address on this platform."); #endif @@ -1860,63 +1814,73 @@ get_ip_address(const char *ifname) * s = seconds * return value is in microseconds */ -static u_int -get_timevar(const char *str) -{ +static u_int get_timevar(const char *str) { char p, u, *ptr; size_t len; - u_int i, d; /* integer and decimal, respectively */ - u_int factor = 1000; /* default to milliseconds */ + u_int i, d; /* integer and decimal, respectively */ + u_int factor = 1000; /* default to milliseconds */ - if(!str) return 0; + if (!str) + return 0; len = strlen(str); - if(!len) return 0; + if (!len) + return 0; /* unit might be given as ms|m (millisec), * us|u (microsec) or just plain s, for seconds */ p = '\0'; u = str[len - 1]; - if(len >= 2 && !isdigit((int)str[len - 2])) p = str[len - 2]; - if(p && u == 's') u = p; - else if(!p) p = u; - if(debug > 2) printf("evaluating %s, u: %c, p: %c\n", str, u, p); - - if(u == 'u') factor = 1; /* microseconds */ - else if(u == 'm') factor = 1000; /* milliseconds */ - else if(u == 's') factor = 1000000; /* seconds */ - if(debug > 2) printf("factor is %u\n", factor); + if (len >= 2 && !isdigit((int)str[len - 2])) + p = str[len - 2]; + if (p && u == 's') + u = p; + else if (!p) + p = u; + if (debug > 2) + printf("evaluating %s, u: %c, p: %c\n", str, u, p); + + if (u == 'u') + factor = 1; /* microseconds */ + else if (u == 'm') + factor = 1000; /* milliseconds */ + else if (u == 's') + factor = 1000000; /* seconds */ + if (debug > 2) + printf("factor is %u\n", factor); i = strtoul(str, &ptr, 0); - if(!ptr || *ptr != '.' || strlen(ptr) < 2 || factor == 1) + if (!ptr || *ptr != '.' || strlen(ptr) < 2 || factor == 1) return i * factor; /* time specified in usecs can't have decimal points, so ignore them */ - if(factor == 1) return i; + if (factor == 1) + return i; d = strtoul(ptr + 1, NULL, 0); /* d is decimal, so get rid of excess digits */ - while(d >= factor) d /= 10; + while (d >= factor) + d /= 10; /* the last parenthesis avoids floating point exceptions. */ return ((i * factor) + (d * (factor / 10))); } /* not too good at checking errors, but it'll do (main() should barfe on -1) */ -static int -get_threshold(char *str, threshold *th) -{ +static int get_threshold(char *str, threshold *th) { char *p = NULL, i = 0; - if(!str || !strlen(str) || !th) return -1; + if (!str || !strlen(str) || !th) + return -1; /* pointer magic slims code by 10 lines. i is bof-stop on stupid libc's */ p = &str[strlen(str) - 1]; - while(p != &str[1]) { - if(*p == '%') *p = '\0'; - else if(*p == ',' && i) { - *p = '\0'; /* reset it so get_timevar(str) works nicely later */ - th->pl = (unsigned char)strtoul(p+1, NULL, 0); + while (p != &str[1]) { + if (*p == '%') + *p = '\0'; + else if (*p == ',' && i) { + *p = '\0'; /* reset it so get_timevar(str) works nicely later */ + th->pl = (unsigned char)strtoul(p + 1, NULL, 0); break; } i = 1; @@ -1924,10 +1888,13 @@ get_threshold(char *str, threshold *th) } th->rta = get_timevar(str); - if(!th->rta) return -1; + if (!th->rta) + return -1; - if(th->rta > MAXTTL * 1000000) th->rta = MAXTTL * 1000000; - if(th->pl > 100) th->pl = 100; + if (th->rta > MAXTTL * 1000000) + th->rta = MAXTTL * 1000000; + if (th->pl > 100) + th->pl = 100; return 0; } @@ -1943,8 +1910,8 @@ get_threshold(char *str, threshold *th) * @param[in] mode Determines whether this a threshold for rta, packet_loss, jitter, mos or score (exclusively) */ static bool get_threshold2(char *str, size_t length, threshold *warn, threshold *crit, threshold_mode mode) { - if (!str || !length || !warn || !crit) return false; - + if (!str || !length || !warn || !crit) + return false; // p points to the last char in str char *p = &str[length - 1]; @@ -1952,18 +1919,17 @@ static bool get_threshold2(char *str, size_t length, threshold *warn, threshold // first_iteration is bof-stop on stupid libc's bool first_iteration = true; - while(p != &str[0]) { - if( (*p == 'm') || (*p == '%') ) { + while (p != &str[0]) { + if ((*p == 'm') || (*p == '%')) { *p = '\0'; - } else if(*p == ',' && !first_iteration) { - *p = '\0'; /* reset it so get_timevar(str) works nicely later */ + } else if (*p == ',' && !first_iteration) { + *p = '\0'; /* reset it so get_timevar(str) works nicely later */ char *start_of_value = p + 1; - if (!parse_threshold2_helper(start_of_value, strlen(start_of_value), crit, mode)){ + if (!parse_threshold2_helper(start_of_value, strlen(start_of_value), crit, mode)) { return false; } - } first_iteration = false; p--; @@ -1976,22 +1942,22 @@ static bool parse_threshold2_helper(char *s, size_t length, threshold *thr, thre char *resultChecker = {0}; switch (mode) { - case const_rta_mode: - thr->rta = strtod(s, &resultChecker) * 1000; - break; - case const_packet_loss_mode: - thr->pl = (unsigned char)strtoul(s, &resultChecker, 0); - break; - case const_jitter_mode: - thr->jitter = strtod(s, &resultChecker); + case const_rta_mode: + thr->rta = strtod(s, &resultChecker) * 1000; + break; + case const_packet_loss_mode: + thr->pl = (unsigned char)strtoul(s, &resultChecker, 0); + break; + case const_jitter_mode: + thr->jitter = strtod(s, &resultChecker); - break; - case const_mos_mode: - thr->mos = strtod(s, &resultChecker); - break; - case const_score_mode: - thr->score = strtod(s, &resultChecker); - break; + break; + case const_mos_mode: + thr->mos = strtod(s, &resultChecker); + break; + case const_score_mode: + thr->score = strtod(s, &resultChecker); + break; } if (resultChecker == s) { @@ -2007,123 +1973,116 @@ static bool parse_threshold2_helper(char *s, size_t length, threshold *thr, thre return true; } -unsigned short -icmp_checksum(uint16_t *p, size_t n) -{ +unsigned short icmp_checksum(uint16_t *p, size_t n) { unsigned short cksum; long sum = 0; /* sizeof(uint16_t) == 2 */ - while(n >= 2) { + while (n >= 2) { sum += *(p++); n -= 2; } /* mop up the occasional odd byte */ - if(n == 1) sum += *((uint8_t *)p -1); + if (n == 1) + sum += *((uint8_t *)p - 1); - sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ - sum += (sum >> 16); /* add carry */ - cksum = ~sum; /* ones-complement, trunc to 16 bits */ + sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ + sum += (sum >> 16); /* add carry */ + cksum = ~sum; /* ones-complement, trunc to 16 bits */ return cksum; } -void -print_help(void) -{ +void print_help(void) { /*print_revision (progname);*/ /* FIXME: Why? */ - printf ("Copyright (c) 2005 Andreas Ericsson \n"); - - printf (COPYRIGHT, copyright, email); - - printf ("\n\n"); - - print_usage (); - - printf (UT_HELP_VRSN); - printf (UT_EXTRA_OPTS); - - printf (" %s\n", "-H"); - printf (" %s\n", _("specify a target")); - printf (" %s\n", "[-4|-6]"); - printf (" %s\n", _("Use IPv4 (default) or IPv6 to communicate with the targets")); - printf (" %s\n", "-w"); - printf (" %s", _("warning threshold (currently ")); - printf ("%0.3fms,%u%%)\n", (float)warn.rta / 1000, warn.pl); - printf (" %s\n", "-c"); - printf (" %s", _("critical threshold (currently ")); - printf ("%0.3fms,%u%%)\n", (float)crit.rta / 1000, crit.pl); - - printf (" %s\n", "-R"); - printf (" %s\n", _("RTA, round trip average, mode warning,critical, ex. 100ms,200ms unit in ms")); - printf (" %s\n", "-P"); - printf (" %s\n", _("packet loss mode, ex. 40%,50% , unit in %")); - printf (" %s\n", "-J"); - printf (" %s\n", _("jitter mode warning,critical, ex. 40.000ms,50.000ms , unit in ms ")); - printf (" %s\n", "-M"); - printf (" %s\n", _("MOS mode, between 0 and 4.4 warning,critical, ex. 3.5,3.0")); - printf (" %s\n", "-S"); - printf (" %s\n", _("score mode, max value 100 warning,critical, ex. 80,70 ")); - printf (" %s\n", "-O"); - printf (" %s\n", _("detect out of order ICMP packts ")); - printf (" %s\n", "-H"); - printf (" %s\n", _("specify a target")); - 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); - printf (" %s\n", "-p"); - printf (" %s", _("number of packets to send (currently ")); - printf ("%u)\n",packets); - printf (" %s\n", "-i"); - printf (" %s", _("max packet interval (currently ")); - printf ("%0.3fms)\n",(float)pkt_interval / 1000); - printf (" %s\n", "-I"); - printf (" %s", _("max target interval (currently ")); - printf ("%0.3fms)\n", (float)target_interval / 1000); - printf (" %s\n", "-m"); - printf (" %s",_("number of alive hosts required for success")); - printf ("\n"); - printf (" %s\n", "-l"); - printf (" %s", _("TTL on outgoing packets (currently ")); - printf ("%u)\n", ttl); - printf (" %s\n", "-t"); - printf (" %s",_("timeout value (seconds, currently ")); - printf ("%u)\n", timeout); - printf (" %s\n", "-b"); - printf (" %s\n", _("Number of icmp data bytes to send")); - printf (" %s %u + %d)\n", _("Packet size will be data bytes + icmp header (currently"),icmp_data_size, ICMP_MINLEN); - printf (" %s\n", "-v"); - printf (" %s\n", _("verbose")); - printf ("\n"); - printf ("%s\n", _("Notes:")); - printf (" %s\n", _("If none of R,P,J,M,S or O is specified, default behavior is -R -P")); - printf (" %s\n", _("The -H switch is optional. Naming a host (or several) to check is not.")); - printf ("\n"); - printf (" %s\n", _("Threshold format for -w and -c is 200.25,60% for 200.25 msec RTA and 60%")); - printf (" %s\n", _("packet loss. The default values should work well for most users.")); - printf (" %s\n", _("You can specify different RTA factors using the standardized abbreviations")); - printf (" %s\n", _("us (microseconds), ms (milliseconds, default) or just plain s for seconds.")); + printf("Copyright (c) 2005 Andreas Ericsson \n"); + + printf(COPYRIGHT, copyright, email); + + printf("\n\n"); + + print_usage(); + + printf(UT_HELP_VRSN); + printf(UT_EXTRA_OPTS); + + printf(" %s\n", "-H"); + printf(" %s\n", _("specify a target")); + printf(" %s\n", "[-4|-6]"); + printf(" %s\n", _("Use IPv4 (default) or IPv6 to communicate with the targets")); + printf(" %s\n", "-w"); + printf(" %s", _("warning threshold (currently ")); + printf("%0.3fms,%u%%)\n", (float)warn.rta / 1000, warn.pl); + printf(" %s\n", "-c"); + printf(" %s", _("critical threshold (currently ")); + printf("%0.3fms,%u%%)\n", (float)crit.rta / 1000, crit.pl); + + printf(" %s\n", "-R"); + printf(" %s\n", _("RTA, round trip average, mode warning,critical, ex. 100ms,200ms unit in ms")); + printf(" %s\n", "-P"); + printf(" %s\n", _("packet loss mode, ex. 40%,50% , unit in %")); + printf(" %s\n", "-J"); + printf(" %s\n", _("jitter mode warning,critical, ex. 40.000ms,50.000ms , unit in ms ")); + printf(" %s\n", "-M"); + printf(" %s\n", _("MOS mode, between 0 and 4.4 warning,critical, ex. 3.5,3.0")); + printf(" %s\n", "-S"); + printf(" %s\n", _("score mode, max value 100 warning,critical, ex. 80,70 ")); + printf(" %s\n", "-O"); + printf(" %s\n", _("detect out of order ICMP packts ")); + printf(" %s\n", "-H"); + printf(" %s\n", _("specify a target")); + 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); + printf(" %s\n", "-p"); + printf(" %s", _("number of packets to send (currently ")); + printf("%u)\n", packets); + printf(" %s\n", "-i"); + printf(" %s", _("max packet interval (currently ")); + printf("%0.3fms)\n", (float)pkt_interval / 1000); + printf(" %s\n", "-I"); + printf(" %s", _("max target interval (currently ")); + printf("%0.3fms)\n", (float)target_interval / 1000); + printf(" %s\n", "-m"); + printf(" %s", _("number of alive hosts required for success")); + printf("\n"); + printf(" %s\n", "-l"); + printf(" %s", _("TTL on outgoing packets (currently ")); + printf("%u)\n", ttl); + printf(" %s\n", "-t"); + printf(" %s", _("timeout value (seconds, currently ")); + printf("%u)\n", timeout); + printf(" %s\n", "-b"); + printf(" %s\n", _("Number of icmp data bytes to send")); + printf(" %s %u + %d)\n", _("Packet size will be data bytes + icmp header (currently"), icmp_data_size, ICMP_MINLEN); + printf(" %s\n", "-v"); + printf(" %s\n", _("verbose")); + printf("\n"); + printf("%s\n", _("Notes:")); + printf(" %s\n", _("If none of R,P,J,M,S or O is specified, default behavior is -R -P")); + printf(" %s\n", _("The -H switch is optional. Naming a host (or several) to check is not.")); + printf("\n"); + printf(" %s\n", _("Threshold format for -w and -c is 200.25,60% for 200.25 msec RTA and 60%")); + printf(" %s\n", _("packet loss. The default values should work well for most users.")); + printf(" %s\n", _("You can specify different RTA factors using the standardized abbreviations")); + printf(" %s\n", _("us (microseconds), ms (milliseconds, default) or just plain s for seconds.")); /* -d not yet implemented */ /* printf ("%s\n", _("Threshold format for -d is warn,crit. 12,14 means WARNING if >= 12 hops")); printf ("%s\n", _("are spent and CRITICAL if >= 14 hops are spent.")); printf ("%s\n\n", _("NOTE: Some systems decrease TTL when forming ICMP_ECHOREPLY, others do not."));*/ - printf ("\n"); - printf (" %s\n", _("The -v switch can be specified several times for increased verbosity.")); + printf("\n"); + printf(" %s\n", _("The -v switch can be specified several times for increased verbosity.")); /* printf ("%s\n", _("Long options are currently unsupported.")); printf ("%s\n", _("Options marked with * require an argument")); */ - printf (UT_SUPPORT); + printf(UT_SUPPORT); } - - -void -print_usage (void) -{ - printf ("%s\n", _("Usage:")); +void print_usage(void) { + printf("%s\n", _("Usage:")); printf(" %s [options] [-H] host1 host2 hostN\n", progname); } -- cgit v0.10-9-g596f From 85f2e32e276ff92110f56828ac82b28007c72236 Mon Sep 17 00:00:00 2001 From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:55:08 +0200 Subject: check_icmp: Declare internal variables static diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c index 5ad1d84..d7e6ca2 100644 --- a/plugins-root/check_icmp.c +++ b/plugins-root/check_icmp.c @@ -247,14 +247,14 @@ static struct timeval prog_start; static unsigned long long max_completion_time = 0; static unsigned int warn_down = 1, crit_down = 1; /* host down threshold values */ static int min_hosts_alive = -1; -float pkt_backoff_factor = 1.5; -float target_backoff_factor = 1.5; -bool rta_mode = false; -bool pl_mode = false; -bool jitter_mode = false; -bool score_mode = false; -bool mos_mode = false; -bool order_mode = false; +static float pkt_backoff_factor = 1.5; +static float target_backoff_factor = 1.5; +static bool rta_mode = false; +static bool pl_mode = false; +static bool jitter_mode = false; +static bool score_mode = false; +static bool mos_mode = false; +static bool order_mode = false; /** code start **/ static void crash(const char *fmt, ...) { -- cgit v0.10-9-g596f From 780909f980809a3798343fb8cf82c33ed284885a Mon Sep 17 00:00:00 2001 From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:55:27 +0200 Subject: check_icmp: Properly mark function with void input diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c index d7e6ca2..e6d4316 100644 --- a/plugins-root/check_icmp.c +++ b/plugins-root/check_icmp.c @@ -845,7 +845,7 @@ int main(int argc, char **argv) { return (0); } -static void run_checks() { +static void run_checks(void) { u_int i, t; u_int final_wait, time_passed; -- cgit v0.10-9-g596f From c0694cc6b52caf924418b636a290b5674a24311a Mon Sep 17 00:00:00 2001 From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:56:41 +0200 Subject: check_icmp: Update copyright diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c index e6d4316..2fd92cd 100644 --- a/plugins-root/check_icmp.c +++ b/plugins-root/check_icmp.c @@ -3,7 +3,7 @@ * Monitoring check_icmp plugin * * License: GPL - * Copyright (c) 2005-2008 Monitoring Plugins Development Team + * Copyright (c) 2005-2024 Monitoring Plugins Development Team * Original Author : Andreas Ericsson * * Description: @@ -39,7 +39,7 @@ /* progname may change */ /* char *progname = "check_icmp"; */ char *progname; -const char *copyright = "2005-2008"; +const char *copyright = "2005-2024"; const char *email = "devel@monitoring-plugins.org"; /** Monitoring Plugins basic includes */ -- cgit v0.10-9-g596f From dd649f629e4846313a3dc89fcae72a420f258be4 Mon Sep 17 00:00:00 2001 From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 16 Oct 2024 00:11:17 +0200 Subject: clang-format: Put all enum values in a single line diff --git a/.clang-format b/.clang-format index c7f0b5e..e7869da 100644 --- a/.clang-format +++ b/.clang-format @@ -8,3 +8,4 @@ AlignConsecutiveMacros: true ColumnLimit: 180 IndentPPDirectives: AfterHash SortIncludes: Never +AllowShortEnumsOnASingleLine: false -- cgit v0.10-9-g596f From aa1f9c50118d63f7229523655a1fab28fd0eab24 Mon Sep 17 00:00:00 2001 From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 16 Oct 2024 00:11:39 +0200 Subject: check_icmp: clang-format diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c index 2fd92cd..6eefeb0 100644 --- a/plugins-root/check_icmp.c +++ b/plugins-root/check_icmp.c @@ -175,7 +175,13 @@ typedef union icmp_packet { #define MODE_ALL 2 #define MODE_ICMP 3 -enum enum_threshold_mode { const_rta_mode, const_packet_loss_mode, const_jitter_mode, const_mos_mode, const_score_mode }; +enum enum_threshold_mode { + const_rta_mode, + const_packet_loss_mode, + const_jitter_mode, + const_mos_mode, + const_score_mode +}; typedef enum enum_threshold_mode threshold_mode; -- cgit v0.10-9-g596f From de6e3c45f3f0889a5b4aada623cbefbd9fcb434d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20K=C3=A4stle?= Date: Wed, 30 Oct 2024 17:12:19 +0100 Subject: check_icmp: Apply clang-format again diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c index 6eefeb0..960ab8f 100644 --- a/plugins-root/check_icmp.c +++ b/plugins-root/check_icmp.c @@ -580,7 +580,8 @@ int main(int argc, char **argv) { icmp_data_size = size; icmp_pkt_size = size + ICMP_MINLEN; } else - usage_va("ICMP data length must be between: %lu and %lu", sizeof(struct icmp) + sizeof(struct icmp_ping_data), MAX_PING_DATA - 1); + usage_va("ICMP data length must be between: %lu and %lu", sizeof(struct icmp) + sizeof(struct icmp_ping_data), + MAX_PING_DATA - 1); break; case 'i': pkt_interval = get_timevar(optarg); @@ -803,7 +804,8 @@ int main(int argc, char **argv) { "target_interval: %0.3f, pkt_interval %0.3f\n" "crit.rta: %0.3f\n" "max_completion_time: %0.3f\n", - packets, targets, (float)target_interval / 1000, (float)pkt_interval / 1000, (float)crit.rta / 1000, (float)max_completion_time / 1000); + packets, targets, (float)target_interval / 1000, (float)pkt_interval / 1000, (float)crit.rta / 1000, + (float)max_completion_time / 1000); } if (debug) { @@ -997,9 +999,10 @@ static int wait_for_reply(int sock, u_int t) { /* address_family == AF_INET6 ? sizeof(struct icmp6_hdr) : sizeof(struct icmp));*/ - if ((address_family == PF_INET && (ntohs(packet.icp->icmp_id) != pid || packet.icp->icmp_type != ICMP_ECHOREPLY || ntohs(packet.icp->icmp_seq) >= targets * packets)) || - (address_family == PF_INET6 && - (ntohs(packet.icp6->icmp6_id) != pid || packet.icp6->icmp6_type != ICMP6_ECHO_REPLY || ntohs(packet.icp6->icmp6_seq) >= targets * packets))) { + if ((address_family == PF_INET && (ntohs(packet.icp->icmp_id) != pid || packet.icp->icmp_type != ICMP_ECHOREPLY || + ntohs(packet.icp->icmp_seq) >= targets * packets)) || + (address_family == PF_INET6 && (ntohs(packet.icp6->icmp6_id) != pid || packet.icp6->icmp6_type != ICMP6_ECHO_REPLY || + ntohs(packet.icp6->icmp6_seq) >= targets * packets))) { if (debug > 2) printf("not a proper ICMP_ECHOREPLY\n"); handle_random_icmp(buf + hlen, &resp_addr); @@ -1010,14 +1013,14 @@ static int wait_for_reply(int sock, u_int t) { if (address_family == PF_INET) { memcpy(&data, packet.icp->icmp_data, sizeof(data)); if (debug > 2) - printf("ICMP echo-reply of len %lu, id %u, seq %u, cksum 0x%X\n", (unsigned long)sizeof(data), ntohs(packet.icp->icmp_id), ntohs(packet.icp->icmp_seq), - packet.icp->icmp_cksum); + printf("ICMP echo-reply of len %lu, id %u, seq %u, cksum 0x%X\n", (unsigned long)sizeof(data), ntohs(packet.icp->icmp_id), + ntohs(packet.icp->icmp_seq), packet.icp->icmp_cksum); host = table[ntohs(packet.icp->icmp_seq) / packets]; } else { memcpy(&data, &packet.icp6->icmp6_dataun.icmp6_un_data8[4], sizeof(data)); if (debug > 2) - printf("ICMP echo-reply of len %lu, id %u, seq %u, cksum 0x%X\n", (unsigned long)sizeof(data), ntohs(packet.icp6->icmp6_id), ntohs(packet.icp6->icmp6_seq), - packet.icp6->icmp6_cksum); + printf("ICMP echo-reply of len %lu, id %u, seq %u, cksum 0x%X\n", (unsigned long)sizeof(data), ntohs(packet.icp6->icmp6_id), + ntohs(packet.icp6->icmp6_seq), packet.icp6->icmp6_cksum); host = table[ntohs(packet.icp6->icmp6_seq) / packets]; } @@ -1069,12 +1072,13 @@ static int wait_for_reply(int sock, u_int t) { switch (address_family) { case AF_INET: { - printf("%0.3f ms rtt from %s, outgoing ttl: %u, incoming ttl: %u, max: %0.3f, min: %0.3f\n", (float)tdiff / 1000, address, ttl, ip->ip.ip_ttl, - (float)host->rtmax / 1000, (float)host->rtmin / 1000); + printf("%0.3f ms rtt from %s, outgoing ttl: %u, incoming ttl: %u, max: %0.3f, min: %0.3f\n", (float)tdiff / 1000, address, + ttl, ip->ip.ip_ttl, (float)host->rtmax / 1000, (float)host->rtmin / 1000); break; }; case AF_INET6: { - printf("%0.3f ms rtt from %s, outgoing ttl: %u, max: %0.3f, min: %0.3f\n", (float)tdiff / 1000, address, ttl, (float)host->rtmax / 1000, (float)host->rtmin / 1000); + printf("%0.3f ms rtt from %s, outgoing ttl: %u, max: %0.3f, min: %0.3f\n", (float)tdiff / 1000, address, ttl, + (float)host->rtmax / 1000, (float)host->rtmin / 1000); }; } } @@ -1083,7 +1087,8 @@ static int wait_for_reply(int sock, u_int t) { if (mode == MODE_HOSTCHECK) { printf("OK - %s responds to ICMP. Packet %u, rta %0.3fms|" "pkt=%u;;;0;%u rta=%0.3f;%0.3f;%0.3f;;\n", - host->name, icmp_recv, (float)tdiff / 1000, icmp_recv, packets, (float)tdiff / 1000, (float)warn.rta / 1000, (float)crit.rta / 1000); + host->name, icmp_recv, (float)tdiff / 1000, icmp_recv, packets, (float)tdiff / 1000, (float)warn.rta / 1000, + (float)crit.rta / 1000); exit(STATE_OK); } } @@ -1138,8 +1143,8 @@ static int send_icmp_ping(int sock, struct rta_host *host) { icp->icmp_cksum = icmp_checksum((uint16_t *)buf, (size_t)icmp_pkt_size); if (debug > 2) - printf("Sending ICMP echo-request of len %lu, id %u, seq %u, cksum 0x%X to host %s\n", (unsigned long)sizeof(data), ntohs(icp->icmp_id), ntohs(icp->icmp_seq), - icp->icmp_cksum, host->name); + printf("Sending ICMP echo-request of len %lu, id %u, seq %u, cksum 0x%X to host %s\n", (unsigned long)sizeof(data), + ntohs(icp->icmp_id), ntohs(icp->icmp_seq), icp->icmp_cksum, host->name); } else { struct icmp6_hdr *icp6 = (struct icmp6_hdr *)buf; addrlen = sizeof(struct sockaddr_in6); @@ -1154,8 +1159,8 @@ static int send_icmp_ping(int sock, struct rta_host *host) { // let checksum be calculated automatically if (debug > 2) { - printf("Sending ICMP echo-request of len %lu, id %u, seq %u, cksum 0x%X to host %s\n", (unsigned long)sizeof(data), ntohs(icp6->icmp6_id), ntohs(icp6->icmp6_seq), - icp6->icmp6_cksum, host->name); + printf("Sending ICMP echo-request of len %lu, id %u, seq %u, cksum 0x%X to host %s\n", (unsigned long)sizeof(data), + ntohs(icp6->icmp6_id), ntohs(icp6->icmp6_seq), icp6->icmp6_cksum, host->name); } } @@ -1542,11 +1547,13 @@ static void finish(int sig) { if (rta_mode) { if (host->pl < 100) { - printf("%srta=%0.3fms;%0.3f;%0.3f;0; %srtmax=%0.3fms;;;; %srtmin=%0.3fms;;;; ", (targets > 1) ? host->name : "", host->rta / 1000, (float)warn.rta / 1000, - (float)crit.rta / 1000, (targets > 1) ? host->name : "", (float)host->rtmax / 1000, (targets > 1) ? host->name : "", + printf("%srta=%0.3fms;%0.3f;%0.3f;0; %srtmax=%0.3fms;;;; %srtmin=%0.3fms;;;; ", (targets > 1) ? host->name : "", + host->rta / 1000, (float)warn.rta / 1000, (float)crit.rta / 1000, (targets > 1) ? host->name : "", + (float)host->rtmax / 1000, (targets > 1) ? host->name : "", (host->rtmin < INFINITY) ? (float)host->rtmin / 1000 : (float)0); } else { - printf("%srta=U;;;; %srtmax=U;;;; %srtmin=U;;;; ", (targets > 1) ? host->name : "", (targets > 1) ? host->name : "", (targets > 1) ? host->name : ""); + printf("%srta=U;;;; %srtmax=U;;;; %srtmin=U;;;; ", (targets > 1) ? host->name : "", (targets > 1) ? host->name : "", + (targets > 1) ? host->name : ""); } } @@ -1556,12 +1563,13 @@ static void finish(int sig) { if (jitter_mode) { if (host->pl < 100) { - printf("%sjitter_avg=%0.3fms;%0.3f;%0.3f;0; %sjitter_max=%0.3fms;;;; %sjitter_min=%0.3fms;;;; ", (targets > 1) ? host->name : "", (float)host->jitter, - (float)warn.jitter, (float)crit.jitter, (targets > 1) ? host->name : "", (float)host->jitter_max / 1000, (targets > 1) ? host->name : "", + printf("%sjitter_avg=%0.3fms;%0.3f;%0.3f;0; %sjitter_max=%0.3fms;;;; %sjitter_min=%0.3fms;;;; ", + (targets > 1) ? host->name : "", (float)host->jitter, (float)warn.jitter, (float)crit.jitter, + (targets > 1) ? host->name : "", (float)host->jitter_max / 1000, (targets > 1) ? host->name : "", (float)host->jitter_min / 1000); } else { - printf("%sjitter_avg=U;;;; %sjitter_max=U;;;; %sjitter_min=U;;;; ", (targets > 1) ? host->name : "", (targets > 1) ? host->name : "", - (targets > 1) ? host->name : ""); + printf("%sjitter_avg=U;;;; %sjitter_max=U;;;; %sjitter_min=U;;;; ", (targets > 1) ? host->name : "", + (targets > 1) ? host->name : "", (targets > 1) ? host->name : ""); } } @@ -1594,7 +1602,8 @@ static void finish(int sig) { /* finish with an empty line */ puts(""); if (debug) - printf("targets: %u, targets_alive: %u, hosts_ok: %u, hosts_warn: %u, min_hosts_alive: %i\n", targets, targets_alive, hosts_ok, hosts_warn, min_hosts_alive); + printf("targets: %u, targets_alive: %u, hosts_ok: %u, hosts_warn: %u, min_hosts_alive: %i\n", targets, targets_alive, hosts_ok, + hosts_warn, min_hosts_alive); exit(status); } -- cgit v0.10-9-g596f