summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRené Scharfe <l.s.r@web.de>2025-12-06 14:27:39 +0100
committerJunio C Hamano <gitster@pobox.com>2025-12-07 07:28:11 +0900
commite1ecf0dd6897eae1594b7e9345605b8f88485b95 (patch)
tree8182ac3c3d18c1c5aca8c3e3e489b9493ccf4cee
parent9a2fb147f2c61d0cab52c883e7e26f5b7948e3ed (diff)
wrapper: add git_mkdtemp()
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>
-rw-r--r--wrapper.c21
-rw-r--r--wrapper.h2
2 files changed, 21 insertions, 2 deletions
diff --git a/wrapper.c b/wrapper.c
index 3d507d4204..89f6effe84 100644
--- 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 */
diff --git a/wrapper.h b/wrapper.h
index 44a8597ac3..15ac3bab6e 100644
--- 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);