]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_rfc3326: Prefer Q.850 cause code over SIP.
authorSean Bright <sean@seanbright.com>
Mon, 12 Jun 2023 15:31:33 +0000 (11:31 -0400)
committerasterisk-org-access-app[bot] <120671045+asterisk-org-access-app[bot]@users.noreply.github.com>
Wed, 21 Jun 2023 13:25:00 +0000 (13:25 +0000)
Resolves: #116

res/res_pjsip_rfc3326.c

index 458b5e97d31ab10acbfd66532079e256caa71e67..7c38a1632cb27d715c8c4ba7610d89301bd52f28 100644 (file)
@@ -40,38 +40,30 @@ static void rfc3326_use_reason_header(struct ast_sip_session *session, struct pj
        pjsip_generic_string_hdr *header;
        char buf[20];
        char *cause;
-       char *text;
-       int code;
-       int cause_q850, cause_sip;
+       int code_q850 = 0, code_sip = 0;
 
        header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, NULL);
        for (; header;
                header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, header->next)) {
+               int cause_q850, cause_sip;
                ast_copy_pj_str(buf, &header->hvalue, sizeof(buf));
                cause = ast_skip_blanks(buf);
 
                cause_q850 = !strncasecmp(cause, "Q.850", 5);
                cause_sip = !strncasecmp(cause, "SIP", 3);
                if ((cause_q850 || cause_sip) && (cause = strstr(cause, "cause="))) {
-                       /* If text is present get rid of it */
-                       if ((text = strchr(cause, ';'))) {
-                               *text = '\0';
+                       int *code = cause_q850 ? &code_q850 : &code_sip;
+                       if (sscanf(cause, "cause=%30d", code) != 1) {
+                               *code = 0;
                        }
-
-                       if (sscanf(cause, "cause=%30d", &code) != 1) {
-                               continue;
-                       }
-               } else {
-                       continue;
-               }
-               if (cause_q850) {
-                       ast_channel_hangupcause_set(session->channel, code & 0x7f);
-                       break;
-               } else if (cause_sip) {
-                       ast_channel_hangupcause_set(session->channel, ast_sip_hangup_sip2cause(code));
-                       break;
                }
        }
+
+       if (code_q850) {
+               ast_channel_hangupcause_set(session->channel, code_q850 & 0x7f);
+       } else if (code_sip) {
+               ast_channel_hangupcause_set(session->channel, ast_sip_hangup_sip2cause(code_sip));
+       }
 }
 
 static int rfc3326_incoming_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata)