]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_pubsub.c: Fix AMI event list counts. 42/4742/1
authorRichard Mudgett <rmudgett@digium.com>
Thu, 5 Jan 2017 21:11:12 +0000 (15:11 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Fri, 20 Jan 2017 18:38:40 +0000 (12:38 -0600)
Fix the AMI PJSIPShowSubscriptionsInbound, PJSIPShowSubscriptionsOutbound,
and PJSIPShowResourceLists actions event counts.  The reported counts may
not necessarily be accurate depending on what happens.

The subscriptions count would be wrong if Asterisk ever has outbound
subscriptions.

The resource list count could be wrong if a list were added or removed
during the AMI action being processed.

Change-Id: I4344301827523fa174960a42c413fd19abe4aed5

res/res_pjsip_pubsub.c

index f6b6efcf57930019e7dd4e495c573446e66493b0..87b1658bd3c0d094f726b36a31e413a77fb35eb9 100644 (file)
@@ -3646,6 +3646,8 @@ static int ami_subscription_detail(struct sip_subscription_tree *sub_tree,
        sip_subscription_to_ami(sub_tree, &buf);
        astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
        ast_free(buf);
+
+       ++ami->count;
        return 0;
 }
 
@@ -3664,14 +3666,13 @@ static int ami_subscription_detail_outbound(struct sip_subscription_tree *sub_tr
 static int ami_show_subscriptions_inbound(struct mansession *s, const struct message *m)
 {
        struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
-       int num;
 
-       astman_send_listack(s, m, "Following are Events for "
-                           "each inbound Subscription", "start");
+       astman_send_listack(s, m, "Following are Events for each inbound Subscription",
+               "start");
 
-       num = for_each_subscription(ami_subscription_detail_inbound, &ami);
+       for_each_subscription(ami_subscription_detail_inbound, &ami);
 
-       astman_send_list_complete_start(s, m, "InboundSubscriptionDetailComplete", num);
+       astman_send_list_complete_start(s, m, "InboundSubscriptionDetailComplete", ami.count);
        astman_send_list_complete_end(s);
        return 0;
 }
@@ -3679,14 +3680,13 @@ static int ami_show_subscriptions_inbound(struct mansession *s, const struct mes
 static int ami_show_subscriptions_outbound(struct mansession *s, const struct message *m)
 {
        struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
-       int num;
 
-       astman_send_listack(s, m, "Following are Events for "
-                           "each outbound Subscription", "start");
+       astman_send_listack(s, m, "Following are Events for each outbound Subscription",
+               "start");
 
-       num = for_each_subscription(ami_subscription_detail_outbound, &ami);
+       for_each_subscription(ami_subscription_detail_outbound, &ami);
 
-       astman_send_list_complete_start(s, m, "OutboundSubscriptionDetailComplete", num);
+       astman_send_list_complete_start(s, m, "OutboundSubscriptionDetailComplete", ami.count);
        astman_send_list_complete_end(s);
        return 0;
 }
@@ -3707,31 +3707,31 @@ static int format_ami_resource_lists(void *obj, void *arg, int flags)
                return CMP_STOP;
        }
        astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
-
        ast_free(buf);
+
+       ++ami->count;
        return 0;
 }
 
 static int ami_show_resource_lists(struct mansession *s, const struct message *m)
 {
        struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
-       int num;
        struct ao2_container *lists;
 
        lists = ast_sorcery_retrieve_by_fields(ast_sip_get_sorcery(), "resource_list",
                        AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL);
 
-       if (!lists || !(num = ao2_container_count(lists))) {
+       if (!lists || !ao2_container_count(lists)) {
                astman_send_error(s, m, "No resource lists found\n");
                return 0;
        }
 
-       astman_send_listack(s, m, "A listing of resource lists follows, "
-                           "presented as ResourceListDetail events", "start");
+       astman_send_listack(s, m, "A listing of resource lists follows, presented as ResourceListDetail events",
+               "start");
 
        ao2_callback(lists, OBJ_NODATA, format_ami_resource_lists, &ami);
 
-       astman_send_list_complete_start(s, m, "ResourceListDetailComplete", num);
+       astman_send_list_complete_start(s, m, "ResourceListDetailComplete", ami.count);
        astman_send_list_complete_end(s);
        return 0;
 }