xref: /aosp_15_r20/external/musl/src/temp/mktemp.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #define _GNU_SOURCE
2*c9945492SAndroid Build Coastguard Worker #include <string.h>
3*c9945492SAndroid Build Coastguard Worker #include <stdlib.h>
4*c9945492SAndroid Build Coastguard Worker #include <errno.h>
5*c9945492SAndroid Build Coastguard Worker #include <sys/stat.h>
6*c9945492SAndroid Build Coastguard Worker 
mktemp(char * template)7*c9945492SAndroid Build Coastguard Worker char *mktemp(char *template)
8*c9945492SAndroid Build Coastguard Worker {
9*c9945492SAndroid Build Coastguard Worker 	size_t l = strlen(template);
10*c9945492SAndroid Build Coastguard Worker 	int retries = 100;
11*c9945492SAndroid Build Coastguard Worker 	struct stat st;
12*c9945492SAndroid Build Coastguard Worker 
13*c9945492SAndroid Build Coastguard Worker 	if (l < 6 || memcmp(template+l-6, "XXXXXX", 6)) {
14*c9945492SAndroid Build Coastguard Worker 		errno = EINVAL;
15*c9945492SAndroid Build Coastguard Worker 		*template = 0;
16*c9945492SAndroid Build Coastguard Worker 		return template;
17*c9945492SAndroid Build Coastguard Worker 	}
18*c9945492SAndroid Build Coastguard Worker 
19*c9945492SAndroid Build Coastguard Worker 	do {
20*c9945492SAndroid Build Coastguard Worker 		__randname(template+l-6);
21*c9945492SAndroid Build Coastguard Worker 		if (stat(template, &st)) {
22*c9945492SAndroid Build Coastguard Worker 			if (errno != ENOENT) *template = 0;
23*c9945492SAndroid Build Coastguard Worker 			return template;
24*c9945492SAndroid Build Coastguard Worker 		}
25*c9945492SAndroid Build Coastguard Worker 	} while (--retries);
26*c9945492SAndroid Build Coastguard Worker 
27*c9945492SAndroid Build Coastguard Worker 	*template = 0;
28*c9945492SAndroid Build Coastguard Worker 	errno = EEXIST;
29*c9945492SAndroid Build Coastguard Worker 	return template;
30*c9945492SAndroid Build Coastguard Worker }
31