aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortradke <tradke@b32723a9-ab3a-4a60-88e2-2e5d99d7c17a>2006-05-11 14:20:34 +0000
committertradke <tradke@b32723a9-ab3a-4a60-88e2-2e5d99d7c17a>2006-05-11 14:20:34 +0000
commitd74fb47b045f8660182e045779e81244f83710f1 (patch)
tree551c83f84205624ded4b3ac5b394f4c6ccd39a33
parent783c8163b39f692cafd93fad715e9040937d7bfc (diff)
Introduce new boolean parameter IO::require_empty_output_directory
which can be used to test if IO::out_dir points to either a non-existing or empty directory at simulation startup. If this parameter is set to "yes" and an already existing IO::out_dir is found to have any contents (eg. output files from a previous simulation which was using the same output directory) Cactus will print an appropriate error message and abort, as opposed to continuing and (potentially by accident) overwriting existing files. The default for IO::require_empty_output_directory is "no". This applies patch http://www.cactuscode.org/old/pipermail/patches/2006-May/000168.html. git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/IOUtil/trunk@239 b32723a9-ab3a-4a60-88e2-2e5d99d7c17a
-rw-r--r--param.ccl3
-rw-r--r--src/Startup.c51
2 files changed, 51 insertions, 3 deletions
diff --git a/param.ccl b/param.ccl
index e8ee4b6..1471218 100644
--- a/param.ccl
+++ b/param.ccl
@@ -52,6 +52,9 @@ BOOLEAN print_timing_info "Print timing information on I/O operations." STEERABL
BOOLEAN new_filename_scheme "Use the new filename scheme for output files ?" STEERABLE = RECOVER
{
} "yes"
+BOOLEAN require_empty_output_directory "Require that IO::out_dir is empty at startup ?" STEERABLE = RECOVER
+{
+} "no"
BOOLEAN strict_io_parameter_check "Stop on errors while parsing I/O parameters from parameter file ?" STEERABLE = RECOVER
{
} "yes"
diff --git a/src/Startup.c b/src/Startup.c
index 3417117..4f70c4c 100644
--- a/src/Startup.c
+++ b/src/Startup.c
@@ -25,6 +25,9 @@
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
#include "ioGH.h"
#include "ioutil_Utils.h"
@@ -218,6 +221,10 @@ static void *SetupGH (tFleshConfig *config, int convergence_level, cGH *GH)
{
int i, maxdim, myproc;
ioGH *myGH;
+#ifdef HAVE_DIRENT_H
+ DIR *dir;
+ struct dirent *file;
+#endif
DECLARE_CCTK_PARAMETERS
@@ -284,10 +291,48 @@ static void *SetupGH (tFleshConfig *config, int convergence_level, cGH *GH)
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"Problem creating default output directory '%s'", out_dir);
}
- else if (i > 0 && CCTK_Equals (verbose, "full"))
+ else if (i > 0)
{
- CCTK_VInfo (CCTK_THORNSTRING,
- "default output directory '%s' already exists", out_dir);
+ if (CCTK_Equals (verbose, "full"))
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "default output directory '%s' already exists", out_dir);
+ }
+ if (require_empty_output_directory)
+ {
+#ifdef HAVE_DIRENT_H
+ i = 0;
+ dir = opendir (out_dir);
+ while ((file = readdir (dir)) != NULL)
+ {
+ if (strcmp (file->d_name, ".") == 0 ||
+ strcmp (file->d_name, "..") == 0)
+ {
+ continue;
+ }
+ CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Found file '%s' in already existing output directory '%s'",
+ file->d_name, out_dir);
+ i++;
+ }
+ closedir (dir);
+ if (i)
+ {
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "You have set IO::out_dir = '%s' and "
+ "IO::require_empty_output_directory = 'yes'. "
+ "This output directory already exists and is non-empty.",
+ out_dir);
+ }
+#else
+ /* No opendir(3) ??? It's probably a Windows box, so just give up ! */
+ CCTK_WARN (0, "You cannot use 'IO::require_empty_output_directory = "
+ "\"yes\"' on this architecture because it doesn't provide "
+ "opendir(3) to browse the IO::out_dir directory.\n"
+ "Please use 'IO::require_empty_output_directories = "
+ "\"no\"' instead !");
+#endif
+ }
}
i = IOUtil_CreateDirectory (GH, checkpoint_dir,
! CCTK_Equals (out_mode, "onefile"),