xref: /plan9/sys/src/ape/lib/bsd/mktemp.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <stdlib.h>
2*219b2ee8SDavid du Colombier #include <sys/types.h>
3*219b2ee8SDavid du Colombier #include <sys/stat.h>
4*219b2ee8SDavid du Colombier #include <unistd.h>
5*219b2ee8SDavid du Colombier #include <string.h>
6*219b2ee8SDavid du Colombier #include <stdio.h>
7*219b2ee8SDavid du Colombier 
8*219b2ee8SDavid du Colombier char*
mktemp(char * template)9*219b2ee8SDavid du Colombier mktemp(char *template)
10*219b2ee8SDavid du Colombier {
11*219b2ee8SDavid du Colombier 	int n;
12*219b2ee8SDavid du Colombier 	long x;
13*219b2ee8SDavid du Colombier 	char *p;
14*219b2ee8SDavid du Colombier 	int c;
15*219b2ee8SDavid du Colombier 	struct stat stbuf;
16*219b2ee8SDavid du Colombier 
17*219b2ee8SDavid du Colombier 	n = strlen(template);
18*219b2ee8SDavid du Colombier 	p = template+n-6;
19*219b2ee8SDavid du Colombier 	if (n < 6 || strcmp(p, "XXXXXX") != 0) {
20*219b2ee8SDavid du Colombier 		*template = 0;
21*219b2ee8SDavid du Colombier 	} else {
22*219b2ee8SDavid du Colombier 		x = getpid() % 100000;
23*219b2ee8SDavid du Colombier 		sprintf(p, "%05d", x);
24*219b2ee8SDavid du Colombier 		p += 5;
25*219b2ee8SDavid du Colombier 		for(c = 'a'; c <= 'z'; c++) {
26*219b2ee8SDavid du Colombier 			*p = c;
27*219b2ee8SDavid du Colombier 			if (stat(template, &stbuf) < 0)
28*219b2ee8SDavid du Colombier 				return template;
29*219b2ee8SDavid du Colombier 		}
30*219b2ee8SDavid du Colombier 		*template = 0;
31*219b2ee8SDavid du Colombier 	}
32*219b2ee8SDavid du Colombier 	return template;
33*219b2ee8SDavid du Colombier }
34