MinGW
[oweals/gnunet.git] / src / util / disk.c
index 6512d9945f6e542b876635144a6051789d711e55..588ecae3cc5dd3b606013032f8ee06d8425cc28c 100644 (file)
@@ -1208,7 +1208,7 @@ GNUNET_DISK_file_open (const char *fn,
       return NULL;
     }
   if (flags & GNUNET_DISK_OPEN_FAILIFEXISTS)
-    oflags |= (O_CREAT & O_EXCL);
+    oflags |= (O_CREAT | O_EXCL);
   if (flags & GNUNET_DISK_OPEN_TRUNCATE)
     oflags |= O_TRUNC;
   if (flags & GNUNET_DISK_OPEN_APPEND)
@@ -1239,7 +1239,10 @@ GNUNET_DISK_file_open (const char *fn,
   fd = open (expfn, oflags | O_LARGEFILE, mode);
   if (fd == -1)
     {
-      GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "open", expfn);
+      if (0 == (flags & GNUNET_DISK_OPEN_FAILIFEXISTS))
+       GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "open", expfn);
+      else
+       GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_DEBUG, "open", expfn);
       GNUNET_free (expfn);
       return NULL;
     }
@@ -1271,7 +1274,7 @@ GNUNET_DISK_file_open (const char *fn,
     }
   else
     {
-      disp = OPEN_ALWAYS;
+      disp = OPEN_EXISTING;
     }
 
   /* TODO: access priviledges? */
@@ -1671,6 +1674,64 @@ GNUNET_DISK_pipe (int blocking)
 }
 
 
+/**
+ * Closes an interprocess channel
+ *
+ * @param p pipe to close
+ * @param end which end of the pipe to close
+ * @return GNUNET_OK on success, GNUNET_SYSERR otherwise
+ */
+int
+GNUNET_DISK_pipe_close_end (struct GNUNET_DISK_PipeHandle *p,
+                           enum GNUNET_DISK_PipeEnd end)
+{
+  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)
+    {
+      if (!CloseHandle (p->fd[0]->h))
+        {
+          SetErrnoFromWinError (GetLastError ());
+          ret = GNUNET_SYSERR;
+        }
+    }
+  else if (end == GNUNET_DISK_PIPE_END_WRITE)
+    {
+      if (!CloseHandle (p->fd[1]->h))
+        {
+          SetErrnoFromWinError (GetLastError ());
+          ret = GNUNET_SYSERR;
+        }
+    }
+  save = errno;
+#else
+  save = 0;
+  if (end == GNUNET_DISK_PIPE_END_READ)
+    {
+      if (0 != close (p->fd[0]->fd))
+        {
+          ret = GNUNET_SYSERR;
+          save = errno;
+        }
+      p->fd[0]->fd = -1;
+    }
+  else if (end == GNUNET_DISK_PIPE_END_WRITE)
+    {
+      if (0 != close (p->fd[1]->fd))
+        {
+          ret = GNUNET_SYSERR;
+          save = errno;
+        }
+      p->fd[1]->fd = -1;
+    }
+#endif
+  errno = save;
+  return ret;
+}
+
 /**
  * Closes an interprocess channel
  *
@@ -1697,15 +1758,22 @@ GNUNET_DISK_pipe_close (struct GNUNET_DISK_PipeHandle *p)
   save = errno;
 #else
   save = 0;
-  if (0 != close (p->fd[0]->fd))
+  if (p->fd[0]->fd != -1)
     {
-      ret = GNUNET_SYSERR;
-      save = errno;
+      if (0 != close (p->fd[0]->fd))
+        {
+          ret = GNUNET_SYSERR;
+          save = errno;
+        }
     }
-  if (0 != close (p->fd[1]->fd))
+
+  if (p->fd[1]->fd != -1)
     {
-      ret = GNUNET_SYSERR;
-      save = errno;
+      if (0 != close (p->fd[1]->fd))
+        {
+          ret = GNUNET_SYSERR;
+          save = errno;
+        }
     }
 #endif
   GNUNET_free (p);
@@ -1716,8 +1784,10 @@ GNUNET_DISK_pipe_close (struct GNUNET_DISK_PipeHandle *p)
 
 /**
  * Get the handle to a particular pipe end
+ *
  * @param p pipe
  * @param n end to access
+ * @return handle for the respective end
  */
 const struct GNUNET_DISK_FileHandle *
 GNUNET_DISK_pipe_handle (const struct GNUNET_DISK_PipeHandle *p,