aboutsummaryrefslogtreecommitdiff
path: root/compat
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2025-04-24 17:25:33 -0700
committerJunio C Hamano <gitster@pobox.com>2025-04-24 17:25:33 -0700
commit36d8035d27d6100a525a0e25619868b9542a4f35 (patch)
treec3d53b9740c6936acceb621da9b839389abaf7e5 /compat
parent51ddc126de2f1dfe8920a83567151721ef58dde9 (diff)
parent68cd492a3e662c75dec364986c81e94716d4ac56 (diff)
downloadgit-36d8035d27d6100a525a0e25619868b9542a4f35.tar.xz
Merge branch 'ps/object-file-cleanup'
Code clean-up. * 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')
-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;
+}