diff options
Diffstat (limited to 'libc-top-half/musl/src/stdio/tmpnam.c')
-rw-r--r-- | libc-top-half/musl/src/stdio/tmpnam.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/libc-top-half/musl/src/stdio/tmpnam.c b/libc-top-half/musl/src/stdio/tmpnam.c new file mode 100644 index 0000000..d667a83 --- /dev/null +++ b/libc-top-half/musl/src/stdio/tmpnam.c @@ -0,0 +1,29 @@ +#include <stdio.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/stat.h> +#include <string.h> +#include <stdlib.h> +#include "syscall.h" +#include "kstat.h" + +#define MAXTRIES 100 + +char *tmpnam(char *buf) +{ + static char internal[L_tmpnam]; + char s[] = "/tmp/tmpnam_XXXXXX"; + int try; + int r; + for (try=0; try<MAXTRIES; try++) { + __randname(s+12); +#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 strcpy(buf ? buf : internal, s); + } + return 0; +} |