svn commit: samba r24848 - in branches: SAMBA_3_2/source/lib SAMBA_3_2/source/nsswitch SAMBA_3_2_0/source/lib SAMBA_3_2_0/source/nsswitch

obnox at samba.org obnox at samba.org
Fri Aug 31 16:30:42 GMT 2007


Author: obnox
Date: 2007-08-31 16:30:40 +0000 (Fri, 31 Aug 2007)
New Revision: 24848

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

Log:
Make tdb_validate() take an open tdb handle instead of a file name.
A new wrapper tdb_validate_open() takes a filename an opens and closes
the tdb before and after calling tdb_validate() respectively.

winbindd_validata_cache_nobackup() now dynamically calls one of
the above functions depending on whether the cache tdb has already
been opened or not.

Michael


Modified:
   branches/SAMBA_3_2/source/lib/util_tdb.c
   branches/SAMBA_3_2/source/nsswitch/winbindd_cache.c
   branches/SAMBA_3_2_0/source/lib/util_tdb.c
   branches/SAMBA_3_2_0/source/nsswitch/winbindd_cache.c


Changeset:
Modified: branches/SAMBA_3_2/source/lib/util_tdb.c
===================================================================
--- branches/SAMBA_3_2/source/lib/util_tdb.c	2007-08-31 15:51:05 UTC (rev 24847)
+++ branches/SAMBA_3_2/source/lib/util_tdb.c	2007-08-31 16:30:40 UTC (rev 24848)
@@ -1010,12 +1010,11 @@
 /* 
  * internal validation function, executed by the child.  
  */
-static int tdb_validate_child(const char *tdb_path,
+static int tdb_validate_child(struct tdb_context *tdb,
 			      tdb_validate_data_func validate_fn)
 {
 	int ret = 1;
 	int num_entries = 0;
-	TDB_CONTEXT *tdb = NULL;
 	struct tdb_validation_status v_status;
 
 	v_status.tdb_error = False;
@@ -1024,7 +1023,6 @@
 	v_status.unknown_key = False;
 	v_status.success = True;
 
-	tdb = tdb_open_log(tdb_path, 0, TDB_DEFAULT, O_RDONLY, 0);
 	if (!tdb) {
 		v_status.tdb_error = True;
 		v_status.success = False;
@@ -1039,7 +1037,7 @@
 	}
 
 	DEBUG(10,("tdb_validate_child: tdb %s freelist has %d entries\n",
-		  tdb_path, num_entries));
+		  tdb_name(tdb), num_entries));
 
 	/* Now traverse the tdb to validate it. */
 	num_entries = tdb_traverse(tdb, validate_fn, (void *)&v_status);
@@ -1052,14 +1050,10 @@
 	}
 
 	DEBUG(10,("tdb_validate_child: tdb %s is good with %d entries\n",
-		  tdb_path, num_entries));
+		  tdb_name(tdb), num_entries));
 	ret = 0; /* Cache is good. */
 
 out:
-	if (tdb) {
-		tdb_close(tdb);
-	}
-
 	DEBUG(10,   ("tdb_validate_child: summary of validation status:\n"));
 	DEBUGADD(10,(" * tdb error: %s\n", v_status.tdb_error ? "yes" : "no"));
 	DEBUGADD(10,(" * bad freelist: %s\n",v_status.bad_freelist?"yes":"no"));
@@ -1071,17 +1065,24 @@
 }
 
 /*
- * tdb validation function returns 0 if tdb is ok, != 0 if it isn't.
+ * tdb validation function.
+ * returns 0 if tdb is ok, != 0 if it isn't.
+ * this function expects an opened tdb.
  */
-int tdb_validate(const char *tdb_path, tdb_validate_data_func validate_fn)
+int tdb_validate(struct tdb_context *tdb, tdb_validate_data_func validate_fn)
 {
 	pid_t child_pid = -1;
 	int child_status = 0;
 	int wait_pid = 0;
 	int ret = 1;
 
-	DEBUG(5, ("tdb_validate called for tdb '%s'\n", tdb_path));
+	if (tdb == NULL) {
+		DEBUG(1, ("Error: tdb_validate called with tdb == NULL\n"));
+		return ret;
+	}
 
+	DEBUG(5, ("tdb_validate called for tdb '%s'\n", tdb_name(tdb)));
+
 	/* fork and let the child do the validation.
 	 * benefit: no need to twist signal handlers and panic functions.
 	 * just let the child panic. we catch the signal. */
@@ -1093,7 +1094,7 @@
 		DEBUG(10, ("tdb_validate (validation child): created\n"));
 		DEBUG(10, ("tdb_validate (validation child): "
 			   "calling tdb_validate_child\n"));
-		exit(tdb_validate_child(tdb_path, validate_fn));
+		exit(tdb_validate_child(tdb, validate_fn));
 	}
 	else if (child_pid < 0) {
 		smb_panic("tdb_validate: fork for validation failed.");
@@ -1144,12 +1145,36 @@
 	}
 
 	DEBUG(5, ("tdb_validate returning code '%d' for tdb '%s'\n", ret,
-		  tdb_path));
+		  tdb_name(tdb)));
 
 	return ret;
 }
 
 /*
+ * tdb validation function.
+ * returns 0 if tdb is ok, != 0 if it isn't.
+ * this is a wrapper around the actual validation function that opens and closes
+ * the tdb.
+ */
+int tdb_validate_open(const char *tdb_path, tdb_validate_data_func validate_fn)
+{
+	TDB_CONTEXT *tdb = NULL;
+	int ret = 1;
+
+	DEBUG(5, ("tdb_validate_open called for tdb '%s'\n", tdb_path));
+
+	tdb = tdb_open_log(tdb_path, 0, TDB_DEFAULT, O_RDONLY, 0);
+	if (!tdb) {
+		DEBUG(1, ("Error opening tdb %s\n", tdb_path));
+		return ret;
+	}
+
+	ret = tdb_validate(tdb, validate_fn);
+	tdb_close(tdb);
+	return ret;
+}
+
+/*
  * tdb backup function and helpers for tdb_validate wrapper with backup
  * handling.
  */
@@ -1397,7 +1422,7 @@
 
 	tdb_path_backup = talloc_asprintf(ctx, "%s%s", tdb_path, backup_suffix);
 
-	ret = tdb_validate(tdb_path, validate_fn);
+	ret = tdb_validate_open(tdb_path, validate_fn);
 
 	if (ret == 0) {
 		DEBUG(1, ("tdb '%s' is valid\n", tdb_path));
@@ -1422,7 +1447,7 @@
 			DEBUG(1, ("No backup found.\n"));
 		} else {
 			DEBUG(1, ("backup '%s' found.\n", tdb_path_backup));
-			ret = tdb_validate(tdb_path_backup, validate_fn);
+			ret = tdb_validate_open(tdb_path_backup, validate_fn);
 			if (ret != 0) {
 				DEBUG(1, ("Backup '%s' is invalid.\n",
 					  tdb_path_backup));

Modified: branches/SAMBA_3_2/source/nsswitch/winbindd_cache.c
===================================================================
--- branches/SAMBA_3_2/source/nsswitch/winbindd_cache.c	2007-08-31 15:51:05 UTC (rev 24847)
+++ branches/SAMBA_3_2/source/nsswitch/winbindd_cache.c	2007-08-31 16:30:40 UTC (rev 24848)
@@ -3329,8 +3329,13 @@
 	DEBUG(10, ("winbindd_validate_cache: replacing panic function\n"));
 	smb_panic_fn = validate_panic;
 
-	ret = tdb_validate(tdb_path, cache_traverse_validate_fn);
 
+	if (wcache == NULL || wcache->tdb == NULL) {
+		ret = tdb_validate_open(tdb_path, cache_traverse_validate_fn);
+	} else {
+		ret = tdb_validate(wcache->tdb, cache_traverse_validate_fn);
+	}
+
 	if (ret != 0) {
 		DEBUG(10, ("winbindd_validate_cache_nobackup: validation not "
 			   "successful.\n"));

Modified: branches/SAMBA_3_2_0/source/lib/util_tdb.c
===================================================================
--- branches/SAMBA_3_2_0/source/lib/util_tdb.c	2007-08-31 15:51:05 UTC (rev 24847)
+++ branches/SAMBA_3_2_0/source/lib/util_tdb.c	2007-08-31 16:30:40 UTC (rev 24848)
@@ -1010,12 +1010,11 @@
 /* 
  * internal validation function, executed by the child.  
  */
-static int tdb_validate_child(const char *tdb_path,
+static int tdb_validate_child(struct tdb_context *tdb,
 			      tdb_validate_data_func validate_fn)
 {
 	int ret = 1;
 	int num_entries = 0;
-	TDB_CONTEXT *tdb = NULL;
 	struct tdb_validation_status v_status;
 
 	v_status.tdb_error = False;
@@ -1024,7 +1023,6 @@
 	v_status.unknown_key = False;
 	v_status.success = True;
 
-	tdb = tdb_open_log(tdb_path, 0, TDB_DEFAULT, O_RDONLY, 0);
 	if (!tdb) {
 		v_status.tdb_error = True;
 		v_status.success = False;
@@ -1039,7 +1037,7 @@
 	}
 
 	DEBUG(10,("tdb_validate_child: tdb %s freelist has %d entries\n",
-		  tdb_path, num_entries));
+		  tdb_name(tdb), num_entries));
 
 	/* Now traverse the tdb to validate it. */
 	num_entries = tdb_traverse(tdb, validate_fn, (void *)&v_status);
@@ -1052,14 +1050,10 @@
 	}
 
 	DEBUG(10,("tdb_validate_child: tdb %s is good with %d entries\n",
-		  tdb_path, num_entries));
+		  tdb_name(tdb), num_entries));
 	ret = 0; /* Cache is good. */
 
 out:
-	if (tdb) {
-		tdb_close(tdb);
-	}
-
 	DEBUG(10,   ("tdb_validate_child: summary of validation status:\n"));
 	DEBUGADD(10,(" * tdb error: %s\n", v_status.tdb_error ? "yes" : "no"));
 	DEBUGADD(10,(" * bad freelist: %s\n",v_status.bad_freelist?"yes":"no"));
@@ -1071,17 +1065,24 @@
 }
 
 /*
- * tdb validation function returns 0 if tdb is ok, != 0 if it isn't.
+ * tdb validation function.
+ * returns 0 if tdb is ok, != 0 if it isn't.
+ * this function expects an opened tdb.
  */
-int tdb_validate(const char *tdb_path, tdb_validate_data_func validate_fn)
+int tdb_validate(struct tdb_context *tdb, tdb_validate_data_func validate_fn)
 {
 	pid_t child_pid = -1;
 	int child_status = 0;
 	int wait_pid = 0;
 	int ret = 1;
 
-	DEBUG(5, ("tdb_validate called for tdb '%s'\n", tdb_path));
+	if (tdb == NULL) {
+		DEBUG(1, ("Error: tdb_validate called with tdb == NULL\n"));
+		return ret;
+	}
 
+	DEBUG(5, ("tdb_validate called for tdb '%s'\n", tdb_name(tdb)));
+
 	/* fork and let the child do the validation.
 	 * benefit: no need to twist signal handlers and panic functions.
 	 * just let the child panic. we catch the signal. */
@@ -1093,7 +1094,7 @@
 		DEBUG(10, ("tdb_validate (validation child): created\n"));
 		DEBUG(10, ("tdb_validate (validation child): "
 			   "calling tdb_validate_child\n"));
-		exit(tdb_validate_child(tdb_path, validate_fn));
+		exit(tdb_validate_child(tdb, validate_fn));
 	}
 	else if (child_pid < 0) {
 		smb_panic("tdb_validate: fork for validation failed.");
@@ -1144,12 +1145,36 @@
 	}
 
 	DEBUG(5, ("tdb_validate returning code '%d' for tdb '%s'\n", ret,
-		  tdb_path));
+		  tdb_name(tdb)));
 
 	return ret;
 }
 
 /*
+ * tdb validation function.
+ * returns 0 if tdb is ok, != 0 if it isn't.
+ * this is a wrapper around the actual validation function that opens and closes
+ * the tdb.
+ */
+int tdb_validate_open(const char *tdb_path, tdb_validate_data_func validate_fn)
+{
+	TDB_CONTEXT *tdb = NULL;
+	int ret = 1;
+
+	DEBUG(5, ("tdb_validate_open called for tdb '%s'\n", tdb_path));
+
+	tdb = tdb_open_log(tdb_path, 0, TDB_DEFAULT, O_RDONLY, 0);
+	if (!tdb) {
+		DEBUG(1, ("Error opening tdb %s\n", tdb_path));
+		return ret;
+	}
+
+	ret = tdb_validate(tdb, validate_fn);
+	tdb_close(tdb);
+	return ret;
+}
+
+/*
  * tdb backup function and helpers for tdb_validate wrapper with backup
  * handling.
  */
@@ -1397,7 +1422,7 @@
 
 	tdb_path_backup = talloc_asprintf(ctx, "%s%s", tdb_path, backup_suffix);
 
-	ret = tdb_validate(tdb_path, validate_fn);
+	ret = tdb_validate_open(tdb_path, validate_fn);
 
 	if (ret == 0) {
 		DEBUG(1, ("tdb '%s' is valid\n", tdb_path));
@@ -1422,7 +1447,7 @@
 			DEBUG(1, ("No backup found.\n"));
 		} else {
 			DEBUG(1, ("backup '%s' found.\n", tdb_path_backup));
-			ret = tdb_validate(tdb_path_backup, validate_fn);
+			ret = tdb_validate_open(tdb_path_backup, validate_fn);
 			if (ret != 0) {
 				DEBUG(1, ("Backup '%s' is invalid.\n",
 					  tdb_path_backup));

Modified: branches/SAMBA_3_2_0/source/nsswitch/winbindd_cache.c
===================================================================
--- branches/SAMBA_3_2_0/source/nsswitch/winbindd_cache.c	2007-08-31 15:51:05 UTC (rev 24847)
+++ branches/SAMBA_3_2_0/source/nsswitch/winbindd_cache.c	2007-08-31 16:30:40 UTC (rev 24848)
@@ -3329,8 +3329,13 @@
 	DEBUG(10, ("winbindd_validate_cache: replacing panic function\n"));
 	smb_panic_fn = validate_panic;
 
-	ret = tdb_validate(tdb_path, cache_traverse_validate_fn);
 
+	if (wcache == NULL || wcache->tdb == NULL) {
+		ret = tdb_validate_open(tdb_path, cache_traverse_validate_fn);
+	} else {
+		ret = tdb_validate(wcache->tdb, cache_traverse_validate_fn);
+	}
+
 	if (ret != 0) {
 		DEBUG(10, ("winbindd_validate_cache_nobackup: validation not "
 			   "successful.\n"));



More information about the samba-cvs mailing list