X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fstdio%2Ftempnam.c;h=0c65b1f08e5e439ac0228e50bb340296f58a89cc;hb=1d5750b95c06913a1f18a995481276d698d20fae;hp=f73ca9f9027f4cec78819da8b954fb7d932a837f;hpb=0e1762539c2ad359ba10502cdfb750b5afd2329e;p=musl diff --git a/src/stdio/tempnam.c b/src/stdio/tempnam.c index f73ca9f9..0c65b1f0 100644 --- a/src/stdio/tempnam.c +++ b/src/stdio/tempnam.c @@ -1,42 +1,47 @@ #include +#include +#include +#include +#include #include #include -#include -#include -#include -#include "libc.h" -#include "atomic.h" +#include "syscall.h" #define MAXTRIES 100 char *tempnam(const char *dir, const char *pfx) { - static int index; - char *s; - struct timespec ts; - int pid = getpid(); - size_t l; - int n; - int try=0; + char s[PATH_MAX]; + size_t l, dl, pl; + int try; + int r; if (!dir) dir = P_tmpdir; if (!pfx) pfx = "temp"; - if (access(dir, R_OK|W_OK|X_OK) != 0) - return NULL; + dl = strlen(dir); + pl = strlen(pfx); + l = dl + 1 + pl + 1 + 6; - l = strlen(dir) + 1 + strlen(pfx) + 3*(sizeof(int)*3+2) + 1; - s = malloc(l); - if (!s) return s; - - do { - clock_gettime(CLOCK_REALTIME, &ts); - n = ts.tv_nsec ^ (uintptr_t)&s ^ (uintptr_t)s; - snprintf(s, l, "%s/%s-%d-%d-%x", dir, pfx, pid, a_fetch_add(&index, 1), n); - } while (!access(s, F_OK) && try++=MAXTRIES) { - free(s); + if (l >= PATH_MAX) { + errno = ENAMETOOLONG; return 0; } - return s; + + memcpy(s, dir, dl); + s[dl] = '/'; + memcpy(s+dl+1, pfx, pl); + s[dl+1+pl] = '_'; + s[l] = 0; + + for (try=0; try