Merged revisions 67993 via svnmerge from
authorOlle Johansson <oej@edvina.net>
Thu, 7 Jun 2007 09:21:29 +0000 (09:21 +0000)
committerOlle Johansson <oej@edvina.net>
Thu, 7 Jun 2007 09:21:29 +0000 (09:21 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r67993 | oej | 2007-06-07 11:00:44 +0200 (Thu, 07 Jun 2007) | 6 lines

Issue #9738 - Make sure we can unload res_jabber. Patch by phsultan - thanks!

Due to a bug in the iksemel library, this will not work if you are using GTLS
in the connection. That's being investigated. If you figure out a way to handle
that without us having to patch iksemel, let us know in the bug report. Thanks.

........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@68026 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/jabber.h
res/res_jabber.c

index ee247d3..43bb0f5 100644 (file)
@@ -50,7 +50,8 @@
 #include "asterisk/linkedlists.h"
 
 enum aji_state {
-       AJI_DISCONNECTED = 0,
+       AJI_DISCONNECTING,
+       AJI_DISCONNECTED,
        AJI_CONNECTING,
        AJI_CONNECTED
 };
index d8d6200..47d2430 100644 (file)
@@ -469,7 +469,9 @@ static void aji_log_hook(void *data, const char *xmpp, size_t size, int is_incom
 
 /*!
  * \brief The action hook parses the inbound packets, constantly running.
- * \param aji client structure, type of packet, the actual packet.
+ * \param data aji client structure 
+ * \param type type of packet 
+ * \param node the actual packet.
  * \return IKS_OK or IKS_HOOK .
  */
 static int aji_act_hook(void *data, int type, iks *node)
@@ -484,6 +486,11 @@ static int aji_act_hook(void *data, int type, iks *node)
                return IKS_HOOK;
        }
 
+       if (client->state == AJI_DISCONNECTING) {
+               ASTOBJ_UNREF(client, aji_client_destroy);
+               return IKS_HOOK;
+       }
+
        pak = iks_packet(node);
 
        if (!client->component) { /*client */
@@ -1511,6 +1518,12 @@ static void *aji_recv_loop(void *data)
                }
 
                res = iks_recv(client->p, 1);
+
+               if (client->state == AJI_DISCONNECTING) {
+                       if (option_debug > 1)
+                               ast_log(LOG_DEBUG, "Ending our Jabber client's thread due to a disconnect\n");
+                       pthread_exit(NULL);
+               }
                client->timeout--;
                if (res == IKS_HOOK) 
                        ast_log(LOG_WARNING, "JABBER: Got hook event.\n");
@@ -2380,9 +2393,9 @@ static int unload_module(void)
        ast_manager_unregister("JabberSend");
        ASTOBJ_CONTAINER_TRAVERSE(&clients, 1, {
                ASTOBJ_RDLOCK(iterator);
-               if (option_verbose > 2)
-                       ast_verbose(VERBOSE_PREFIX_3 "JABBER: %s\n", iterator->name);
-               iterator->state = AJI_DISCONNECTED;
+               if (option_debug > 2)
+                       ast_log(LOG_DEBUG, "JABBER: Releasing and disconneing client: %s\n", iterator->name);
+               iterator->state = AJI_DISCONNECTING;
                ast_aji_disconnect(iterator);
                pthread_join(iterator->thread, NULL);
                ASTOBJ_UNLOCK(iterator);
@@ -2390,8 +2403,6 @@ static int unload_module(void)
 
        ASTOBJ_CONTAINER_DESTROYALL(&clients, aji_client_destroy);
        ASTOBJ_CONTAINER_DESTROY(&clients);
-
-       ast_log(LOG_NOTICE, "res_jabber unloaded.\n");
        return 0;
 }
 
@@ -2406,7 +2417,6 @@ static int load_module(void)
        ast_register_application(app_ajistatus, aji_status_exec, ajistatus_synopsis, ajistatus_descrip);
        ast_cli_register_multiple(aji_cli, sizeof(aji_cli) / sizeof(struct ast_cli_entry));
 
-       ast_log(LOG_NOTICE, "res_jabber.so loaded.\n");
        return 0;
 }