From 71b7293b7fe420a29ebb5abf49e8d310570a6ba2 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 10 Jul 2015 08:13:58 -0400 Subject: [PATCH] MT#13895 support binding to a single interface address --- iaxmodem.c | 12 ++++++++++-- lib/libiax2/src/iax-client.h | 2 +- lib/libiax2/src/iax.c | 4 ++-- lib/libiax2/src/miniphone.c | 2 +- lib/libiax2/src/winiphone.c | 2 +- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/iaxmodem.c b/iaxmodem.c index 40e54a4..edad183 100644 --- a/iaxmodem.c +++ b/iaxmodem.c @@ -118,6 +118,7 @@ static int window = 1000; /* u-sec prior to target that we will let audio go */ static int codec = AST_FORMAT_SLINEAR; /* negotiated codec */ static int port = 4569; +static unsigned long interface = 0; static int refreshreq = 300; /* requested refresh */ static int refresh = 300; /* negotiated refresh, initialize equal to refreshreq */ static int codecreq = AST_FORMAT_SLINEAR; /* requested codec */ @@ -341,6 +342,12 @@ setconfigline(char *line) port = atoi(line); printlog(LOG_INFO, "Setting port = %d\n", port); } + if (strncasecmp(line, "interface", 9) == 0) { + line += 9; + while (*line == '\t' || *line == ' ') line++; + interface = inet_addr(line); + printlog(LOG_INFO, "Setting interface = %lu\n", interface); + } if (strncasecmp(line, "refresh", 7) == 0) { line += 7; while (*line == '\t' || *line == ' ') line++; @@ -877,8 +884,9 @@ iaxmodem(const char *config, int nondaemon) setegid(uucp_gid); seteuid(uucp_uid); - if ((port = iax_init(port) < 0)) { - printlog(LOG_ERROR, "Fatal error: failed to initialize iax with port %d\n", port); + if ((port = iax_init(port, interface) < 0)) { + printlog(LOG_ERROR, "Fatal error: failed to initialize iax with port %d and interface %lu\n", + port, interface); cleanup(-1); } iaxnetfd = iax_get_fd(); diff --git a/lib/libiax2/src/iax-client.h b/lib/libiax2/src/iax-client.h index cd8f62d..d88a97a 100644 --- a/lib/libiax2/src/iax-client.h +++ b/lib/libiax2/src/iax-client.h @@ -138,7 +138,7 @@ extern "C" /* Called to initialize IAX structures and sockets. Returns actual portnumber (which it will try preferred portno first, but if not take what it can get */ -extern int iax_init(int preferredportno); +extern int iax_init(int preferredportno, unsigned long interface); /* Get filedescriptor for IAX to use with select or gtk_input_add */ extern int iax_get_fd(void); diff --git a/lib/libiax2/src/iax.c b/lib/libiax2/src/iax.c index df3ca18..b0b7bb4 100644 --- a/lib/libiax2/src/iax.c +++ b/lib/libiax2/src/iax.c @@ -911,7 +911,7 @@ void iax_set_jb_target_extra( long value ) jb_target_extra = value ; } -int iax_init(int preferredportno) +int iax_init(int preferredportno, unsigned long interface) { int portno = preferredportno; @@ -943,7 +943,7 @@ int iax_init(int preferredportno) preferredportno = 0; sin.sin_family = AF_INET; - sin.sin_addr.s_addr = 0; + sin.sin_addr.s_addr = interface; sin.sin_port = htons((short)preferredportno); if (bind(netfd, (struct sockaddr *) &sin, sizeof(sin)) < 0) { diff --git a/lib/libiax2/src/miniphone.c b/lib/libiax2/src/miniphone.c index ab0dd84..9c8e3b2 100644 --- a/lib/libiax2/src/miniphone.c +++ b/lib/libiax2/src/miniphone.c @@ -389,7 +389,7 @@ main(int argc, char *argv[]) return -1; } - if ( (port = iax_init(0) < 0)) { + if ( (port = iax_init(0, 0) < 0)) { fprintf(stderr, "Fatal error: failed to initialize iax with port %d\n", port); return -1; } diff --git a/lib/libiax2/src/winiphone.c b/lib/libiax2/src/winiphone.c index 0bc3147..10b9bcf 100644 --- a/lib/libiax2/src/winiphone.c +++ b/lib/libiax2/src/winiphone.c @@ -270,7 +270,7 @@ main(int argc, char *argv[]) /* initialize the audio in buffer structures */ memset(&whin,0,sizeof(whin)); - if ( (port = iax_init(0) < 0)) { + if ( (port = iax_init(0, 0) < 0)) { fprintf(stderr, "Fatal error: failed to initialize iax with port %d\n", port); return -1; }