X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fstdio%2Ftempnam.c;h=565df6b656a957d58694853b982dc1705cac424e;hb=c9ebff4736128186121424364c1c62224b02aee3;hp=2cbcb8649f1fd885d145ba1d8b97b8c3263a9586;hpb=0b44a0315b47dd8eced9f3b7f31580cf14bbfc01;p=musl diff --git a/src/stdio/tempnam.c b/src/stdio/tempnam.c index 2cbcb864..565df6b6 100644 --- a/src/stdio/tempnam.c +++ b/src/stdio/tempnam.c @@ -1,42 +1,49 @@ #include -#include -#include #include -#include -#include #include -#include "libc.h" +#include +#include +#include +#include +#include "syscall.h" +#include "kstat.h" + +#define MAXTRIES 100 char *tempnam(const char *dir, const char *pfx) { - static int lock; - static int index; - char *s; - int pid = getpid(); - int l; + 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) + 2 + sizeof(int)*3*2 + 1; - s = malloc(l); - if (!s) { - errno = ENOMEM; - return NULL; + if (l >= PATH_MAX) { + errno = ENAMETOOLONG; + return 0; } - LOCK(&lock); - for (; index < TMP_MAX; index++) { - snprintf(s, l, "%s/%s-%d-%d", dir, pfx, pid, index); - if (access(s, F_OK) != 0) { - UNLOCK(&lock); - 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