diff options
author | Rich Felker <dalias@aerifal.cx> | 2014-05-27 00:44:23 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2014-05-27 00:44:23 -0400 |
commit | 2fe6579125fe042f2255afbf00fc8e4b80d6a6be (patch) | |
tree | 153294950c138c8cbef7ca3a9dd145f99f7afc6e /src/stdio/tmpnam.c | |
parent | 9b880a6b4112b0b3c0bd07949f7836daeea4e712 (diff) | |
download | musl-2fe6579125fe042f2255afbf00fc8e4b80d6a6be.tar.gz musl-2fe6579125fe042f2255afbf00fc8e4b80d6a6be.tar.xz musl-2fe6579125fe042f2255afbf00fc8e4b80d6a6be.zip |
overhaul tmpfile, tmpnam, and tempnam functions
these all now use the shared __randname function internally, rather than duplicating logic for producing a random name. incorrect usage of the access syscall (which works with real uid/gid, not effective) has been removed, along with unnecessary heavy dependencies like snprintf.
Diffstat (limited to 'src/stdio/tmpnam.c')
-rw-r--r-- | src/stdio/tmpnam.c | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/src/stdio/tmpnam.c b/src/stdio/tmpnam.c index 2bd72b3b..92f699c2 100644 --- a/src/stdio/tmpnam.c +++ b/src/stdio/tmpnam.c @@ -1,31 +1,23 @@ #include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <unistd.h> -#include <time.h> -#include "libc.h" +#include <fcntl.h> +#include <errno.h> +#include <sys/stat.h> #include "syscall.h" -#include "atomic.h" #define MAXTRIES 100 -char *tmpnam(char *s) -{ - static int index; - static char s2[L_tmpnam]; - struct timespec ts; - int try = 0; - unsigned n; - - if (!s) s = s2; +char *__randname(char *); - if (__syscall(SYS_access, P_tmpdir, R_OK|W_OK|X_OK) != 0) - return NULL; - - do { - __syscall(SYS_clock_gettime, CLOCK_REALTIME, &ts, 0); - n = ts.tv_nsec ^ (uintptr_t)&s ^ (uintptr_t)s; - snprintf(s, L_tmpnam, "/tmp/t%x-%x", a_fetch_add(&index, 1), n); - } while (!__syscall(SYS_access, s, F_OK) && try++<MAXTRIES); - return try>=MAXTRIES ? 0 : s; +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); + r = __syscall(SYS_lstat, s, &(struct stat){0}); + if (r == -ENOENT) return strcpy(buf ? buf : internal, s); + } + return 0; } |