s4:dns_server: split out dns_common_extract() and dns_common_lookup()
authorStefan Metzmacher <metze@samba.org>
Wed, 30 Jul 2014 06:24:10 +0000 (08:24 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 10 Mar 2015 09:55:42 +0000 (10:55 +0100)
Bug: https://bugzilla.samba.org/show_bug.cgi?id=10749

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
(cherry picked from commit 342a087349f8a10833338a3fa49fbd4d4d29f3e5)

source4/dns_server/dns_utils.c
source4/dns_server/dnsserver_common.c
source4/dns_server/dnsserver_common.h

index 77c410b508abe557a8810a8d5c509d4574800282..69f9bd95ca8c85559b17a9681d428084e48cb119 100644 (file)
@@ -151,48 +151,7 @@ WERROR dns_lookup_records(struct dns_server *dns,
                          struct dnsp_DnssrvRpcRecord **records,
                          uint16_t *rec_count)
 {
-       static const char * const attrs[] = { "dnsRecord", NULL};
-       struct ldb_message_element *el;
-       uint16_t ri;
-       int ret;
-       struct ldb_message *msg = NULL;
-       struct dnsp_DnssrvRpcRecord *recs;
-
-       *records = NULL;
-       *rec_count = 0;
-
-       ret = dsdb_search_one(dns->samdb, mem_ctx, &msg, dn,
-                             LDB_SCOPE_BASE, attrs, 0, "%s", "(objectClass=dnsNode)");
-       if (ret == LDB_ERR_NO_SUCH_OBJECT) {
-               return WERR_DNS_ERROR_NAME_DOES_NOT_EXIST;
-       }
-       if (ret != LDB_SUCCESS) {
-               /* TODO: we need to check if there's a glue record we need to
-                * create a referral to */
-               return DNS_ERR(NAME_ERROR);
-       }
-
-       el = ldb_msg_find_element(msg, attrs[0]);
-       if (el == NULL) {
-               return DNS_ERR(NAME_ERROR);
-       }
-
-       recs = talloc_zero_array(mem_ctx, struct dnsp_DnssrvRpcRecord, el->num_values);
-       W_ERROR_HAVE_NO_MEMORY(recs);
-       for (ri = 0; ri < el->num_values; ri++) {
-               struct ldb_val *v = &el->values[ri];
-               enum ndr_err_code ndr_err;
-
-               ndr_err = ndr_pull_struct_blob(v, recs, &recs[ri],
-                               (ndr_pull_flags_fn_t)ndr_pull_dnsp_DnssrvRpcRecord);
-               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-                       DEBUG(0, ("Failed to grab dnsp_DnssrvRpcRecord\n"));
-                       return DNS_ERR(SERVER_FAILURE);
-               }
-       }
-       *records = recs;
-       *rec_count = el->num_values;
-       return WERR_OK;
+       return dns_common_lookup(dns->samdb, mem_ctx, dn, records, rec_count);
 }
 
 WERROR dns_replace_records(struct dns_server *dns,
index f5c1903709fa016ce9bf883c04a4590840e70e8f..5c3cafbd2ee4e0f6c145849b95fdaea555964a42 100644 (file)
@@ -63,3 +63,81 @@ uint8_t werr_to_dns_err(WERROR werr)
        DEBUG(5, ("No mapping exists for %s\n", win_errstr(werr)));
        return DNS_RCODE_SERVFAIL;
 }
+
+WERROR dns_common_extract(const struct ldb_message_element *el,
+                         TALLOC_CTX *mem_ctx,
+                         struct dnsp_DnssrvRpcRecord **records,
+                         uint16_t *num_records)
+{
+       uint16_t ri;
+       struct dnsp_DnssrvRpcRecord *recs;
+
+       *records = NULL;
+       *num_records = 0;
+
+       recs = talloc_zero_array(mem_ctx, struct dnsp_DnssrvRpcRecord,
+                                el->num_values);
+       if (recs == NULL) {
+               return WERR_NOMEM;
+       }
+       for (ri = 0; ri < el->num_values; ri++) {
+               struct ldb_val *v = &el->values[ri];
+               enum ndr_err_code ndr_err;
+
+               ndr_err = ndr_pull_struct_blob(v, recs, &recs[ri],
+                               (ndr_pull_flags_fn_t)ndr_pull_dnsp_DnssrvRpcRecord);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       TALLOC_FREE(recs);
+                       DEBUG(0, ("Failed to grab dnsp_DnssrvRpcRecord\n"));
+                       return DNS_ERR(SERVER_FAILURE);
+               }
+       }
+       *records = recs;
+       *num_records = el->num_values;
+       return WERR_OK;
+}
+
+WERROR dns_common_lookup(struct ldb_context *samdb,
+                        TALLOC_CTX *mem_ctx,
+                        struct ldb_dn *dn,
+                        struct dnsp_DnssrvRpcRecord **records,
+                        uint16_t *num_records)
+{
+       static const char * const attrs[] = {
+               "dnsRecord",
+               NULL
+       };
+       int ret;
+       WERROR werr;
+       struct ldb_message *msg = NULL;
+       struct ldb_message_element *el;
+
+       *records = NULL;
+       *num_records = 0;
+
+       ret = dsdb_search_one(samdb, mem_ctx, &msg, dn,
+                             LDB_SCOPE_BASE, attrs, 0,
+                             "(objectClass=dnsNode)");
+       if (ret == LDB_ERR_NO_SUCH_OBJECT) {
+               return WERR_DNS_ERROR_NAME_DOES_NOT_EXIST;
+       }
+       if (ret != LDB_SUCCESS) {
+               /* TODO: we need to check if there's a glue record we need to
+                * create a referral to */
+               return DNS_ERR(NAME_ERROR);
+       }
+
+       el = ldb_msg_find_element(msg, "dnsRecord");
+       if (el == NULL) {
+               TALLOC_FREE(msg);
+               return DNS_ERR(NAME_ERROR);
+       }
+
+       werr = dns_common_extract(el, mem_ctx, records, num_records);
+       TALLOC_FREE(msg);
+       if (!W_ERROR_IS_OK(werr)) {
+               return werr;
+       }
+
+       return WERR_OK;
+}
index 41febe28d39d1f7b578938f3026ebccd84a0212e..4731780eea65da25e8e3477e6fc7971b8316e90d 100644 (file)
 uint8_t werr_to_dns_err(WERROR werr);
 #define DNS_ERR(err_str) WERR_DNS_ERROR_RCODE_##err_str
 
+struct ldb_message_element;
+
+WERROR dns_common_extract(const struct ldb_message_element *el,
+                         TALLOC_CTX *mem_ctx,
+                         struct dnsp_DnssrvRpcRecord **records,
+                         uint16_t *num_records);
+
+WERROR dns_common_lookup(struct ldb_context *samdb,
+                        TALLOC_CTX *mem_ctx,
+                        struct ldb_dn *dn,
+                        struct dnsp_DnssrvRpcRecord **records,
+                        uint16_t *num_records);
+
 #endif /* __DNSSERVER_COMMON_H__ */