[asterisk-commits] snuffy: branch snuffy/ao2_jabber_take2 r165881 - in /team/snuffy/ao2_jabber_t...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Dec 19 05:26:31 CST 2008


Author: snuffy
Date: Fri Dec 19 05:26:30 2008
New Revision: 165881

URL: http://svn.digium.com/view/asterisk?view=rev&rev=165881
Log:
Suggested fixes implemented

Fix whitespace issues etc

Modified:
    team/snuffy/ao2_jabber_take2/channels/chan_gtalk.c
    team/snuffy/ao2_jabber_take2/channels/chan_jingle.c
    team/snuffy/ao2_jabber_take2/res/res_jabber.c

Modified: team/snuffy/ao2_jabber_take2/channels/chan_gtalk.c
URL: http://svn.digium.com/view/asterisk/team/snuffy/ao2_jabber_take2/channels/chan_gtalk.c?view=diff&rev=165881&r1=165880&r2=165881
==============================================================================
--- team/snuffy/ao2_jabber_take2/channels/chan_gtalk.c (original)
+++ team/snuffy/ao2_jabber_take2/channels/chan_gtalk.c Fri Dec 19 05:26:30 2008
@@ -236,9 +236,10 @@
 static void gtalk_member_destroy(struct gtalk *obj)
 {
 	//ao2_t_ref(obj->connection->buddies, -1, "die ref");
-	ao2_t_ref(obj->connection, -1, "die client ref");
-	ao2_t_ref(obj->buddy, -1, "die buddy ref");
+	obj->connection ? ao2_t_ref(obj->connection, -1, "die client ref") : 0;
+	obj->buddy ? ao2_t_ref(obj->buddy, -1, "die buddy ref") : 0;
 	ast_free(obj);
+
 }
 
 static struct gtalk *find_gtalk(char *name, char *connection)
@@ -884,7 +885,7 @@
 {
 	struct gtalk_pvt *tmp = NULL;
 	struct aji_resource *resources = NULL;
-	struct aji_buddy *buddy, tmp_buddy;
+	struct aji_buddy *buddy = NULL, tmp_buddy;
 	char idroster[200];
 	char *data, *exten = NULL;
 
@@ -895,17 +896,21 @@
 			buddy = ao2_t_find(client->connection->buddies, &tmp_buddy, OBJ_POINTER, "find buddy");
 			if (buddy)
 				resources = buddy->resources;
-		} else if (client->buddy)
+		} else if (client->buddy) {
 			resources = client->buddy->resources;
+		}
 		while (resources) {
 			if (resources->cap->jingle) {
 				break;
 			}
 			resources = resources->next;
 		}
-		if (resources)
+		if (resources) {
 			snprintf(idroster, sizeof(idroster), "%s/%s", them, resources->resource);
-		else {
+			if (buddy) {
+				ao2_t_ref(buddy, -1, "gtalk_alloc");
+			}
+		} else {
 			ast_log(LOG_ERROR, "no gtalk capable clients to talk to.\n");
 			return NULL;
 		}

Modified: team/snuffy/ao2_jabber_take2/channels/chan_jingle.c
URL: http://svn.digium.com/view/asterisk/team/snuffy/ao2_jabber_take2/channels/chan_jingle.c?view=diff&rev=165881&r1=165880&r2=165881
==============================================================================
--- team/snuffy/ao2_jabber_take2/channels/chan_jingle.c (original)
+++ team/snuffy/ao2_jabber_take2/channels/chan_jingle.c Fri Dec 19 05:26:30 2008
@@ -742,7 +742,7 @@
 {
 	struct jingle_pvt *tmp = NULL;
 	struct aji_resource *resources = NULL;
-	struct aji_buddy *buddy,tmp_buddy;
+	struct aji_buddy *buddy = NULL,tmp_buddy;
 	char idroster[200];
 
 	ast_debug(1, "The client is %s for alloc\n", client->name);
@@ -760,9 +760,12 @@
 			}
 			resources = resources->next;
 		}
-		if (resources)
+		if (resources) {
 			snprintf(idroster, sizeof(idroster), "%s/%s", from, resources->resource);
-		else {
+			if (buddy) {
+				ao2_t_ref(buddy, -1, "jingle_alloc");
+			}
+		} else {
 			ast_log(LOG_ERROR, "no jingle capable clients to talk to.\n");
 			return NULL;
 		}

Modified: team/snuffy/ao2_jabber_take2/res/res_jabber.c
URL: http://svn.digium.com/view/asterisk/team/snuffy/ao2_jabber_take2/res/res_jabber.c?view=diff&rev=165881&r1=165880&r2=165881
==============================================================================
--- team/snuffy/ao2_jabber_take2/res/res_jabber.c (original)
+++ team/snuffy/ao2_jabber_take2/res/res_jabber.c Fri Dec 19 05:26:30 2008
@@ -61,7 +61,7 @@
 #include "asterisk/manager.h"
 
 /*! \todo This should really be renamed to xmpp.conf. For backwards compatibility, we
- 	need to read both files */
+ * need to read both files */
 #define JABBER_CONFIG "jabber.conf"
 
 #ifndef FALSE
@@ -73,11 +73,11 @@
 #endif
 
 #ifdef LOW_MEMORY
-static int hash_buddy_size = 20;
-static int hash_client_size = 20;
+static int hash_buddy_size = 23;
+static int hash_client_size = 23;
 #else
-static int hash_buddy_size = 256;
-static int hash_client_size = 256;
+static int hash_buddy_size = 257;
+static int hash_client_size = 257;
 #endif
 /*-- Forward declarations */
 static void aji_buddy_destroy(void *obj);
@@ -257,28 +257,28 @@
 {
 	struct aji_client *client = obj, *client2 = arg;
 
-	return !strcasecmp(client->name, client2->name) ? CMP_MATCH : 0;
+	return !strcasecmp(client->name, client2->name) ? CMP_MATCH | CMP_STOP : 0;
 }
 
 static int buddy_cmp_cb(void *obj, void *arg, int flags)
 {
 	struct aji_buddy *buddy = obj, *buddy2 = arg;
 
-	return !strcasecmp(buddy->name, buddy2->name) ? CMP_MATCH : 0;
+	return !strcasecmp(buddy->name, buddy2->name) ? CMP_MATCH | CMP_STOP : 0;
 }
 
 static int buddy_hash_cb(const void *obj, const int flags)
 {
 	const struct aji_buddy *buddy = obj;
-	
-	return ast_str_hash(buddy->name);
+
+	return ast_str_case_hash(buddy->name);
 }
 
 static int client_hash_cb(const void *obj, const int flags)
 {
 	const struct aji_client *client = obj;
-	
-	return ast_str_hash(client->name);
+
+	return ast_str_case_hash(client->name);
 }
 
 /*!
@@ -295,7 +295,7 @@
 	
 	biter = ao2_iterator_init(c->buddies, 0);
 
-	while( (b = ao2_t_iterator_next(&biter, "iterate thru buddies")) ) {
+	while ((b = ao2_t_iterator_next(&biter, "iterate thru buddies"))) {
 		ao2_t_unlink(c->buddies, b, "Remove buddy from list");
 		buddy_unref(b, "unref buddy");
 	}
@@ -313,7 +313,7 @@
 	AST_LIST_HEAD_DESTROY(&c->messages);
 
 	ao2_lock(clients); /* required locking for removal? */
-	ao2_t_unlink(clients,obj,"Remove client from list");
+	ao2_t_unlink(clients, c, "Remove client from list");
 	ao2_unlock(clients);
 }
 
@@ -327,13 +327,15 @@
 	struct aji_buddy *b = obj;
 	struct aji_resource *tmp;
 
-	while ((tmp = b->resources)) {
-		b->resources = b->resources->next;
-		ast_free(tmp->description);
-		ast_free(tmp);
-	}
-
-	ast_free(b);
+	if (b) {
+		while ((tmp = b->resources)) {
+			b->resources = b->resources->next;
+			ast_free(tmp->description);
+			ast_free(tmp);
+		}
+
+		ast_free(b);
+	}
 }
 
 /*!
@@ -352,23 +354,23 @@
 
 	list = capabilities;
 
-	if(!node)
+	if (!node)
 		node = pak->from->full;
-	if(!version)
+	if (!version)
 		version = "none supplied.";
-	while(list) {
-		if(!strcasecmp(list->node, node)) {
+	while (list) {
+		if (!strcasecmp(list->node, node)) {
 			res = list->versions;
-			while(res) {
-				 if(!strcasecmp(res->version, version))
+			while (res) {
+				 if (!strcasecmp(res->version, version))
 					 return res;
 				 res = res->next;
 			}
 			/* Specified version not found. Let's add it to 
 			   this node in our capabilities list */
-			if(!res) {
+			if (!res) {
 				res = ast_malloc(sizeof(*res));
-				if(!res) {
+				if (!res) {
 					ast_log(LOG_ERROR, "Out of memory!\n");
 					return NULL;
 				}
@@ -383,14 +385,14 @@
 		list = list->next;
 	}
 	/* Specified node not found. Let's add it our capabilities list */
-	if(!list) {
+	if (!list) {
 		list = ast_malloc(sizeof(*list));
-		if(!list) {
+		if (!list) {
 			ast_log(LOG_ERROR, "Out of memory!\n");
 			return NULL;
 		}
 		res = ast_malloc(sizeof(*res));
-		if(!res) {
+		if (!res) {
 			ast_log(LOG_ERROR, "Out of memory!\n");
 			ast_free(list);
 			return NULL;
@@ -519,7 +521,7 @@
 
 	ast_copy_string(tmp_buddy.name, jid.screenname, sizeof(tmp_buddy.name));
 	buddy = ao2_t_find(client->buddies, &tmp_buddy, OBJ_POINTER, "Find buddy");
-	
+
 	if (!buddy) {
 		ast_log(LOG_WARNING, "Could not find buddy in list: '%s'\n", jid.screenname);
 		client_unref(client, "unref client");
@@ -528,7 +530,7 @@
 
 	r = aji_find_resource(buddy, jid.resource);
 
-	if (!r && buddy->resources) 
+	if (!r && buddy->resources)
 		r = buddy->resources;
 	if (!r)
 		ast_log(LOG_NOTICE, "Resource '%s' of buddy '%s' was not found\n", jid.resource, jid.screenname);
@@ -585,7 +587,7 @@
 		return -1;
 	}
 	r = aji_find_resource(buddy, jid.resource);
-	if (!r && buddy->resources) 
+	if (!r && buddy->resources)
 		r = buddy->resources;
 	if (!r)
 		ast_log(LOG_NOTICE, "Resource %s of buddy %s was not found.\n", jid.resource, jid.screenname);
@@ -645,7 +647,7 @@
 	}
 	if (strchr(args.recipient, '@') && !ast_strlen_zero(args.message))
 		ast_aji_send_chat(client, args.recipient, args.message);
-	
+
 	client_unref(client, "unref client");
 	return 0;
 }
@@ -931,7 +933,7 @@
 static void aji_log_hook(void *data, const char *xmpp, size_t size, int is_incoming)
 {
 	struct aji_client *client = (struct aji_client *) data;
-	client_ref(client,"log_hook");
+	client_ref(client, "log_hook");
 
 	if (!ast_strlen_zero(xmpp))
 		manager_event(EVENT_FLAG_USER, "JabberEvent", "Account: %s\r\nPacket: %s\r\n", client->name, xmpp);
@@ -948,7 +950,7 @@
 		}
 
 	}
-	client_unref(client,"log_hook");
+	client_unref(client, "log_hook");
 }
 
 /*!
@@ -1016,7 +1018,7 @@
 	iks *auth = NULL;
 	int features = 0;
 
-	client_ref(client,"act_hook");
+	client_ref(client, "act_hook");
 
 	if(!node) {
 		ast_log(LOG_ERROR, "aji_act_hook was called with out a packet\n"); /* most likely cause type is IKS_NODE_ERROR lost connection */
@@ -1037,13 +1039,13 @@
 			if (client->usetls && !aji_is_secure(client)) {
 #ifndef HAVE_OPENSSL
 				ast_log(LOG_ERROR, "OpenSSL not installed. You need to install OpenSSL on this system, or disable the TLS option in your configuration file\n");
-				client_unref(client,"act_hook_no_openssl_tls");
+				client_unref(client, "act_hook_no_openssl_tls");
 				return IKS_HOOK;
 #else
 				if (aji_start_tls(client) == IKS_NET_TLSFAIL) {
 					ast_log(LOG_ERROR, "Could not start TLS\n");
-					client_unref(client,"act_hook_openssl_tls");
-					return IKS_HOOK;		
+					client_unref(client, "act_hook_openssl_tls");
+					return IKS_HOOK;
 				}
 #endif
 				break;
@@ -1066,7 +1068,7 @@
 #ifdef HAVE_OPENSSL
 			if (client->stream_flags & TRY_SECURE) {
 				if (!strcmp("proceed", iks_name(node))) {
-					client_unref(client,"try_sec");
+					client_unref(client, "try_sec");
 					return aji_tls_handshake(client);
 				}
 			}
@@ -1124,12 +1126,12 @@
 				aji_send_header(client, client->jid->server);
 			}
 			break;
-		case IKS_NODE_ERROR: 
+		case IKS_NODE_ERROR:
 				ast_log(LOG_ERROR, "JABBER: Node Error\n");
 				client_unref(client, "act_hook_node_error");
 				return IKS_HOOK;
 				break;
-		case IKS_NODE_STOP: 
+		case IKS_NODE_STOP:
 				ast_log(LOG_WARNING, "JABBER: Disconnected\n");
 				client_unref(client, "act_hook_discon_error");
 				return IKS_HOOK;
@@ -1218,7 +1220,7 @@
 	struct aji_client *client = (struct aji_client *) data;
 	iks *iq = NULL, *presence = NULL, *x = NULL;
 
-	client_ref(client,"arpv_hand");
+	client_ref(client, "arpv_hand");
 	iq = iks_new("iq");
 	presence = iks_new("presence");
 	x = iks_new("x");
@@ -1247,7 +1249,7 @@
 	iks_delete(iq);
 	iks_delete(presence);
 	iks_delete(x);
-	
+
 	client_unref(client, "aprv_hand");
 	return IKS_FILTER_EAT;
 }
@@ -1260,11 +1262,11 @@
 static int aji_register_query_handler(void *data, ikspak *pak)
 {
 	struct aji_client *client = (struct aji_client *) data;
-	struct aji_buddy *buddy = NULL; 
-	struct aji_buddy tmp_buddy; 
+	struct aji_buddy *buddy = NULL;
+	struct aji_buddy tmp_buddy;
 	char *node = NULL;
 
-	client_ref(client,"qry_hand");
+	client_ref(client, "qry_hand");
 	ast_copy_string(tmp_buddy.name, pak->from->partial,sizeof(tmp_buddy.name));
 	buddy = ao2_t_find(client->buddies, &tmp_buddy, OBJ_POINTER, "Find Buddy");
 	if (!buddy) {
@@ -1296,7 +1298,7 @@
 		iks_delete(query);
 		iks_delete(error);
 		iks_delete(notacceptable);
-	} else 	if (!(node = iks_find_attrib(pak->query, "node"))) {
+	} else if (!(node = iks_find_attrib(pak->query, "node"))) {
 		iks *iq = NULL, *query = NULL, *instructions = NULL;
 		char *explain = "Welcome to Asterisk - the Open Source PBX.\n";
 		iq = iks_new("iq");
@@ -1336,7 +1338,7 @@
 	struct aji_client *client = (struct aji_client *) data;
 	char *node = NULL;
 
-	client_ref(client,"itm_hand");
+	client_ref(client, "itm_hand");
 
 	if (!(node = iks_find_attrib(pak->query, "node"))) {
 		iks *iq = NULL, *query = NULL, *item = NULL;
@@ -1434,7 +1436,7 @@
 	struct aji_resource *resource = NULL;
 	struct aji_buddy *buddy = NULL;
 	struct aji_buddy tmp_buddy;
-	
+
 	client_ref(client, "info_hand");
 	ast_copy_string(tmp_buddy.name, pak->from->partial, sizeof(tmp_buddy.name));
 	buddy = ao2_t_find(client->buddies, &tmp_buddy, OBJ_POINTER, "Find buddy");
@@ -1501,12 +1503,12 @@
 	struct aji_buddy *buddy = NULL;
 	struct aji_buddy tmp_buddy;
 	char *node = NULL;
-	
+
 	client_ref(client, "dinfo_hand");
 	ast_copy_string(tmp_buddy.name, pak->from->partial, sizeof(tmp_buddy.name));
 	buddy = ao2_t_find(client->buddies, &tmp_buddy, OBJ_POINTER, "Find buddy");
 	resource = aji_find_resource(buddy, pak->from->resource);
-	
+
 	if (pak->subtype == IKS_TYPE_ERROR) {
 		ast_log(LOG_WARNING, "Recieved error from a client, turn on jabber debug!\n");
 		buddy_unref(buddy, "dinfo_hand");
@@ -1700,7 +1702,7 @@
 	struct aji_buddy tmp_buddy, *buddy;
 	struct aji_resource *tmp = NULL, *last = NULL, *found = NULL;
 	char *ver, *node, *descrip, *type;
-	
+
 	if(client->state != AJI_CONNECTED)
 		aji_create_buddy(pak->from->partial, client);
 
@@ -1725,9 +1727,9 @@
 
 	status = (pak->show) ? pak->show : 6;
 	priority = atoi((iks_find_cdata(pak->x, "priority")) ? iks_find_cdata(pak->x, "priority") : "0");
-	tmp = buddy->resources;
 	descrip = ast_strdup(iks_find_cdata(pak->x,"status"));
 	ao2_lock(buddy);
+	tmp = buddy->resources;
 
 	while (tmp && pak->from->resource) {
 		if (!strcasecmp(tmp->resource, pak->from->resource)) {
@@ -1807,6 +1809,8 @@
 
 		if (!found) {
 			ast_log(LOG_ERROR, "Out of memory!\n");
+			ao2_unlock(buddy);
+			buddy_unref(buddy, "hld_pres");
 			return;
 		}
 		ast_copy_string(found->resource, pak->from->resource, sizeof(found->resource));
@@ -1835,7 +1839,7 @@
 		if (!tmp)
 			buddy->resources = found;
 	}
-	
+
 	ao2_unlock(buddy);
 	buddy_unref(buddy, "hld_pres");
 
@@ -1923,7 +1927,7 @@
 	struct aji_buddy* buddy = NULL;
 	struct aji_buddy tmp_buddy;
 
-	switch (pak->subtype) { 
+	switch (pak->subtype) {
 	case IKS_TYPE_SUBSCRIBE:
 		presence = iks_new("presence");
 		status = iks_new("status");
@@ -1950,7 +1954,7 @@
 		if (!buddy && pak->from->partial) {
 			aji_create_buddy(pak->from->partial, client);
 		} else {
-				buddy_unref(buddy,"hand_sub");
+			buddy_unref(buddy,"hand_sub");
 		}
 	default:
 			ast_verb(3, "JABBER: This is a subcription of type %i\n", pak->subtype);
@@ -2084,10 +2088,10 @@
  */
 static void *aji_recv_loop(void *data)
 {
-	struct aji_client *client = (struct aji_client *) data;
+	struct aji_client *client = data;
 	int res = IKS_HOOK;
 
-	client_ref(client,"recv_loop");
+	client_ref(client, "recv_loop");
 
 	while(res != IKS_OK) {
 		ast_verb(4, "JABBER: Connecting.\n");
@@ -2274,14 +2278,14 @@
 			res = ast_aji_send(client, iks_make_s10n(IKS_TYPE_UNSUBSCRIBED, b->name,
 								 "GoodBye you are no longer in the asterisk config file so I am removing"
 								 " your access to my presence.\n"));
-			iks_insert_attrib(removeiq, "from", client->jid->full); 
-			iks_insert_attrib(removeiq, "type", "set"); 
+			iks_insert_attrib(removeiq, "from", client->jid->full);
+			iks_insert_attrib(removeiq, "type", "set");
 			iks_insert_attrib(removequery, "xmlns", "jabber:iq:roster");
 			iks_insert_attrib(removeitem, "jid", b->name);
 			iks_insert_attrib(removeitem, "subscription", "remove");
 			res = ast_aji_send(client, removeiq);
 		} else if (ast_test_flag(&b->flags, AJI_AUTOREGISTER)) {
-			res = ast_aji_send(client, iks_make_s10n(IKS_TYPE_SUBSCRIBE, b->name, 
+			res = ast_aji_send(client, iks_make_s10n(IKS_TYPE_SUBSCRIBE, b->name,
 								 "Greetings I am the Asterisk Open Source PBX and I want to subscribe to your presence\n"));
 			ast_clear_flag(&b->flags, AJI_AUTOREGISTER);
 		}
@@ -2294,7 +2298,7 @@
 	iks_delete(removequery);
 	iks_delete(removeitem);
 	iks_delete(send);
-	
+
 }
 
 /*!
@@ -2313,7 +2317,7 @@
 
 	client_ref(client, "filter_ros");
 	client->state = AJI_CONNECTED;
-	biter= ao2_iterator_init(client->buddies, 0);
+	biter = ao2_iterator_init(client->buddies, 0);
 	while ((b = ao2_t_iterator_next(&biter, "iterate through buddies"))) {
 		ao2_lock(b);
 		x = iks_child(pak->query);
@@ -2351,13 +2355,13 @@
 				x = iks_next(x);
 				continue;
 			}
-			
+
 			buddy = ao2_t_alloc(sizeof(*buddy), aji_buddy_destroy, "alloc buddy");
 			if (!buddy) {
+				client_unref(client, "filter_ros");
 				ast_log(LOG_WARNING, "Out of memory\n");
 				return 0;
 			}
-			buddy_ref(buddy, "ref buddy");
 			ao2_lock(buddy);
 			ast_copy_string(buddy->name, iks_find_attrib(x, "jid"), sizeof(buddy->name));
 			ast_clear_flag(&buddy->flags, AST_FLAGS_ALL);
@@ -2413,7 +2417,7 @@
 	iks *roster = NULL;
 	roster = iks_make_iq(IKS_TYPE_GET, IKS_NS_ROSTER);
 
-	if(roster) {
+	if (roster) {
 		iks_insert_attrib(roster, "id", "roster");
 		aji_set_presence(client, NULL, client->jid->full, client->status, client->statusmessage);
 		ast_aji_send(client, roster);
@@ -2449,7 +2453,7 @@
 		ast_log(LOG_ERROR, "Out of memory.\n");
 	}
 
-	client_unref(client, "unref client_con");
+	client_unref(client, "client_con");
 	return res;
 }
 
@@ -2569,7 +2573,7 @@
 	if (!strncasecmp(a->argv[e->args - 1], "on", 2)) {
 		citer = ao2_iterator_init(clients, 0);
 		while((c = ao2_t_iterator_next(&citer,"Go through list"))) {
-			ao2_lock(c); 
+			ao2_lock(c);
 			c->debug = 1;
 			ao2_unlock(c);
 			client_unref(c, "client unref");
@@ -2579,7 +2583,7 @@
 	} else if (!strncasecmp(a->argv[e->args - 1], "off", 3)) {
 		citer = ao2_iterator_init(clients, 0);
 		while((c = ao2_t_iterator_next(&citer,"Go through list"))) {
-			ao2_lock(c); 
+			ao2_lock(c);
 			c->debug = 0;
 			ao2_unlock(c);
 			client_unref(c, "client unref");
@@ -2622,7 +2626,7 @@
 	struct ao2_iterator citer;
 	struct aji_client *c = NULL;
 	int count = 0;
-	
+
 	switch (cmd) {
 	case CLI_INIT:
 		e->command = "jabber show connected";
@@ -2637,7 +2641,7 @@
 	ast_cli(a->fd, "Jabber Users and their status:\n");
 	citer = ao2_iterator_init(clients, 0);
 	while((c = ao2_t_iterator_next(&citer,"Go through list"))) {
-		ao2_lock(c); 
+		ao2_lock(c);
 		count++;
 		switch (c->state) {
 		case AJI_DISCONNECTED:
@@ -2694,7 +2698,7 @@
 			ao2_lock(b);
 			ast_cli(a->fd,"\tBuddy:\t%s\n", b->name);
 			if (!b->resources)
-				ast_cli(a->fd,"\t\tResource: None\n");	
+				ast_cli(a->fd,"\t\tResource: None\n");
 			for (resource = b->resources; resource; resource = resource->next) {
 				ast_cli(a->fd,"\t\tResource: %s\n", resource->resource);
 				if(resource->cap) {
@@ -2764,8 +2768,8 @@
 				ast_verbose("   Jingle Capable: %d\n", resource->cap->jingle);
 			}
 			ast_verbose("	Priority: %d\n", resource->priority);
-			ast_verbose("	Status: %d\n", resource->status); 
-			ast_verbose("	Message: %s\n", S_OR(resource->description,"")); 
+			ast_verbose("	Status: %d\n", resource->status);
+			ast_verbose("	Message: %s\n", S_OR(resource->description,""));
 		}
 		ao2_unlock(b);
 		buddy_unref(b, "unref buddy");
@@ -2823,7 +2827,7 @@
 		buddy_unref(b, "unref buddy");
 	}
 
-	
+
 	ast_copy_string(client->name, label, sizeof(client->name));
 	ast_copy_string(client->mid, "aaaaa", sizeof(client->mid));
 
@@ -2977,6 +2981,7 @@
 	iks_set_log_hook(client->p, aji_log_hook);
 	ao2_unlock(client);
 	ao2_t_link(clients, client, "Linking new client");
+	client_unref(client, "create_client");
 	return 1;
 }
 
@@ -3042,7 +3047,7 @@
 	struct aji_buddy *buddy = NULL;
 	struct aji_buddy tmp_buddy;
 	int flag = 0;
-	
+
 	ast_copy_string(tmp_buddy.name, label, sizeof(tmp_buddy.name));
 	buddy = ao2_t_find(client->buddies, &tmp_buddy, OBJ_POINTER, "find buddy");
 	if (!buddy) {
@@ -3050,6 +3055,7 @@
 		buddy = ao2_t_alloc(sizeof(*buddy), aji_buddy_destroy, "alloc buddy");
 		if(!buddy) {
 			ast_log(LOG_WARNING, "Out of memory\n");
+			buddy_ref(buddy, "gowayerror");
 			return 0;
 		}
 	}
@@ -3060,9 +3066,9 @@
 	else {
 		/*ASTOBJ_UNMARK(buddy);*/
 		buddy->mark = 0;
-		buddy_unref(buddy, "create_buddy");
 	}
 	ao2_unlock(buddy);
+	buddy_unref(buddy, "create_buddy");
 	return 1;
 }
 
@@ -3125,7 +3131,7 @@
 	client = ao2_t_find(clients, &tmp_client, OBJ_POINTER, "Find client");
 	if (!client && strchr(name, '@')) {
 		citer = ao2_iterator_init(clients, 0);
-	   	while (( c = ao2_t_iterator_next(&citer, "iter through clients"))) {
+		while (( c = ao2_t_iterator_next(&citer, "iter through clients"))) {
 			aux = ast_strdupa(c->user);
 			if (strchr(aux, '/')) {
 				/* strip resource for comparison */
@@ -3187,17 +3193,17 @@
 		return 0;
 	}	
 	if (strchr(screenname, '@') && message){
-		ast_aji_send_chat(client, screenname, message);	
+		ast_aji_send_chat(client, screenname, message);
 		astman_append(s, "Response: Success\r\n");
 		if (!ast_strlen_zero(id))
 			astman_append(s, "ActionID: %s\r\n",id);
-		client_unref(client,"manager send");
+		client_unref(client, "manager send");
 		return 0;
 	}
 	astman_append(s, "Response: Error\r\n");
 	if (!ast_strlen_zero(id))
 		astman_append(s, "ActionID: %s\r\n",id);
-	client_unref(client,"manager send");
+	client_unref(client, "manager send");
 	return 0;
 }
 
@@ -3210,13 +3216,13 @@
 
 	/* ASTOBJ_CONTAINER_MARKALL(&clients); */
 	citer = ao2_iterator_init(clients, 0);
-   	while ((c = ao2_t_iterator_next(&citer, "iter through clients"))) {
+	while ((c = ao2_t_iterator_next(&citer, "iter through clients"))) {
 		ao2_lock(c);
 		c->mark=1;
 		ao2_unlock(c);
 		client_unref(c, "unref client");
 
-	}	
+	}
 
 
 	if (!(res = aji_load_config(reload))) {
@@ -3227,7 +3233,7 @@
 
 	/*ASTOBJ_CONTAINER_PRUNE_MARKED(&clients, aji_client_destroy); */
 	citer = ao2_iterator_init(clients, 0);
-   	while ((c = ao2_t_iterator_next(&citer, "iter through clients"))) {
+	while ((c = ao2_t_iterator_next(&citer, "iter through clients"))) {
 		if(c->mark == 1) {
 			struct ao2_iterator biter;
 			struct aji_buddy *b;
@@ -3244,11 +3250,11 @@
 		}
 		client_unref(c, "unref client");
 
-	}	
-	
-	
+	}
+
+
 	citer = ao2_iterator_init(clients, 0);
-   	while ((c = ao2_t_iterator_next(&citer, "iter through clients"))) {
+	while ((c = ao2_t_iterator_next(&citer, "iter through clients"))) {
 		ao2_lock(c);
 		if(c->state == AJI_DISCONNECTED) {
 			if (!c->thread)
@@ -3282,16 +3288,18 @@
 		biter = ao2_iterator_init(c->buddies, 0);
 		while((b = ao2_t_iterator_next(&biter,"iterate through buddies"))) {
 			ao2_t_unlink(c->buddies, b, "unlink buddy");
-			buddy_unref(b, "unref buddy");
-		}
+			/*buddy_unref(b, "unref buddy");*/
+		}
+		ao2_t_ref(c->buddies, -1, "destroy container");
 		c->state = AJI_DISCONNECTING;
 		ast_aji_disconnect(c);
 		pthread_join(c->thread, NULL);
 		ao2_unlock(c);
 		ao2_t_unlink(clients, c, "unlink client");
-		client_unref(c, "unref client");
-	}
-
+		/*client_unref(c, "unref client");*/
+	}
+
+	ao2_t_ref(clients, -1, "destroy container");
 	return 0;
 }
 




More information about the asterisk-commits mailing list