From a8a2f39f048c06773eb3e97703d8b8bdcd3e91bd Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Thu, 4 Jan 2018 17:04:39 -0600 Subject: res_pjsip_endpoint_identifier_ip.c: Allow multiple IdentifyDetail AMI events. 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 | 57 +++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/res/res_pjsip_endpoint_identifier_ip.c b/res/res_pjsip_endpoint_identifier_ip.c index 5324af7b9..14f4cfd1a 100644 --- a/res/res_pjsip_endpoint_identifier_ip.c +++ b/res/res_pjsip_endpoint_identifier_ip.c @@ -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; } -- cgit v1.2.3