aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_dahdi.c13
-rw-r--r--channels/sig_analog.c12
-rw-r--r--channels/sig_analog.h1
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);
};