FreeCalypso > hg > themwi-system-sw
comparison libsip/req_supp.c @ 49:dec31b1a8b96
sip-in: check Require and Supported
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 06 Sep 2022 22:57:16 -0800 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
48:8117d8ee44a5 | 49:dec31b1a8b96 |
---|---|
1 /* | |
2 * Here we parse Require and Supported headers in a SIP request, | |
3 * checking whether our supported extensions are also supported | |
4 * or required by the client, and catching any client requirements | |
5 * which we don't support. | |
6 */ | |
7 | |
8 #include <ctype.h> | |
9 #include <string.h> | |
10 #include <strings.h> | |
11 #include "parse.h" | |
12 #include "req_supp.h" | |
13 | |
14 parse_require_supported(msg, lsupp, nlsupp, unsupp) | |
15 struct sip_pkt_rx *msg; | |
16 struct supported_ext *lsupp; | |
17 unsigned nlsupp; | |
18 char **unsupp; | |
19 { | |
20 struct sip_parse_hdr *hdr, *endhdr; | |
21 char *cp, *np; | |
22 unsigned n; | |
23 | |
24 endhdr = msg->hdr_fields + msg->num_hdr_fields; | |
25 /* check Require first */ | |
26 for (hdr = msg->hdr_fields; hdr < endhdr; hdr++) { | |
27 if (strcasecmp(hdr->field_name, "Require")) | |
28 continue; | |
29 cp = hdr->field_value; | |
30 for (;;) { | |
31 while (isspace(*cp) || *cp == ',') | |
32 cp++; | |
33 if (!*cp) | |
34 break; | |
35 np = cp; | |
36 while (*cp && !isspace(*cp) && *cp != ',') | |
37 cp++; | |
38 if (*cp) | |
39 *cp++ = '\0'; | |
40 for (n = 0; n < nlsupp; n++) { | |
41 if (!strcasecmp(np, lsupp[n].name)) { | |
42 *lsupp[n].req_flag = 1; | |
43 break; | |
44 } else { | |
45 if (unsupp) | |
46 *unsupp = np; | |
47 return(-1); | |
48 } | |
49 } | |
50 } | |
51 } | |
52 /* now check Supported */ | |
53 for (hdr = msg->hdr_fields; hdr < endhdr; hdr++) { | |
54 if (strcasecmp(hdr->field_name, "Supported") && | |
55 strcasecmp(hdr->field_name, "k")) | |
56 continue; | |
57 cp = hdr->field_value; | |
58 for (;;) { | |
59 while (isspace(*cp) || *cp == ',') | |
60 cp++; | |
61 if (!*cp) | |
62 break; | |
63 np = cp; | |
64 while (*cp && !isspace(*cp) && *cp != ',') | |
65 cp++; | |
66 if (*cp) | |
67 *cp++ = '\0'; | |
68 for (n = 0; n < nlsupp; n++) { | |
69 if (!strcasecmp(np, lsupp[n].name)) { | |
70 *lsupp[n].sup_flag = 1; | |
71 break; | |
72 } | |
73 } | |
74 } | |
75 } | |
76 return(0); | |
77 } |