about summary refs log tree commit diff homepage
path: root/tools/klee-replay/file-creator.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/klee-replay/file-creator.c')
-rw-r--r--tools/klee-replay/file-creator.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/tools/klee-replay/file-creator.c b/tools/klee-replay/file-creator.c
index a218e6b0..58580f94 100644
--- a/tools/klee-replay/file-creator.c
+++ b/tools/klee-replay/file-creator.c
@@ -12,6 +12,7 @@
 #include <assert.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <ftw.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -431,18 +432,21 @@ static void create_file(int target_fd,
   }
 }
 
+char replay_dir[] = "/tmp/klee-replay-XXXXXX";
+
 void replay_create_files(exe_file_system_t *exe_fs) {
-  char tmpdir[PATH_MAX];
   unsigned k;
 
-  if (!getcwd(tmpdir, PATH_MAX)) {
-    perror("getcwd");
-    exit(1);
+  // Create a temporary directory to place files involved in replay
+  strcpy(replay_dir, "/tmp/klee-replay-XXXXXX"); // new template for each replayed file
+  char* tmpdir = mkdtemp(replay_dir);
+
+  if (tmpdir == NULL) {
+    perror("mkdtemp: could not create temporary directory");
+    exit(EXIT_FAILURE);
   }
 
-  strcat(tmpdir, ".temps");
-  delete_file(tmpdir, 1);
-  mkdir(tmpdir, 0755);
+  fprintf(stderr, "note: storing KLEE replay files in %s\n", tmpdir);
 
   umask(0);
   for (k=0; k < exe_fs->n_sym_files; k++) {
@@ -467,6 +471,25 @@ void replay_create_files(exe_file_system_t *exe_fs) {
     check_file(k, &exe_fs->sym_files[k]);
 }
 
+
+/* Used by nftw() in replay_delete_files() */
+int remove_callback(const char *fpath,
+                __attribute__((unused)) const struct stat *sb,
+                __attribute__((unused)) int typeflag,
+                __attribute__((unused)) struct FTW *ftwbuf) {
+  return remove(fpath);
+}
+
+void replay_delete_files() {
+  fprintf(stderr, "removing %s\n", replay_dir);
+
+  if (nftw(replay_dir, remove_callback, FOPEN_MAX,
+           FTW_DEPTH | FTW_PHYS) == -1) {
+      perror("nftw");
+      exit(EXIT_FAILURE);
+  }
+}
+
 static void check_file(int index, exe_disk_file_t *dfile) {
   struct stat s;
   int res;