FreeCalypso > hg > themwi-system-sw
view libsip/req_supp.c @ 152:7176dc850d7a
sip-in hold/retr error handling: simply send BYE
Because we know that the SIP state is CONNECTED at the time of any
such error event, we can call initiate_bye() instead of disconnect_sip(),
and thereby get rid of struct gsm_mncc_cause which will never be used
in this scenario anyway.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 11 Oct 2022 16:11:21 -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); }