#include <stdio.h> | |
#include <fcntl.h> | |
#include <errno.h> | |
#include <sys/stat.h> | |
#include <limits.h> | |
#include <string.h> | |
#define MAXTRIES 100 | |
char* __randname(char*); | |
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); | |
r = lstat(s, &(struct stat){0}); | |
if (r == -ENOENT) | |
return strdup(s); | |
} | |
return 0; | |
} |