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

Function do_query

modules/enum/enum.c:537–643  ·  view source on GitHub ↗

* Makes enum query on name. On success, rewrites user part and * replaces Request-URI. */

Source from the content-addressed store, hash-verified

535 * replaces Request-URI.
536 */
537int 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");

Callers 3

enum_queryFunction · 0.85
isn_queryFunction · 0.85
i_enum_queryFunction · 0.85

Calls 9

get_recordFunction · 0.85
sip_matchFunction · 0.85
reg_replaceFunction · 0.85
add_uri_paramFunction · 0.85
set_ruriFunction · 0.85
append_msg_branchFunction · 0.85
free_rdata_listFunction · 0.85
naptr_sortFunction · 0.70
parse_naptr_regexpFunction · 0.70

Tested by

no test coverage detected