diff options
-rw-r--r-- | channels/chan_dahdi.c | 13 | ||||
-rw-r--r-- | channels/sig_analog.c | 12 | ||||
-rw-r--r-- | channels/sig_analog.h | 1 |
3 files changed, 26 insertions, 0 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index f5217ea53..b78c6aa72 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -2104,6 +2104,15 @@ static int my_check_confirmanswer(void *pvt) return 0; } +static void my_cancel_cidspill(void *pvt) +{ + struct dahdi_pvt *p = pvt; + if (p->cidspill) { + ast_free(p->cidspill); + p->cidspill = NULL; + } +} + static void my_increase_ss_count(void) { ast_mutex_lock(&ss_thread_lock); @@ -2435,6 +2444,8 @@ static int my_is_off_hook(void *pvt) int res; struct dahdi_params par; + memset(&par, 0, sizeof(par)); + if (p->subs[SUB_REAL].dfd > -1) res = ioctl(p->subs[SUB_REAL].dfd, DAHDI_GET_PARAMS, &par); else { @@ -2833,6 +2844,7 @@ static struct analog_callback dahdi_analog_callbacks = .check_waitingfordt = my_check_waitingfordt, .set_confirmanswer = my_set_confirmanswer, .check_confirmanswer = my_check_confirmanswer, + .cancel_cidspill = my_cancel_cidspill, }; static struct dahdi_pvt *round_robin[32]; @@ -4359,6 +4371,7 @@ static int send_callerid(struct dahdi_pvt *p) } while (p->cidpos < p->cidlen) { res = write(p->subs[SUB_REAL].dfd, p->cidspill + p->cidpos, p->cidlen - p->cidpos); + ast_debug(4, "writing callerid at pos %d of %d, res = %d\n", p->cidpos, p->cidlen, res); if (res < 0) { if (errno == EAGAIN) return 0; diff --git a/channels/sig_analog.c b/channels/sig_analog.c index 398b5f170..e822fc339 100644 --- a/channels/sig_analog.c +++ b/channels/sig_analog.c @@ -771,6 +771,15 @@ static int analog_check_confirmanswer(struct analog_pvt *p) return 0; } +static void analog_cancel_cidspill(struct analog_pvt *p) +{ + if (!p->calls->cancel_cidspill) { + return; + } + + p->calls->cancel_cidspill(p->chan_pvt); +} + static int analog_set_linear_mode(struct analog_pvt *p, int index, int linear_mode) { if (p->calls->set_linear_mode) { @@ -2541,6 +2550,7 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_ /* Make sure it stops ringing */ analog_off_hook(p); ast_debug(1, "channel %d answered\n", p->channel); + analog_cancel_cidspill(p); analog_set_dialing(p, 0); p->callwaitcas = 0; if (analog_check_confirmanswer(p)) { @@ -2662,6 +2672,7 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_ } if (ast->rings > p->cidrings) { + analog_cancel_cidspill(p); p->callwaitcas = 0; } p->subs[index].f.frametype = AST_FRAME_CONTROL; @@ -3187,6 +3198,7 @@ int analog_handle_init_event(struct analog_pvt *i, int event) if (res && (errno == EBUSY)) { break; } + analog_cancel_cidspill(i); if (i->immediate) { analog_set_echocanceller(i, 1); /* The channel is immediately up. Start right away */ diff --git a/channels/sig_analog.h b/channels/sig_analog.h index ce41ccc70..1b9a14de1 100644 --- a/channels/sig_analog.h +++ b/channels/sig_analog.h @@ -201,6 +201,7 @@ struct analog_callback { int (* const check_waitingfordt)(void *pvt); void (* const set_confirmanswer)(void *pvt, int flag); int (* const check_confirmanswer)(void *pvt); + void (* const cancel_cidspill)(void *pvt); }; |