]> git.ipfire.org Git - thirdparty/git.git/commitdiff
wrapper: add git_mkdtemp()
authorRené Scharfe <l.s.r@web.de>
Sat, 6 Dec 2025 13:27:39 +0000 (14:27 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sat, 6 Dec 2025 22:28:11 +0000 (07:28 +0900)
Extend git_mkstemps_mode() to optionally call mkdir(2) instead of
open(2), then use that ability to create a mkdtemp(3) replacement,
git_mkdtemp().  We'll start using it in the next commit.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
wrapper.c
wrapper.h

index 3d507d420452030e77fee9e181762513e5aa9fe8..89f6effe84371b40463fb23f5dc908113db3378d 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -446,7 +446,11 @@ int xmkstemp(char *filename_template)
 #undef TMP_MAX
 #define TMP_MAX 16384
 
-int git_mkstemps_mode(char *pattern, int suffix_len, int mode)
+/*
+ * Returns -1 on error, 0 if it created a directory, or an open file
+ * descriptor to the created regular file.
+ */
+static int git_mkdstemps_mode(char *pattern, int suffix_len, int mode, bool dir)
 {
        static const char letters[] =
                "abcdefghijklmnopqrstuvwxyz"
@@ -488,7 +492,10 @@ int git_mkstemps_mode(char *pattern, int suffix_len, int mode)
                        v /= num_letters;
                }
 
-               fd = open(pattern, O_CREAT | O_EXCL | O_RDWR, mode);
+               if (dir)
+                       fd = mkdir(pattern, mode);
+               else
+                       fd = open(pattern, O_CREAT | O_EXCL | O_RDWR, mode);
                if (fd >= 0)
                        return fd;
                /*
@@ -503,6 +510,16 @@ int git_mkstemps_mode(char *pattern, int suffix_len, int mode)
        return -1;
 }
 
+char *git_mkdtemp(char *pattern)
+{
+       return git_mkdstemps_mode(pattern, 0, 0700, true) ? NULL : pattern;
+}
+
+int git_mkstemps_mode(char *pattern, int suffix_len, int mode)
+{
+       return git_mkdstemps_mode(pattern, suffix_len, mode, false);
+}
+
 int git_mkstemp_mode(char *pattern, int mode)
 {
        /* mkstemp is just mkstemps with no suffix */
index 44a8597ac314267d80b5cd45b11d2684bbde0cf9..15ac3bab6e974842bb1d24f093e923b34f00f8e2 100644 (file)
--- a/wrapper.h
+++ b/wrapper.h
@@ -37,6 +37,8 @@ int xsnprintf(char *dst, size_t max, const char *fmt, ...);
 
 int xgethostname(char *buf, size_t len);
 
+char *git_mkdtemp(char *pattern);
+
 /* set default permissions by passing mode arguments to open(2) */
 int git_mkstemps_mode(char *pattern, int suffix_len, int mode);
 int git_mkstemp_mode(char *pattern, int mode);