Add peercontext parameter for default outbound context (bug #1929)
authorMark Spencer <markster@digium.com>
Sat, 26 Jun 2004 15:48:30 +0000 (15:48 +0000)
committerMark Spencer <markster@digium.com>
Sat, 26 Jun 2004 15:48:30 +0000 (15:48 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3315 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_voicemail.c
channels/chan_alsa.c
channels/chan_iax2.c
configs/iax.conf.sample
doc/README.iax

index 8f622f4..d1183ff 100755 (executable)
@@ -1687,7 +1687,6 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
        char *context;
        char ecodes[16] = "#";
        char tmp[256] = "", *tmpptr;
        char *context;
        char ecodes[16] = "#";
        char tmp[256] = "", *tmpptr;
-       char language[MAX_LANGUAGE];
        struct ast_vm_user *vmu;
        struct ast_vm_user svm;
 
        struct ast_vm_user *vmu;
        struct ast_vm_user svm;
 
index b8ae8b9..b13224b 100755 (executable)
@@ -647,6 +647,7 @@ static struct ast_frame *alsa_read(struct ast_channel *chan)
                left = FRAME_SIZE;
                if (chan->_state != AST_STATE_UP) {
                        /* Don't transmit unless it's up */
                left = FRAME_SIZE;
                if (chan->_state != AST_STATE_UP) {
                        /* Don't transmit unless it's up */
+                       ast_mutex_unlock(&alsalock);
                        return &f;
                }
                f.frametype = AST_FRAME_VOICE;
                        return &f;
                }
                f.frametype = AST_FRAME_VOICE;
index 54ae3ff..5e282a0 100755 (executable)
@@ -216,6 +216,7 @@ struct iax2_peer {
        char secret[80];
        char outkey[80];                /* What key we use to talk to this peer */
        char context[AST_MAX_EXTENSION];        /* Default context (for transfer really) */
        char secret[80];
        char outkey[80];                /* What key we use to talk to this peer */
        char context[AST_MAX_EXTENSION];        /* Default context (for transfer really) */
+       char peercontext[AST_MAX_EXTENSION];    /* Context to pass to peer */
        char mailbox[AST_MAX_EXTENSION];        /* Mailbox */
        struct sockaddr_in addr;
        int formats;
        char mailbox[AST_MAX_EXTENSION];        /* Mailbox */
        struct sockaddr_in addr;
        int formats;
@@ -1960,7 +1961,7 @@ static struct iax2_user *mysql_user(char *user)
 }
 #endif /* MYSQL_FRIENDS */
 
 }
 #endif /* MYSQL_FRIENDS */
 
-static int create_addr(struct sockaddr_in *sin, int *capability, int *sendani, int *maxtime, char *peer, char *context, int *trunk, int *notransfer, char *secret, int seclen, int *ofound)
+static int create_addr(struct sockaddr_in *sin, int *capability, int *sendani, int *maxtime, char *peer, char *context, int *trunk, int *notransfer, char *secret, int seclen, int *ofound, char *peercontext)
 {
        struct ast_hostent ahp; struct hostent *hp;
        struct iax2_peer *p;
 {
        struct ast_hostent ahp; struct hostent *hp;
        struct iax2_peer *p;
@@ -1995,6 +1996,8 @@ static int create_addr(struct sockaddr_in *sin, int *capability, int *sendani, i
                                *maxtime = p->maxms;            /* Max time they should take */
                        if (context)
                                strncpy(context, p->context, AST_MAX_EXTENSION - 1);
                                *maxtime = p->maxms;            /* Max time they should take */
                        if (context)
                                strncpy(context, p->context, AST_MAX_EXTENSION - 1);
+                       if (peercontext)
+                               strncpy(peercontext, p->peercontext, AST_MAX_EXTENSION - 1);
                        if (trunk)
                                *trunk = p->trunk;
                        if (capability)
                        if (trunk)
                                *trunk = p->trunk;
                        if (capability)
@@ -2079,6 +2082,7 @@ static int iax2_call(struct ast_channel *c, char *dest, int timeout)
        struct iax_ie_data ied;
        char myrdest [5] = "s";
        char context[AST_MAX_EXTENSION] ="";
        struct iax_ie_data ied;
        char myrdest [5] = "s";
        char context[AST_MAX_EXTENSION] ="";
+       char peercontext[AST_MAX_EXTENSION] ="";
        char *portno = NULL;
        char *opts = "";
        unsigned short callno = PTR_TO_CALLNO(c->pvt->pvt);
        char *portno = NULL;
        char *opts = "";
        unsigned short callno = PTR_TO_CALLNO(c->pvt->pvt);
@@ -2125,7 +2129,7 @@ static int iax2_call(struct ast_channel *c, char *dest, int timeout)
                strsep(&stringp, ":");
                portno = strsep(&stringp, ":");
        }
                strsep(&stringp, ":");
                portno = strsep(&stringp, ":");
        }
-       if (create_addr(&sin, NULL, NULL, NULL, hname, context, NULL, NULL, storedsecret, sizeof(storedsecret) - 1, NULL)) {
+       if (create_addr(&sin, NULL, NULL, NULL, hname, context, NULL, NULL, storedsecret, sizeof(storedsecret) - 1, NULL, peercontext)) {
                ast_log(LOG_WARNING, "No address associated with '%s'\n", hname);
                return -1;
        }
                ast_log(LOG_WARNING, "No address associated with '%s'\n", hname);
                return -1;
        }
@@ -2168,6 +2172,8 @@ static int iax2_call(struct ast_channel *c, char *dest, int timeout)
                iax_ie_append_str(&ied, IAX_IE_DNID, c->dnid);
        if (rcontext)
                iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, rcontext);
                iax_ie_append_str(&ied, IAX_IE_DNID, c->dnid);
        if (rcontext)
                iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, rcontext);
+       else if (strlen(peercontext))
+               iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, peercontext);
        if (username)
                iax_ie_append_str(&ied, IAX_IE_USERNAME, username);
        if (!secret && !ast_strlen_zero(storedsecret))
        if (username)
                iax_ie_append_str(&ied, IAX_IE_USERNAME, username);
        if (!secret && !ast_strlen_zero(storedsecret))
@@ -5785,7 +5791,7 @@ static struct ast_channel *iax2_request(char *type, int format, void *data)
        }                                                       
 
        /* Populate our address from the given */
        }                                                       
 
        /* Populate our address from the given */
-       if (create_addr(&sin, &capability, &sendani, &maxtime, hostname, NULL, &trunk, &notransfer, NULL, 0, &found)) {
+       if (create_addr(&sin, &capability, &sendani, &maxtime, hostname, NULL, &trunk, &notransfer, NULL, 0, &found, NULL)) {
                return NULL;
        }
        if (portno) {
                return NULL;
        }
        if (portno) {
@@ -6012,6 +6018,9 @@ static struct iax2_peer *build_peer(char *name, struct ast_variable *v)
                        } else if (!strcasecmp(v->name, "context")) {
                                if (ast_strlen_zero(peer->context))
                                        strncpy(peer->context, v->value, sizeof(peer->context) - 1);
                        } else if (!strcasecmp(v->name, "context")) {
                                if (ast_strlen_zero(peer->context))
                                        strncpy(peer->context, v->value, sizeof(peer->context) - 1);
+                       } else if (!strcasecmp(v->name, "peercontext")) {
+                               if (ast_strlen_zero(peer->peercontext))
+                                       strncpy(peer->peercontext, v->value, sizeof(peer->peercontext) - 1);
                        } else if (!strcasecmp(v->name, "port")) {
                                if (peer->dynamic)
                                        peer->defaddr.sin_port = htons(atoi(v->value));
                        } else if (!strcasecmp(v->name, "port")) {
                                if (peer->dynamic)
                                        peer->defaddr.sin_port = htons(atoi(v->value));
@@ -6553,7 +6562,7 @@ static int cache_get_callno_locked(char *data)
                host = st;
        }
        /* Populate our address from the given */
                host = st;
        }
        /* Populate our address from the given */
-       if (create_addr(&sin, NULL, NULL, NULL, host, NULL, NULL, NULL, NULL, 0, NULL)) {
+       if (create_addr(&sin, NULL, NULL, NULL, host, NULL, NULL, NULL, NULL, 0, NULL, NULL)) {
                return -1;
        }
        ast_log(LOG_DEBUG, "host: %s, user: %s, password: %s, context: %s\n", host, username, password, context);
                return -1;
        }
        ast_log(LOG_DEBUG, "host: %s, user: %s, password: %s, context: %s\n", host, username, password, context);
index 8cd590f..dae37d4 100755 (executable)
@@ -208,6 +208,7 @@ host=216.207.245.47
 ;secret=mysecret
 ;mailbox=1234          ; Notify about mailbox 1234
 ;inkeys=key1:key2
 ;secret=mysecret
 ;mailbox=1234          ; Notify about mailbox 1234
 ;inkeys=key1:key2
+;peercontext=local     ; Default context to request for calls to peer
 ;defaultip=216.207.245.34
 ;callerid="Some Host" <(256) 428-6011>
 ;
 ;defaultip=216.207.245.34
 ;callerid="Some Host" <(256) 428-6011>
 ;
index 2e1c4cf..10f6a80 100755 (executable)
@@ -323,4 +323,8 @@ If the host uses dynamic registration, Asterisk may still be given a
 default IP address to use when dynamic registration has not been performed 
 or has timed out.
 
 default IP address to use when dynamic registration has not been performed 
 or has timed out.
 
+> peercontext = <context>
 
 
+Specifies the context name to be passed to the peer for it to use when routing
+the call through its dial plan. This entry will be used only if a context
+is not included in the IAX2 channel name passed to the Dial command.