File ibod.dif of Package xibod

Index: ibod.1
===================================================================
--- ibod.1.orig
+++ ibod.1
@@ -2,7 +2,7 @@
 .SH NAME
 ibod \- ISDN MPPP bandwidth on demand daemon
 .SH SYNOPSIS
-.B ibod [file configfile] [pid pidfile]
+.B ibod [file configfile] [pid pidfile] [listen ip-address]
 
 .SH DESCRIPTION
 .B Ibod
@@ -33,7 +33,10 @@ interface.
 .B Ibod
 is also listening on TCP port 6051 for eventual connection from control
 panels
-.Bxibod(1).
+.B xibod(1).
+.br
+Default is to listen on all IP addresses (0.0.0.0), except an IP address
+is explicitely specified via command line.
 
 .SH SIGNALS
 Upon receiving SIGHUP, the configuration file is re-read.
Index: ibod.c
===================================================================
--- ibod.c.orig
+++ ibod.c
@@ -1,8 +1,3 @@
-static char *rcsId = "$Id: ibod.c,v 2.1 2001/03/09 10:15:09 kkeil Exp $";
-static char *rcsSymbol = "$Symbol$";
-
-#include <stdlib.h>
-#include <string.h>
 #include <stdio.h>
 #include <signal.h>
 #include <sys/types.h>
@@ -11,6 +6,7 @@ static char *rcsSymbol = "$Symbol$";
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <syslog.h>
+#include <sys/ioctl.h>
 #include <errno.h>
 #include <linux/isdn.h>
 #include <linux/isdnif.h>
@@ -44,7 +40,7 @@ static int	bring_down_allslave(Bundle_t 
 static int debug=0;
 
 static char  conffile[256];
-static char *pidfile  = 0;
+static char *pidfile  = IBOD_PIDFILE;
 static int usageflags[ISDN_MAX_CHANNELS];
 static char phone[ISDN_MAX_CHANNELS][32];
 static Siobytes iobytes[ISDN_MAX_CHANNELS];
@@ -251,7 +247,7 @@ list_config(void)
 
 int main(int argc, char *argv[])
 {
-    fd_set readfds, writefds, execptfds;
+    fd_set readfds, execptfds;
     int    i;
     int    s;			/* Listening socket descriptor */
     struct sockaddr_in server;	/* Socket protocol descriptor */
@@ -261,6 +257,7 @@ int main(int argc, char *argv[])
     Bundle_t *act;
     int    rval;
     int    tmpsock  = -1;
+    char   listen_to[16];
 
     openlog("ibod", LOG_PID, LOG_DAEMON);
 
@@ -268,15 +265,27 @@ int main(int argc, char *argv[])
     if ((home = getenv("IBOD_HOME")) == NULL)
         home = IBOD_DEFAULT_DIR;
 
-    sprintf(conffile, "%s/ibod.cf", home);
+    memset(conffile, 0, sizeof(conffile));
+    snprintf(conffile, sizeof(conffile), "%s/ibod.cf", home);
+
+    memset(listen_to, 0, sizeof(listen_to));
+    strncpy(listen_to, LISTEN_TO, sizeof(listen_to)-1);
+    listen_to[sizeof(listen_to)-1] = '\0';
 
     for (i = 1; i < argc; i++) {
-       if (strcmp(argv[i], "file") == 0 && i < argc-1)
-	  strcpy(conffile, argv[++i]);
+       if (strcmp(argv[i], "file") == 0 && i < argc-1) {
+	  strncpy(conffile, argv[++i], sizeof(conffile)-1);
+          conffile[sizeof(conffile)-1] = '\0';
+       }
        if (strcmp(argv[i], "pid") == 0 && i < argc-1)
 	  pidfile = argv[++i];
        if (strcmp(argv[i], "debug") == 0 && i < argc-1)
 	  debug = atoi(argv[++i]);
+       if (strcmp(argv[i], "listen") == 0 && i < argc-1) {
+          /* should be a valid IPv4 listen IP address */
+	  strncpy(listen_to, argv[++i], sizeof(listen_to)-1);
+          listen_to[sizeof(listen_to)-1] = '\0';
+       }
     }
 
     syslog(LOG_NOTICE, "ibod start: Configuration=%s\n", conffile);
@@ -296,7 +305,7 @@ int main(int argc, char *argv[])
        switch((rval=daemon(0,0)))
        {
            case -1:
-          	syslog(LOG_ERR, "daemon() call failed: %s\n", sys_errlist[errno]);
+          	syslog(LOG_ERR, "daemon() call failed: %s\n", strerror(errno));
 		bye(1);
            case  0:
 	        setpgrp();
@@ -310,7 +319,7 @@ int main(int argc, char *argv[])
     if (pidfile) {
        FILE *fd = fopen(pidfile, "w");
        if (fd == 0) {
-          syslog(LOG_ERR, "open %s: %s\n", pidfile, sys_errlist[errno]);
+          syslog(LOG_ERR, "open %s: %s\n", pidfile, strerror(errno));
 	  bye(1);
        }
    
@@ -328,15 +337,20 @@ int main(int argc, char *argv[])
 
     /* Create a socket for control panel communication */
     if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
-        syslog(LOG_ERR, "creating socket: %s\n", sys_errlist[errno]);
+        syslog(LOG_ERR, "creating socket: %s\n", strerror(errno));
         bye(1);
     }
 
     server.sin_family = AF_INET;
-    server.sin_addr.s_addr = INADDR_ANY;
     server.sin_port = htons(IBOD_PORT);
+    server.sin_addr.s_addr = INADDR_ANY;
+    if(inet_pton(AF_INET, listen_to, &server.sin_addr) <= 0) {
+      syslog(LOG_ERR, "unable to convert listen address '%s': %s\n",
+                      listen_to, strerror(errno));
+      bye(1);
+    }
     if (bind(s, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0) {
-        syslog(LOG_ERR, "binding stream socket: %s\n", sys_errlist[errno]);
+        syslog(LOG_ERR, "binding stream socket: %s\n", strerror(errno));
         bye(1);
     }
 
@@ -375,16 +389,16 @@ int main(int argc, char *argv[])
         }
 
         if ((rc = select(max_fd + 1, &readfds, NULL, &execptfds, &timeout)) < 0) {
-            syslog(LOG_ERR, "select: %s\n", sys_errlist[errno]);
+            syslog(LOG_ERR, "select: %s\n", strerror(errno));
             continue;
         }
 	if ((debug & DEBUG_SEL) & rc)
 	    syslog(LOG_DEBUG, "select: %d\n", rc);
 
         if (FD_ISSET(s, &readfds)) {
-            tmpsock = accept(s, (struct sockaddr *)0, (int *)0);
+            tmpsock = accept(s, (struct sockaddr *)0, (unsigned int *)0);
             if (tmpsock == -1)
-                syslog(LOG_ERR, "accept: %s\n", sys_errlist[errno]);
+                syslog(LOG_ERR, "accept: %s\n", strerror(errno));
         }
         
         if (FD_ISSET(s, &execptfds)) {
@@ -395,12 +409,11 @@ int main(int argc, char *argv[])
             memset(buf, 0, sizeof(buf));
             if ((rval = read(tmpsock, buf, 1024)) < 0) {
                 syslog(LOG_ERR, "reading stream(%d) message: %s\n",
-                    tmpsock, sys_errlist[errno]);
+                    tmpsock, strerror(errno));
                 close(tmpsock);
                 tmpsock = -1;
             } else {
             	OpenCMD_t *oc = (OpenCMD_t*)buf;
-            	int i;
 
                 if (debug & DEBUG_CMD)
                     syslog(LOG_DEBUG, "get tmpsock(%d) command(%d) rval(%d)\n",
@@ -441,7 +454,7 @@ int main(int argc, char *argv[])
                 memset(buf, 0, sizeof(buf));
                 if ((rval = read(act->msgsock, buf, 1024)) < 0) {
                     syslog(LOG_ERR, "reading stream(%d) message: %s\n",
-                       act->msgsock, sys_errlist[errno]);
+                       act->msgsock, strerror(errno));
                     errsocket = act->msgsock;
                 } else {
                     int  cmd = *(int *)buf;
@@ -500,7 +513,10 @@ int main(int argc, char *argv[])
                 memcpy(&buf[INBOUND_RATE_POS], &act->in_bytes_per_sec, POBJ_SIZE);
                 memcpy(&buf[OUTBOUND_RATE_POS], &act->out_bytes_per_sec, POBJ_SIZE);
 
-                write(act->msgsock, buf, STATUS_FRAME_SIZE);
+            	if ((rval = write(act->msgsock, buf, STATUS_FRAME_SIZE)) < 0) {
+                   syslog(LOG_ERR, "writing msgsock(%d) message: %s\n",
+                       act->msgsock, strerror(errno));
+                }
             }
             act = act->next;
         }
@@ -531,7 +547,7 @@ static void pipehndl(int sig)
     Bundle_t *b = bundle_list;
 
     syslog(LOG_ERR, "errsocket(%d) caught SIGPIPE: %s\n", errsocket,
-    	sys_errlist[errno]);
+    	strerror(errno));
 
     while(b) {
     	if ((b->msgsock != -1) && (b->msgsock == errsocket)) {
@@ -560,7 +576,7 @@ static int phone_index(char *number, int
 static void
 get_if_state()
 {
-    static char			buf[4096];
+    static char			buf[4096] = {0};
     struct timeval		tv_now;
     unsigned long		in_bytes_now, out_bytes_now;
     int				ms_delta;
@@ -572,7 +588,7 @@ get_if_state()
 
     /* Open the info device */
     if ((fd = open(ISDN_INFO_DEV, O_RDONLY | O_NDELAY)) < 0) {
-        syslog(LOG_ERR, "%s: %s\n", ISDN_INFO_DEV, sys_errlist[errno]);
+        syslog(LOG_ERR, "%s: %s\n", ISDN_INFO_DEV, strerror(errno));
         bye(1);
     }
 
@@ -653,14 +669,14 @@ get_if_state()
 
     /* Get byte in/out for all channels */
     if (ioctl(fd, IIOCGETCPS, &iobytes)) {
-        syslog(LOG_ERR, "%s: %s\n", IIOCGETCPS, sys_errlist[errno]);
+        syslog(LOG_ERR, "ioctl IOCGETCPS(%x): %s\n", IIOCGETCPS, strerror(errno));
         bye(1);
     }
 
     if (debug & DEBUG_ISDN) {
         p = buf;
         for (i=0; i<max_usable_channels;i++)
-            p += sprintf(p," %d/%d", iobytes[i].ibytes, iobytes[i].obytes);
+            p += sprintf(p," %ld/%ld", iobytes[i].ibytes, iobytes[i].obytes);
         syslog(LOG_DEBUG, "i/o bytes:%s\n", buf);
     }
 
@@ -719,7 +735,7 @@ get_if_state()
             act->channels_now++;
         }
         if (debug & DEBUG_ISDN)
-            syslog(LOG_DEBUG, "bundle %s:%d channels up i/o: %u,%u\n",
+            syslog(LOG_DEBUG, "bundle %s:%d channels up i/o: %lu,%lu\n",
                 act->cfg.dev, act->channels_now, in_bytes_now, out_bytes_now);
         if ((act->channels_last == -1) ||
             (act->channels_now < act->channels_last)) {
@@ -751,7 +767,7 @@ get_if_state()
         act->out_bytes_last = out_bytes_now;
 
         if (debug & DEBUG_RATE)
-            syslog(LOG_DEBUG, "%s rates: %d/%d\n", act->cfg.dev,
+            syslog(LOG_DEBUG, "%s rates: %ld/%ld\n", act->cfg.dev,
                 act->in_bytes_per_sec, act->out_bytes_per_sec);
         /* Take up or down slave channel */
 
@@ -767,7 +783,7 @@ get_if_state()
             /* Start stay up timer */
             gettimeofday(&act->tv_up, NULL);
             if (debug & DEBUG_UPDOWN)
-                syslog(LOG_DEBUG, "%s: up channel %d/%d time=%d sec\n",
+                syslog(LOG_DEBUG, "%s: up channel %d/%d time=%ld sec\n",
                     act->cfg.dev, act->channels_now, act->cfg.maxchan,
                     act->tv_up.tv_sec);
 
@@ -784,7 +800,7 @@ get_if_state()
             /* Check that the min stay up timer has expired */
             gettimeofday(&tv_now, NULL);
             if (debug & DEBUG_UPDOWN)
-                syslog(LOG_DEBUG, "%s: down channel %d/%d time=%d sec diff %d sec\n",
+                syslog(LOG_DEBUG, "%s: down channel %d/%d time=%ld sec diff %ld sec\n",
                     act->cfg.dev, act->channels_now, act->cfg.maxchan,
                     tv_now.tv_sec, tv_now.tv_sec - act->tv_up.tv_sec);
             if (tv_now.tv_sec - act->tv_up.tv_sec > act->cfg.stayup_time) {
@@ -811,12 +827,12 @@ static int bring_up_slave(Bundle_t *b)
 {   int  fd, rc;
 
     if ((fd = open(ISDN_CTLR_DEV, O_RDWR)) < 0) {
-        syslog(LOG_ERR, "%s: %s\n", ISDN_CTLR_DEV, sys_errlist[errno]);
+        syslog(LOG_ERR, "%s: %s\n", ISDN_CTLR_DEV, strerror(errno));
         return -1;
     }
 
     if ((rc = ioctl(fd, IIOCNETALN, b->cfg.dev)) < 0) {
-        syslog(LOG_ERR, "%s: %s\n", b->cfg.dev, sys_errlist[errno]);
+        syslog(LOG_ERR, "%s: %s\n", b->cfg.dev, strerror(errno));
         return -1;
     }
 
@@ -825,7 +841,7 @@ static int bring_up_slave(Bundle_t *b)
     if (rc)
         syslog(LOG_NOTICE, "unable to attach additional link: %d\n", rc);
     else {
-        syslog(LOG_NOTICE, "added new link for %s (in cps=%d, out cps=%d)\n", 
+        syslog(LOG_NOTICE, "added new link for %s (in cps=%ld, out cps=%ld)\n",
 		b->cfg.dev, b->in_bytes_per_sec, b->out_bytes_per_sec);
     }
 
@@ -838,12 +854,12 @@ static int bring_down_slave(Bundle_t *b)
     int  fd, rc;
 
     if ((fd = open(ISDN_CTLR_DEV, O_RDWR)) < 0) {
-        syslog(LOG_ERR, "%s: %s\n", ISDN_CTLR_DEV, sys_errlist[errno]);
+        syslog(LOG_ERR, "%s: %s\n", ISDN_CTLR_DEV, strerror(errno));
         return -1;
     }
 
     if ((rc = ioctl(fd, IIOCNETDLN, b->cfg.dev)) < 0) {
-        syslog(LOG_ERR, "%s: %s\n", b->cfg.dev, sys_errlist[errno]);
+        syslog(LOG_ERR, "%s: %s\n", b->cfg.dev, strerror(errno));
         return -1;
     }
 
@@ -852,7 +868,7 @@ static int bring_down_slave(Bundle_t *b)
     if (rc)
         syslog(LOG_ERR, "unable to remove additional link: %d\n", rc);
     else {
-        syslog(LOG_NOTICE, "removed link(%d) for %s(in cps=%d, out cps=%d)\n",
+        syslog(LOG_NOTICE, "removed link(%d) for %s(in cps=%ld, out cps=%ld)\n",
             b->channels_last, b->cfg.dev, b->in_bytes_per_sec,
             b->out_bytes_per_sec);
     }
Index: ibod.h
===================================================================
--- ibod.h.orig
+++ ibod.h
@@ -3,6 +3,13 @@
  */
 
 #include <sys/time.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <ctype.h>
+#include <string.h>
 
 #define INTERVAL		500
 #define DEVICE			"ippp0"
@@ -18,6 +25,7 @@
 #define ISDN_INFO_DEV		"/dev/isdninfo"
 #define ISDN_CTLR_DEV		"/dev/isdnctrl"
 #define IBOD_PORT		6051
+#define IBOD_PIDFILE		"/var/run/ibod.pid"
 
 /* Protocol specification */
 #define MAX_MSG_LEN		1024
@@ -35,6 +43,9 @@
 #define CMD_UP2			4
 #define CMD_DOWN2		5
 
+/* defaults to any for compatibility */
+#define LISTEN_TO               "0.0.0.0"
+
 typedef struct _Conf Conf_t;
 
 struct _Conf {