/* Names are equal if they match and there's nothing left over */ bool dns_name_equal(const char *name1, const char *name2) { size_t host_part_len; bool ret = dns_name_match(name1, name2, &host_part_len); return ret && (host_part_len == 0); }
bool dns_authoritative_for_zone(struct dns_server *dns, const char *name) { const struct dns_server_zone *z; size_t host_part_len = 0; if (name == NULL) { return false; } if (strcmp(name, "") == 0) { return true; } for (z = dns->zones; z != NULL; z = z->next) { bool match; match = dns_name_match(z->name, name, &host_part_len); if (match) { break; } } if (z == NULL) { return false; } return true; }
WERROR dns_name2dn(struct dns_server *dns, TALLOC_CTX *mem_ctx, const char *name, struct ldb_dn **_dn) { struct ldb_dn *base; struct ldb_dn *dn; const struct dns_server_zone *z; size_t host_part_len = 0; if (name == NULL) { return DNS_ERR(FORMAT_ERROR); } /*TODO: Check if 'name' is a valid DNS name */ if (strcmp(name, "") == 0) { base = ldb_get_default_basedn(dns->samdb); dn = ldb_dn_copy(mem_ctx, base); ldb_dn_add_child_fmt(dn, "DC=@,DC=RootDNSServers,CN=MicrosoftDNS,CN=System"); *_dn = dn; return WERR_OK; } for (z = dns->zones; z != NULL; z = z->next) { bool match; match = dns_name_match(z->name, name, &host_part_len); if (match) { break; } } if (z == NULL) { return DNS_ERR(NAME_ERROR); } if (host_part_len == 0) { dn = ldb_dn_copy(mem_ctx, z->dn); ldb_dn_add_child_fmt(dn, "DC=@"); *_dn = dn; return WERR_OK; } dn = ldb_dn_copy(mem_ctx, z->dn); ldb_dn_add_child_fmt(dn, "DC=%*.*s", (int)host_part_len, (int)host_part_len, name); *_dn = dn; return WERR_OK; }
const char *dns_get_authoritative_zone(struct dns_server *dns, const char *name) { const struct dns_server_zone *z; size_t host_part_len = 0; for (z = dns->zones; z != NULL; z = z->next) { bool match; match = dns_name_match(z->name, name, &host_part_len); if (match) { return z->name; } } return NULL; }