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