[openwrt/openwrt] ucode: add fs.mkdtemp function

LEDE Commits lede-commits at lists.infradead.org
Mon Oct 13 01:56:53 PDT 2025


nbd pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/255d999783656fdbb56867faa8eb4eac0b22c138

commit 255d999783656fdbb56867faa8eb4eac0b22c138
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Fri Oct 10 14:19:58 2025 +0200

    ucode: add fs.mkdtemp function
    
    Useful for creating temporary directories
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 ...emp-method-for-creating-temporary-directo.patch | 107 +++++++++++++++++++++
 1 file changed, 107 insertions(+)

diff --git a/package/utils/ucode/patches/122-fs-add-mkdtemp-method-for-creating-temporary-directo.patch b/package/utils/ucode/patches/122-fs-add-mkdtemp-method-for-creating-temporary-directo.patch
new file mode 100644
index 0000000000..a92dac3f43
--- /dev/null
+++ b/package/utils/ucode/patches/122-fs-add-mkdtemp-method-for-creating-temporary-directo.patch
@@ -0,0 +1,107 @@
+From: Felix Fietkau <nbd at nbd.name>
+Date: Thu, 9 Oct 2025 14:11:55 +0200
+Subject: [PATCH] fs: add mkdtemp() method for creating temporary directories
+
+Returns the directory path as a string, following the same template
+handling pattern as mkstemp().
+
+Signed-off-by: Felix Fietkau <nbd at nbd.name>
+---
+
+--- a/lib/fs.c
++++ b/lib/fs.c
+@@ -2632,6 +2632,86 @@ uc_fs_mkstemp(uc_vm_t *vm, size_t nargs)
+ }
+ 
+ /**
++ * Creates a unique temporary directory based on the given template.
++ *
++ * If the template argument is given and contains a relative path, the created
++ * directory will be placed relative to the current working directory.
++ *
++ * If the template argument is given and contains an absolute path, the created
++ * directory will be placed relative to the given directory.
++ *
++ * If the template argument is given but does not contain a directory separator,
++ * the directory will be placed in `/tmp/`.
++ *
++ * If no template argument is given, the default `/tmp/XXXXXX` is used.
++ *
++ * The template argument must end with six consecutive X characters (`XXXXXX`),
++ * which will be replaced with a random string to create the unique directory name.
++ * If the template does not end with `XXXXXX`, it will be automatically appended.
++ *
++ * Returns a string containing the path of the created directory on success.
++ *
++ * Returns `null` if an error occurred, e.g. on insufficient permissions or
++ * inaccessible directory.
++ *
++ * @function module:fs#mkdtemp
++ *
++ * @param {string} [template="/tmp/XXXXXX"]
++ * The path template to use when forming the temporary directory name.
++ *
++ * @returns {?string}
++ *
++ * @example
++ * // Create a unique temporary directory in the current working directory
++ * const tempDir = mkdtemp('./data-XXXXXX');
++ */
++static uc_value_t *
++uc_fs_mkdtemp(uc_vm_t *vm, size_t nargs)
++{
++	uc_value_t *template = uc_fn_arg(0);
++	bool ends_with_template = false;
++	char *path, *t, *result;
++	uc_value_t *rv;
++	size_t l;
++
++	if (template && ucv_type(template) != UC_STRING)
++		err_return(EINVAL);
++
++	t = ucv_string_get(template);
++	l = ucv_string_length(template);
++
++	ends_with_template = (l >= 6 && strcmp(&t[l - 6], "XXXXXX") == 0);
++
++	if (t && strchr(t, '/')) {
++		if (ends_with_template)
++			xasprintf(&path, "%s", t);
++		else
++			xasprintf(&path, "%s.XXXXXX", t);
++	}
++	else if (t) {
++		if (ends_with_template)
++			xasprintf(&path, "/tmp/%s", t);
++		else
++			xasprintf(&path, "/tmp/%s.XXXXXX", t);
++	}
++	else {
++		xasprintf(&path, "/tmp/XXXXXX");
++	}
++
++	result = mkdtemp(path);
++
++	if (!result) {
++		free(path);
++		err_return(errno);
++	}
++
++	rv = ucv_string_new(result);
++	free(path);
++
++	return rv;
++}
++
++/**
+  * Checks the accessibility of a file or directory.
+  *
+  * The optional modes argument specifies the access modes which should be
+@@ -3065,6 +3145,7 @@ static const uc_function_list_t global_f
+ 	{ "basename",	uc_fs_basename },
+ 	{ "lsdir",		uc_fs_lsdir },
+ 	{ "mkstemp",	uc_fs_mkstemp },
++	{ "mkdtemp",	uc_fs_mkdtemp },
+ 	{ "access",		uc_fs_access },
+ 	{ "readfile",	uc_fs_readfile },
+ 	{ "writefile",	uc_fs_writefile },




More information about the lede-commits mailing list