diff options
-rw-r--r-- | param.ccl | 3 | ||||
-rw-r--r-- | src/Startup.c | 51 |
2 files changed, 51 insertions, 3 deletions
@@ -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"), |