} else {
match = 0;
for (i=1; i<=zcount; i++) {
- if (strcmp(nlist[ncount-i], zlist[zcount-i]) != 0) {
+ if (strcasecmp(nlist[ncount-i], zlist[zcount-i]) != 0) {
break;
}
match++;
void dnsp_to_dns_copy(TALLOC_CTX *mem_ctx, struct dnsp_DnssrvRpcRecord *dnsp,
struct DNS_RPC_RECORD *dns)
{
- int len;
+ int i, len;
ZERO_STRUCTP(dns);
break;
case DNS_TYPE_TXT:
- dns->data.name.len = strlen(dnsp->data.txt);
- dns->data.name.str = talloc_strdup(mem_ctx, dnsp->data.txt);
+ dns->data.txt.count = dnsp->data.txt.count;
+ dns->data.txt.str = talloc_array(mem_ctx, struct DNS_RPC_NAME, dnsp->data.txt.count);
+ for (i=0; i<dnsp->data.txt.count; i++) {
+ dns->data.txt.str[i].str = talloc_strdup(mem_ctx, dnsp->data.txt.str[i]);
+ dns->data.txt.str[i].len = strlen(dnsp->data.txt.str[i]);
+ }
break;
case DNS_TYPE_AAAA:
struct dnsp_DnssrvRpcRecord *dns_to_dnsp_copy(TALLOC_CTX *mem_ctx, struct DNS_RPC_RECORD *dns)
{
- int len;
+ int i, len;
struct dnsp_DnssrvRpcRecord *dnsp;
dnsp = talloc_zero(mem_ctx, struct dnsp_DnssrvRpcRecord);
len = dns->data.soa.NamePrimaryServer.len;
if (dns->data.soa.NamePrimaryServer.str[len-1] == '.') {
- dnsp->data.soa.mname = talloc_strdup(mem_ctx, dns->data.soa.NamePrimaryServer.str);
- } else {
dnsp->data.soa.mname = talloc_strndup(mem_ctx, dns->data.soa.NamePrimaryServer.str, len-1);
+ } else {
+ dnsp->data.soa.mname = talloc_strdup(mem_ctx, dns->data.soa.NamePrimaryServer.str);
}
len = dns->data.soa.ZoneAdministratorEmail.len;
break;
case DNS_TYPE_TXT:
- dnsp->data.txt = talloc_strdup(mem_ctx, dns->data.name.str);
+ dnsp->data.txt.count = dns->data.txt.count;
+ dnsp->data.txt.str = talloc_array(mem_ctx, const char *, dns->data.txt.count);
+ for (i=0; i<dns->data.txt.count; i++) {
+ dnsp->data.txt.str[i] = talloc_strdup(mem_ctx, dns->data.txt.str[i].str);
+ }
break;
case DNS_TYPE_AAAA:
if (strcmp(tree->name, "@") == 0) {
start = 0;
} else {
- if (strcmp(tree->name, nlist[ncount-1]) != 0) {
+ if (strcasecmp(tree->name, nlist[ncount-1]) != 0) {
return NULL;
}
start = 1;
}
next = NULL;
for (j=0; j<node->num_children; j++) {
- if (strcmp(nlist[(ncount-1)-i], node->children[j]->name) == 0) {
+ if (strcasecmp(nlist[(ncount-1)-i], node->children[j]->name) == 0) {
next = node->children[j];
*match_count = i;
break;
if (strcmp(ptr, "@") == 0) {
base->data = res->msgs[i];
continue;
- } else if (strcmp(ptr, name) == 0) {
+ } else if (strcasecmp(ptr, name) == 0) {
base->data = res->msgs[i];
continue;
}
goto failed;
}
+ /* If the node is on leaf, then add record data */
+ if (match_count+1 == ncount) {
+ tree->data = res->msgs[i];
+ }
+
/* Add missing name components */
for (level=match_count+1; level<ncount; level++) {
if (tree->level == rootcount+1) {
int count = *add_count;
for (i=0; i<count; i++) {
- if (strcmp(ptr[i], name) == 0) {
+ if (strcasecmp(ptr[i], name) == 0) {
return;
}
}
return WERR_OK;
}
+ /* Do not return RR records, if the node has children */
+ if (branch_name != NULL && num_children > 0) {
+ return WERR_OK;
+ }
+
ptr = ldb_msg_find_attr_as_string(msg, "name", NULL);
el = ldb_msg_find_element(msg, "dnsRecord");
if (el == NULL || el->values == 0) {
if (name1[0] == '@') {
return -1;
}
- if (search_name && strcmp(name1, search_name) == 0) {
+ if (search_name && strcasecmp(name1, search_name) == 0) {
return -1;
}
if (name2[0] == '@') {
return 1;
}
- if (search_name && strcmp(name2, search_name) == 0) {
+ if (search_name && strcasecmp(name2, search_name) == 0) {
return 1;
}
if (ptr1 == NULL) {
ptr1 = name1;
} else {
- if (search_name && strcmp(ptr1+1, search_name) == 0) {
+ if (search_name && strcasecmp(ptr1+1, search_name) == 0) {
ptr1--;
while (ptr1 != name1) {
ptr1--;
if (ptr2 == NULL) {
ptr2 = name2;
} else {
- if (search_name && strcmp(ptr2+1, search_name) == 0) {
+ if (search_name && strcasecmp(ptr2+1, search_name) == 0) {
ptr2--;
while (ptr2 != name2) {
ptr2--;
bool dns_record_match(struct dnsp_DnssrvRpcRecord *rec1, struct dnsp_DnssrvRpcRecord *rec2)
{
+ bool status;
+ int i;
+
if (rec1->wType != rec2->wType) {
return false;
}
return strcmp(rec1->data.ipv4, rec2->data.ipv4) == 0;
case DNS_TYPE_NS:
- return dns_name_equal(rec1->data.ns, rec1->data.ns);
+ return dns_name_equal(rec1->data.ns, rec2->data.ns);
case DNS_TYPE_CNAME:
- return dns_name_equal(rec1->data.cname, rec1->data.cname);
+ return dns_name_equal(rec1->data.cname, rec2->data.cname);
case DNS_TYPE_SOA:
- return dns_name_equal(rec1->data.soa.mname, rec2->data.soa.mname) == 0 &&
- dns_name_equal(rec1->data.soa.rname, rec2->data.soa.rname) == 0 &&
+ return dns_name_equal(rec1->data.soa.mname, rec2->data.soa.mname) &&
+ dns_name_equal(rec1->data.soa.rname, rec2->data.soa.rname) &&
rec1->data.soa.serial == rec2->data.soa.serial &&
rec1->data.soa.refresh == rec2->data.soa.refresh &&
rec1->data.soa.retry == rec2->data.soa.retry &&
return dns_name_equal(rec1->data.ptr, rec2->data.ptr);
case DNS_TYPE_MX:
- return rec1->data.mx.wPriority == rec2->data.srv.wPriority &&
- dns_name_equal(rec1->data.mx.nameTarget, rec2->data.srv.nameTarget);
+ return rec1->data.mx.wPriority == rec2->data.mx.wPriority &&
+ dns_name_equal(rec1->data.mx.nameTarget, rec2->data.mx.nameTarget);
case DNS_TYPE_TXT:
- return strcmp(rec1->data.txt, rec2->data.txt) == 0;
+ if (rec1->data.txt.count != rec2->data.txt.count) {
+ return false;
+ }
+ status = true;
+ for (i=0; i<rec1->data.txt.count; i++) {
+ status = status && (strcmp(rec1->data.txt.str[i],
+ rec2->data.txt.str[i]) == 0);
+ }
+ return status;
case DNS_TYPE_AAAA:
return strcmp(rec1->data.ipv6, rec2->data.ipv6) == 0;