FreeCalypso > hg > sipout-test-utils
diff libsip/req_supp.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/req_supp.c Sun Mar 03 23:20:19 2024 -0800 @@ -0,0 +1,77 @@ +/* + * Here we parse Require and Supported headers in a SIP request, + * checking whether our supported extensions are also supported + * or required by the client, and catching any client requirements + * which we don't support. + */ + +#include <ctype.h> +#include <string.h> +#include <strings.h> +#include "parse.h" +#include "req_supp.h" + +parse_require_supported(msg, lsupp, nlsupp, unsupp) + struct sip_pkt_rx *msg; + struct supported_ext *lsupp; + unsigned nlsupp; + char **unsupp; +{ + struct sip_parse_hdr *hdr, *endhdr; + char *cp, *np; + unsigned n; + + endhdr = msg->hdr_fields + msg->num_hdr_fields; + /* check Require first */ + for (hdr = msg->hdr_fields; hdr < endhdr; hdr++) { + if (strcasecmp(hdr->field_name, "Require")) + continue; + cp = hdr->field_value; + for (;;) { + while (isspace(*cp) || *cp == ',') + cp++; + if (!*cp) + break; + np = cp; + while (*cp && !isspace(*cp) && *cp != ',') + cp++; + if (*cp) + *cp++ = '\0'; + for (n = 0; n < nlsupp; n++) { + if (!strcasecmp(np, lsupp[n].name)) { + *lsupp[n].req_flag = 1; + break; + } else { + if (unsupp) + *unsupp = np; + return(-1); + } + } + } + } + /* now check Supported */ + for (hdr = msg->hdr_fields; hdr < endhdr; hdr++) { + if (strcasecmp(hdr->field_name, "Supported") && + strcasecmp(hdr->field_name, "k")) + continue; + cp = hdr->field_value; + for (;;) { + while (isspace(*cp) || *cp == ',') + cp++; + if (!*cp) + break; + np = cp; + while (*cp && !isspace(*cp) && *cp != ',') + cp++; + if (*cp) + *cp++ = '\0'; + for (n = 0; n < nlsupp; n++) { + if (!strcasecmp(np, lsupp[n].name)) { + *lsupp[n].sup_flag = 1; + break; + } + } + } + } + return(0); +}