FreeCalypso > hg > sipout-test-utils
view libsip/req_supp.c @ 15:71f01a834820
sipout-test-voice: implement play with offset
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 11 May 2024 22:27:07 -0800 |
parents | 35c0d9f03c0a |
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); }