Removed done() from icmpmonitor.c.
[icmpmonitor] / icmpmonitor.c
index 4bd0b92..7d24d1a 100644 (file)
@@ -10,7 +10,6 @@
 #include <sys/param.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/param.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <syslog.h>
 #include <stdarg.h>
 #include <signal.h>
 #include <string.h>
 #include <stdarg.h>
 #include <signal.h>
 #include <string.h>
@@ -44,7 +43,6 @@
 #define        DEFDATALEN      (64 - 8)         /* default data length */
 
 #define VERSION "ICMPmonitor v1.2 by lord@crocodile.org"
 #define        DEFDATALEN      (64 - 8)         /* default data length */
 
 #define VERSION "ICMPmonitor v1.2 by lord@crocodile.org"
-#define MAX_LOG_MSG_SIZE 4096
 
 # define icmphdr                       icmp
 
 
 # define icmphdr                       icmp
 
@@ -74,9 +72,6 @@ typedef struct monitor_host
 } monitor_host_t;
 
 /* protos */
 } 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);
 static void init_hosts(void);
 static int  gethostaddr(const char *name);
 static void read_hosts(const char *cfg_file_name);
 static void init_hosts(void);
@@ -85,38 +80,41 @@ static void pinger(int);
 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 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      = NULL;
 static int gcd(int x, int y);
 
 /* globals */
 
 static monitor_host_t **hosts      = NULL;
-static int             isDaemon    = 0; 
 static int             isVerbose   = 0;
 static int             keepBanging = 0;
 static unsigned short  ident;
 static int             send_delay  = 1;
 
 static int             isVerbose   = 0;
 static int             keepBanging = 0;
 static unsigned short  ident;
 static int             send_delay  = 1;
 
+
+
+
+
+
+
+
+
+
+
+
+
 int main(int ac, char **av)
 {
     extern char* optarg;
     extern int   optind;
     char         *cfgfile=NULL;
     int          param;
 int main(int ac, char **av)
 {
     extern char* optarg;
     extern int   optind;
     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; 
        switch(param)
         { 
        case 'v':
             isVerbose = 1;
            break; 
-       case 'd':
-            isDaemon = 1;
-           break; 
        case 'r':
             keepBanging = 1;
            break; 
        case 'r':
             keepBanging = 1;
            break; 
@@ -124,21 +122,16 @@ int main(int ac, char **av)
            cfgfile=strdup(optarg);  
            break;  
        default: 
            cfgfile=strdup(optarg);  
            break;  
        default: 
-           fprintf(stderr,"Usage: icmpmonitor [-d] [-v] [-r] [-f cfgfile]\n");
-            done(RET_BAD_OPT);
+            fprintf(stderr,"Usage: icmpmonitor [-v] [-r] [-f cfgfile]\n");
+            exit(EXIT_FAILURE);
        } 
     
        } 
     
-    if(!cfgfile)
-    {
-        log(LOG_WARNING,"No cfg file specified. Assuming 'icmpmonitor.cfg'");
-       cfgfile="icmpmonitor.cfg";
+    if (!cfgfile) {
+        fprintf(stderr, "ERROR: No config file specified.\n");
+        exit(EXIT_FAILURE);
     }
 
     }
 
-    read_hosts(cfgfile); /* we do this before becoming daemon,
-                            to be able process relative path */
-
-    if(isDaemon)
-        start_daemon();
+    read_hosts(cfgfile);
     
     init_hosts();
     
     
     init_hosts();
     
@@ -148,8 +141,8 @@ int main(int ac, char **av)
     alarm(send_delay); 
 
     get_response();
     alarm(send_delay); 
 
     get_response();
-    
-    done(RET_OK);
+
+    exit(EXIT_SUCCESS);
 }
 
 
 }
 
 
@@ -221,8 +214,7 @@ static void pinger(int ignore)
                 {
                    p->down = 1;
                     
                 {
                    p->down = 1;
                     
-                    if(isVerbose)
-                        log(LOG_INFO,"Host %s in down. Executing DOWN command",p->name);
+                    if (isVerbose) printf("INFO: Host %s is down. Executing DOWN command.\n", p->name);
                     if(!fork())
                     {
                         system(p->downcmd);
                     if(!fork())
                     {
                         system(p->downcmd);
@@ -248,8 +240,7 @@ static void pinger(int ignore)
                 icp->icmp_seq   = p->socket;
                 icp->icmp_id    = ident;                       
 
                 icp->icmp_seq   = p->socket;
                 icp->icmp_id    = ident;                       
 
-                if(isVerbose)
-                    log(LOG_INFO,"Sending ICMP packet to %s.",p->name);
+                if (isVerbose) printf("INFO: Sending ICMP packet to %s.\n", p->name);
                 
                 (void)gettimeofday((struct timeval *)&outpack[8],
                                    (struct timezone *)NULL);
                 
                 (void)gettimeofday((struct timeval *)&outpack[8],
                                    (struct timezone *)NULL);
@@ -267,8 +258,7 @@ static void pinger(int ignore)
                 
                 if(i<0 || i!=cc)
                 {
                 
                 if(i<0 || i!=cc)
                 {
-                    if(i<0)
-                        log(LOG_WARNING,"Sending ICMP packet to %s failed.",p->name);
+                    if (i<0) fprintf(stderr, "WARN: Failed sending ICMP packet to %s.\n", p->name);
                 }
                 p->sentpackets++;
             }
                 }
                 p->sentpackets++;
             }
@@ -313,7 +303,6 @@ static void get_response(void)
         {
             if(retval>0)
             {
         {
             if(retval>0)
             {
-                /* log(LOG_DEBUG,"ICMP data is available now."); */
                 p=hosts[0];
                 while(p)
                 {
                 p=hosts[0];
                 while(p)
                 {
@@ -324,9 +313,8 @@ static void get_response(void)
                     }
                     p=p->next;
                 }
                     }
                     p=p->next;
                 }
-            } else
-            {
-                log(LOG_DEBUG,"select returns 0."); /* TODO */
+            } else {
+                /* TODO: How to handle this error? */
             }
         }
     }
             }
         }
     }
@@ -347,24 +335,18 @@ static void read_icmp_data(monitor_host_t *p)
     (void)gettimeofday(&tv, (struct timezone *)NULL);
     
     fromlen = sizeof(from);
     (void)gettimeofday(&tv, (struct timezone *)NULL);
     
     fromlen = sizeof(from);
-    if((cc = recvfrom(p->socket, buf, sizeof(buf), 0,
-                      (struct sockaddr *)&from, &fromlen)) < 0)
-    {
-        if(errno != EINTR)
-            log(LOG_WARNING,"Error reading ICMP data from %s.",p->name);
+    if ((cc = recvfrom(p->socket, buf, sizeof(buf), 0, (struct sockaddr *)&from, &fromlen)) < 0) {
+        if (errno != EINTR) fprintf(stderr, "WARN: Error reading ICMP data from %s.\n", p->name);
         return;
     } 
 
         return;
     } 
 
-    /* log(LOG_DEBUG,"Got %d bytes of ICMP data from %s.",cc, p->name); */
-
     /* check IP header actual len */ 
     ip       = (struct ip *)buf               ; 
     iphdrlen = ip->ip_hl<<2                   ; 
     icmp     = (struct icmp *) (buf+iphdrlen) ;
     
     /* check IP header actual len */ 
     ip       = (struct ip *)buf               ; 
     iphdrlen = ip->ip_hl<<2                   ; 
     icmp     = (struct icmp *) (buf+iphdrlen) ;
     
-    if(cc < iphdrlen+ICMP_MINLEN)
-    {
-        log(LOG_WARNING,"Received short packet from %s.",p->name);
+    if (cc < iphdrlen + ICMP_MINLEN) {
+        fprintf(stderr, "WARN: Received short packet from %s.\n", p->name);
         return;
     }
     
         return;
     }
     
@@ -379,14 +361,12 @@ static void read_icmp_data(monitor_host_t *p)
         tvsub(&tv, (struct timeval *) &icmp->icmp_data[0]);
         delay=tv.tv_sec*1000+(tv.tv_usec/1000);
         
         tvsub(&tv, (struct timeval *) &icmp->icmp_data[0]);
         delay=tv.tv_sec*1000+(tv.tv_usec/1000);
         
-        if(isVerbose)
-            log(LOG_INFO,"Got ICMP reply from %s in %d ms.",p->name,delay);
+        if(isVerbose) printf("INFO: Got ICMP reply from %s in %d ms.\n", p->name, delay);
        p->down=0;
         if(!p->up)
         {
             p->up=1;
        p->down=0;
         if(!p->up)
         {
             p->up=1;
-            if(isVerbose)
-                log(LOG_INFO,"Host %s in now up. Executing UP command",p->name);
+            if (isVerbose) printf("INFO: Host %s is up. Executing UP command.\n", p->name);
             if(!fork())
             {
                 system(p->upcmd);
             if(!fork())
             {
                 system(p->upcmd);
@@ -396,14 +376,8 @@ static void read_icmp_data(monitor_host_t *p)
                 wait(NULL);
             }
         }
                 wait(NULL);
             }
         }
-    } else
-    {
-        /*
-          log(LOG_DEBUG,"ICMP packet of type %d from %s. Ident=%d",icmp->icmp_type,
-          p->name,
-          icmp->icmp_id
-          );
-        */
+    } else {
+        /* TODO: Do anything here? */
     }
 }
 
     }
 }
 
@@ -412,28 +386,23 @@ static void read_hosts(const char *cfg_file_name)
     int    i,n=0;
     struct Cfg *cfg;
     
     int    i,n=0;
     struct Cfg *cfg;
     
-    if((cfg=readcfg(cfg_file_name))==NULL)
-    {
-        log(LOG_ERR,"Error reading cfg. Exiting.");
-        done(RET_BAD_CFG);
+    if ((cfg = readcfg(cfg_file_name)) == NULL) {
+        fprintf(stderr, "ERROR: Failed to read config.\n");
+        exit(EXIT_FAILURE);
     }
     
     }
     
-    if(cfg->nelements)
-    {
-        hosts=malloc(sizeof(monitor_host_t *)*cfg->nelements);
-        for(i=0;i<cfg->nelements;i++)
-        {
-            if(cfg->dict[i]->nvalues<4)
-            {
-                log(LOG_ERR,"Not enough fields in record %d of cfg file. Got %d.",n, cfg->dict[i]->nvalues+1);
-                done(RET_BAD_CFG);
-            } else if(cfg->dict[i]->nvalues>5)
-            {
-                log(LOG_ERR,"Too many fields in record %d of cfg file. Got %d.",n, cfg->dict[i]->nvalues+1);
-                done(RET_BAD_CFG);
+    if (cfg->nelements) {
+        hosts = malloc(sizeof(monitor_host_t *) * cfg->nelements);
+        for (i=0; i<cfg->nelements; i++) {
+            if (cfg->dict[i]->nvalues < 4) {
+                fprintf(stderr, "ERROR: Not enough fields in record %d of cfg file. Got %d.\n", n, cfg->dict[i]->nvalues+1);
+                exit(EXIT_FAILURE);
+            } else if (cfg->dict[i]->nvalues>5) {
+                fprintf(stderr, "ERROR: Too many fields in record %d of cfg file. Got %d.\n", n, cfg->dict[i]->nvalues+1);
+                exit(EXIT_FAILURE);
             }
             
             }
             
-            hosts[n]=malloc(sizeof(monitor_host_t));
+            hosts[n]                = malloc(sizeof(monitor_host_t));
             hosts[n]->name          = strdup(cfg->dict[i]->name);
             hosts[n]->ping_interval = atoi  (cfg->dict[i]->value[0]);
             hosts[n]->max_delay     = atoi  (cfg->dict[i]->value[1]);
             hosts[n]->name          = strdup(cfg->dict[i]->name);
             hosts[n]->ping_interval = atoi  (cfg->dict[i]->value[0]);
             hosts[n]->max_delay     = atoi  (cfg->dict[i]->value[1]);
@@ -460,19 +429,17 @@ static void read_hosts(const char *cfg_file_name)
            {
                hosts[n]->down = 0;
                hosts[n]->up   = 0;
            {
                hosts[n]->down = 0;
                hosts[n]->up   = 0;
-           } else
-           {
-               log(LOG_ERR,"Illegal value %s in record %n for startup condition.", cfg->dict[i]->value[4], n);
-               done(RET_BAD_CFG);
+           } else {
+               fprintf(stderr, "ERROR: Illegal value %s in record %n for startup condition.\n", cfg->dict[i]->value[4], n);
+               exit(EXIT_FAILURE);
            }
             hosts[n]->sentpackets   = 0;
             hosts[n]->recvdpackets  = 0;
 
             hosts[n]->socket           = -1;
            }
             hosts[n]->sentpackets   = 0;
             hosts[n]->recvdpackets  = 0;
 
             hosts[n]->socket           = -1;
-            hosts[n]->next             = nil;
-            if(n>0)
-                hosts[n-1]->next=hosts[n];
-            (void)gettimeofday(&(hosts[n]->last_ping_received), (struct timezone *)NULL);
+            hosts[n]->next             = NULL;
+            if (n > 0) hosts[n-1]->next=hosts[n];
+            gettimeofday(&(hosts[n]->last_ping_received), (struct timezone *)NULL);
 
             n++;
         } 
 
             n++;
         } 
@@ -480,14 +447,10 @@ static void read_hosts(const char *cfg_file_name)
 
     freecfg(cfg);
 
 
     freecfg(cfg);
 
-    if(n<=0)
-    {
-        log(LOG_ERR,"No hosts defined in cfg file, exiting.");
-        done(RET_NO_HOSTS);
+    if (n <= 0) {
+        fprintf(stderr, "ERROR: No hosts defined in cfg file, exiting.\n");
+        exit(EXIT_FAILURE);
     }
     }
-    else
-        log(LOG_DEBUG,"%d host(s) found in cfg file,", n);
-    
 }
 
 static int gethostaddr(const char *name)
 }
 
 static int gethostaddr(const char *name)
@@ -511,27 +474,23 @@ static void init_hosts(void)
     struct protoent   *proto;
     int ok=0;
 
     struct protoent   *proto;
     int ok=0;
 
-    if((proto=getprotobyname("icmp"))==NULL)
-    {
-        log(LOG_ERR,"Unknown protocol: icmp. Exiting.");
-        done(RET_INIT_ERROR);
+    if ((proto = getprotobyname("icmp")) == NULL) {
+        fprintf(stderr, "ERROR: Unknown protocol: icmp.\n");
+        exit(EXIT_FAILURE);
     }
     
     }
     
-    while(p)
-    {
-        log(LOG_DEBUG,"resolving host %s", p->name);
-        
+    while(p) {
         bzero(&p->dest,sizeof(p->dest));
         p->dest.sin_family=AF_INET;
         if((p->dest.sin_addr.s_addr=gethostaddr(p->name))<=0)
         {
         bzero(&p->dest,sizeof(p->dest));
         p->dest.sin_family=AF_INET;
         if((p->dest.sin_addr.s_addr=gethostaddr(p->name))<=0)
         {
-            log(LOG_ERR,"Can't resolve host. Skipping client %s.",p->name);
+            fprintf(stderr, "WARN: Can't resolve host. Skipping client %s.\n", p->name);
             p->socket=-1;
         } else
         {
             if((p->socket=socket(AF_INET,SOCK_RAW,proto->p_proto))<0)
             {
             p->socket=-1;
         } else
         {
             if((p->socket=socket(AF_INET,SOCK_RAW,proto->p_proto))<0)
             {
-                log(LOG_ERR,"Can't create socket. Skipping client %s.",p->name);
+                fprintf(stderr, "WARN: Can't create socket. Skipping client %s.\n", p->name);
                 p->socket=-1;
             } else
             {
                 p->socket=-1;
             } else
             {
@@ -547,8 +506,8 @@ static void init_hosts(void)
 
     if(!ok)
     {
 
     if(!ok)
     {
-        log(LOG_ERR,"No hosts left to process, exiting.");
-        done(RET_NO_HOSTS);
+        fprintf(stderr, "ERROR: No hosts left to process.\n");
+        exit(EXIT_FAILURE);
     }
 }
 
     }
 }
 
@@ -567,87 +526,9 @@ tvsub(register struct timeval *out, register struct timeval *in)
        out->tv_sec -= in->tv_sec;
 }
 
        out->tv_sec -= in->tv_sec;
 }
 
-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(isDaemon)
-        openlog("icmpmonitor", LOG_PID| LOG_CONS|LOG_NOWAIT, LOG_USER);
-}
-
-static void logclose(void)
-{
-    if(isDaemon)
-        closelog();
-}
-
-/**
- * This function should be used as central logging facility.
- * 'type' argument should be one of following:
- *
- *  LOG_EMERG  system is unusable 
- *  LOG_ALERT  action must be taken immediately 
- *  LOG_CRIT   critical conditions 
- *  LOG_ERR    error conditions 
- *  LOG_WARNING        warning conditions 
- *  LOG_NOTICE normal but significant condition 
- *  LOG_INFO   informational 
- *  LOG_DEBUG  debug-level messages 
- */
-static void log(int type, char *format, ...)
-{
-    va_list ap;
-
-#ifndef DEBUG
-    if(type==LOG_DEBUG)
-        return;
-#endif
-    
-    va_start(ap, format);
-
-    if(isDaemon)
-    {
-        char buffer[MAX_LOG_MSG_SIZE];
-            
-        (void)vsnprintf(buffer, MAX_LOG_MSG_SIZE, format, ap);
-        syslog(type,buffer);
-    } else
-    {
-        (void)  fprintf(stderr, "icmpmonitor[%d]:", (int)getpid());
-        (void) vfprintf(stderr, format, ap);
-        (void)  fprintf(stderr, "\n");
-    }
-    va_end(ap);
-}
-
 static int gcd(int x, int y)
 {
 static int gcd(int x, int y)
 {
-    while(x!=y)
-    {
-        if(x<y)
-            y-=x;
-        else 
-            x-=y;
-    }
-    return x;
+    int remainder = x % y;
+    if (remainder == 0) return y;
+    return gcd(y, remainder);
 }
 }