diff options
Diffstat (limited to 'channels/chan_sip.c')
-rwxr-xr-x | channels/chan_sip.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 58ef4530d..2abbe4491 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -36,6 +36,7 @@ #include <asterisk/dsp.h> #include <asterisk/parking.h> #include <asterisk/acl.h> +#include <asterisk/srv.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> @@ -94,6 +95,8 @@ static char fromdomain[AST_MAX_EXTENSION] = ""; static char notifymime[AST_MAX_EXTENSION] = "application/simple-message-summary"; +static int srvlookup = 0; + static int usecnt =0; static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER; @@ -595,6 +598,8 @@ static int create_addr(struct sip_pvt *r, char *peer) struct sip_peer *p; int found=0; char *port; + int portno; + char host[256], *hostn; r->sa.sin_family = AF_INET; ast_pthread_mutex_lock(&peerl.lock); @@ -656,15 +661,27 @@ static int create_addr(struct sip_pvt *r, char *peer) *port='\0'; port++; } - hp = gethostbyname(peer); + hostn = peer; + if (port) + portno = atoi(port); + else + portno = DEFAULT_SIP_PORT; + if (srvlookup) { + char service[256]; + int tportno; + int ret; + snprintf(service, sizeof(service), "_sip._udp.%s", peer); + ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service); + if (ret > 0) { + hostn = host; + portno = tportno; + } + } + hp = gethostbyname(hostn); if (hp) { strncpy(r->tohost, peer, sizeof(r->tohost) - 1); memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr)); - if (port) { - r->sa.sin_port = htons(atoi(port)); - } else { - r->sa.sin_port = htons(DEFAULT_SIP_PORT); - } + r->sa.sin_port = htons(portno); memcpy(&r->recv, &r->sa, sizeof(r->recv)); return 0; } else { @@ -5216,6 +5233,8 @@ static int reload_config(void) strncpy(fromdomain, v->value, sizeof(fromdomain)-1); } else if (!strcasecmp(v->name, "nat")) { globalnat = ast_true(v->value); + } else if (!strcasecmp(v->name, "srvlookup")) { + srvlookup = ast_true(v->value); } else if (!strcasecmp(v->name, "canreinvite")) { if (!strcasecmp(v->value, "update")) globalcanreinvite = REINVITE_UPDATE; |