s4:dsdb/common/util.c - provide a call which returns the forest function level
[amitay/samba.git] / source4 / dsdb / common / util.c
index b8d72781f618629307c444908d82c2f89ca3d3fc..7c5fd8a1b48ef000c5bbd510a2f989ccaff8311e 100644 (file)
@@ -1831,7 +1831,7 @@ bool samdb_is_pdc(struct ldb_context *ldb)
        }
 
        ret = ldb_search(ldb, tmp_ctx, &dom_res, ldb_get_default_basedn(ldb), LDB_SCOPE_BASE, dom_attrs, NULL);
-       if (ret) {
+       if (ret != LDB_SUCCESS) {
                DEBUG(1,("Searching for fSMORoleOwner in %s failed: %s\n", 
                         ldb_dn_get_linearized(ldb_get_default_basedn(ldb)), 
                         ldb_errstring(ldb)));
@@ -1877,7 +1877,7 @@ bool samdb_is_gc(struct ldb_context *ldb)
 
        /* Query cn=ntds settings,.... */
        ret = ldb_search(ldb, tmp_ctx, &res, samdb_ntds_settings_dn(ldb), LDB_SCOPE_BASE, attrs, NULL);
-       if (ret) {
+       if (ret != LDB_SUCCESS) {
                talloc_free(tmp_ctx);
                return false;
        }
@@ -1903,7 +1903,7 @@ int samdb_search_for_parent_domain(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
        TALLOC_CTX *local_ctx;
        struct ldb_dn *sdn = dn;
        struct ldb_result *res = NULL;
-       int ret = 0;
+       int ret = LDB_SUCCESS;
        const char *attrs[] = { NULL };
 
        local_ctx = talloc_new(mem_ctx);
@@ -2350,7 +2350,7 @@ struct ldb_dn *samdb_domain_to_dn(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
                                            domain_ref_attrs,
                                            "(&(nETBIOSName=%s)(objectclass=crossRef))", 
                                            escaped_domain);
-       if (ret_domain != 0) {
+       if (ret_domain != LDB_SUCCESS) {
                return NULL;
        }
 
@@ -2361,7 +2361,7 @@ struct ldb_dn *samdb_domain_to_dn(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
                                                LDB_SCOPE_BASE,
                                                domain_ref2_attrs,
                                                "(objectclass=domain)");
-               if (ret_domain != 0) {
+               if (ret_domain != LDB_SUCCESS) {
                        return NULL;
                }
 
@@ -2895,7 +2895,7 @@ int samdb_ntds_options(struct ldb_context *ldb, uint32_t *options)
        }
 
        ret = ldb_search(ldb, tmp_ctx, &res, samdb_ntds_settings_dn(ldb), LDB_SCOPE_BASE, attrs, NULL);
-       if (ret) {
+       if (ret != LDB_SUCCESS) {
                goto failed;
        }
 
@@ -2922,7 +2922,7 @@ const char* samdb_ntds_object_category(TALLOC_CTX *tmp_ctx, struct ldb_context *
        struct ldb_result *res;
 
        ret = ldb_search(ldb, tmp_ctx, &res, samdb_ntds_settings_dn(ldb), LDB_SCOPE_BASE, attrs, NULL);
-       if (ret) {
+       if (ret != LDB_SUCCESS) {
                goto failed;
        }
 
@@ -2965,8 +2965,7 @@ const char *samdb_cn_to_lDAPDisplayName(TALLOC_CTX *mem_ctx, const char *cn)
 }
 
 /*
-  return domain functional level
-  returns DS_DOMAIN_FUNCTION_*
+ * This detects and returns the domain functional level (DS_DOMAIN_FUNCTION_*)
  */
 int dsdb_functional_level(struct ldb_context *ldb)
 {
@@ -2979,6 +2978,20 @@ int dsdb_functional_level(struct ldb_context *ldb)
        return *domainFunctionality;
 }
 
+/*
+ * This detects and returns the forest functional level (DS_DOMAIN_FUNCTION_*)
+ */
+int dsdb_forest_functional_level(struct ldb_context *ldb)
+{
+       int *forestFunctionality =
+               talloc_get_type(ldb_get_opaque(ldb, "forestFunctionality"), int);
+       if (!forestFunctionality) {
+               DEBUG(0,(__location__ ": WARNING: forestFunctionality not setup\n"));
+               return DS_DOMAIN_FUNCTION_2000;
+       }
+       return *forestFunctionality;
+}
+
 /*
   set a GUID in an extended DN structure
  */
@@ -3209,7 +3222,7 @@ int dsdb_find_nc_root(struct ldb_context *samdb, TALLOC_CTX *mem_ctx, struct ldb
 
        ret = ldb_search(samdb, tmp_ctx, &root_res,
                         ldb_dn_new(tmp_ctx, samdb, ""), LDB_SCOPE_BASE, root_attrs, NULL);
-       if (ret) {
+       if (ret != LDB_SUCCESS) {
                DEBUG(1,("Searching for namingContexts in rootDSE failed: %s\n", ldb_errstring(samdb)));
                talloc_free(tmp_ctx);
                return ret;
@@ -3527,6 +3540,36 @@ int dsdb_request_add_controls(struct ldb_request *req, uint32_t dsdb_flags)
        return LDB_SUCCESS;
 }
 
+/*
+  an add with a set of controls
+*/
+int dsdb_add(struct ldb_context *ldb, const struct ldb_message *message,
+            uint32_t dsdb_flags)
+{
+       struct ldb_request *req;
+       int ret;
+
+       ret = ldb_build_add_req(&req, ldb, ldb,
+                               message,
+                               NULL,
+                               NULL,
+                               ldb_op_default_callback,
+                               NULL);
+
+       if (ret != LDB_SUCCESS) return ret;
+
+       ret = dsdb_request_add_controls(req, dsdb_flags);
+       if (ret != LDB_SUCCESS) {
+               talloc_free(req);
+               return ret;
+       }
+
+       ret = dsdb_autotransaction_request(ldb, req);
+
+       talloc_free(req);
+       return ret;
+}
+
 /*
   a modify with a set of controls
 */