diff --git a/acl.c b/acl.c index dbc2065dd80ffebce923a102a99d87b16b46bf4e..7042eeee5cf55206bc0273ad27a1f69c5b5da2f9 100755 --- a/acl.c +++ b/acl.c @@ -384,3 +384,32 @@ struct ast_netsock *ast_netsock_bind(struct ast_netsock_list *list, struct io_co ast_log(LOG_WARNING, "Out of memory!\n"); return NULL; } + +int ast_find_ourip(struct in_addr *ourip, struct sockaddr_in bindaddr) +{ + char ourhost[256]; + struct ast_hostent ahp; + struct hostent *hp; + struct in_addr saddr; + + /* just use the bind address if it is nonzero */ + if (ntohl(bindaddr.sin_addr.s_addr)) { + memcpy(ourip, &bindaddr.sin_addr, sizeof(*ourip)); + return 0; + } + /* try to use our hostname */ + if (gethostname(ourhost, sizeof(ourhost))) { + ast_log(LOG_WARNING, "Unable to get hostname\n"); + } else { + hp = ast_gethostbyname(ourhost, &ahp); + if (hp) { + memcpy(ourip, hp->h_addr, sizeof(*ourip)); + return 0; + } + } + /* A.ROOT-SERVERS.NET. */ + if (inet_aton("198.41.0.4", &saddr) && !ast_ouraddrfor(&saddr, ourip)) + return 0; + return -1; +} + diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 24af559fe8319b8ff561923b77fa6a9885e26d3b..fb00430a791e4bd008cb3759f4fa67f01e04e1ba 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -191,7 +191,6 @@ static int restart_monitor(void); static int global_capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263; static int noncodeccapability = AST_RTP_DTMF; -static char ourhost[256]; static struct in_addr __ourip; static struct sockaddr_in outboundproxyip; static int ourport; @@ -9059,10 +9058,6 @@ static int reload_config(void) char iabuf[INET_ADDRSTRLEN]; struct ast_flags dummy; - if (gethostname(ourhost, sizeof(ourhost))) { - ast_log(LOG_WARNING, "Unable to get hostname, SIP disabled\n"); - return 0; - } cfg = ast_config_load(config); /* We *must* have a config file otherwise stop immediately */ @@ -9297,20 +9292,9 @@ static int reload_config(void) } cat = ast_category_browse(cfg, cat); } - - /* Find our IP address */ - if (ntohl(bindaddr.sin_addr.s_addr)) { - memcpy(&__ourip, &bindaddr.sin_addr, sizeof(__ourip)); - } else { - hp = ast_gethostbyname(ourhost, &ahp); - if (!hp) { - ast_log(LOG_WARNING, "Unable to get IP address for %s, SIP disabled\n", ourhost); - if (!__ourip.s_addr) { - ast_config_destroy(cfg); - return 0; - } - } else - memcpy(&__ourip, hp->h_addr, sizeof(__ourip)); + if (ast_find_ourip(&__ourip, bindaddr)) { + ast_log(LOG_WARNING, "Unable to get own IP address, SIP disabled\n"); + return 0; } if (!ntohs(bindaddr.sin_port)) bindaddr.sin_port = ntohs(DEFAULT_SIP_PORT); diff --git a/include/asterisk/acl.h b/include/asterisk/acl.h index 5dff735a1cc7637fc85631d8357e72cc68680a71..3aa777718394067b897244fe6c4a6f31353d7d3f 100755 --- a/include/asterisk/acl.h +++ b/include/asterisk/acl.h @@ -50,6 +50,7 @@ extern struct ast_netsock *ast_netsock_bindaddr(struct ast_netsock_list *list, s extern int ast_netsock_free(struct ast_netsock_list *list, struct ast_netsock *netsock); extern int ast_netsock_release(struct ast_netsock_list *list); extern int ast_netsock_sockfd(struct ast_netsock *ns); +extern int ast_find_ourip(struct in_addr *ourip, struct sockaddr_in bindaddr); /*! Compares the source address and port of two sockaddr_in */ static inline int inaddrcmp(struct sockaddr_in *sin1, struct sockaddr_in *sin2)