X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Futil%2Fos_file.c;h=c5970ddb2431b058334dd6b97b0b142e2bb724ff;hb=9760a7ed9138b84d83a712afeb0e673399d9e200;hp=b502ff4b0ef8f9bda5e7b62022e64daf84cc92ea;hpb=f76cbc7901f7d500f5a4f74aedfd29970d1efd00;p=mesa.git diff --git a/src/util/os_file.c b/src/util/os_file.c index b502ff4b0ef..c5970ddb243 100644 --- a/src/util/os_file.c +++ b/src/util/os_file.c @@ -4,20 +4,25 @@ */ #include "os_file.h" +#include "detect_os.h" #include #include #include #include - -#if defined(WIN32) +#if DETECT_OS_WINDOWS #include #define open _open #define fdopen _fdopen #define O_CREAT _O_CREAT #define O_EXCL _O_EXCL #define O_WRONLY _O_WRONLY +#else +#include +#ifndef F_DUPFD_CLOEXEC +#define F_DUPFD_CLOEXEC 1030 +#endif #endif @@ -31,14 +36,59 @@ os_file_create_unique(const char *filename, int filemode) } -#if defined(__linux__) +#if DETECT_OS_WINDOWS +int +os_dupfd_cloexec(int fd) +{ + /* + * On Windows child processes don't inherit handles by default: + * https://devblogs.microsoft.com/oldnewthing/20111216-00/?p=8873 + */ + return dup(fd); +} +#else +int +os_dupfd_cloexec(int fd) +{ + int minfd = 3; + int newfd = fcntl(fd, F_DUPFD_CLOEXEC, minfd); + + if (newfd >= 0) + return newfd; + + if (errno != EINVAL) + return -1; + + newfd = fcntl(fd, F_DUPFD, minfd); + + if (newfd < 0) + return -1; + + long flags = fcntl(newfd, F_GETFD); + if (flags == -1) { + close(newfd); + return -1; + } + + if (fcntl(newfd, F_SETFD, flags | FD_CLOEXEC) == -1) { + close(newfd); + return -1; + } + + return newfd; +} +#endif + + +#if DETECT_OS_LINUX #include -#include #include #include #include +/* copied from */ +#define KCMP_FILE 0 static ssize_t readN(int fd, char *buf, size_t len) @@ -66,7 +116,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 @@ -129,15 +179,22 @@ os_read_file(const char *filename) buf[offset] = '\0'; + if (size) + *size = offset; + return buf; } -bool +int os_same_file_description(int fd1, int fd2) { pid_t pid = getpid(); - return syscall(SYS_kcmp, pid, pid, KCMP_FILE, fd1, fd2) == 0; + /* Same file descriptor trivially implies same file description */ + if (fd1 == fd2) + return 0; + + return syscall(SYS_kcmp, pid, pid, KCMP_FILE, fd1, fd2); } #else @@ -145,21 +202,21 @@ os_same_file_description(int fd1, int fd2) #include "u_debug.h" char * -os_read_file(const char *filename) +os_read_file(const char *filename, size_t *size) { errno = -ENOSYS; return NULL; } -bool +int os_same_file_description(int fd1, int fd2) { + /* Same file descriptor trivially implies same file description */ if (fd1 == fd2) - return true; + return 0; - debug_warn_once("Can't tell if different file descriptors reference the same" - " file description, false negatives might cause trouble!\n"); - return false; + /* Otherwise we can't tell */ + return -1; } #endif