util: Add os_same_file_description helper
authorMichel Dänzer <mdaenzer@redhat.com>
Mon, 6 Jan 2020 17:24:52 +0000 (18:24 +0100)
committerMichel Dänzer <michel@daenzer.net>
Thu, 23 Jan 2020 16:39:34 +0000 (17:39 +0100)
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3202>

src/util/os_file.c
src/util/os_file.h

index c670e127c6b1761a6271902045cd2f8df6c68862..b502ff4b0ef8f9bda5e7b62022e64daf84cc92ea 100644 (file)
@@ -34,7 +34,9 @@ os_file_create_unique(const char *filename, int filemode)
 #if defined(__linux__)
 
 #include <fcntl.h>
+#include <linux/kcmp.h>
 #include <sys/stat.h>
+#include <sys/syscall.h>
 #include <unistd.h>
 
 
@@ -130,8 +132,18 @@ os_read_file(const char *filename)
    return buf;
 }
 
+bool
+os_same_file_description(int fd1, int fd2)
+{
+   pid_t pid = getpid();
+
+   return syscall(SYS_kcmp, pid, pid, KCMP_FILE, fd1, fd2) == 0;
+}
+
 #else
 
+#include "u_debug.h"
+
 char *
 os_read_file(const char *filename)
 {
@@ -139,4 +151,15 @@ os_read_file(const char *filename)
    return NULL;
 }
 
+bool
+os_same_file_description(int fd1, int fd2)
+{
+   if (fd1 == fd2)
+      return true;
+
+   debug_warn_once("Can't tell if different file descriptors reference the same"
+                   " file description, false negatives might cause trouble!\n");
+   return false;
+}
+
 #endif
index d691302d12dd095e0dcf8aac2cf1385f1648511e..1972beba32b11ae2ab04a0b2f5f8a55642df9898 100644 (file)
@@ -8,6 +8,7 @@
 #ifndef _OS_FILE_H_
 #define _OS_FILE_H_
 
+#include <stdbool.h>
 #include <stdio.h>
 
 #ifdef  __cplusplus
@@ -30,6 +31,13 @@ os_file_create_unique(const char *filename, int filemode);
 char *
 os_read_file(const char *filename);
 
+/*
+ * Returns true if the two file descriptors passed in can be determined to
+ * reference the same file description, false otherwise
+ */
+bool
+os_same_file_description(int fd1, int fd2);
+
 #ifdef __cplusplus
 }
 #endif