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