From: Richard Mudgett Date: Sat, 16 Dec 2017 01:01:02 +0000 (-0600) Subject: chan_pjsip.c: Improve ast_request() diagnostic msgs. X-Git-Tag: 13.19.0-rc1~21^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a368ad92294a987c8315869a56e5151de809f9e2;p=thirdparty%2Fasterisk.git chan_pjsip.c: Improve ast_request() diagnostic msgs. 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 --- diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 4324d159bc..13cbd5d9df 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -2132,7 +2132,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); @@ -2157,10 +2157,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@\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; @@ -2172,23 +2180,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@\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; @@ -2196,7 +2219,10 @@ static int request(void *obj) } } - if (!(session = ast_sip_session_create_outgoing(endpoint, NULL, args.aor, request_user, req_data->caps))) { + session = ast_sip_session_create_outgoing(endpoint, NULL, args.aor, request_user, + req_data->caps); + 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;