Merged revisions 198311 via svnmerge from
[asterisk/asterisk.git] / res / res_smdi.c
index 88f562b..d1d40f0 100644 (file)
@@ -43,6 +43,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/module.h"
 #include "asterisk/lock.h"
 #include "asterisk/utils.h"
+#define AST_API_MODULE
 #include "asterisk/smdi.h"
 #include "asterisk/config.h"
 #include "asterisk/astobj.h"
@@ -305,8 +306,10 @@ static inline void unref_msg(void *msg, enum smdi_message_type type)
        switch (type) {
        case SMDI_MWI:
                ASTOBJ_UNREF(mwi_msg, ast_smdi_mwi_message_destroy);
+               break;
        case SMDI_MD:
                ASTOBJ_UNREF(md_msg, ast_smdi_md_message_destroy);
+               break;
        }
 }
 
@@ -378,7 +381,18 @@ static void *smdi_msg_find(struct ast_smdi_interface *iface,
 
        switch (type) {
        case SMDI_MD:
-               if (ast_test_flag(&options, OPT_SEARCH_TERMINAL)) {
+               if (ast_strlen_zero(search_key)) {
+                       struct ast_smdi_md_message *md_msg = NULL;
+
+                       /* No search key provided (the code from chan_dahdi does this).
+                        * Just pop the top message off of the queue. */
+
+                       ASTOBJ_CONTAINER_TRAVERSE(&iface->md_q, !md_msg, do {
+                               md_msg = ASTOBJ_REF(iterator);
+                       } while (0); );
+
+                       msg = md_msg;
+               } else if (ast_test_flag(&options, OPT_SEARCH_TERMINAL)) {
                        struct ast_smdi_md_message *md_msg = NULL;
 
                        /* Searching by the message desk terminal */
@@ -406,7 +420,20 @@ static void *smdi_msg_find(struct ast_smdi_interface *iface,
                }
                break;
        case SMDI_MWI:
-               msg = ASTOBJ_CONTAINER_FIND(&iface->mwi_q, search_key);
+               if (ast_strlen_zero(search_key)) {
+                       struct ast_smdi_mwi_message *mwi_msg = NULL;
+
+                       /* No search key provided (the code from chan_dahdi does this).
+                        * Just pop the top message off of the queue. */
+
+                       ASTOBJ_CONTAINER_TRAVERSE(&iface->mwi_q, !mwi_msg, do {
+                               mwi_msg = ASTOBJ_REF(iterator);
+                       } while (0); );
+
+                       msg = mwi_msg;
+               } else {
+                       msg = ASTOBJ_CONTAINER_FIND(&iface->mwi_q, search_key);
+               }
                break;
        }
 
@@ -1260,7 +1287,7 @@ static int smdi_msg_read(struct ast_channel *chan, const char *cmd, char *data,
 return_error:
        ast_module_user_remove(u);
 
-       return 0;
+       return res;
 }
 
 static struct ast_custom_function smdi_msg_retrieve_function = {
@@ -1308,6 +1335,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;
@@ -1325,8 +1354,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;
        }