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