resolve MODAPP-80

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7909 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2008-03-18 03:24:03 +00:00
parent 6667eed75e
commit 6b8be36518
1 changed files with 38 additions and 27 deletions

View File

@ -279,46 +279,57 @@ static void parse_rr(const struct dns_parse *p, enum_query_t * q, struct dns_rr
const unsigned char *dend = rr->dnsrr_dend; const unsigned char *dend = rr->dnsrr_dend;
unsigned char *dn = rr->dnsrr_dn; unsigned char *dn = rr->dnsrr_dn;
const unsigned char *c; const unsigned char *c;
char *ptr;
char flags; char flags;
int order; int order;
int preference; int preference;
char *nme;
char *service = NULL; char *service = NULL;
char *regex = NULL; char *regex = NULL;
char *replace = NULL; char *replace = NULL;
int argc = 0; int argc = 0;
char *argv[4] = { 0 }; char *argv[4] = { 0 };
int leap; int n;
char string_arg[3][256] = {{0}};
switch (rr->dnsrr_typ) { switch (rr->dnsrr_typ) {
case DNS_T_NAPTR:/* prio weight port targetDN */
case DNS_T_NAPTR: /* prio weight port targetDN */
c = dptr;
c += 2 + 2 + 2;
if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 || c != dend)
goto xperr;
c = dptr; c = dptr;
c += 4; /* order, pref */
leap = *dn; for (n = 0; n < 3; ++n) {
nme = (char *) dn + 1; if (c >= dend) {
goto xperr;
order = dns_get16(c + 0); } else {
preference = dns_get16(c + 2); c += *c + 1;
flags = (char) dns_get16(c + 4); }
if ((ptr = nme + leap)) {
service = nme;
*ptr++ = '\0';
argc = switch_separate_string(ptr, '!', argv, (sizeof(argv) / sizeof(argv[0])));
regex = argv[1];
replace = argv[2];
} }
for (ptr = replace; ptr && *ptr; ptr++) { if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 || c != dend) {
if (*ptr == '\\') { goto xperr;
*ptr = '$'; }
c = dptr;
order = dns_get16(c+0);
preference = dns_get16(c+2);
flags = (char) dns_get16(c + 4);
c += 4;
for(n = 0; n < 3; n++) {
uint32_t len = *c++, cpylen = len;
if (len > sizeof(string_arg[n]) - 1) {
cpylen = sizeof(string_arg[n]) - 1;
} }
strncpy(string_arg[n], (char *)c, cpylen);
*(string_arg[n] + len) = '\0';
c += len;
}
service = string_arg[1];
if ((argc = switch_separate_string(string_arg[2], '!', argv, (sizeof(argv) / sizeof(argv[0]))))) {
regex = argv[1];
replace = argv[2];
} else {
goto xperr;
} }
if (flags && service && regex && replace) { if (flags && service && regex && replace) {
@ -350,7 +361,7 @@ static void parse_rr(const struct dns_parse *p, enum_query_t * q, struct dns_rr
} }
} }
} }
add_result(q, order, preference, service, uri); add_result(q, order, preference, service, uri);
} }
@ -365,7 +376,7 @@ static void parse_rr(const struct dns_parse *p, enum_query_t * q, struct dns_rr
return; return;
xperr: xperr:
//printf("<parse error>\n"); //printf("<parse error>\n");
return; return;
} }