fix
[oweals/gnunet.git] / src / util / disk.c
index ef1f9ad4bb29beadb2a44ae6577e2ada82e61256..65509166e1bac25da8bcb4928d0996f9d273669a 100644 (file)
@@ -267,7 +267,7 @@ GNUNET_DISK_file_get_identifiers (const char *filename,
   if ( (0 == stat (filename, &sbuf)) &&
        (0 == statfs (filename, &fbuf) ) )
     {
-      *dev = (uint64_t) fbuf.f_fsid;
+      *dev = ((uint64_t) fbuf.f_fsid.val[0]) << 32 || ((uint64_t) fbuf.f_fsid.val[1]);
       *ino = (uint64_t) sbuf.st_ino;
       return GNUNET_OK;
     }  
@@ -1646,10 +1646,13 @@ GNUNET_DISK_file_sync (const struct GNUNET_DISK_FileHandle *h)
  * Creates an interprocess channel
  *
  * @param blocking creates an asynchronous pipe if set to GNUNET_NO
+ * @param inherit_read inherit the parent processes stdin (only for windows)
+ * @param inherit_write inherit the parent processes stdout (only for windows)
+ *
  * @return handle to the new pipe, NULL on error
  */
 struct GNUNET_DISK_PipeHandle *
-GNUNET_DISK_pipe (int blocking)
+GNUNET_DISK_pipe (int blocking, int inherit_read, int inherit_write)
 {
   struct GNUNET_DISK_PipeHandle *p;
   struct GNUNET_DISK_FileHandle *fds;
@@ -1699,6 +1702,7 @@ GNUNET_DISK_pipe (int blocking)
     }
 #else
   BOOL ret;
+  HANDLE tmp_handle;
 
   ret = CreatePipe (&p->fd[0]->h, &p->fd[1]->h, NULL, 0);
   if (!ret)
@@ -1707,6 +1711,31 @@ GNUNET_DISK_pipe (int blocking)
       SetErrnoFromWinError (GetLastError ());
       return NULL;
     }
+  if (!DuplicateHandle (GetCurrentProcess (), p->fd[0]->h,
+               GetCurrentProcess (), &tmp_handle, 0, inherit_read == GNUNET_YES ? TRUE : FALSE,
+                       DUPLICATE_SAME_ACCESS))
+       {
+         SetErrnoFromWinError (GetLastError ());
+         CloseHandle (p->fd[0]->h);
+         CloseHandle (p->fd[1]->h);
+         GNUNET_free (p);
+         return NULL;
+       }
+       CloseHandle (p->fd[0]->h);
+       p->fd[0]->h = tmp_handle;
+
+       if (!DuplicateHandle (GetCurrentProcess (), p->fd[1]->h,
+                       GetCurrentProcess (), &tmp_handle, 0, inherit_write == GNUNET_YES ? TRUE : FALSE,
+                       DUPLICATE_SAME_ACCESS))
+       {
+         SetErrnoFromWinError (GetLastError ());
+         CloseHandle (p->fd[0]->h);
+         CloseHandle (p->fd[1]->h);
+         GNUNET_free (p);
+         return NULL;
+       }
+  CloseHandle (p->fd[1]->h);
+  p->fd[1]->h = tmp_handle;
   if (!blocking)
     {
       DWORD mode;