xref: /aosp_15_r20/external/musl/src/stdio/tmpfile.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <stdio.h>
2*c9945492SAndroid Build Coastguard Worker #include <fcntl.h>
3*c9945492SAndroid Build Coastguard Worker #include <stdlib.h>
4*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h"
5*c9945492SAndroid Build Coastguard Worker 
6*c9945492SAndroid Build Coastguard Worker #define MAXTRIES 100
7*c9945492SAndroid Build Coastguard Worker 
tmpfile(void)8*c9945492SAndroid Build Coastguard Worker FILE *tmpfile(void)
9*c9945492SAndroid Build Coastguard Worker {
10*c9945492SAndroid Build Coastguard Worker 	char s[] = "/tmp/tmpfile_XXXXXX";
11*c9945492SAndroid Build Coastguard Worker 	int fd;
12*c9945492SAndroid Build Coastguard Worker 	FILE *f;
13*c9945492SAndroid Build Coastguard Worker 	int try;
14*c9945492SAndroid Build Coastguard Worker 	for (try=0; try<MAXTRIES; try++) {
15*c9945492SAndroid Build Coastguard Worker 		__randname(s+13);
16*c9945492SAndroid Build Coastguard Worker 		fd = sys_open(s, O_RDWR|O_CREAT|O_EXCL, 0600);
17*c9945492SAndroid Build Coastguard Worker 		if (fd >= 0) {
18*c9945492SAndroid Build Coastguard Worker #ifdef SYS_unlink
19*c9945492SAndroid Build Coastguard Worker 			__syscall(SYS_unlink, s);
20*c9945492SAndroid Build Coastguard Worker #else
21*c9945492SAndroid Build Coastguard Worker 			__syscall(SYS_unlinkat, AT_FDCWD, s, 0);
22*c9945492SAndroid Build Coastguard Worker #endif
23*c9945492SAndroid Build Coastguard Worker 			f = __fdopen(fd, "w+");
24*c9945492SAndroid Build Coastguard Worker 			if (!f) __syscall(SYS_close, fd);
25*c9945492SAndroid Build Coastguard Worker 			return f;
26*c9945492SAndroid Build Coastguard Worker 		}
27*c9945492SAndroid Build Coastguard Worker 	}
28*c9945492SAndroid Build Coastguard Worker 	return 0;
29*c9945492SAndroid Build Coastguard Worker }
30