MCPcopy Create free account
hub / github.com/OpenSIPS/opensips / sip_match

Function sip_match

modules/enum/enum.c:171–221  ·  view source on GitHub ↗

Checks if NAPTR record has flag u and its services field * e2u+[service:]sip or * e2u+service[+service[+service[+...]]] */

Source from the content-addressed store, hash-verified

169 * e2u+service[+service[+service[+...]]]
170 */
171static inline int sip_match( struct naptr_rdata* naptr, str* service)
172{
173 if (service->len == 0) {
174 return (naptr->flags_len == 1) &&
175 ((naptr->flags[0] == 'u') || (naptr->flags[0] == 'U')) &&
176 (naptr->services_len == 7) &&
177 ((strncasecmp(naptr->services, "e2u+sip", 7) == 0) ||
178 (strncasecmp(naptr->services, "sip+e2u", 7) == 0));
179 } else if (service->s[0] != '+') {
180 return (naptr->flags_len == 1) &&
181 ((naptr->flags[0] == 'u') || (naptr->flags[0] == 'U')) &&
182 (naptr->services_len == service->len + 8) &&
183 (strncasecmp(naptr->services, "e2u+", 4) == 0) &&
184 (strncasecmp(naptr->services + 4, service->s, service->len) == 0) &&
185 (strncasecmp(naptr->services + 4 + service->len, ":sip", 4) == 0);
186 } else { /* handle compound NAPTRs and multiple services */
187 str bakservice, baknaptr; /* we bakup the str */
188 int naptrlen, len; /* length of the extracted service */
189
190 /* RFC 3761, NAPTR service field must start with E2U+ */
191 if (strncasecmp(naptr->services, "e2u+", 4) != 0) {
192 return 0;
193 }
194 baknaptr.s = naptr->services + 4; /* leading 'e2u+' */
195 baknaptr.len = naptr->services_len - 4;
196 for (;;) { /* iterate over services in NAPTR */
197 bakservice.s = service->s + 1; /* leading '+' */
198 bakservice.len = service->len - 1;
199 naptrlen = findchr(baknaptr.s,'+',baknaptr.len);
200
201 for (;;) { /* iterate over services in enum_query */
202 len = findchr(bakservice.s,'+',bakservice.len);
203 if ((naptrlen == len ) && !strncasecmp(baknaptr.s, bakservice.s, len)){
204 return 1;
205 }
206 if ( (bakservice.len -= len+1) > 0) {
207 bakservice.s += len+1;
208 continue;
209 }
210 break;
211 }
212 if ( (baknaptr.len -= naptrlen+1) > 0) {
213 baknaptr.s += naptrlen+1;
214 continue;
215 }
216 break;
217 }
218 /* no matching service found */
219 return 0;
220 }
221}
222
223
224

Callers 2

is_from_user_enumFunction · 0.85
do_queryFunction · 0.85

Calls 1

findchrFunction · 0.85

Tested by

no test coverage detected