FreeCalypso > hg > sipout-test-utils
diff libsip/to_tag.c @ 0:35c0d9f03c0a
beginning with sipout-test-voice,
a copy of sip-manual-out from themwi-system-sw
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 03 Mar 2024 23:20:19 -0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libsip/to_tag.c Sun Mar 03 23:20:19 2024 -0800 @@ -0,0 +1,76 @@ +/* + * The function implemented in this module extracts the tag + * from the To header of a SIP destination server's response. + */ + +#include <ctype.h> +#include <string.h> +#include <strings.h> +#include <stdio.h> +#include <stdlib.h> +#include "parse.h" + +extern char *get_single_header(); + +char * +extract_to_tag(msg, expect_uri) + struct sip_pkt_rx *msg; + char *expect_uri; +{ + char *cp, *tag; + int bracketed, c; + unsigned expect_uri_len; + + cp = get_single_header(msg, "To", "t", (int *) 0); + if (!cp) + return 0; + if (*cp == '<') { + cp++; + bracketed = 1; + } else + bracketed = 0; + expect_uri_len = strlen(expect_uri); + if (strncasecmp(cp, expect_uri, expect_uri_len)) + return 0; + cp += expect_uri_len; + if (bracketed) { + if (*cp++ != '>') + return 0; + } + while (isspace(*cp)) + cp++; + if (*cp++ != ';') + return 0; + while (isspace(*cp)) + cp++; + if (strncasecmp(cp, "tag", 3)) + return 0; + cp += 3; + while (isspace(*cp)) + cp++; + if (*cp++ != '=') + return 0; + while (isspace(*cp)) + cp++; + tag = cp; + for (; c = *cp; cp++) { + switch (c) { + case '-': + case '.': + case '!': + case '%': + case '*': + case '_': + case '+': + case '`': + case '\'': + case '~': + continue; + default: + if (isalnum(c)) + continue; + return 0; + } + } + return tag; +}