]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
automerge commit
authorAutomerge Script <automerge@asterisk.org>
Wed, 20 Dec 2006 20:11:07 +0000 (20:11 +0000)
committerAutomerge Script <automerge@asterisk.org>
Wed, 20 Dec 2006 20:11:07 +0000 (20:11 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2-netsec@48657 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_dial.c
channels/chan_misdn.c
channels/chan_sip.c
channels/misdn/isdn_lib.c

index 662a2142aa92195ba57b0a80162f69c3deb34b1a..c7fe8762dc1c4058e5d7c865eed4265cf87aeba1 100644 (file)
@@ -1058,6 +1058,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
                        cur = rest;
                        if (!cur)
                                chan->hangupcause = cause;
+                       free(tmp);
                        continue;
                }
                pbx_builtin_setvar_helper(tmp->chan, "DIALEDPEERNUMBER", numsubst);
@@ -1096,6 +1097,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
                        if (!tmp->chan) {
                                HANDLE_CAUSE(cause, chan);
                                cur = rest;
+                               free(tmp);
                                continue;
                        }
                }
@@ -1163,6 +1165,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
                        ast_hangup(tmp->chan);
                        tmp->chan = NULL;
                        cur = rest;
+                       free(tmp);
                        continue;
                } else {
                        senddialevent(chan, tmp->chan);
index 9049ba753b6b20b8c9f348e93ce54add464f8c6a..65c15a16672a2cfc5a9f2df08cf6937a156ec379 100644 (file)
@@ -124,7 +124,6 @@ enum misdn_chan_state {
        /* misdn_hangup */
        MISDN_HOLDED, /*!< if this chan is holded */
        MISDN_HOLD_DISCONNECT, /*!< if this chan is holded */
-       MISDN_FIXUP/*!< if this chan is holded */
   
 };
 
@@ -684,7 +683,6 @@ static struct state_struct state_array[] = {
        {MISDN_HUNGUP_FROM_MISDN,"HUNGUP_FROM_MISDN"}, /* when DISCONNECT/RELEASE/REL_COMP  cam from misdn */
        {MISDN_HOLDED,"HOLDED"}, /* when DISCONNECT/RELEASE/REL_COMP  cam from misdn */
        {MISDN_HOLD_DISCONNECT,"HOLD_DISCONNECT"}, /* when DISCONNECT/RELEASE/REL_COMP  cam from misdn */
-       {MISDN_FIXUP,"FIXUP"}, /**/
        {MISDN_HUNGUP_FROM_AST,"HUNGUP_FROM_AST"} /* when DISCONNECT/RELEASE/REL_COMP came out of */
        /* misdn_hangup */
 };
@@ -1831,7 +1829,6 @@ static int misdn_fixup(struct ast_channel *oldast, struct ast_channel *ast)
        chan_misdn_log(1, p->bc?p->bc->port:0, "* IND: Got Fixup State:%s L3id:%x\n", misdn_get_ch_state(p), p->l3id);
        
        p->ast = ast ;
-       p->state=MISDN_FIXUP;
   
        return 0;
 }
@@ -1998,7 +1995,6 @@ static int misdn_hangup(struct ast_channel *ast)
        if (ast->_state == AST_STATE_RESERVED || 
                p->state == MISDN_NOTHING || 
                p->state == MISDN_HOLDED || 
-               p->state == MISDN_FIXUP || 
                p->state == MISDN_HOLD_DISCONNECT ) {
 
                CLEAN_CH:
@@ -2397,6 +2393,10 @@ static int dialtone_indicate(struct chan_list *cl)
        const struct tone_zone_sound *ts= NULL;
        struct ast_channel *ast=cl->ast;
 
+       if (!ast) {
+               chan_misdn_log(0,cl->bc->port,"No Ast in dialtone_indicate\n");
+               return -1;
+       }
 
        int nd=0;
        misdn_cfg_get( cl->bc->port, MISDN_CFG_NODIALTONE, &nd, sizeof(nd));
@@ -2430,6 +2430,12 @@ static int hanguptone_indicate(struct chan_list *cl)
 static int stop_indicate(struct chan_list *cl)
 {
        struct ast_channel *ast=cl->ast;
+
+       if (!ast) {
+               chan_misdn_log(0,cl->bc->port,"No Ast in stop_indicate\n");
+               return -1;
+       }
+
        chan_misdn_log(3,cl->bc->port," --> None\n");
        misdn_lib_tone_generator_stop(cl->bc);
        ast_playtones_stop(ast);
index 67005f690d0aced3c7a0230f092e7eb46cdfa694..5054a8b3f95349f43e1f55796f502bc9d5d173ec 100644 (file)
@@ -2357,6 +2357,7 @@ static int hangup_sip2cause(int cause)
                case 502:       
                        return AST_CAUSE_DESTINATION_OUT_OF_ORDER;
                case 503:       /* Service unavailable */
+               case 504:       /* Server timeout */
                        return AST_CAUSE_CONGESTION;
                default:
                        return AST_CAUSE_NORMAL;
@@ -10303,6 +10304,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                                case 400: /* Bad Request */
                                case 500: /* Server error */
                                case 503: /* Service Unavailable */
+                               case 504: /* Server Timeout */
                                        if (owner)
                                                ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
                                        break;
@@ -10396,6 +10398,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                                case 603: /* Decline */
                                case 500: /* Server error */
                                case 503: /* Service Unavailable */
+                               case 504: /* Server timeout */
 
                                        if (sipmethod == SIP_INVITE && !ignore) {       /* re-invite failed */
                                                sip_cancel_destroy(p);
index 72b7d8243944cb9fe8aa5a454cdcd47177a66647..54a47753cb1338a40604f9db0a0c78becf97ff87 100644 (file)
@@ -433,7 +433,6 @@ static int find_free_chan_in_stack(struct misdn_stack *stack, int channel)
                if (i != 15 && (channel < 0 || i == channel)) { /* skip E1 Dchannel ;) and work with chan preselection */
                        if (!stack->channels[i]) {
                                cb_log (3, stack->port, " --> found chan%s: %d\n", channel>=0?" (preselected)":"", i+1);
-                               stack->channels[i] = 1;
                                return i+1;
                        }
                }
@@ -666,10 +665,17 @@ int set_chan_in_stack(struct misdn_stack *stack, int channel)
 {
 
        cb_log(4,stack->port,"set_chan_in_stack: %d\n",channel);
+       dump_chan_list(stack);
        if (channel >=1 ) {
-               stack->channels[channel-1] = 1;
+               if (!stack->channels[channel-1])
+                       stack->channels[channel-1] = 1;
+               else {
+                       cb_log(0,stack->port,"channel already in use:%d\n", channel );
+                       return -1;
+               }
        } else {
                cb_log(0,stack->port,"couldn't set channel %d in\n", channel );
+               return -1;
        }
   
        return 0;
@@ -814,6 +820,8 @@ static int create_process (int midev, struct misdn_bchannel *bc) {
                free_chan = find_free_chan_in_stack(stack, bc->channel_preselected?bc->channel:0);
                if (!free_chan) return -1;
                bc->channel=free_chan;
+
+               if (set_chan_in_stack(stack ,bc->channel)<0) return -1;
                
                cb_log(4,stack->port, " -->  found channel: %d\n",free_chan);
     
@@ -845,6 +853,7 @@ static int create_process (int midev, struct misdn_bchannel *bc) {
                        if (!free_chan) return -1;
                        bc->channel=free_chan;
                        cb_log(2,stack->port, " -->  found channel: %d\n",free_chan);
+                       if (set_chan_in_stack(stack ,bc->channel)<0) return -1;
                } else {
                        /* other phones could have made a call also on this port (ptmp) */
                        bc->channel=0xff;
@@ -1468,27 +1477,27 @@ int handle_event ( struct misdn_bchannel *bc, enum event_e event, iframe_t *frm)
                setup_bc(bc);
 
                case EVENT_SETUP:
-                       
                {
                        if (bc->channel == 0xff) {
                                bc->channel=find_free_chan_in_stack(stack, 0);
                                if (!bc->channel) {
                                        cb_log(0, stack->port, "Any Channel Requested, but we have no more!!\n");
-                                       break;
+                                       bc->out_cause=34;
+                                       misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
+                                       return -1;
                                }
-                       }  
+                       } 
 
                        if (bc->channel >0 && bc->channel<255) {
-                               set_chan_in_stack(stack ,bc->channel);
-                       }
-
-#if 0
-                       int ret=setup_bc(bc);
-                       if (ret == -EINVAL){
-                               cb_log(0,bc->port,"handle_event: setup_bc failed\n");
-                               misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
+                               int ret=set_chan_in_stack(stack ,bc->channel);
+                               if (event == EVENT_SETUP && ret<0){
+                                       /* empty bchannel */
+                                       bc->channel=0;
+                                       bc->out_cause=44;
+                                       misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
+                                       return -1;
+                               }
                        }
-#endif
                }
                break;
 
@@ -1790,12 +1799,6 @@ handle_event_nt(void *dat, void *arg)
                        cb_log(7, stack->port, " --> new_process: New L3Id: %x\n",hh->dinfo);
                        bc->l3_id=hh->dinfo;
 
-                       if (bc->channel<=0) {
-                               bc->channel=find_free_chan_in_stack(stack,0);
-
-                               if (bc->channel<=0)
-                                       goto ERR_NO_CHANNEL;
-                       }
                }
                break;
 
@@ -2023,32 +2026,22 @@ handle_event_nt(void *dat, void *arg)
 
                        switch (event) {
                                case EVENT_SETUP:
-                                       if (bc->channel>0 && bc->channel<255) {
-
-                                               if (stack->ptp) 
-                                                       set_chan_in_stack(stack, bc->channel);
-                                               else 
-                                                       cb_log(3,stack->port," --> PTMP but channel requested\n");
-
-                                       } else {
-
-                                               bc->channel = find_free_chan_in_stack(stack, 0);
-                                               if (!bc->channel) {
-                                                       cb_log(0, stack->port, " No free channel at the moment\n");
-                                       
-                                                       msg_t *dmsg;
-                               
-                                                       cb_log(0, stack->port, "Releaseing call %x (No free Chan for you..)\n", hh->dinfo);
-                                                               dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST,MT_RELEASE_COMPLETE, hh->dinfo,sizeof(RELEASE_COMPLETE_t), 1);
-                                                       stack->nst.manager_l3(&stack->nst, dmsg);
-                                                       free_msg(msg);
-                                                       return 0;
-                                               }
-                                               
+                                       if (bc->channel<=0 || bc->channel==0xff) {
+                                               bc->channel=find_free_chan_in_stack(stack,0);
+               
+                                               if (bc->channel<=0)
+                                                       goto ERR_NO_CHANNEL;
+                                       } else if (!stack->ptp) 
+                                               cb_log(3,stack->port," --> PTMP but channel requested\n"); 
+
+                                       int ret=set_chan_in_stack(stack, bc->channel);
+                                       if (event==EVENT_SETUP && ret<0){
+                                               /* empty bchannel */
+                                               bc->channel=0;
+                                               bc->out_cause=44;
+
+                                               goto ERR_NO_CHANNEL;
                                        }
-#if 0
-                                       setup_bc(bc);
-#endif
 
                                        break;
                                case EVENT_RELEASE:
@@ -2592,7 +2585,12 @@ int handle_frm(msg_t *msg)
                        isdn_msg_parse_event(msgs_g,msg,bc, 0);
                        
                        /** Preprocess some Events **/
-                       handle_event(bc, event, frm);
+                       int ret=handle_event(bc, event, frm);
+                       if (ret<0) {
+                               cb_log(0,stack->port,"couldn't handle event\n");
+                               free_msg(msg);
+                               return 1;
+                       }
                        /*  shoot up event to App: */
                        cb_log(5, stack->port, "lib Got Prim: Addr %x prim %x dinfo %x\n",frm->addr, frm->prim, frm->dinfo);
       
@@ -3206,7 +3204,13 @@ int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
                                bc->channel = find_free_chan_in_stack(stack, 0);
                                if (!bc->channel) {
                                        cb_log(0, stack->port, " No free channel at the moment\n");
-                                       
+                                       /*FIXME: add disconnect*/
+                                       err=-ENOCHAN;
+                                       goto ERR;
+                               }
+                               
+                               if (set_chan_in_stack(stack ,bc->channel)<0) {
+                                       /*FIXME: add disconnect*/
                                        err=-ENOCHAN;
                                        goto ERR;
                                }