Index: apps/app_voicemail.c =================================================================== --- apps/app_voicemail.c (revision 192938) +++ apps/app_voicemail.c (working copy) @@ -9298,10 +9298,10 @@ 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"); Index: apps/app_queue.c =================================================================== --- apps/app_queue.c (revision 192938) +++ apps/app_queue.c (working copy) @@ -3668,16 +3668,18 @@ 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 { @@ -6553,6 +6555,7 @@ 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); Index: include/asterisk/smdi.h =================================================================== --- include/asterisk/smdi.h (revision 192938) +++ include/asterisk/smdi.h (working copy) @@ -84,7 +84,7 @@ */ 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 @@ * * \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 @@ * \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 @@ * 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 @@ * * \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 @@ * \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 @@ * 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 @@ * 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 */ Index: include/asterisk/monitor.h =================================================================== --- include/asterisk/monitor.h (revision 192938) +++ include/asterisk/monitor.h (working copy) @@ -51,21 +51,21 @@ /* 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 */ Index: res/res_smdi.c =================================================================== --- res/res_smdi.c (revision 192938) +++ res/res_smdi.c (working copy) @@ -1250,6 +1250,8 @@ .read = smdi_msg_read, }; +static int unload_module(void); + static int load_module(void) { int res; @@ -1267,8 +1269,10 @@ /* 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; }