xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/tmpfile.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 #include <stdlib.h>
2 #include <unistd.h>
3 #include <string.h>
4 #include "sys9.h"
5 #undef OPEN
6 #include "../stdio/iolib.h"
7 #include "lib.h"
8 #include "dir.h"
9 
10 FILE *
tmpfile(void)11 tmpfile(void){
12 	FILE *f;
13 	static char name[]="/tmp/tf0000000000000";
14 	char *p;
15 	int n;
16 	for(f=_IO_stream;f!=&_IO_stream[FOPEN_MAX];f++)
17 		if(f->state==CLOSED)
18 			break;
19 	if(f==&_IO_stream[FOPEN_MAX])
20 		return NULL;
21 	while(access(name, 0) >= 0){
22 		p = name+7;
23 		while(*p == '9')
24 			*p++ = '0';
25 		if(*p == '\0')
26 			return NULL;
27 		++*p;
28 	}
29 	n = _CREATE(name, 64|2, 0777); /* remove-on-close */
30 	if(n==-1){
31 		_syserrno();
32 		return NULL;
33 	}
34 	_fdinfo[n].flags = FD_ISOPEN;
35 	_fdinfo[n].oflags = 2;
36 	f->fd=n;
37 	f->flags=0;
38 	f->state=OPEN;
39 	f->buf=0;
40 	f->rp=0;
41 	f->wp=0;
42 	f->lp=0;
43 	return f;
44 }
45