X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Futil%2Fos_file.c;h=c5970ddb2431b058334dd6b97b0b142e2bb724ff;hb=28f258536581a740c8da8803cafbd5dc2711efd0;hp=5771b27e5d0730d33a0a3a95235c2432320eb9a8;hpb=2cb965e5b60dbcd767da42360a5e18acd8803f5d;p=mesa.git diff --git a/src/util/os_file.c b/src/util/os_file.c index 5771b27e5d0..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,7 +36,51 @@ 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