Minor protocol fixes (bug #4169)
authorMark Spencer <markster@digium.com>
Wed, 4 May 2005 19:17:09 +0000 (19:17 +0000)
committerMark Spencer <markster@digium.com>
Wed, 4 May 2005 19:17:09 +0000 (19:17 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5577 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_mgcp.c

index c0a1a0c..e1e8afc 100755 (executable)
@@ -509,7 +509,7 @@ static int unalloc_sub(struct mgcp_subchannel *sub)
        ast_log(LOG_DEBUG, "Released sub %d of channel %s@%s\n", sub->id, p->name, p->parent->name);
 
        sub->owner = NULL;
        ast_log(LOG_DEBUG, "Released sub %d of channel %s@%s\n", sub->id, p->name, p->parent->name);
 
        sub->owner = NULL;
-       if (strlen(sub->cxident)) {
+       if (!ast_strlen_zero(sub->cxident)) {
                transmit_connection_del(sub);
        }
        sub->cxident[0] = '\0';
                transmit_connection_del(sub);
        }
        sub->cxident[0] = '\0';
@@ -943,7 +943,7 @@ static int mgcp_call(struct ast_channel *ast, char *dest, int timeout)
                        transmit_modify_request(sub);
                }
 
                        transmit_modify_request(sub);
                }
 
-               if (sub->next->owner && strlen(sub->next->cxident) && strlen(sub->next->callid)) {
+               if (sub->next->owner && !ast_strlen_zero(sub->next->cxident) && !ast_strlen_zero(sub->next->callid)) {
                        /* try to prevent a callwait from disturbing the other connection */
                        sub->next->cxmode = MGCP_CX_RECVONLY;
                        transmit_modify_request(sub->next);
                        /* try to prevent a callwait from disturbing the other connection */
                        sub->next->cxmode = MGCP_CX_RECVONLY;
                        transmit_modify_request(sub->next);
@@ -952,7 +952,7 @@ static int mgcp_call(struct ast_channel *ast, char *dest, int timeout)
                transmit_notify_request_with_callerid(sub, tone, ast->cid.cid_num, ast->cid.cid_name);
                ast_setstate(ast, AST_STATE_RINGING);
 
                transmit_notify_request_with_callerid(sub, tone, ast->cid.cid_num, ast->cid.cid_name);
                ast_setstate(ast, AST_STATE_RINGING);
 
-               if (sub->next->owner && strlen(sub->next->cxident) && strlen(sub->next->callid)) {
+               if (sub->next->owner && !ast_strlen_zero(sub->next->cxident) && !ast_strlen_zero(sub->next->callid)) {
                        /* Put the connection back in sendrecv */
                        sub->next->cxmode = MGCP_CX_SENDRECV;
                        transmit_modify_request(sub->next);
                        /* Put the connection back in sendrecv */
                        sub->next->cxmode = MGCP_CX_SENDRECV;
                        transmit_modify_request(sub->next);
@@ -1001,7 +1001,7 @@ static int mgcp_hangup(struct ast_channel *ast)
        }
 
        sub->owner = NULL;
        }
 
        sub->owner = NULL;
-       if (strlen(sub->cxident)) {
+       if (!ast_strlen_zero(sub->cxident)) {
                transmit_connection_del(sub);
        }
        sub->cxident[0] = '\0';
                transmit_connection_del(sub);
        }
        sub->cxident[0] = '\0';
@@ -1402,9 +1402,9 @@ static struct ast_channel *mgcp_new(struct mgcp_subchannel *sub, int state)
                tmp->readformat = fmt;
                tmp->rawreadformat = fmt;
                tmp->tech_pvt = sub;
                tmp->readformat = fmt;
                tmp->rawreadformat = fmt;
                tmp->tech_pvt = sub;
-               if (strlen(i->language))
+               if (!ast_strlen_zero(i->language))
                        strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
                        strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
-               if (strlen(i->accountcode))
+               if (!ast_strlen_zero(i->accountcode))
                        strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
                if (i->amaflags)
                        tmp->amaflags = i->amaflags;
                        strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
                if (i->amaflags)
                        tmp->amaflags = i->amaflags;
@@ -1663,7 +1663,7 @@ static void parse(struct mgcp_request *req)
 #if 0
                        printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
 #endif                 
 #if 0
                        printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
 #endif                 
-                       if (!strlen(req->header[f])) {
+                       if (ast_strlen_zero(req->header[f])) {
                                /* Line by itself means we're now in content */
                                c++;
                                break;
                                /* Line by itself means we're now in content */
                                c++;
                                break;
@@ -1680,7 +1680,7 @@ static void parse(struct mgcp_request *req)
                c++;
        }
        /* Check for last header */
                c++;
        }
        /* Check for last header */
-       if (strlen(req->header[f])) 
+       if (!ast_strlen_zero(req->header[f])) 
                f++;
        req->headers = f;
        /* Now we process any mime content */
                f++;
        req->headers = f;
        /* Now we process any mime content */
@@ -1705,7 +1705,7 @@ static void parse(struct mgcp_request *req)
                c++;
        }
        /* Check for last line */
                c++;
        }
        /* Check for last line */
-       if (strlen(req->line[f])) 
+       if (!ast_strlen_zero(req->line[f])) 
                f++;
        req->lines = f;
        /* Parse up the initial header */
                f++;
        req->lines = f;
        /* Parse up the initial header */
@@ -1760,14 +1760,14 @@ static int process_sdp(struct mgcp_subchannel *sub, struct mgcp_request *req)
        struct sockaddr_in sin;
        char *codecs;
        struct ast_hostent ahp; struct hostent *hp;
        struct sockaddr_in sin;
        char *codecs;
        struct ast_hostent ahp; struct hostent *hp;
-       int codec;
+       int codec, codec_count=0;
        int iterator;
        struct mgcp_endpoint *p = sub->parent;
 
        /* Get codec and RTP info from SDP */
        m = get_sdp(req, "m");
        c = get_sdp(req, "c");
        int iterator;
        struct mgcp_endpoint *p = sub->parent;
 
        /* Get codec and RTP info from SDP */
        m = get_sdp(req, "m");
        c = get_sdp(req, "c");
-       if (!strlen(m) || !strlen(c)) {
+       if (ast_strlen_zero(m) || ast_strlen_zero(c)) {
                ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
                return -1;
        }
                ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
                return -1;
        }
@@ -1794,13 +1794,16 @@ static int process_sdp(struct mgcp_subchannel *sub, struct mgcp_request *req)
 #endif 
        /* Scan through the RTP payload types specified in a "m=" line: */
        ast_rtp_pt_clear(sub->rtp);
 #endif 
        /* Scan through the RTP payload types specified in a "m=" line: */
        ast_rtp_pt_clear(sub->rtp);
-       codecs = m + len;
-       while(strlen(codecs)) {
-               if (sscanf(codecs, "%d %n", &codec, &len) != 1) {
-                       ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
+       codecs = ast_strdupa(m + len);
+       while (codecs && !ast_strlen_zero(codecs)) {
+               if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
+                       if (codec_count)
+                               break;
+                       ast_log(LOG_WARNING, "Error in codec string '%s' at '%s'\n", m, codecs);
                        return -1;
                }
                ast_rtp_set_m_type(sub->rtp, codec);
                        return -1;
                }
                ast_rtp_set_m_type(sub->rtp, codec);
+               codec_count++;
                codecs += len;
        }
 
                codecs += len;
        }
 
@@ -2061,7 +2064,7 @@ static int transmit_modify_with_sdp(struct mgcp_subchannel *sub, struct ast_rtp
        capability = p->capability;
        if (codecs)
                capability = codecs;
        capability = p->capability;
        if (codecs)
                capability = codecs;
-       if (!strlen(sub->cxident) && rtp) {
+       if (ast_strlen_zero(sub->cxident) && rtp) {
                /* We don't have a CXident yet, store the destination and
                   wait a bit */
                ast_rtp_get_peer(rtp, &sub->tmpdest);
                /* We don't have a CXident yet, store the destination and
                   wait a bit */
                ast_rtp_get_peer(rtp, &sub->tmpdest);
@@ -2144,7 +2147,7 @@ static int transmit_notify_request(struct mgcp_subchannel *sub, char *tone)
                add_header(&resp, "R", (sub->rtp && (p->dtmfmode & MGCP_DTMF_INBAND)) ? "L/hu(N),L/hf(N)" : "L/hu(N),L/hf(N),D/[0-9#*](N)");
                break;
        }
                add_header(&resp, "R", (sub->rtp && (p->dtmfmode & MGCP_DTMF_INBAND)) ? "L/hu(N),L/hf(N)" : "L/hu(N),L/hf(N),D/[0-9#*](N)");
                break;
        }
-       if (strlen(tone)) {
+       if (!ast_strlen_zero(tone)) {
                add_header(&resp, "S", tone);
        }
        /* SC: fill in new fields */
                add_header(&resp, "S", tone);
        }
        /* SC: fill in new fields */
@@ -2187,7 +2190,7 @@ static int transmit_notify_request_with_callerid(struct mgcp_subchannel *sub, ch
                add_header(&resp, "R",  (sub->rtp && (p->dtmfmode & MGCP_DTMF_INBAND)) ? "L/hu(N),L/hf(N)" : "L/hu(N),L/hf(N),D/[0-9#*](N)");
                break;
        }
                add_header(&resp, "R",  (sub->rtp && (p->dtmfmode & MGCP_DTMF_INBAND)) ? "L/hu(N),L/hf(N)" : "L/hu(N),L/hf(N),D/[0-9#*](N)");
                break;
        }
-       if (strlen(tone2)) {
+       if (!ast_strlen_zero(tone2)) {
                add_header(&resp, "S", tone2);
        }
        if (mgcpdebug) {
                add_header(&resp, "S", tone2);
        }
        if (mgcpdebug) {
@@ -2205,7 +2208,7 @@ static int transmit_modify_request(struct mgcp_subchannel *sub)
        struct mgcp_request resp;
        struct mgcp_endpoint *p = sub->parent;
 
        struct mgcp_request resp;
        struct mgcp_endpoint *p = sub->parent;
 
-       if (!strlen(sub->cxident)) {
+       if (ast_strlen_zero(sub->cxident)) {
                /* We don't have a CXident yet, store the destination and
                   wait a bit */
                return 0;
                /* We don't have a CXident yet, store the destination and
                   wait a bit */
                return 0;
@@ -2428,10 +2431,10 @@ static void handle_response(struct mgcp_endpoint *p, struct mgcp_subchannel *sub
        if (resp) {
                if (req->cmd == MGCP_CMD_CRCX) {
                        if ((c = get_header(resp, "I"))) {
        if (resp) {
                if (req->cmd == MGCP_CMD_CRCX) {
                        if ((c = get_header(resp, "I"))) {
-                               if (strlen(c) && sub) {
+                               if (!ast_strlen_zero(c) && sub) {
                                        /* SC: if we are hanging up do not process this conn. */
                                        if (sub->owner) {
                                        /* SC: if we are hanging up do not process this conn. */
                                        if (sub->owner) {
-                                               if (strlen(sub->cxident)) {
+                                               if (!ast_strlen_zero(sub->cxident)) {
                                                        if (strcasecmp(c, sub->cxident)) {
                                                                ast_log(LOG_WARNING, "Subchannel already has a cxident. sub->cxident: %s requested %s\n", sub->cxident, c);
                                                        }
                                                        if (strcasecmp(c, sub->cxident)) {
                                                                ast_log(LOG_WARNING, "Subchannel already has a cxident. sub->cxident: %s requested %s\n", sub->cxident, c);
                                                        }
@@ -2477,7 +2480,7 @@ static void handle_response(struct mgcp_endpoint *p, struct mgcp_subchannel *sub
 
                        /* Try to determine the hookstate returned from an audit endpoint command */
                        if ((c = get_header(resp, "ES"))) {
 
                        /* Try to determine the hookstate returned from an audit endpoint command */
                        if ((c = get_header(resp, "ES"))) {
-                               if (strlen(c)) {
+                               if (!ast_strlen_zero(c)) {
                                        if (strstr(c, "hu")) {
                                                if (p->hookstate != MGCP_ONHOOK) {
                                                        /* SC: XXX cleanup if we think we are offhook XXX */
                                        if (strstr(c, "hu")) {
                                                if (p->hookstate != MGCP_ONHOOK) {
                                                        /* SC: XXX cleanup if we think we are offhook XXX */
@@ -2692,7 +2695,7 @@ static void *mgcp_ss(void *data)
                        timeout = firstdigittimeout;
                } else if (p->callreturn && !strcmp(exten, "*69")) {
                        res = 0;
                        timeout = firstdigittimeout;
                } else if (p->callreturn && !strcmp(exten, "*69")) {
                        res = 0;
-                       if (strlen(p->lastcallerid)) {
+                       if (!ast_strlen_zero(p->lastcallerid)) {
                                res = ast_say_digit_str(chan, p->lastcallerid, "", chan->language);
                        }
                        if (!res)
                                res = ast_say_digit_str(chan, p->lastcallerid, "", chan->language);
                        }
                        if (!res)
@@ -2746,7 +2749,7 @@ static void *mgcp_ss(void *data)
                                ast_verbose(VERBOSE_PREFIX_3 "Parking call to '%s'\n", chan->name);
                        }
                        break;
                                ast_verbose(VERBOSE_PREFIX_3 "Parking call to '%s'\n", chan->name);
                        }
                        break;
-               } else if (strlen(p->lastcallerid) && !strcmp(exten, "*60")) {
+               } else if (!ast_strlen_zero(p->lastcallerid) && !strcmp(exten, "*60")) {
                        if (option_verbose > 2) {
                                ast_verbose(VERBOSE_PREFIX_3 "Blacklisting number %s\n", p->lastcallerid);
                        }
                        if (option_verbose > 2) {
                                ast_verbose(VERBOSE_PREFIX_3 "Blacklisting number %s\n", p->lastcallerid);
                        }
@@ -3043,9 +3046,7 @@ static int handle_request(struct mgcp_subchannel *sub, struct mgcp_request *req,
                ev = get_header(req, "O");
                s = strchr(ev, '/');
                if (s) ev = s + 1;
                ev = get_header(req, "O");
                s = strchr(ev, '/');
                if (s) ev = s + 1;
-               if (option_verbose > 2) {
-                       ast_verbose(VERBOSE_PREFIX_3 "Endpoint '%s@%s-%d' observed '%s'\n", p->name, p->parent->name, sub->id, ev);
-               }
+               ast_log(LOG_DEBUG, "Endpoint '%s@%s-%d' observed '%s'\n", p->name, p->parent->name, sub->id, ev);
                /* Keep looking for events unless this was a hangup */
                if (strcasecmp(ev, "hu") && strcasecmp(ev, "hd") && strcasecmp(ev, "ping")) {
                        transmit_notify_request(sub, p->curtone);
                /* Keep looking for events unless this was a hangup */
                if (strcasecmp(ev, "hu") && strcasecmp(ev, "hd") && strcasecmp(ev, "ping")) {
                        transmit_notify_request(sub, p->curtone);
@@ -3307,7 +3308,7 @@ static int mgcpsock_read(int *id, int fd, short events, void *ignore)
                /* Must have at least one header */
                return 1;
        }
                /* Must have at least one header */
                return 1;
        }
-       if (!req.identifier || !strlen(req.identifier)) {
+       if (!req.identifier || ast_strlen_zero(req.identifier)) {
                ast_log(LOG_NOTICE, "Message from %s missing identifier\n", ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr));
                return 1;
        }
                ast_log(LOG_NOTICE, "Message from %s missing identifier\n", ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr));
                return 1;
        }
@@ -3349,9 +3350,9 @@ static int mgcpsock_read(int *id, int fd, short events, void *ignore)
                                gw->name, ident);
                }
        } else {
                                gw->name, ident);
                }
        } else {
-               if (!req.endpoint || !strlen(req.endpoint) || 
-                   !req.version || !strlen(req.version) || 
-                       !req.verb || !strlen(req.verb)) {
+               if (!req.endpoint || ast_strlen_zero(req.endpoint) || 
+                   !req.version || ast_strlen_zero(req.version) || 
+                       !req.verb || ast_strlen_zero(req.verb)) {
                        ast_log(LOG_NOTICE, "Message must have a verb, an idenitifier, version, and endpoint\n");
                        return 1;
                }
                        ast_log(LOG_NOTICE, "Message must have a verb, an idenitifier, version, and endpoint\n");
                        return 1;
                }
@@ -3504,7 +3505,7 @@ static struct ast_channel *mgcp_request(const char *type, int format, void *data
                return NULL;
        }
        strncpy(tmp, dest, sizeof(tmp) - 1);
                return NULL;
        }
        strncpy(tmp, dest, sizeof(tmp) - 1);
-       if (!strlen(tmp)) {
+       if (ast_strlen_zero(tmp)) {
                ast_log(LOG_NOTICE, "MGCP Channels require an endpoint\n");
                return NULL;
        }
                ast_log(LOG_NOTICE, "MGCP Channels require an endpoint\n");
                return NULL;
        }
@@ -3523,7 +3524,7 @@ static struct ast_channel *mgcp_request(const char *type, int format, void *data
        /* Must be busy */
        if (((sub->parent->callwaiting) && ((sub->owner) && (sub->next->owner))) ||
                ((!sub->parent->callwaiting) && (sub->owner)) ||
        /* Must be busy */
        if (((sub->parent->callwaiting) && ((sub->owner) && (sub->next->owner))) ||
                ((!sub->parent->callwaiting) && (sub->owner)) ||
-                (sub->parent->dnd && (!strlen(sub->parent->call_forward)))) {
+                (sub->parent->dnd && (ast_strlen_zero(sub->parent->call_forward)))) {
                if (sub->parent->hookstate == MGCP_ONHOOK) {
                        if (has_voicemail(sub->parent)) {
                                transmit_notify_request(sub,"L/vmwi(+)");
                if (sub->parent->hookstate == MGCP_ONHOOK) {
                        if (has_voicemail(sub->parent)) {
                                transmit_notify_request(sub,"L/vmwi(+)");
@@ -3816,7 +3817,7 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
                                        strncpy(e->language, language, sizeof(e->language) - 1);
                                        strncpy(e->musicclass, musicclass, sizeof(e->musicclass) - 1);
                                        strncpy(e->mailbox, mailbox, sizeof(e->mailbox)-1);
                                        strncpy(e->language, language, sizeof(e->language) - 1);
                                        strncpy(e->musicclass, musicclass, sizeof(e->musicclass) - 1);
                                        strncpy(e->mailbox, mailbox, sizeof(e->mailbox)-1);
-                                       if (strlen(mailbox)) {
+                                       if (!ast_strlen_zero(mailbox)) {
                                                ast_verbose(VERBOSE_PREFIX_3 "Setting mailbox '%s' on %s@%s\n", mailbox, gw->name, e->name);
                                        }
                                        if (!ep_reload) {
                                                ast_verbose(VERBOSE_PREFIX_3 "Setting mailbox '%s' on %s@%s\n", mailbox, gw->name, e->name);
                                        }
                                        if (!ep_reload) {
@@ -3995,7 +3996,7 @@ static void destroy_endpoint(struct mgcp_endpoint *e)
 
        for (i = 0; i < MAX_SUBS; i++) {
                ast_mutex_lock(&sub->lock);
 
        for (i = 0; i < MAX_SUBS; i++) {
                ast_mutex_lock(&sub->lock);
-               if (strlen(sub->cxident)) {
+               if (!ast_strlen_zero(sub->cxident)) {
                        transmit_connection_del(sub);
                }
                if (sub->rtp) {
                        transmit_connection_del(sub);
                }
                if (sub->rtp) {