From e0dac6cfb192f13bc39d22b0815c9c9b60e9db70 Mon Sep 17 00:00:00 2001 From: julianuziemblo Date: Wed, 20 May 2026 14:09:37 +0200 Subject: [PATCH 1/2] mktemp: implement tmpnam YT: RTOS-1333 --- posix/stubs.c | 4 ---- stdlib/mktemp.c | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/posix/stubs.c b/posix/stubs.c index 8c23d239..03058ad5 100644 --- a/posix/stubs.c +++ b/posix/stubs.c @@ -199,10 +199,6 @@ char *gets(char *str) return NULL; } -char *tmpnam(char *str) -{ - return NULL; -} int wctomb(char *str, wchar_t wchar) { diff --git a/stdlib/mktemp.c b/stdlib/mktemp.c index 86d347db..fc143f4b 100644 --- a/stdlib/mktemp.c +++ b/stdlib/mktemp.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -119,3 +120,21 @@ char *mkdtemp(char *templt) return templt; } + + +char *tmpnam(char *str) +{ + static char template[L_tmpnam]; + int err; + + if (str == NULL) { + str = template; + } + + do { + (void)strcpy(str, "/tmp/fileXXXXXX"); + err = __mktemp(str, 0); + } while ((err < 0) && errno == EEXIST); + + return (err < 0) ? NULL : str; +} From b3e65dee9b4013858a1f5db7e643f665a4acb3e0 Mon Sep 17 00:00:00 2001 From: julianuziemblo Date: Wed, 20 May 2026 18:04:20 +0200 Subject: [PATCH 2/2] mktemp: add tempnam YT: RTOS-1333 --- include/stdio.h | 5 +++++ stdlib/mktemp.c | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/include/stdio.h b/include/stdio.h index 2fa99840..488b4114 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -47,6 +47,7 @@ extern "C" { #define FOPEN_MAX 16 #define L_ctermid 11 /* Fit at least /dev/pts/XX */ #define L_tmpnam 16 +#define P_tmpdir "/tmp" #define TMP_MAX 32767 typedef off_t fpos_t; @@ -194,6 +195,10 @@ extern FILE *tmpfile(void); extern char *tmpnam(char *str); +/* Generates a pathname that may be used for a temporary file. */ +extern char *tempnam(const char *dir, const char *pfx); + + /* Sends formatted output to a stream. */ extern int fprintf(FILE *stream, const char *format, ...) __attribute__((format(printf, 2, 3))); diff --git a/stdlib/mktemp.c b/stdlib/mktemp.c index fc143f4b..b5e25777 100644 --- a/stdlib/mktemp.c +++ b/stdlib/mktemp.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -138,3 +139,43 @@ char *tmpnam(char *str) return (err < 0) ? NULL : str; } + + +char *tempnam(const char *dir, const char *pfx) +{ + struct stat statbuf; + int err, dirlen, pfxlen, sep = 0; + + if (dir == NULL || stat(dir, &statbuf) < 0 || !S_ISDIR(statbuf.st_mode)) { + if (access(P_tmpdir, W_OK | X_OK) < 0) { + dir = "/"; + } + else { + dir = P_tmpdir; + } + } + + dirlen = strlen(dir); + pfxlen = (pfx == NULL) ? 4 /* strlen("file") */ : strlen(pfx); + if (dir[dirlen - 1] != '/') { + sep = 1; + } + + char *name = malloc(dirlen + sep + pfxlen + 6 /* "XXXXXX" */ + 1); + if (name == NULL) { + errno = ENOMEM; + return NULL; + } + + do { + sprintf(name, "%s%s%sXXXXXX", dir, (sep != 0) ? "/" : "", (pfx == NULL) ? "file" : pfx); + err = __mktemp(name, 0); + } while ((err < 0) && errno == EEXIST); + + if (err < 0) { + free(name); + name = NULL; + } + + return name; +}