diff --git a/Makefile b/Makefile index 84603fdaa9..fa86849b22 100755 --- a/Makefile +++ b/Makefile @@ -112,7 +112,7 @@ OBJS=io.o sched.o logger.o frame.o loader.o config.o channel.o \ ulaw.o alaw.o callerid.o fskmodem.o image.o app.o \ cdr.o tdd.o acl.o rtp.o manager.o asterisk.o ast_expr.o \ dsp.o chanvars.o indications.o autoservice.o db.o privacy.o \ - astmm.o enum.o + astmm.o enum.o srv.o CC=gcc INSTALL=install diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index f7faa0ab23..661ed97679 100755 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -3019,7 +3019,7 @@ static int complete_dpreply(struct chan_iax2_pvt *pvt, struct iax_ies *ies) if (dp->flags & CACHE_FLAG_PENDING) { dp->flags &= ~CACHE_FLAG_PENDING; dp->flags |= status; - dp->flags |= CACHE_FLAG_MATCHMORE; + dp->flags |= matchmore; } /* Wake up waiters */ for (x=0;xwaiters) / sizeof(dp->waiters[0]); x++) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 58ef4530d2..2abbe4491a 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -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; diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample index 0010d47797..a26996939d 100755 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -5,6 +5,7 @@ port = 5060 ; Port to bind to bindaddr = 0.0.0.0 ; Address to bind to context = default ; Default for incoming calls +;srvlookup = yes ; Enable SRV lookups on outbound calls ;tos=lowdelay ;tos=184 ;maxexpirey=3600 ; Max length of incoming registration we allow diff --git a/enum.c b/enum.c index b42278239d..73141f0a89 100755 --- a/enum.c +++ b/enum.c @@ -234,15 +234,12 @@ static int parse_answer(unsigned char *dst, int dstlen, unsigned char *tech, int printf("Looking for %d/%d\n", C_IN, T_NAPTR); #endif for (x=0;xancount);x++) { - if ((res = skip_name(answer, len) < 0)) { + if ((res = skip_name(answer, len)) < 0) { ast_log(LOG_WARNING, "Failed to skip name :(\n"); return -1; } answer += res; len -= res; - /* XXX Why am I adding 2 here? XXX */ - answer += 2; - len -= 2; ans = (struct dn_answer *)answer; answer += sizeof(struct dn_answer); len -= sizeof(struct dn_answer);