From a2979a6a5d3275858275714d28c76b584e11b0ea Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Tue, 2 Dec 2008 03:37:16 +0000 Subject: [PATCH] Add a way to bind to a specific IP address. --- codemux.c | 25 +++++++++++++++++++++++-- codemux.initscript | 4 +++- codemuxlib.c | 9 ++++----- codemuxlib.h | 2 +- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/codemux.c b/codemux.c index 4e4fabe..5957850 100644 --- 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 ]\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); } diff --git a/codemux.initscript b/codemux.initscript index c12b2e4..de4f167 100644 --- a/codemux.initscript +++ b/codemux.initscript @@ -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 diff --git a/codemuxlib.c b/codemuxlib.c index 206c08f..58b5fc8 100644 --- a/codemuxlib.c +++ b/codemuxlib.c @@ -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 * diff --git a/codemuxlib.h b/codemuxlib.h index 5911620..465d382 100644 --- a/codemuxlib.h +++ b/codemuxlib.h @@ -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); -- 2.43.0