aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_misdn.c
diff options
context:
space:
mode:
authorcrichter <crichter@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-07 09:22:44 +0000
committercrichter <crichter@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-07 09:22:44 +0000
commit3fab98fbb13e43c32666a28bcfa9f693c16b56e0 (patch)
tree895ea4c1648ca27929e465c98ca39bf3b45bf70e /channels/chan_misdn.c
parent3f5a760c2096890abce0d6c1ebde7a4259157fda (diff)
Merged revisions 52843 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r52843 | crichter | 2007-01-30 15:38:08 +0100 (Di, 30 Jan 2007) | 1 line fixed some possible segfaults. also fixed an very important bug which occurs on high load (when calls are very fast generated) ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@53324 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_misdn.c')
-rw-r--r--channels/chan_misdn.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index 80520d723..bf2149cc0 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -4156,6 +4156,8 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
strncat(bc->dad,bc->infos_pending, l - strlen(bc->dad));
bc->dad[l-1] = 0;
}
+
+ if (!ch->ast) break;
{
int l = sizeof(ch->ast->exten);
strncpy(ch->ast->exten, bc->dad, l);
@@ -4184,11 +4186,12 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
ch->state = MISDN_PROCEEDING;
+ if (!ch->ast) break;
+
ast_queue_control(ch->ast, AST_CONTROL_PROCEEDING);
}
break;
case EVENT_PROGRESS:
-
if (bc->channel)
update_name(ch->ast,bc->port,bc->channel);
@@ -4199,9 +4202,10 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
start_bc_tones(ch);
}
- ast_queue_control(ch->ast, AST_CONTROL_PROGRESS);
-
ch->state=MISDN_PROGRESS;
+
+ if (!ch->ast) break;
+ ast_queue_control(ch->ast, AST_CONTROL_PROGRESS);
}
break;
@@ -4213,6 +4217,8 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
ch->state = MISDN_ALERTING;
+ if (!ch->ast) break;
+
ast_queue_control(ch->ast, AST_CONTROL_RINGING);
ast_setstate(ch->ast, AST_STATE_RINGING);
@@ -4235,7 +4241,9 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
{
/*we answer when we've got our very new L3 ID from the NT stack */
misdn_lib_send_event(bc,EVENT_CONNECT_ACKNOWLEDGE);
-
+
+ if (!ch->ast) break;
+
struct ast_channel *bridged=AST_BRIDGED_P(ch->ast);
stop_indicate(ch);
@@ -4258,8 +4266,10 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
start_bc_tones(ch);
-
ch->state = MISDN_CONNECTED;
+
+ if (!ch->ast) break;
+
ast_queue_control(ch->ast, AST_CONTROL_ANSWER);
}
break;
@@ -4267,7 +4277,7 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
/*we might not have an ch->ast ptr here anymore*/
if (ch) {
struct chan_list *holded_ch=find_holded(cl_te, bc);
-
+
chan_misdn_log(3,bc->port," --> org:%d nt:%d, inbandavail:%d state:%d\n", ch->orginator, bc->nt, misdn_inband_avail(bc), ch->state);
if ( ch->orginator==ORG_AST && !bc->nt && misdn_inband_avail(bc) && ch->state != MISDN_CONNECTED) {
/* If there's inband information available (e.g. a
@@ -4280,8 +4290,10 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
ch->state=MISDN_DISCONNECTED;
start_bc_tones(ch);
- if (ch->ast) ch->ast->hangupcause=bc->cause;
- ast_queue_control(ch->ast, AST_CONTROL_BUSY);
+ if (ch->ast) {
+ ch->ast->hangupcause=bc->cause;
+ ast_queue_control(ch->ast, AST_CONTROL_BUSY);
+ }
ch->need_busy=0;
break;
}
@@ -4398,7 +4410,8 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
frame.src = NULL;
frame.data = bc->bframe ;
- ast_queue_frame(ch->ast,&frame);
+ if (ch->ast)
+ ast_queue_frame(ch->ast,&frame);
} else {
fd_set wrfs;
struct timeval tv;