From 74ed86c4e3d997a283e1ac03237ece9397242d81 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 6 Jul 2010 15:22:31 +1000 Subject: lib/torture: Add function to clean up the output directory This helps to avoid leaving 85MB of provision around for every NET-API-BECOME-DC test. Andrew Bartlett Signed-off-by: Matthieu Patou --- lib/torture/torture.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++- lib/torture/torture.h | 1 + 2 files changed, 66 insertions(+), 1 deletion(-) (limited to 'lib/torture') diff --git a/lib/torture/torture.c b/lib/torture/torture.c index 74dfce19db..ead89cdd5e 100644 --- a/lib/torture/torture.c +++ b/lib/torture/torture.c @@ -23,6 +23,7 @@ #include "../lib/util/dlinklist.h" #include "param/param.h" #include "system/filesys.h" +#include "system/dir.h" struct torture_results *torture_results_init(TALLOC_CTX *mem_ctx, const struct torture_ui_ops *ui_ops) @@ -75,7 +76,7 @@ struct torture_context *torture_context_child(struct torture_context *parent) } /** - create a temporary directory. + create a temporary directory under the output dir */ _PUBLIC_ NTSTATUS torture_temp_dir(struct torture_context *tctx, const char *prefix, char **tempdir) @@ -93,6 +94,69 @@ _PUBLIC_ NTSTATUS torture_temp_dir(struct torture_context *tctx, return NT_STATUS_OK; } +static int local_deltree(const char *path) +{ + int ret; + struct dirent *dirent; + DIR *dir = opendir(path); + if (!dir) { + char *error = talloc_asprintf(NULL, "Could not open directory %s", path); + perror(error); + talloc_free(error); + return -1; + } + while ((dirent = readdir(dir))) { + char *name; + if ((strcmp(dirent->d_name, ".") == 0) || (strcmp(dirent->d_name, "..") == 0)) { + continue; + } + name = talloc_asprintf(NULL, "%s/%s", path, + dirent->d_name); + if (name == NULL) { + closedir(dir); + return -1; + } + ret = remove(name); + if (ret == 0) { + talloc_free(name); + continue; + } + + if (errno == ENOTEMPTY) { + ret = local_deltree(name); + if (ret == 0) { + ret = remove(name); + } + } + talloc_free(name); + if (ret != 0) { + char *error = talloc_asprintf(NULL, "Could not remove %s", path); + perror(error); + talloc_free(error); + break; + } + } + closedir(dir); + return ret; +} + +_PUBLIC_ NTSTATUS torture_deltree_outputdir(struct torture_context *tctx) +{ + SMB_ASSERT(tctx->outputdir != NULL); + if ((strcmp(tctx->outputdir, "/") == 0) + || (strcmp(tctx->outputdir, "") == 0)) { + return NT_STATUS_INVALID_PARAMETER; + } + + if (local_deltree(tctx->outputdir) == -1) { + if (errno != 0) { + return map_nt_error_from_unix(errno); + } + return NT_STATUS_UNSUCCESSFUL; + } + return NT_STATUS_OK; +} + /** * Comment on the status/progress of a test */ diff --git a/lib/torture/torture.h b/lib/torture/torture.h index 01947e773d..605ba341eb 100644 --- a/lib/torture/torture.h +++ b/lib/torture/torture.h @@ -488,6 +488,7 @@ unsigned long torture_setting_ulong(struct torture_context *test, NTSTATUS torture_temp_dir(struct torture_context *tctx, const char *prefix, char **tempdir); +NTSTATUS torture_deltree_outputdir(struct torture_context *tctx); struct torture_test *torture_tcase_add_simple_test(struct torture_tcase *tcase, const char *name, -- cgit