#include <stdio.h> #include <fcntl.h> #include <errno.h> #include <sys/stat.h> #include <limits.h> #include <string.h> #include "syscall.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] = '_'; for (try=0; try<MAXTRIES; try++) { __randname(s+l-6); #ifdef SYS_lstat r = __syscall(SYS_lstat, s, &(struct stat){0}); #else r = __syscall(SYS_fstatat, AT_FDCWD, s, &(struct stat){0}, AT_SYMLINK_NOFOLLOW); #endif if (r == -ENOENT) return strdup(s); } return 0; }