aboutsummaryrefslogtreecommitdiffstats
path: root/compat/open.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2025-04-24 11:37:21 -0700
committerJunio C Hamano <gitster@pobox.com>2025-04-24 11:37:21 -0700
commitd61ff9c237b05f9cff0831d4bde546ed4a9c3c42 (patch)
tree4a787bfa36ba05fbcaefec1334b520a9f175935b /compat/open.c
parent4bbb303af69990ccd05fe3a2eb58a1ce036f8220 (diff)
parent68cd492a3e662c75dec364986c81e94716d4ac56 (diff)
downloadgit-d61ff9c237b05f9cff0831d4bde546ed4a9c3c42.tar.gz
Merge branch 'ps/object-file-cleanup' into ps/object-store-cleanup
* ps/object-file-cleanup: object-store: merge "object-store-ll.h" and "object-store.h" object-store: remove global array of cached objects object: split out functions relating to object store subsystem object-file: drop `index_blob_stream()` object-file: split up concerns of `HASH_*` flags object-file: split out functions relating to object store subsystem object-file: move `xmmap()` into "wrapper.c" object-file: move `git_open_cloexec()` to "compat/open.c" object-file: move `safe_create_leading_directories()` into "path.c" object-file: move `mkdir_in_gitdir()` into "path.c"
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;
+}