FreeCalypso > hg > themwi-system-sw
view libsip/to_tag.c @ 83:3e3fbf44f9d7
sip-in: disconnect and call clearing implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 20 Sep 2022 22:06:37 -0800 |
parents | 9ca6f0708237 |
children |
line wrap: on
line source
/* * 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; }