chan_pjsip.c: Improve ast_request() diagnostic msgs.
authorRichard Mudgett <rmudgett@digium.com>
Sat, 16 Dec 2017 01:01:02 +0000 (19:01 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Sat, 16 Dec 2017 01:59:50 +0000 (19:59 -0600)
Attempting to dial PJSIP/endpoint when the endpoint doesn't exist and
disable_multi_domain=no results in a misleading empty endpoint name
message.  The message should say the endpoint was not found.

* Added missing endpoint not found message.

* Added more information to the empty endpoint name msgs if available.

* Eliminated RAII_VAR in request().

Change-Id: I21da85ebd62dcc32115b2ffcb5157416ebae51e4

channels/chan_pjsip.c

index 69bcc18..10f45a4 100644 (file)
@@ -2381,7 +2381,7 @@ static int request(void *obj)
        struct request_data *req_data = obj;
        struct ast_sip_session *session = NULL;
        char *tmp = ast_strdupa(req_data->dest), *endpoint_name = NULL, *request_user = NULL;
-       RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
+       struct ast_sip_endpoint *endpoint;
 
        AST_DECLARE_APP_ARGS(args,
                AST_APP_ARG(endpoint);
@@ -2406,10 +2406,18 @@ static int request(void *obj)
                }
 
                if (ast_strlen_zero(endpoint_name)) {
-                       ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name\n");
+                       if (request_user) {
+                               ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name: %s@<endpoint-name>\n",
+                                       request_user);
+                       } else {
+                               ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name\n");
+                       }
                        req_data->cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
                        return -1;
-               } else if (!(endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
+               }
+               endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint",
+                       endpoint_name);
+               if (!endpoint) {
                        ast_log(LOG_ERROR, "Unable to create PJSIP channel - endpoint '%s' was not found\n", endpoint_name);
                        req_data->cause = AST_CAUSE_NO_ROUTE_DESTINATION;
                        return -1;
@@ -2421,23 +2429,38 @@ static int request(void *obj)
                        ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name\n");
                        req_data->cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
                        return -1;
-               } else if (!(endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
+               }
+               endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint",
+                       endpoint_name);
+               if (!endpoint) {
                        /* It seems it's not a multi-domain endpoint or single endpoint exact match,
                         * it's possible that it's a SIP trunk with a specified user (user@trunkname),
                         * so extract the user before @ sign.
                         */
-                       if ((endpoint_name = strchr(args.endpoint, '@'))) {
-                               request_user = args.endpoint;
-                               *endpoint_name++ = '\0';
+                       endpoint_name = strchr(args.endpoint, '@');
+                       if (!endpoint_name) {
+                               /*
+                                * Couldn't find an '@' so it had to be an endpoint
+                                * name that doesn't exist.
+                                */
+                               ast_log(LOG_ERROR, "Unable to create PJSIP channel - endpoint '%s' was not found\n",
+                                       args.endpoint);
+                               req_data->cause = AST_CAUSE_NO_ROUTE_DESTINATION;
+                               return -1;
                        }
+                       request_user = args.endpoint;
+                       *endpoint_name++ = '\0';
 
                        if (ast_strlen_zero(endpoint_name)) {
-                               ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name\n");
+                               ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name: %s@<endpoint-name>\n",
+                                       request_user);
                                req_data->cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
                                return -1;
                        }
 
-                       if (!(endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
+                       endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint",
+                               endpoint_name);
+                       if (!endpoint) {
                                ast_log(LOG_ERROR, "Unable to create PJSIP channel - endpoint '%s' was not found\n", endpoint_name);
                                req_data->cause = AST_CAUSE_NO_ROUTE_DESTINATION;
                                return -1;
@@ -2445,7 +2468,10 @@ static int request(void *obj)
                }
        }
 
-       if (!(session = ast_sip_session_create_outgoing(endpoint, NULL, args.aor, request_user, req_data->topology))) {
+       session = ast_sip_session_create_outgoing(endpoint, NULL, args.aor, request_user,
+               req_data->topology);
+       ao2_ref(endpoint, -1);
+       if (!session) {
                ast_log(LOG_ERROR, "Failed to create outgoing session to endpoint '%s'\n", endpoint_name);
                req_data->cause = AST_CAUSE_NO_ROUTE_DESTINATION;
                return -1;