Add a way to bind to a specific IP address.
Daniel Hokka Zakrisson [Tue, 2 Dec 2008 03:37:16 +0000 (03:37 +0000)]
codemux.c
codemux.initscript
codemuxlib.c
codemuxlib.h

index 4e4fabe..5957850 100644 (file)
--- a/codemux.c
+++ b/codemux.c
@@ -1063,9 +1063,29 @@ main(int argc, char *argv[])
 {
   int lisSock;
   int logFd;
+  int doDaemon = 1;
+  int opt;
+  struct in_addr lisAddress = { .s_addr = htonl(INADDR_ANY) };
+
+  while ((opt = getopt(argc, argv, "dl:")) != -1) {
+    switch (opt) {
+      case 'd':
+       doDaemon = 0;
+       break;
+      case 'l':
+       if (inet_pton(AF_INET, optarg, &lisAddress) <= 0) {
+         fprintf(stderr, "`%s' is not a valid address\n", optarg);
+         exit(-1);
+       }
+       break;
+      default:
+       fprintf(stderr, "Usage: %s [-d] [-l <listening address>]\n", argv[0]);
+       exit(-1);
+    }
+  }
 
   /* do the daemon stuff */
-  if (argc <= 1 || strcmp(argv[1], "-d") != 0) {
+  if (doDaemon) {
     if (InitDaemon() < 0) {
       fprintf(stderr, "codemux daemon_init() failed\n");
       exit(-1);
@@ -1073,7 +1093,8 @@ main(int argc, char *argv[])
   }
 
   /* create the accept socket */
-  if ((lisSock = CreatePrivateAcceptSocket(DEMUX_PORT, TRUE)) < 0) {
+  if ((lisSock = CreatePrivateAcceptSocket(DEMUX_PORT, TRUE,
+                                          &lisAddress)) < 0) {
     fprintf(stderr, "failed creating accept socket\n");
     exit(-1);
   }
index c12b2e4..de4f167 100644 (file)
@@ -12,6 +12,8 @@ RETVAL=0
 
 pidfile=/var/run/$PROC.pid
 
+[ -r /etc/sysconfig/codemux ] && . /etc/sysconfig/codemux
+
 check_status() {
     pid=`cat $pidfile 2>/dev/null`
     #
@@ -35,7 +37,7 @@ case "$1" in
         fi
 
         #initlog -c /usr/sbin/codemux # Depricated
-               /usr/sbin/codemux
+               /usr/sbin/codemux $CODEMUX_OPTS
 
         cmd=success
         check_status && touch /var/lock/subsys/$PROC || cmd=failure
index 206c08f..58b5fc8 100644 (file)
@@ -168,7 +168,7 @@ GetWord(const char *start, int whichWord)
 }
 /*-----------------------------------------------------------------*/
 static int 
-CreatePrivateAcceptSocketEx(int portNum, int nonBlocking, int loopbackOnly)
+CreatePrivateAcceptSocketEx(int portNum, int nonBlocking, struct in_addr *addr)
 {
   int doReuse = 1;
   struct linger doLinger;
@@ -205,8 +205,7 @@ CreatePrivateAcceptSocketEx(int portNum, int nonBlocking, int loopbackOnly)
   /* set up info for binding listen */
   memset(&sa, 0, sizeof(sa));
   sa.sin_family = AF_INET;
-  sa.sin_addr.s_addr = (loopbackOnly) ? htonl(INADDR_LOOPBACK) 
-                                      : htonl(INADDR_ANY);
+  sa.sin_addr = *addr;
   sa.sin_port = htons(portNum);
 
   /* bind the sock */
@@ -225,9 +224,9 @@ CreatePrivateAcceptSocketEx(int portNum, int nonBlocking, int loopbackOnly)
 }
 /*-----------------------------------------------------------------*/
 int
-CreatePrivateAcceptSocket(int portNum, int nonBlocking)
+CreatePrivateAcceptSocket(int portNum, int nonBlocking, struct in_addr *addr)
 {
-  return CreatePrivateAcceptSocketEx(portNum, nonBlocking, FALSE);
+  return CreatePrivateAcceptSocketEx(portNum, nonBlocking, addr);
 }
 /*-----------------------------------------------------------------*/
 char *
index 5911620..465d382 100644 (file)
@@ -25,7 +25,7 @@ extern int   WordCount(char *buf);
 extern char *GetField(const char *start, int whichField);
 extern char *GetWord(const char *start, int whichWord);
 extern int   DoesDotlessSuffixMatch(char *start, int len, char *suffix);
-extern int   CreatePrivateAcceptSocket(int portNum, int nonBlocking);
+extern int   CreatePrivateAcceptSocket(int portNum, int nonBlocking, struct in_addr *addr);
 extern char *StrdupLower(const char *orig);
 extern void  StrcpyLower(char *dest, const char *src);