diff options
-rw-r--r-- | apps/app_queue.c | 21 | ||||
-rw-r--r-- | apps/app_voicemail.c | 4 | ||||
-rw-r--r-- | include/asterisk/monitor.h | 12 | ||||
-rw-r--r-- | include/asterisk/smdi.h | 26 | ||||
-rw-r--r-- | res/res_smdi.c | 4 |
5 files changed, 37 insertions, 30 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c index d86fa6bc2..95e7ebc15 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -3699,16 +3699,18 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce else which = peer; ast_channel_unlock(qe->chan); - if (monitorfilename) - ast_monitor_start(which, qe->parent->monfmt, monitorfilename, 1, X_REC_IN | X_REC_OUT); - else if (qe->chan->cdr) - ast_monitor_start(which, qe->parent->monfmt, qe->chan->cdr->uniqueid, 1, X_REC_IN | X_REC_OUT); - else { - /* Last ditch effort -- no CDR, make up something */ - snprintf(tmpid, sizeof(tmpid), "chan-%lx", ast_random()); - ast_monitor_start(which, qe->parent->monfmt, tmpid, 1, X_REC_IN | X_REC_OUT); + if (ast_monitor_start) { + if (monitorfilename) { + ast_monitor_start(which, qe->parent->monfmt, monitorfilename, 1, X_REC_IN | X_REC_OUT); + } else if (qe->chan->cdr && ast_monitor_start) { + ast_monitor_start(which, qe->parent->monfmt, qe->chan->cdr->uniqueid, 1, X_REC_IN | X_REC_OUT); + } else if (ast_monitor_start) { + /* Last ditch effort -- no CDR, make up something */ + snprintf(tmpid, sizeof(tmpid), "chan-%lx", ast_random()); + ast_monitor_start(which, qe->parent->monfmt, tmpid, 1, X_REC_IN | X_REC_OUT); + } } - if (!ast_strlen_zero(monexec)) { + if (!ast_strlen_zero(monexec) && ast_monitor_setjoinfiles) { ast_monitor_setjoinfiles(which, 1); } } else { @@ -6589,6 +6591,7 @@ static int unload_module(void) struct ao2_iterator q_iter; struct call_queue *q = NULL; + if (device_state.thread != AST_PTHREADT_NULL) { device_state.stop = 1; ast_mutex_lock(&device_state.lock); diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 153fb9537..6bd8a4d18 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -9327,10 +9327,10 @@ static int load_config(int reload) if ((val = ast_variable_retrieve(cfg, "general", "smdienable")) && ast_true(val)) { ast_debug(1, "Enabled SMDI voicemail notification\n"); if ((val = ast_variable_retrieve(cfg, "general", "smdiport"))) { - smdi_iface = ast_smdi_interface_find(val); + smdi_iface = ast_smdi_interface_find ? ast_smdi_interface_find(val) : NULL; } else { ast_debug(1, "No SMDI interface set, trying default (/dev/ttyS0)\n"); - smdi_iface = ast_smdi_interface_find("/dev/ttyS0"); + smdi_iface = ast_smdi_interface_find ? ast_smdi_interface_find("/dev/ttyS0") : NULL; } if (!smdi_iface) { ast_log(LOG_ERROR, "No valid SMDI interface specfied, disabling SMDI voicemail notification\n"); diff --git a/include/asterisk/monitor.h b/include/asterisk/monitor.h index 7f32b6994..84d369617 100644 --- a/include/asterisk/monitor.h +++ b/include/asterisk/monitor.h @@ -51,21 +51,21 @@ struct ast_channel_monitor { /* Start monitoring a channel */ int ast_monitor_start(struct ast_channel *chan, const char *format_spec, - const char *fname_base, int need_lock, int stream_action); + const char *fname_base, int need_lock, int stream_action) attribute_weak; /* Stop monitoring a channel */ -int ast_monitor_stop(struct ast_channel *chan, int need_lock); +int ast_monitor_stop(struct ast_channel *chan, int need_lock) attribute_weak; /* Change monitoring filename of a channel */ int ast_monitor_change_fname(struct ast_channel *chan, - const char *fname_base, int need_lock); + const char *fname_base, int need_lock) attribute_weak; -void ast_monitor_setjoinfiles(struct ast_channel *chan, int turnon); +void ast_monitor_setjoinfiles(struct ast_channel *chan, int turnon) attribute_weak; /* Pause monitoring of a channel */ -int ast_monitor_pause(struct ast_channel *chan); +int ast_monitor_pause(struct ast_channel *chan) attribute_weak; /* Unpause monitoring of a channel */ -int ast_monitor_unpause(struct ast_channel *chan); +int ast_monitor_unpause(struct ast_channel *chan) attribute_weak; #endif /* _ASTERISK_MONITOR_H */ diff --git a/include/asterisk/smdi.h b/include/asterisk/smdi.h index 8f098abdd..1351226af 100644 --- a/include/asterisk/smdi.h +++ b/include/asterisk/smdi.h @@ -84,7 +84,7 @@ struct ast_smdi_md_message { */ struct ast_smdi_interface; -void ast_smdi_interface_unref(struct ast_smdi_interface *iface); +void ast_smdi_interface_unref(struct ast_smdi_interface *iface) attribute_weak; /*! * \brief Get the next SMDI message from the queue. @@ -96,7 +96,7 @@ void ast_smdi_interface_unref(struct ast_smdi_interface *iface); * * \return the next SMDI message, or NULL if there were no pending messages. */ -struct ast_smdi_md_message *ast_smdi_md_message_pop(struct ast_smdi_interface *iface); +struct ast_smdi_md_message *ast_smdi_md_message_pop(struct ast_smdi_interface *iface) attribute_weak; /*! * \brief Get the next SMDI message from the queue. @@ -110,7 +110,7 @@ struct ast_smdi_md_message *ast_smdi_md_message_pop(struct ast_smdi_interface *i * \return the next SMDI message, or NULL if there were no pending messages and * the timeout has expired. */ -struct ast_smdi_md_message *ast_smdi_md_message_wait(struct ast_smdi_interface *iface, int timeout); +struct ast_smdi_md_message *ast_smdi_md_message_wait(struct ast_smdi_interface *iface, int timeout) attribute_weak; /*! * \brief Put an SMDI message back in the front of the queue. @@ -121,7 +121,7 @@ struct ast_smdi_md_message *ast_smdi_md_message_wait(struct ast_smdi_interface * * should be used if a message was popped but is not going to be processed for * some reason, and the message needs to be returned to the queue. */ -void ast_smdi_md_message_putback(struct ast_smdi_interface *iface, struct ast_smdi_md_message *msg); +void ast_smdi_md_message_putback(struct ast_smdi_interface *iface, struct ast_smdi_md_message *msg) attribute_weak; /*! * \brief Get the next SMDI message from the queue. @@ -133,7 +133,7 @@ void ast_smdi_md_message_putback(struct ast_smdi_interface *iface, struct ast_sm * * \return the next SMDI message, or NULL if there were no pending messages. */ -struct ast_smdi_mwi_message *ast_smdi_mwi_message_pop(struct ast_smdi_interface *iface); +struct ast_smdi_mwi_message *ast_smdi_mwi_message_pop(struct ast_smdi_interface *iface) attribute_weak; /*! * \brief Get the next SMDI message from the queue. @@ -147,9 +147,9 @@ struct ast_smdi_mwi_message *ast_smdi_mwi_message_pop(struct ast_smdi_interface * \return the next SMDI message, or NULL if there were no pending messages and * the timeout has expired. */ -struct ast_smdi_mwi_message *ast_smdi_mwi_message_wait(struct ast_smdi_interface *iface, int timeout); +struct ast_smdi_mwi_message *ast_smdi_mwi_message_wait(struct ast_smdi_interface *iface, int timeout) attribute_weak; struct ast_smdi_mwi_message *ast_smdi_mwi_message_wait_station(struct ast_smdi_interface *iface, - int timeout, const char *station); + int timeout, const char *station) attribute_weak; /*! * \brief Put an SMDI message back in the front of the queue. @@ -160,7 +160,7 @@ struct ast_smdi_mwi_message *ast_smdi_mwi_message_wait_station(struct ast_smdi_i * should be used if a message was popped but is not going to be processed for * some reason, and the message needs to be returned to the queue. */ -void ast_smdi_mwi_message_putback(struct ast_smdi_interface *iface, struct ast_smdi_mwi_message *msg); +void ast_smdi_mwi_message_putback(struct ast_smdi_interface *iface, struct ast_smdi_mwi_message *msg) attribute_weak; /*! * \brief Find an SMDI interface with the specified name. @@ -170,26 +170,26 @@ void ast_smdi_mwi_message_putback(struct ast_smdi_interface *iface, struct ast_s * actually returns an ASTOBJ reference and should be released using * #ASTOBJ_UNREF(iface, ast_smdi_interface_destroy). */ -struct ast_smdi_interface *ast_smdi_interface_find(const char *iface_name); +struct ast_smdi_interface *ast_smdi_interface_find(const char *iface_name) attribute_weak; /*! * \brief Set the MWI indicator for a mailbox. * \param iface the interface to use. * \param mailbox the mailbox to use. */ -int ast_smdi_mwi_set(struct ast_smdi_interface *iface, const char *mailbox); +int ast_smdi_mwi_set(struct ast_smdi_interface *iface, const char *mailbox) attribute_weak; /*! * \brief Unset the MWI indicator for a mailbox. * \param iface the interface to use. * \param mailbox the mailbox to use. */ -int ast_smdi_mwi_unset(struct ast_smdi_interface *iface, const char *mailbox); +int ast_smdi_mwi_unset(struct ast_smdi_interface *iface, const char *mailbox) attribute_weak; /*! \brief ast_smdi_md_message destructor. */ -void ast_smdi_md_message_destroy(struct ast_smdi_md_message *msg); +void ast_smdi_md_message_destroy(struct ast_smdi_md_message *msg) attribute_weak; /*! \brief ast_smdi_mwi_message destructor. */ -void ast_smdi_mwi_message_destroy(struct ast_smdi_mwi_message *msg); +void ast_smdi_mwi_message_destroy(struct ast_smdi_mwi_message *msg) attribute_weak; #endif /* !ASTERISK_SMDI_H */ diff --git a/res/res_smdi.c b/res/res_smdi.c index 69a34ff59..80c2c9d68 100644 --- a/res/res_smdi.c +++ b/res/res_smdi.c @@ -1250,6 +1250,8 @@ static struct ast_custom_function smdi_msg_function = { .read = smdi_msg_read, }; +static int unload_module(void); + static int load_module(void) { int res; @@ -1267,8 +1269,10 @@ static int load_module(void) /* load the config and start the listener threads*/ res = smdi_load(0); if (res < 0) { + unload_module(); return res; } else if (res == 1) { + unload_module(); ast_log(LOG_NOTICE, "No SMDI interfaces are available to listen on, not starting SMDI listener.\n"); return AST_MODULE_LOAD_DECLINE; } |