aboutsummaryrefslogtreecommitdiffstats
path: root/compat/open.c
diff options
context:
space:
mode:
Diffstat (limited to 'compat/open.c')
-rw-r--r--compat/open.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/compat/open.c b/compat/open.c
index eb3754a23b..37ae2b1aeb 100644
--- a/compat/open.c
+++ b/compat/open.c
@@ -1,5 +1,6 @@
#include "git-compat-util.h"
+#ifdef OPEN_RETURNS_EINTR
#undef open
int git_open_with_retry(const char *path, int flags, ...)
{
@@ -23,3 +24,31 @@ int git_open_with_retry(const char *path, int flags, ...)
return ret;
}
+#endif
+
+int git_open_cloexec(const char *name, int flags)
+{
+ int fd;
+ static int o_cloexec = O_CLOEXEC;
+
+ fd = open(name, flags | o_cloexec);
+ if ((o_cloexec & O_CLOEXEC) && fd < 0 && errno == EINVAL) {
+ /* Try again w/o O_CLOEXEC: the kernel might not support it */
+ o_cloexec &= ~O_CLOEXEC;
+ fd = open(name, flags | o_cloexec);
+ }
+
+#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
+ {
+ static int fd_cloexec = FD_CLOEXEC;
+
+ if (!o_cloexec && 0 <= fd && fd_cloexec) {
+ /* Opened w/o O_CLOEXEC? try with fcntl(2) to add it */
+ int flags = fcntl(fd, F_GETFD);
+ if (fcntl(fd, F_SETFD, flags | fd_cloexec))
+ fd_cloexec = 0;
+ }
+ }
+#endif
+ return fd;
+}
='/pub/scm/linux/kernel/git/stable/linux.git/log/'>
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2014-08-21 09:57:48 -0500
committerWilly Tarreau <w@1wt.eu>2015-09-18 13:51:53 +0200
commitd8b3be1ede7a9559cef59f8066ba90a17f989dd8 (patch)
treefdbc52a24d85f5bdf7cd99340099005e6ff28dc3
parentf9e6d14d33ab7e4ada2d59acaf16196626063e95 (diff)
downloadlinux-d8b3be1ede7a9559cef59f8066ba90a17f989dd8.tar.gz
HID: fix a couple of off-by-ones