Add SRV code to SIP, cleanup ENUM and make IAX2 do the right thing on dials
authorMark Spencer <markster@digium.com>
Thu, 12 Jun 2003 12:48:57 +0000 (12:48 +0000)
committerMark Spencer <markster@digium.com>
Thu, 12 Jun 2003 12:48:57 +0000 (12:48 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1085 65c4cc65-6c06-0410-ace0-fbb531ad65f3

Makefile
channels/chan_iax2.c
channels/chan_sip.c
configs/sip.conf.sample
enum.c

index 84603fd..fa86849 100755 (executable)
--- 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
 
index f7faa0a..661ed97 100755 (executable)
@@ -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;x<sizeof(dp->waiters) / sizeof(dp->waiters[0]); x++)
index 58ef453..2abbe44 100755 (executable)
@@ -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;
index 0010d47..a269969 100755 (executable)
@@ -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 b422782..73141f0 100755 (executable)
--- 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;x<ntohs(h->ancount);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);