commit fabad66414b1644a8d786e344732a8303c0f2c64 Author: root Date: Mon Mar 31 20:32:29 2014 +0100 handle ENODEV on sig_pri diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index a3a82be..7b34b68 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -1149,7 +1149,6 @@ static void release_doomed_pris(void) { #ifdef HAVE_PRI /*! - * \internal * \brief Queue a span for destruction * \since 13.0 * @@ -3038,6 +3037,7 @@ struct sig_pri_callback sig_pri_callbacks = .dial_digits = my_pri_dial_digits, .open_media = my_pri_ss7_open_media, .ami_channel_event = my_ami_channel_event, + .destroy_later = pri_queue_for_destruction, }; #endif /* defined(HAVE_PRI) */ @@ -14254,6 +14254,7 @@ static void pri_destroy_span(struct sig_pri_span *pri) for (i = 0; i < SIG_PRI_NUM_DCHANS; i++) { ast_debug(4, "closing pri_fd %d\n", i); dahdi_close_pri_fd(dahdi_pri, i); + dahdi_pri->dchannels[i] = 0; } sig_pri_init_pri(pri); ast_debug(1, "PRI span %d destroyed\n", pri->span); diff --git a/channels/sig_pri.c b/channels/sig_pri.c index def6555..b82d041 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -5961,6 +5961,14 @@ static void *pri_dchannel(void *vpri) } if (e) break; + + if ((errno != 0) && (errno != EINTR)) { + ast_log(LOG_NOTICE, "pri_check_event returned error %d (%s)\n", + errno, strerror(errno)); + } + if (errno == ENODEV) { + sig_pri_callbacks.destroy_later(pri); + } } } else if (errno != EINTR) ast_log(LOG_WARNING, "pri_event returned error %d (%s)\n", errno, strerror(errno)); diff --git a/channels/sig_pri.h b/channels/sig_pri.h index ad6c4c5..c8498fa 100644 --- a/channels/sig_pri.h +++ b/channels/sig_pri.h @@ -231,6 +231,8 @@ struct sig_pri_callback { void (*module_ref)(void); /*! Unreference the parent module. */ void (*module_unref)(void); + /*! Mark the span for destruction. */ + void (*destroy_later)(struct sig_pri_span *pri); }; /*! Global sig_pri callbacks to the upper layer. */