From 45626eac473a524d75828e92fc2aeb1b7a50fed9 Mon Sep 17 00:00:00 2001 From: oej Date: Thu, 7 Jun 2007 09:21:29 +0000 Subject: Merged revisions 67993 via svnmerge from 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: http://svn.digium.com/svn/asterisk/trunk@68026 f38db490-d61c-443f-a65b-d21fe96a405b --- res/res_jabber.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'res/res_jabber.c') diff --git a/res/res_jabber.c b/res/res_jabber.c index d8d620021..47d243006 100644 --- a/res/res_jabber.c +++ b/res/res_jabber.c @@ -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; } -- cgit v1.2.3