svn commit: samba r11403 - in branches/SAMBA_4_0/source/lib/ldb/ldb_ildap: .

tridge at samba.org tridge at samba.org
Mon Oct 31 02:13:03 GMT 2005


Author: tridge
Date: 2005-10-31 02:13:02 +0000 (Mon, 31 Oct 2005)
New Revision: 11403

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=11403

Log:

improved the error handling in the ildap ldb backend. Now passes
through all ldap errors except on search. Search errors are only
available via ldb_errstring() until we decide how to fix ldb_search().


Modified:
   branches/SAMBA_4_0/source/lib/ldb/ldb_ildap/ldb_ildap.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_ildap/ldb_ildap.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb_ildap/ldb_ildap.c	2005-10-31 02:12:13 UTC (rev 11402)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb_ildap/ldb_ildap.c	2005-10-31 02:13:02 UTC (rev 11403)
@@ -32,17 +32,35 @@
 #include "includes.h"
 #include "ldb/include/ldb.h"
 #include "ldb/include/ldb_private.h"
+#include "ldb/include/ldb_errors.h"
 #include "libcli/ldap/ldap.h"
 #include "libcli/ldap/ldap_client.h"
 #include "lib/cmdline/popt_common.h"
 
 struct ildb_private {
 	struct ldap_connection *ldap;
-	NTSTATUS last_rc;
 	struct ldb_message *rootDSE;
+	struct ldb_context *ldb;
 };
 
+
 /*
+  map an ildap NTSTATUS to a ldb error code
+*/
+static int ildb_map_error(struct ildb_private *ildb, NTSTATUS status)
+{
+	if (NT_STATUS_IS_OK(status)) {
+		return LDB_SUCCESS;
+	}
+	talloc_free(ildb->ldb->err_string);
+	ildb->ldb->err_string = talloc_strdup(ildb, ldap_errstr(ildb->ldap, status));
+	if (NT_STATUS_IS_LDAP(status)) {
+		return NT_STATUS_LDAP_CODE(status);
+	}
+	return LDB_ERR_OPERATIONS_ERROR;
+}
+
+/*
   rename a record
 */
 static int ildb_rename(struct ldb_module *module, const struct ldb_dn *olddn, const struct ldb_dn *newdn)
@@ -52,19 +70,22 @@
 	int ret = 0;
 	char *old_dn;
 	char *newrdn, *parentdn;
+	NTSTATUS status;
 
 	/* ignore ltdb specials */
 	if (ldb_dn_is_special(olddn) || ldb_dn_is_special(newdn)) {
-		return 0;
+		return LDB_SUCCESS;
 	}
 
 	local_ctx = talloc_named(ildb, 0, "ildb_rename local context");
 	if (local_ctx == NULL) {
-		return -1;
+		ret = LDB_ERR_OPERATIONS_ERROR;
+		goto failed;
 	}
 
 	old_dn = ldb_dn_linearize(local_ctx, olddn);
 	if (old_dn == NULL) {
+		ret = LDB_ERR_INVALID_DN_SYNTAX;
 		goto failed;
 	}
 
@@ -72,26 +93,22 @@
 					    newdn->components[0].name,
 					    ldb_dn_escape_value(ildb, newdn->components[0].value));
 	if (newrdn == NULL) {
+		ret = LDB_ERR_OPERATIONS_ERROR;
 		goto failed;
 	}
 
 	parentdn = ldb_dn_linearize(local_ctx, ldb_dn_get_parent(ildb, newdn));
 	if (parentdn == NULL) {
+		ret = LDB_ERR_INVALID_DN_SYNTAX;
 		goto failed;
 	}
 
-	ildb->last_rc = ildap_rename(ildb->ldap, old_dn, newrdn, parentdn, True);
-	if (!NT_STATUS_IS_OK(ildb->last_rc)) {
-		ldb_set_errstring(module, talloc_strdup(module, ldap_errstr(ildb->ldap, ildb->last_rc)));
-		ret = -1;
-	}
+	status = ildap_rename(ildb->ldap, old_dn, newrdn, parentdn, True);
+	ret = ildb_map_error(ildb, status);
 
+failed:
 	talloc_free(local_ctx);
 	return ret;
-
-failed:
-	talloc_free(local_ctx);
-	return -1;
 }
 
 /*
@@ -102,20 +119,21 @@
 	struct ildb_private *ildb = module->private_data;
 	char *del_dn;
 	int ret = 0;
+	NTSTATUS status;
 
 	/* ignore ltdb specials */
 	if (ldb_dn_is_special(dn)) {
-		return 0;
+		return LDB_SUCCESS;
 	}
 	
 	del_dn = ldb_dn_linearize(ildb, dn);
-
-	ildb->last_rc = ildap_delete(ildb->ldap, del_dn);
-	if (!NT_STATUS_IS_OK(ildb->last_rc)) {
-		ldb_set_errstring(module, talloc_strdup(module, ldap_errstr(ildb->ldap, ildb->last_rc)));
-		ret = -1;
+	if (del_dn == NULL) {
+		return LDB_ERR_INVALID_DN_SYNTAX;
 	}
 
+	status = ildap_delete(ildb->ldap, del_dn);
+	ret = ildb_map_error(ildb, status);
+
 	talloc_free(del_dn);
 
 	return ret;
@@ -135,6 +153,7 @@
 	int count, i;
 	struct ldap_message **ldapres, *msg;
 	char *search_base;
+	NTSTATUS status;
 
 	if (scope == LDB_SCOPE_DEFAULT) {
 		scope = LDB_SCOPE_SUBTREE;
@@ -163,11 +182,11 @@
 		return -1;
 	}
 
-	ildb->last_rc = ildap_search_bytree(ildb->ldap, search_base, scope, tree, attrs, 
+	status = ildap_search_bytree(ildb->ldap, search_base, scope, tree, attrs, 
 					    0, &ldapres);
 	talloc_free(search_base);
-	if (!NT_STATUS_IS_OK(ildb->last_rc)) {
-		ldb_set_errstring(module, talloc_strdup(module, ldap_errstr(ildb->ldap, ildb->last_rc)));
+	if (!NT_STATUS_IS_OK(status)) {
+		ildb_map_error(ildb, status);
 		return -1;
 	}
 
@@ -280,28 +299,26 @@
 	struct ldap_mod **mods;
 	char *dn;
 	int ret = 0;
+	NTSTATUS status;
 
 	/* ignore ltdb specials */
 	if (ldb_dn_is_special(msg->dn)) {
-		return 0;
+		return LDB_SUCCESS;
 	}
 
 	mods = ildb_msg_to_mods(ldb, msg, 0);
 	if (mods == NULL) {
-		return -1;
+		return LDB_ERR_OPERATIONS_ERROR;
 	}
 
 	dn = ldb_dn_linearize(mods, msg->dn);
 	if (dn == NULL) {
 		talloc_free(mods);
-		return -1;
+		return LDB_ERR_INVALID_DN_SYNTAX;
 	}
 
-	ildb->last_rc = ildap_add(ildb->ldap, dn, mods);
-	if (!NT_STATUS_IS_OK(ildb->last_rc)) {
-		ldb_set_errstring(module, talloc_strdup(module, ldap_errstr(ildb->ldap, ildb->last_rc)));
-		ret = -1;
-	}
+	status = ildap_add(ildb->ldap, dn, mods);
+	ret = ildb_map_error(ildb, status);
 
 	talloc_free(mods);
 
@@ -319,28 +336,26 @@
 	struct ldap_mod **mods;
 	char *dn;
 	int ret = 0;
+	NTSTATUS status;
 
 	/* ignore ltdb specials */
 	if (ldb_dn_is_special(msg->dn)) {
-		return 0;
+		return LDB_SUCCESS;
 	}
 
 	mods = ildb_msg_to_mods(ldb, msg, 1);
 	if (mods == NULL) {
-		return -1;
+		return LDB_ERR_OPERATIONS_ERROR;
 	}
 
 	dn = ldb_dn_linearize(mods, msg->dn);
 	if (dn == NULL) {
 		talloc_free(mods);
-		return -1;
+		return LDB_ERR_INVALID_DN_SYNTAX;
 	}
 
-	ildb->last_rc = ildap_modify(ildb->ldap, dn, mods);
-	if (!NT_STATUS_IS_OK(ildb->last_rc)) {
-		ldb_set_errstring(module, talloc_strdup(module, ldap_errstr(ildb->ldap, ildb->last_rc)));
-		ret = -1;
-	}
+	status = ildap_modify(ildb->ldap, dn, mods);
+	ret = ildb_map_error(ildb, status);
 
 	talloc_free(mods);
 
@@ -418,6 +433,7 @@
 	}
 
 	ildb->rootDSE = NULL;
+	ildb->ldb     = ldb;
 
 	ildb->ldap = ldap_new_connection(ildb, ldb_get_opaque(ldb, "EventContext"));
 	if (!ildb->ldap) {



More information about the samba-cvs mailing list