* Makes enum query on name. On success, rewrites user part and * replaces Request-URI. */
| 535 | * replaces Request-URI. |
| 536 | */ |
| 537 | int do_query(struct sip_msg* _msg, char *user, char *name, str *service) { |
| 538 | |
| 539 | char uri[MAX_URI_SIZE]; |
| 540 | char new_uri[MAX_URI_SIZE]; |
| 541 | unsigned int priority, curr_prio, first; |
| 542 | qvalue_t q; |
| 543 | struct rdata* head; |
| 544 | struct rdata* l; |
| 545 | struct naptr_rdata* naptr; |
| 546 | str pattern, replacement, result, new_result; |
| 547 | struct msg_branch branch; |
| 548 | |
| 549 | head = get_record(name, T_NAPTR); |
| 550 | |
| 551 | if (head == 0) { |
| 552 | LM_DBG("No NAPTR record found for %s.\n", name); |
| 553 | return -1; |
| 554 | } |
| 555 | |
| 556 | naptr_sort(&head); |
| 557 | |
| 558 | q = MAX_Q - 10; |
| 559 | curr_prio = 0; |
| 560 | first = 1; |
| 561 | |
| 562 | for (l = head; l; l = l->next) { |
| 563 | |
| 564 | if (l->type != T_NAPTR) continue; /*should never happen*/ |
| 565 | naptr = (struct naptr_rdata*)l->rdata; |
| 566 | if (naptr == 0) { |
| 567 | LM_ERR("Null rdata in DNS response\n"); |
| 568 | continue; |
| 569 | } |
| 570 | |
| 571 | LM_DBG("ENUM query on %s: order %u, pref %u, flen %u, flags '%.*s', " |
| 572 | "slen %u, services '%.*s', rlen %u, regexp '%.*s'\n", |
| 573 | name, naptr->order, naptr->pref, |
| 574 | naptr->flags_len, (int)(naptr->flags_len), ZSW(naptr->flags), |
| 575 | naptr->services_len, |
| 576 | (int)(naptr->services_len), ZSW(naptr->services), naptr->regexp_len, |
| 577 | (int)(naptr->regexp_len), ZSW(naptr->regexp)); |
| 578 | |
| 579 | if (sip_match(naptr, service) == 0) continue; |
| 580 | |
| 581 | if (parse_naptr_regexp(&(naptr->regexp[0]), naptr->regexp_len, |
| 582 | &pattern, &replacement) < 0) { |
| 583 | LM_ERR("Parsing of NAPTR regexp failed\n"); |
| 584 | continue; |
| 585 | } |
| 586 | result.s = &(uri[0]); |
| 587 | result.len = MAX_URI_SIZE; |
| 588 | /* Avoid making copies of pattern and replacement */ |
| 589 | pattern.s[pattern.len] = (char)0; |
| 590 | replacement.s[replacement.len] = (char)0; |
| 591 | if (reg_replace(pattern.s, replacement.s, user, &result) < 0) { |
| 592 | pattern.s[pattern.len] = '!'; |
| 593 | replacement.s[replacement.len] = '!'; |
| 594 | LM_ERR("Regexp replace failed\n"); |
no test coverage detected