util/os_file: replace broken windows-detection code with detect_os.h
[mesa.git] / src / util / os_file.c
index ae41506332d3863e77b64669b619aa551b386d3e..f02d74afd2ca1158e91cfd750defc783c7cbc2f2 100644 (file)
@@ -4,14 +4,14 @@
  */
 
 #include "os_file.h"
+#include "detect_os.h"
 
 #include <errno.h>
 #include <fcntl.h>
 #include <stdlib.h>
 #include <sys/stat.h>
 
-
-#if defined(WIN32)
+#if DETECT_OS_WINDOWS
 #include <io.h>
 #define open _open
 #define fdopen _fdopen
@@ -31,12 +31,15 @@ os_file_create_unique(const char *filename, int filemode)
 }
 
 
-#if defined(__linux__)
+#if DETECT_OS_LINUX
 
 #include <fcntl.h>
 #include <sys/stat.h>
+#include <sys/syscall.h>
 #include <unistd.h>
 
+/* copied from <linux/kcmp.h> */
+#define KCMP_FILE 0
 
 static ssize_t
 readN(int fd, char *buf, size_t len)
@@ -64,7 +67,7 @@ readN(int fd, char *buf, size_t len)
 }
 
 char *
-os_read_file(const char *filename)
+os_read_file(const char *filename, size_t *size)
 {
    /* Note that this also serves as a slight margin to avoid a 2x grow when
     * the file is just a few bytes larger when we read it than when we
@@ -120,7 +123,6 @@ os_read_file(const char *filename)
    char *newbuf = realloc(buf, len);
    if (!newbuf) {
       free(buf);
-      close(fd);
       errno = -ENOMEM;
       return NULL;
    }
@@ -128,16 +130,44 @@ os_read_file(const char *filename)
 
    buf[offset] = '\0';
 
+   if (size)
+      *size = offset;
+
    return buf;
 }
 
+int
+os_same_file_description(int fd1, int fd2)
+{
+   pid_t pid = getpid();
+
+   /* Same file descriptor trivially implies same file description */
+   if (fd1 == fd2)
+      return 0;
+
+   return syscall(SYS_kcmp, pid, pid, KCMP_FILE, fd1, fd2);
+}
+
 #else
 
+#include "u_debug.h"
+
 char *
-os_read_file(const char *filename)
+os_read_file(const char *filename, size_t *size)
 {
    errno = -ENOSYS;
    return NULL;
 }
 
+int
+os_same_file_description(int fd1, int fd2)
+{
+   /* Same file descriptor trivially implies same file description */
+   if (fd1 == fd2)
+      return 0;
+
+   /* Otherwise we can't tell */
+   return -1;
+}
+
 #endif