xref: /plan9/sys/src/cmd/postscript/common/tempnam.c (revision 14f51593fd82e19ba95969a8c07ff71131015979)
1219b2ee8SDavid du Colombier #if defined(V9) || defined(BSD4_2) || defined(plan9)
2*14f51593SDavid du Colombier #define _BSD_EXTENSION
3*14f51593SDavid du Colombier 
4fd09ca94SDavid du Colombier #include <stdio.h>
5fd09ca94SDavid du Colombier #include <stdlib.h>
6fd09ca94SDavid du Colombier #include <unistd.h>
7*14f51593SDavid du Colombier #include <string.h>
8fd09ca94SDavid du Colombier #include <errno.h>
9fd09ca94SDavid du Colombier #include <sys/types.h>
10fd09ca94SDavid du Colombier #include <sys/stat.h>
11fd09ca94SDavid du Colombier 
12fd09ca94SDavid du Colombier char *
tempnam(char * dir,char * pfx)13fd09ca94SDavid du Colombier tempnam(char *dir, char *pfx)
14fd09ca94SDavid du Colombier {
15219b2ee8SDavid du Colombier 	int pid;
16fd09ca94SDavid du Colombier 	char *tnm;
17fd09ca94SDavid du Colombier 	struct stat stb;
18219b2ee8SDavid du Colombier 	static int seq = 0;
19219b2ee8SDavid du Colombier 
20fd09ca94SDavid du Colombier 	if (dir == NULL)
21fd09ca94SDavid du Colombier 		dir = ".";
22fd09ca94SDavid du Colombier #ifdef plan9
23fd09ca94SDavid du Colombier 	/* our access emulation has a race when checking for write access */
24fd09ca94SDavid du Colombier 	if (access(dir, R_OK|X_OK) == -1)
25fd09ca94SDavid du Colombier #else
26fd09ca94SDavid du Colombier 	if (access(dir, R_OK|W_OK|X_OK) == -1)
27fd09ca94SDavid du Colombier #endif
28fd09ca94SDavid du Colombier 		return NULL;
29219b2ee8SDavid du Colombier 	pid = getpid();
30fd09ca94SDavid du Colombier 	tnm = malloc(strlen(dir) + 1 + strlen(pfx) + 2*20 + 1);
31fd09ca94SDavid du Colombier 	if (tnm == NULL)
32fd09ca94SDavid du Colombier 		return NULL;
33219b2ee8SDavid du Colombier 	do {
34fd09ca94SDavid du Colombier 		sprintf(tnm, "%s/%s.%d.%d", dir, pfx, pid, seq++);
35219b2ee8SDavid du Colombier 		errno = 0;
36fd09ca94SDavid du Colombier 	} while (stat(tnm, &stb) >= 0 && seq < 256);
37fd09ca94SDavid du Colombier 	return tnm;
38219b2ee8SDavid du Colombier }
39219b2ee8SDavid du Colombier #endif
40