From 6b749f225e8d1c910820a6576952f130e72bab84 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 26 Jun 2006 19:30:00 +0000 Subject: r16526: Add torture_setup_server() with test. (This used to be commit 6a1ed8ad756b97f61d4af9df2c7a7d889a2d09ef) --- source4/torture/util.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) (limited to 'source4/torture/util.c') diff --git a/source4/torture/util.c b/source4/torture/util.c index bd2bc493c5..5df90163ad 100644 --- a/source4/torture/util.c +++ b/source4/torture/util.c @@ -20,8 +20,12 @@ #include "includes.h" #include "system/filesys.h" +#include "system/wait.h" #include "torture/torture.h" +/** + create a temporary directory. +*/ _PUBLIC_ NTSTATUS torture_temp_dir(TALLOC_CTX *mem_ctx, char **tempdir) { *tempdir = talloc_strdup(mem_ctx, "torture-tmp.XXXXXX"); @@ -33,11 +37,79 @@ _PUBLIC_ NTSTATUS torture_temp_dir(TALLOC_CTX *mem_ctx, char **tempdir) } /** - check if 2 NTTIMEs are equal + check if 2 NTTIMEs are equal. */ BOOL nt_time_equal(NTTIME *t1, NTTIME *t2) { return *t1 == *t2; } +/** + * Provision a Samba installation using @param setupdir_script and start smbd. + */ +NTSTATUS torture_setup_server(TALLOC_CTX *mem_ctx, + const char *setupdir_script, + const char *smbd_path, + pid_t *smbd_pid) +{ + char *tempdir; + NTSTATUS status; + pid_t pid; + int child_status; + char *configfile, *configparam; + pid_t closed_pid; + + *smbd_pid = -1; + + status = torture_temp_dir(mem_ctx, &tempdir); + if (NT_STATUS_IS_ERR(status)) { + return status; + } + + if ((pid = fork()) == 0) { + execl(setupdir_script, setupdir_script, tempdir, NULL); + exit(1); + } else if (pid == -1) { + DEBUG(0, ("Unable to fork()\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + closed_pid = waitpid(pid, &child_status, 0); + + if (closed_pid == -1) { + DEBUG(1, ("Error waiting for child")); + return NT_STATUS_UNSUCCESSFUL; + } + + SMB_ASSERT(closed_pid == pid); + + if (!WIFEXITED(child_status) || WEXITSTATUS(child_status) != 0) { + DEBUG(1, ("Invalid return code from setup script %s: %d\n", + setupdir_script, + WEXITSTATUS(child_status))); + return NT_STATUS_UNSUCCESSFUL; + } + + configfile = talloc_asprintf(mem_ctx, "%s/etc/smb.conf", + tempdir); + if (!file_exist(configfile)) { + DEBUG(1, ("Setup script didn't create %s\n", configfile)); + return NT_STATUS_UNSUCCESSFUL; + } + + configparam = talloc_asprintf(mem_ctx, "--configfile=%s", configfile); + talloc_free(configfile); + if ((pid = fork()) == 0) { + execl(smbd_path, smbd_path, "-i", "--model=single", + configparam, NULL); + exit(1); + } else if (pid == -1) { + DEBUG(0, ("Unable to fork()\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + *smbd_pid = pid; + + return NT_STATUS_OK; +} -- cgit