diff options
Diffstat (limited to 'libc-top-half/musl/src/stdio/tempnam.c')
-rw-r--r-- | libc-top-half/musl/src/stdio/tempnam.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/libc-top-half/musl/src/stdio/tempnam.c b/libc-top-half/musl/src/stdio/tempnam.c new file mode 100644 index 0000000..565df6b --- /dev/null +++ b/libc-top-half/musl/src/stdio/tempnam.c @@ -0,0 +1,49 @@ +#include <stdio.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/stat.h> +#include <limits.h> +#include <string.h> +#include <stdlib.h> +#include "syscall.h" +#include "kstat.h" + +#define MAXTRIES 100 + +char *tempnam(const char *dir, const char *pfx) +{ + char s[PATH_MAX]; + size_t l, dl, pl; + int try; + int r; + + if (!dir) dir = P_tmpdir; + if (!pfx) pfx = "temp"; + + dl = strlen(dir); + pl = strlen(pfx); + l = dl + 1 + pl + 1 + 6; + + if (l >= PATH_MAX) { + errno = ENAMETOOLONG; + return 0; + } + + memcpy(s, dir, dl); + s[dl] = '/'; + memcpy(s+dl+1, pfx, pl); + s[dl+1+pl] = '_'; + s[l] = 0; + + for (try=0; try<MAXTRIES; try++) { + __randname(s+l-6); +#ifdef SYS_lstat + r = __syscall(SYS_lstat, s, &(struct kstat){0}); +#else + r = __syscall(SYS_fstatat, AT_FDCWD, s, + &(struct kstat){0}, AT_SYMLINK_NOFOLLOW); +#endif + if (r == -ENOENT) return strdup(s); + } + return 0; +} |