Index: channels/chan_iax2.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v retrieving revision 1.325 diff -u -r1.325 chan_iax2.c --- channels/chan_iax2.c 4 Aug 2005 17:33:21 -0000 1.325 +++ channels/chan_iax2.c 9 Aug 2005 14:55:40 -0000 @@ -213,6 +213,9 @@ static pthread_t netthreadid = AST_PTHREADT_NULL; +static int bindtospecificaddr = 0; +static char bindtoaddr[32]; + #define IAX_STATE_STARTED (1 << 0) #define IAX_STATE_AUTHENTICATED (1 << 1) #define IAX_STATE_TBD (1 << 2) @@ -8444,6 +8447,9 @@ if (reload) { ast_log(LOG_NOTICE, "Ignoring bindaddr on reload\n"); } else { + bindtospecificaddr=1; + strncpy(bindtoaddr, v->value, (sizeof bindtoaddr)-1); +#if 0 if (!(ns = ast_netsock_bind(netsock, io, v->value, portno, tos, socket_read, NULL))) { ast_log(LOG_WARNING, "Unable apply binding to '%s' at line %d\n", v->value, v->lineno); } else { @@ -8456,6 +8462,7 @@ if (defaultsockfd < 0) defaultsockfd = ast_netsock_sockfd(ns); } +#endif } } else if (!strcasecmp(v->name, "authdebug")) authdebug = ast_true(v->value); @@ -8531,8 +8538,8 @@ if (!ast_context_find(regcontext)) ast_context_create(NULL, regcontext, channeltype); } else if (!strcasecmp(v->name, "tos")) { - if (sscanf(v->value, "%d", &format) == 1) - tos = format & 0xff; + if (!strcmp(v->value, "0") || !strcmp(v->value, "0x0") || strtoul(v->value, NULL, 0) > 0) + tos = strtoul(v->value, NULL, 0) & 0xff; else if (!strcasecmp(v->value, "lowdelay")) tos = IPTOS_LOWDELAY; else if (!strcasecmp(v->value, "throughput")) @@ -8544,7 +8551,8 @@ else if (!strcasecmp(v->value, "none")) tos = 0; else - ast_log(LOG_WARNING, "Invalid tos value at line %d, should be 'lowdelay', 'throughput', 'reliability', 'mincost', or 'none'\n", v->lineno); + ast_log(LOG_WARNING, "Invalid tos value \"%s\" at line %d, should be 'lowdelay', 'throughput', 'reliability', 'mincost', or 'none'\n", + v->value, v->lineno); } else if (!strcasecmp(v->name, "accountcode")) { ast_copy_string(accountcode, v->value, sizeof(accountcode)); } else if (!strcasecmp(v->name, "amaflags")) { @@ -9372,13 +9380,24 @@ ast_log(LOG_ERROR, "Unable to register IAX switch\n"); if (defaultsockfd < 0) { - if (!(ns = ast_netsock_bindaddr(netsock, io, &sin, tos, socket_read, NULL))) { - ast_log(LOG_ERROR, "Unable to create network socket: %s\n", strerror(errno)); - return -1; + if (bindtospecificaddr) { + if (!(ns = ast_netsock_bind(netsock, io, bindtoaddr, IAX_DEFAULT_PORTNO, tos, socket_read, NULL))) { + ast_log(LOG_ERROR, "Unable to create network socket: %s\n", strerror(errno)); + return -1; + } else { + if (option_verbose > 1) + ast_verbose(VERBOSE_PREFIX_2 "Binding IAX2 to default address %s:%d\n", bindtoaddr, IAX_DEFAULT_PORTNO); + defaultsockfd = ast_netsock_sockfd(ns); + } } else { - if (option_verbose > 1) - ast_verbose(VERBOSE_PREFIX_2 "Binding IAX2 to default address 0.0.0.0:%d\n", IAX_DEFAULT_PORTNO); - defaultsockfd = ast_netsock_sockfd(ns); + if (!(ns = ast_netsock_bindaddr(netsock, io, &sin, tos, socket_read, NULL))) { + ast_log(LOG_ERROR, "Unable to create network socket: %s\n", strerror(errno)); + return -1; + } else { + if (option_verbose > 1) + ast_verbose(VERBOSE_PREFIX_2 "Binding IAX2 to default address 0.0.0.0:%d\n", IAX_DEFAULT_PORTNO); + defaultsockfd = ast_netsock_sockfd(ns); + } } }