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