summaryrefslogtreecommitdiff
path: root/source3/lib/util_tdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib/util_tdb.c')
-rw-r--r--source3/lib/util_tdb.c52
1 files changed, 10 insertions, 42 deletions
diff --git a/source3/lib/util_tdb.c b/source3/lib/util_tdb.c
index 338a0fabdb..65ecb1759d 100644
--- a/source3/lib/util_tdb.c
+++ b/source3/lib/util_tdb.c
@@ -989,8 +989,7 @@ NTSTATUS map_nt_error_from_tdb(enum TDB_ERROR err)
* internal validation function, executed by the child.
*/
static int tdb_validate_child(const char *tdb_path,
- tdb_validate_data_func validate_fn,
- int pfd)
+ tdb_validate_data_func validate_fn)
{
int ret = -1;
int num_entries = 0;
@@ -1047,9 +1046,12 @@ out:
tdb_close(tdb);
}
- DEBUG(10, ("tdb_validate_child: writing status to pipe\n"));
- write (pfd, (const char *)&v_status, sizeof(v_status));
- close(pfd);
+ 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"));
+ DEBUGADD(10, (" * bad entry: %s\n", v_status.bad_entry ? "yes" : "no"));
+ DEBUGADD(10, (" * unknown key: %s\n", v_status.unknown_key ? "yes" : "no"));
+ DEBUGADD(10, (" => overall success: %s\n", v_status.success ? "yes" : "no"));
return ret;
}
@@ -1060,29 +1062,19 @@ int tdb_validate(const char *tdb_path, tdb_validate_data_func validate_fn)
int child_status = 0;
int wait_pid = 0;
int ret = -1;
- int pipe_fds[2];
- struct tdb_validation_status v_status;
- int bytes_read = 0;
/* 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.
- * communicate the extended status struct over a pipe. */
-
- if (pipe(pipe_fds) != 0) {
- DEBUG(0, ("tdb_validate: unable to create pipe, "
- "error %s", strerror(errno)));
- smb_panic("tdb_validate: unable to create pipe.");
- }
+ * just let the child panic. we catch the signal. */
DEBUG(10, ("tdb_validate: forking to let child do validation.\n"));
child_pid = sys_fork();
if (child_pid == 0) {
+ /* child code */
DEBUG(10, ("tdb_validate (validation child): created\n"));
- close(pipe_fds[0]); /* close reading fd */
DEBUG(10, ("tdb_validate (validation child): "
"calling tdb_validate_child\n"));
- exit(tdb_validate_child(tdb_path, validate_fn, pipe_fds[1]));
+ exit(tdb_validate_child(tdb_path, validate_fn));
}
else if (child_pid < 0) {
smb_panic("tdb_validate: fork for validation failed.");
@@ -1092,30 +1084,6 @@ int tdb_validate(const char *tdb_path, tdb_validate_data_func validate_fn)
DEBUG(10, ("tdb_validate: fork succeeded, child PID = %d\n",
child_pid));
- close(pipe_fds[1]); /* close writing fd */
-
- v_status.success = True;
- v_status.bad_entry = False;
- v_status.unknown_key = False;
-
- DEBUG(10, ("tdb_validate: reading from pipe.\n"));
- bytes_read = read(pipe_fds[0], (void *)&v_status, sizeof(v_status));
- close(pipe_fds[0]);
-
- if (bytes_read != sizeof(v_status)) {
- DEBUG(10, ("tdb_validate: read %d bytes from pipe "
- "but expected %d", bytes_read, (int)sizeof(v_status)));
- DEBUGADD(10, (" -> assuming child crashed\n"));
- v_status.success = False;
- }
- else {
- DEBUG(10, ("tdb_validate: read status from child\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"));
- DEBUGADD(10, (" * bad entry: %s\n", v_status.bad_entry ? "yes" : "no"));
- DEBUGADD(10, (" * unknown key: %s\n", v_status.unknown_key ? "yes" : "no"));
- DEBUGADD(10, (" => overall success: %s\n", v_status.success ? "yes" : "no"));
- }
DEBUG(10, ("tdb_validate: waiting for child to finish...\n"));
while ((wait_pid = sys_waitpid(child_pid, &child_status, 0)) < 0) {