dhtlog updates
[oweals/gnunet.git] / src / util / disk.c
index 94615f198565e86124d5eee67b385b8658108426..88f11be51993a8413926b7cfb320a7c3478c243c 100644 (file)
@@ -248,7 +248,7 @@ GNUNET_DISK_file_size (const char *filename,
  */
 int
 GNUNET_DISK_file_get_identifiers (const char *filename,
-                                  uint32_t * dev, uint64_t * ino)
+                                  uint64_t * dev, uint64_t * ino)
 {
 #if LINUX
   struct stat sbuf;
@@ -256,10 +256,41 @@ GNUNET_DISK_file_get_identifiers (const char *filename,
 
   if ((0 == stat (filename, &sbuf)) && (0 == statvfs (filename, &fbuf)))
     {
-      *dev = (uint32_t) fbuf.f_fsid;
+      *dev = (uint64_t) fbuf.f_fsid;
       *ino = (uint64_t) sbuf.st_ino;
       return GNUNET_OK;
     }
+#elif SOMEBSD
+  struct stat sbuf;
+  struct statfs fbuf;
+
+  if ( (0 == stat (filename, &sbuf)) &&
+       (0 == statfs (filename, &fbuf) ) )
+    {
+      *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;
+    }  
+#elif WINDOWS
+  // FIXME NILS: test this
+  struct GNUNET_DISK_FileHandle *fh;
+  BY_HANDLE_FILE_INFORMATION info;
+  int succ;
+
+  fh = GNUNET_DISK_file_open(filename, GNUNET_DISK_OPEN_READ, 0);
+  if (fh == NULL)
+    return GNUNET_SYSERR;
+  succ = GetFileInformationByHandle(fh->h, &info);
+  GNUNET_DISK_file_close(fh);
+  if (succ)
+    {
+      *dev = info.dwVolumeSerialNumber;
+      *ino = ((info.nFileIndexHigh << sizeof(DWORD)) | info.nFileIndexLow);
+      return GNUNET_OK;
+    }
+  else
+    return GNUNET_SYSERR;
+
 #endif
   return GNUNET_SYSERR;
 }
@@ -1532,7 +1563,6 @@ GNUNET_DISK_file_map (const struct GNUNET_DISK_FileHandle *h,
   return ret;
 #else
   int prot;
-  int ec;
 
   prot = 0;
   if (access & GNUNET_DISK_MAP_TYPE_READ)
@@ -1544,9 +1574,7 @@ GNUNET_DISK_file_map (const struct GNUNET_DISK_FileHandle *h,
   GNUNET_assert (NULL != (*m)->addr);
   if (MAP_FAILED == (*m)->addr)
     {    
-      ec = errno;
       GNUNET_free (*m);
-      errno = ec;
       return NULL;
     }
   (*m)->len = len;
@@ -1641,34 +1669,33 @@ GNUNET_DISK_pipe (int blocking)
   ret = pipe (fd);
   if (ret == -1)
     {
-      eno = errno;
       GNUNET_free (p);
-      errno = eno;
       return NULL;
     }
   p->fd[0]->fd = fd[0];
   p->fd[1]->fd = fd[1];
+  ret = 0;
+  flags = fcntl (fd[0], F_GETFL);
+  flags |= FD_CLOEXEC;
   if (!blocking)
+    flags |= O_NONBLOCK;
+  if (0 > fcntl (fd[0], F_SETFL, flags))
+    ret = -1;
+  flags = fcntl (fd[1], F_GETFL);
+  flags |= FD_CLOEXEC;
+  if (!blocking)
+    flags |= O_NONBLOCK;
+  if (0 > fcntl (fd[1], F_SETFL, flags))
+    ret = -1;
+  if (ret == -1)
     {
-      flags = fcntl (fd[0], F_GETFL);
-      flags |= O_NONBLOCK;
-      ret = fcntl (fd[0], F_SETFL, flags);
-      if (ret != -1)
-        {
-          flags = fcntl (fd[1], F_GETFL);
-          flags |= O_NONBLOCK;
-          ret = fcntl (fd[1], F_SETFL, flags);
-        }
-      if (ret == -1)
-        {
-          eno = errno;
-          GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fcntl");
-          GNUNET_break (0 == close (p->fd[0]->fd));
-          GNUNET_break (0 == close (p->fd[1]->fd));
-          GNUNET_free (p);
-          errno = eno;
-          return NULL;
-        }
+      eno = errno;
+      GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fcntl");
+      GNUNET_break (0 == close (p->fd[0]->fd));
+      GNUNET_break (0 == close (p->fd[1]->fd));
+      GNUNET_free (p);
+      errno = eno;
+      return NULL;    
     }
 #else
   BOOL ret;