about summary refs log tree commit diff
path: root/pkgs/build-support/libredirect
diff options
context:
space:
mode:
authorRobert Scott <code@humanleg.org.uk>2022-01-16 22:37:37 +0000
committerRobert Scott <code@humanleg.org.uk>2022-01-18 20:20:28 +0000
commitd38832ace04e150c85e681ece903517cd95a5baa (patch)
tree53abcdf2807bc4095a8f5d98abeb80035fd24850 /pkgs/build-support/libredirect
parent2185a70fa4eec7a42dc3c0cce61ece4b71b0a7a0 (diff)
libredirect: add support for mkdtemp
Diffstat (limited to 'pkgs/build-support/libredirect')
-rw-r--r--pkgs/build-support/libredirect/libredirect.c16
-rw-r--r--pkgs/build-support/libredirect/test.c4
2 files changed, 20 insertions, 0 deletions
diff --git a/pkgs/build-support/libredirect/libredirect.c b/pkgs/build-support/libredirect/libredirect.c
index a59bc1bbaa328..07eca43810ca2 100644
--- a/pkgs/build-support/libredirect/libredirect.c
+++ b/pkgs/build-support/libredirect/libredirect.c
@@ -443,3 +443,19 @@ WRAPPER(int, mkostemps)(char *template, int suffixlen, int flags)
     return retval;
 }
 WRAPPER_DEF(mkostemps)
+
+WRAPPER(char *, mkdtemp)(char *template)
+{
+    char * (*mkdtemp_real) (char *template) = LOOKUP_REAL(mkdtemp);
+    char buf[PATH_MAX];
+    char * rewritten = rewrite_non_const(template, buf);
+    char * retval = mkdtemp_real(rewritten);
+    if (retval == NULL) {
+        return retval;
+    };
+    if (rewritten != template) {
+        copy_temp_wildcard(template, rewritten, 0);
+    }
+    return template;
+}
+WRAPPER_DEF(mkdtemp)
diff --git a/pkgs/build-support/libredirect/test.c b/pkgs/build-support/libredirect/test.c
index f15b44ff3d861..012e4aa4b283b 100644
--- a/pkgs/build-support/libredirect/test.c
+++ b/pkgs/build-support/libredirect/test.c
@@ -117,6 +117,10 @@ int main(int argc, char *argv[])
     assert_mktemp_path(TESTDIR "/temp", ".test", buf);
     close(testfd);
 
+    strncpy(buf, TESTDIR "/tempXXXXXX", PATH_MAX);
+    assert(mkdtemp(buf) == buf);
+    assert_mktemp_path(TESTDIR "/temp", "", buf);
+
     test_spawn();
     test_system();