asserts
[oweals/gnunet.git] / src / util / disk.c
index 588ecae3cc5dd3b606013032f8ee06d8425cc28c..e3a58531bd9f6c552f316a90ac7ac360e0ddd58b 100644 (file)
@@ -266,7 +266,10 @@ GNUNET_DISK_file_get_identifiers (const char *filename,
 
 
 /**
- * Create an (empty) temporary file on disk.
+ * Create an (empty) temporary file on disk.  If the given name is not
+ * an absolute path, the current 'TMPDIR' will be prepended.  In any case,
+ * 6 random characters will be appended to the name to create a unique
+ * filename.
  * 
  * @param t component to use for the name;
  *        does NOT contain "XXXXXX" or "/tmp/".
@@ -281,10 +284,17 @@ GNUNET_DISK_mktemp (const char *t)
   char *tmpl;
   char *fn;
 
-  tmpdir = getenv ("TMPDIR");
-  tmpdir = tmpdir ? tmpdir : "/tmp";
-
-  GNUNET_asprintf (&tmpl, "%s/%s%s", tmpdir, t, "XXXXXX");
+  if ( (t[0] != '/') &&
+       (t[0] != '\\') )
+    {
+      tmpdir = getenv ("TMPDIR");
+      tmpdir = tmpdir ? tmpdir : "/tmp";
+      GNUNET_asprintf (&tmpl, "%s/%s%s", tmpdir, t, "XXXXXX");
+    }
+  else
+    {
+      GNUNET_asprintf (&tmpl, "%s%s", t, "XXXXXX");
+    }
 #ifdef MINGW
   fn = (char *) GNUNET_malloc (MAX_PATH + 1);
   if (ERROR_SUCCESS != plibc_conv_to_win_path (tmpl, fn))
@@ -1192,7 +1202,6 @@ GNUNET_DISK_file_open (const char *fn,
   expfn = GNUNET_STRINGS_filename_expand (fn);
   if (NULL == expfn)
     return NULL;
-
 #ifndef MINGW
   mode = 0;
   if (GNUNET_DISK_OPEN_READWRITE == (flags & GNUNET_DISK_OPEN_READWRITE))
@@ -1215,6 +1224,7 @@ GNUNET_DISK_file_open (const char *fn,
     oflags |= O_APPEND;
   if (flags & GNUNET_DISK_OPEN_CREATE)
     {
+      (void) GNUNET_DISK_directory_create_for_file (expfn);
       oflags |= O_CREAT;
       if (perm & GNUNET_DISK_PERM_USER_READ)
         mode |= S_IRUSR;
@@ -1688,7 +1698,6 @@ GNUNET_DISK_pipe_close_end (struct GNUNET_DISK_PipeHandle *p,
   int ret = GNUNET_OK;
   int save;
 
-  /* FIXME: What can we safely set HANDLE to once we've closed an end, NULL? */
 #ifdef MINGW
   if (end == GNUNET_DISK_PIPE_END_READ)
     {
@@ -1697,6 +1706,7 @@ GNUNET_DISK_pipe_close_end (struct GNUNET_DISK_PipeHandle *p,
           SetErrnoFromWinError (GetLastError ());
           ret = GNUNET_SYSERR;
         }
+      p->fd[0]->h = INVALID_HANDLE_VALUE;
     }
   else if (end == GNUNET_DISK_PIPE_END_WRITE)
     {
@@ -1705,6 +1715,7 @@ GNUNET_DISK_pipe_close_end (struct GNUNET_DISK_PipeHandle *p,
           SetErrnoFromWinError (GetLastError ());
           ret = GNUNET_SYSERR;
         }
+      p->fd[1]->h = INVALID_HANDLE_VALUE;
     }
   save = errno;
 #else