xref: /plan9/sys/src/cmd/postscript/common/tempnam.c (revision fd09ca941898d683357731c0553304f21c5a1596)
1219b2ee8SDavid du Colombier #if defined(V9) || defined(BSD4_2) || defined(plan9)
2*fd09ca94SDavid du Colombier #include <stdio.h>
3*fd09ca94SDavid du Colombier #include <stdlib.h>
4*fd09ca94SDavid du Colombier #include <unistd.h>
5*fd09ca94SDavid du Colombier #include <errno.h>
6*fd09ca94SDavid du Colombier #include <sys/types.h>
7*fd09ca94SDavid du Colombier #include <sys/stat.h>
8*fd09ca94SDavid du Colombier 
9*fd09ca94SDavid du Colombier char *
10*fd09ca94SDavid du Colombier tempnam(char *dir, char *pfx)
11*fd09ca94SDavid du Colombier {
12219b2ee8SDavid du Colombier 	int pid;
13*fd09ca94SDavid du Colombier 	char *tnm;
14*fd09ca94SDavid du Colombier 	struct stat stb;
15219b2ee8SDavid du Colombier 	static int seq = 0;
16219b2ee8SDavid du Colombier 
17*fd09ca94SDavid du Colombier 	if (dir == NULL)
18*fd09ca94SDavid du Colombier 		dir = ".";
19*fd09ca94SDavid du Colombier #ifdef plan9
20*fd09ca94SDavid du Colombier 	/* our access emulation has a race when checking for write access */
21*fd09ca94SDavid du Colombier 	if (access(dir, R_OK|X_OK) == -1)
22*fd09ca94SDavid du Colombier #else
23*fd09ca94SDavid du Colombier 	if (access(dir, R_OK|W_OK|X_OK) == -1)
24*fd09ca94SDavid du Colombier #endif
25*fd09ca94SDavid du Colombier 		return NULL;
26219b2ee8SDavid du Colombier 	pid = getpid();
27*fd09ca94SDavid du Colombier 	tnm = malloc(strlen(dir) + 1 + strlen(pfx) + 2*20 + 1);
28*fd09ca94SDavid du Colombier 	if (tnm == NULL)
29*fd09ca94SDavid du Colombier 		return NULL;
30219b2ee8SDavid du Colombier 	do {
31*fd09ca94SDavid du Colombier 		sprintf(tnm, "%s/%s.%d.%d", dir, pfx, pid, seq++);
32219b2ee8SDavid du Colombier 		errno = 0;
33*fd09ca94SDavid du Colombier 	} while (stat(tnm, &stb) >= 0 && seq < 256);
34*fd09ca94SDavid du Colombier 	return tnm;
35219b2ee8SDavid du Colombier }
36219b2ee8SDavid du Colombier #endif
37