FreeCalypso > hg > themwi-system-sw
view libsip/req_supp.c @ 111:7a4d4b8d5f04
sip-in call clearing: unlink and free implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 28 Sep 2022 18:45:16 -0800 |
parents | dec31b1a8b96 |
children |
line wrap: on
line source
/* * 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); }