]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_endpoint_identifier_ip.c: Allow multiple IdentifyDetail AMI events.
authorRichard Mudgett <rmudgett@digium.com>
Thu, 4 Jan 2018 23:04:39 +0000 (17:04 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 9 Jan 2018 18:01:14 +0000 (12:01 -0600)
The AMI PJSIPShowEndpoint action could only list one IdentifyDetail AMI
event per endpoint.  However, there is no reason that multiple
type=identify sections cannot identify the same endpoint.

* Reworked format_ami_endpoint_identify() to generate as many
IdentifyDetail AMI events as there are matching identifiers.

Change-Id: Ie146792aef72d78e05416ab5b27bc552a30399db

res/res_pjsip_endpoint_identifier_ip.c

index 5324af7b9716c14f6a9e8687e462cc82b5f3ae84..14f4cfd1ad388651cc7697ac555bd3e3e4baec1e 100644 (file)
@@ -484,47 +484,54 @@ static int sip_identify_to_ami(const struct ip_identify_match *identify,
        return ast_sip_sorcery_object_to_ami(identify, buf);
 }
 
-static int find_identify_by_endpoint(void *obj, void *arg, int flags)
+static int send_identify_ami_event(void *obj, void *arg, void *data, int flags)
 {
        struct ip_identify_match *identify = obj;
        const char *endpoint_name = arg;
+       struct ast_sip_ami *ami = data;
+       struct ast_str *buf;
 
-       return strcmp(identify->endpoint_name, endpoint_name) ? 0 : CMP_MATCH;
+       /* Build AMI event */
+       buf = ast_sip_create_ami_event("IdentifyDetail", ami);
+       if (!buf) {
+               return CMP_STOP;
+       }
+       if (sip_identify_to_ami(identify, &buf)) {
+               ast_free(buf);
+               return CMP_STOP;
+       }
+       ast_str_append(&buf, 0, "EndpointName: %s\r\n", endpoint_name);
+
+       /* Send AMI event */
+       astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
+       ++ami->count;
+
+       ast_free(buf);
+       return 0;
 }
 
 static int format_ami_endpoint_identify(const struct ast_sip_endpoint *endpoint,
                                        struct ast_sip_ami *ami)
 {
-       RAII_VAR(struct ao2_container *, identifies, NULL, ao2_cleanup);
-       RAII_VAR(struct ip_identify_match *, identify, NULL, ao2_cleanup);
-       RAII_VAR(struct ast_str *, buf, NULL, ast_free);
+       struct ao2_container *identifies;
+       struct ast_variable fields = {
+               .name = "endpoint",
+               .value = ast_sorcery_object_get_id(endpoint),
+       };
 
        identifies = ast_sorcery_retrieve_by_fields(ast_sip_get_sorcery(), "identify",
-               AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL);
+               AST_RETRIEVE_FLAG_MULTIPLE, &fields);
        if (!identifies) {
                return -1;
        }
 
-       identify = ao2_callback(identifies, 0, find_identify_by_endpoint,
-               (void *) ast_sorcery_object_get_id(endpoint));
-       if (!identify) {
-               return 1;
-       }
-
-       if (!(buf = ast_sip_create_ami_event("IdentifyDetail", ami))) {
-               return -1;
-       }
-
-       if (sip_identify_to_ami(identify, &buf)) {
-               return -1;
-       }
-
-       ast_str_append(&buf, 0, "EndpointName: %s\r\n",
-               ast_sorcery_object_get_id(endpoint));
-
-       astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
-       ami->count++;
+       /* Build and send any found identify object's AMI IdentifyDetail event. */
+       ao2_callback_data(identifies, OBJ_MULTIPLE | OBJ_NODATA,
+               send_identify_ami_event,
+               (void *) ast_sorcery_object_get_id(endpoint),
+               ami);
 
+       ao2_ref(identifies, -1);
        return 0;
 }