• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <stdlib.h>
8 #include "syscall.h"
9 
10 #define MAXTRIES 100
11 
tempnam(const char * dir,const char * pfx)12 char *tempnam(const char *dir, const char *pfx)
13 {
14 	char s[PATH_MAX];
15 	size_t l, dl, pl;
16 	int try;
17 	int r;
18 
19 	if (!dir) dir = P_tmpdir;
20 	if (!pfx) pfx = "temp";
21 
22 	dl = strlen(dir);
23 	pl = strlen(pfx);
24 	l = dl + 1 + pl + 1 + 6;
25 
26 	if (l >= PATH_MAX) {
27 		errno = ENAMETOOLONG;
28 		return 0;
29 	}
30 
31 	memcpy(s, dir, dl);
32 	s[dl] = '/';
33 	memcpy(s+dl+1, pfx, pl);
34 	s[dl+1+pl] = '_';
35 	s[l] = 0;
36 
37 	for (try=0; try<MAXTRIES; try++) {
38 		__randname(s+l-6);
39 #ifdef SYS_readlink
40 		r = __syscall(SYS_readlink, s, (char[1]){0}, 1);
41 #else
42 		r = __syscall(SYS_readlinkat, AT_FDCWD, s, (char[1]){0}, 1);
43 #endif
44 		if (r == -ENOENT) return strdup(s);
45 	}
46 	return 0;
47 }
48