1#include <stdio.h> 2#include <fcntl.h> 3#include <errno.h> 4#include <sys/stat.h> 5#include <limits.h> 6#include <string.h> 7#include "syscall.h" 8 9#define MAXTRIES 100 10 11char *__randname(char *); 12 13char *tempnam(const char *dir, const char *pfx) 14{ 15 char s[PATH_MAX]; 16 size_t l, dl, pl; 17 int try; 18 int r; 19 20 if (!dir) dir = P_tmpdir; 21 if (!pfx) pfx = "temp"; 22 23 dl = strlen(dir); 24 pl = strlen(pfx); 25 l = dl + 1 + pl + 1 + 6; 26 27 if (l >= PATH_MAX) { 28 errno = ENAMETOOLONG; 29 return 0; 30 } 31 32 memcpy(s, dir, dl); 33 s[dl] = '/'; 34 memcpy(s+dl+1, pfx, pl); 35 s[dl+1+pl] = '_'; 36 s[l] = 0; 37 38 for (try=0; try<MAXTRIES; try++) { 39 __randname(s+l-6); 40#ifdef SYS_lstat 41 r = __syscall(SYS_lstat, s, &(struct stat){0}); 42#else 43 r = __syscall(SYS_fstatat, AT_FDCWD, s, 44 &(struct stat){0}, AT_SYMLINK_NOFOLLOW); 45#endif 46 if (r == -ENOENT) return strdup(s); 47 } 48 return 0; 49} 50