X-Git-Url: http://git.subgeniuskitty.com/icmpmonitor/.git/blobdiff_plain/b50b99d422783b77e867f5486e5703b780efbc1c..832bcc3f7dc22a080cb61551ecd09e71ccf06bee:/icmpmonitor.c diff --git a/icmpmonitor.c b/icmpmonitor.c index 870a4e2..f0fbc09 100644 --- a/icmpmonitor.c +++ b/icmpmonitor.c @@ -1,135 +1,37 @@ /* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Mike Muuss. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * ICMPMONITOR.C - * - * Using the InterNet Control Message Protocol (ICMP) "ECHO" facility, - * monitor several hosts, and notify admin if some of them are down. - * - * Author - - * Vadim Zaliva - * - * Status - - * Public Domain. Distribution Unlimited. + * Monitor hosts using ICMP "echo" and notify when down. + * + * © 2019 Aaron Taylor + * © 1999 Vadim Zaliva + * © 1989 The Regents of the University of California & Mike Muuss + * See LICENSE file for copyright and license details. */ -char copyright[] = -"@(#) Copyright (c) 1989 The Regents of the University of California.\n" -"All rights reserved.\n"; - -char rcsid[] = "$Id: icmpmonitor.c,v 1.8 2004/05/28 01:33:07 lord Exp $"; - #include #include #include -#ifdef HAVE_SYSLOG_H -# include -#endif #include #include #include -#ifdef HAVE_SYS_TIME_H -# include -# include -#endif +#include +#include #include #include -#ifdef HAVE_FCNTL_H -# include -#endif -#ifdef HAVE_SYS_FCNTL_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif - +#include +#include +#include #include - #include #include #include #include #include #include - -/* Workaround for broken ICMP header on Slackware 4.x */ -#ifdef _LINUX_ICMP_H -# warning "Broken Slackware 4.x 'netinet/ip_icmp.h' header detected. Using replacement 'struct icmp' definition." -# define ICMP_MINLEN 8 -struct icmp -{ - u_int8_t icmp_type; - u_int8_t icmp_code; - u_int16_t icmp_cksum; - union - { - struct ih_idseq - { - u_int16_t icd_id; - u_int16_t icd_seq; - } ih_idseq; - } icmp_hun; - -# define icmp_id icmp_hun.ih_idseq.icd_id -# define icmp_seq icmp_hun.ih_idseq.icd_seq - - union { - u_int8_t id_data[1]; - } icmp_dun; - -# define icmp_data icmp_dun.id_data - -}; -#endif /* _LINUX_ICMP_H */ - #include #include #include "cfg.h" -/* defines */ - -/* #define DEBUG */ - -#ifndef nil -# define nil NULL -#endif - /* return codes */ #define RET_OK 0 #define RET_NO_HOSTS 1 @@ -171,8 +73,6 @@ typedef struct monitor_host } monitor_host_t; /* protos */ -static void logopen(void); -static void logclose(void); static void log(int type, char *format, ...); static int gethostaddr(const char *name); static void read_hosts(const char *cfg_file_name); @@ -183,13 +83,11 @@ static int in_cksum(u_short *addr, int len); static void read_icmp_data(monitor_host_t *p); static void tvsub(struct timeval *out, struct timeval *in); static void done(int code); -static void start_daemon(void); static int gcd(int x, int y); /* globals */ -static monitor_host_t **hosts = nil; -static int isDaemon = 0; +static monitor_host_t **hosts = NULL; static int isVerbose = 0; static int keepBanging = 0; static unsigned short ident; @@ -199,21 +97,17 @@ int main(int ac, char **av) { extern char* optarg; extern int optind; - char *cfgfile=nil; + char *cfgfile=NULL; int param; - logopen(); log(LOG_INFO, VERSION " is starting."); - while((param = getopt(ac, av, "rvdf:")) != -1) + while((param = getopt(ac, av, "rvf:")) != -1) switch(param) { case 'v': isVerbose = 1; break; - case 'd': - isDaemon = 1; - break; case 'r': keepBanging = 1; break; @@ -221,7 +115,7 @@ int main(int ac, char **av) cfgfile=strdup(optarg); break; default: - fprintf(stderr,"Usage: icmpmonitor [-d] [-v] [-r] [-f cfgfile]\n"); + fprintf(stderr,"Usage: icmpmonitor [-v] [-r] [-f cfgfile]\n"); done(RET_BAD_OPT); } @@ -231,11 +125,7 @@ int main(int ac, char **av) cfgfile="icmpmonitor.cfg"; } - read_hosts(cfgfile); /* we do this before becoming daemon, - to be able process relative path */ - - if(isDaemon) - start_daemon(); + read_hosts(cfgfile); init_hosts(); @@ -326,7 +216,7 @@ static void pinger(int ignore) exit(0); } else { - wait(nil); + wait(NULL); } } } @@ -400,7 +290,7 @@ static void get_response(void) p=p->next; } - retval = select(maxd+1, &rfds, nil, nil, nil); + retval = select(maxd+1, &rfds, NULL, NULL, NULL); if(retval<0) { /* we get her in case we are interrupted by signal. @@ -490,7 +380,7 @@ static void read_icmp_data(monitor_host_t *p) exit(0); } else { - wait(nil); + wait(NULL); } } } else @@ -608,7 +498,7 @@ static void init_hosts(void) struct protoent *proto; int ok=0; - if((proto=getprotobyname("icmp"))==nil) + if((proto=getprotobyname("icmp"))==NULL) { log(LOG_ERR,"Unknown protocol: icmp. Exiting."); done(RET_INIT_ERROR); @@ -666,44 +556,9 @@ tvsub(register struct timeval *out, register struct timeval *in) void done(int code) { - logclose(); exit(code); } -void start_daemon(void) -{ - if(fork()) - exit(0); - - chdir("/"); - umask(0); - (void) close(0); - (void) close(1); - (void) close(2); - (void) open("/", O_RDONLY); - (void) dup2(0, 1); - (void) dup2(0, 2); - setsid(); -} - -static void logopen(void) -{ -#if HAVE_OPENLOG - if(isDaemon) - openlog("icmpmonitor", LOG_PID| LOG_CONS|LOG_NOWAIT, LOG_USER); -#else - log(LOG_WARNING,"Compiled without syslog. Syslog can't be used."); -#endif -} - -static void logclose(void) -{ -#if HAVE_CLOSELOG - if(isDaemon) - closelog(); -#endif -} - /** * This function should be used as central logging facility. * 'type' argument should be one of following: @@ -728,40 +583,15 @@ static void log(int type, char *format, ...) va_start(ap, format); - if(isDaemon) - { - char buffer[MAX_LOG_MSG_SIZE]; - -#if HAVE_VSNPRINTF - (void)vsnprintf(buffer, MAX_LOG_MSG_SIZE, format, ap); -#else -# if HAVE_VSPRINTF -# warning "Using VSPRINTF. Buffer overflow could happen!" - (void)vsprintf(buffer, format, ap); -# else -# error "Your standard libabry have neither vsnprintf nor vsprintf defined. One of them is reqired!" -# endif -#endif -#if HAVE_SYSLOG - syslog(type,buffer); -#endif - } else - { - (void) fprintf(stderr, "icmpmonitor[%d]:", (int)getpid()); - (void) vfprintf(stderr, format, ap); - (void) fprintf(stderr, "\n"); - } + fprintf(stderr, "icmpmonitor[%d]:", (int)getpid()); + vfprintf(stderr, format, ap); + fprintf(stderr, "\n"); va_end(ap); } static int gcd(int x, int y) { - while(x!=y) - { - if(x