Checks if NAPTR record has flag u and its services field * e2u+[service:]sip or * e2u+service[+service[+service[+...]]] */
| 169 | * e2u+service[+service[+service[+...]]] |
| 170 | */ |
| 171 | static 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 |
no test coverage detected