xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/tmpfile.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include <stdlib.h>
23e12c5d1SDavid du Colombier #include <unistd.h>
33e12c5d1SDavid du Colombier #include <string.h>
43e12c5d1SDavid du Colombier #include "sys9.h"
53e12c5d1SDavid du Colombier #undef OPEN
63e12c5d1SDavid du Colombier #include "../stdio/iolib.h"
73e12c5d1SDavid du Colombier #include "lib.h"
8219b2ee8SDavid du Colombier #include "dir.h"
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier FILE *
tmpfile(void)113e12c5d1SDavid du Colombier tmpfile(void){
123e12c5d1SDavid du Colombier 	FILE *f;
133e12c5d1SDavid du Colombier 	static char name[]="/tmp/tf0000000000000";
143e12c5d1SDavid du Colombier 	char *p;
153e12c5d1SDavid du Colombier 	int n;
163e12c5d1SDavid du Colombier 	for(f=_IO_stream;f!=&_IO_stream[FOPEN_MAX];f++)
173e12c5d1SDavid du Colombier 		if(f->state==CLOSED)
183e12c5d1SDavid du Colombier 			break;
193e12c5d1SDavid du Colombier 	if(f==&_IO_stream[FOPEN_MAX])
203e12c5d1SDavid du Colombier 		return NULL;
21*9a747e4fSDavid du Colombier 	while(access(name, 0) >= 0){
223e12c5d1SDavid du Colombier 		p = name+7;
233e12c5d1SDavid du Colombier 		while(*p == '9')
243e12c5d1SDavid du Colombier 			*p++ = '0';
253e12c5d1SDavid du Colombier 		if(*p == '\0')
263e12c5d1SDavid du Colombier 			return NULL;
273e12c5d1SDavid du Colombier 		++*p;
283e12c5d1SDavid du Colombier 	}
293e12c5d1SDavid du Colombier 	n = _CREATE(name, 64|2, 0777); /* remove-on-close */
303e12c5d1SDavid du Colombier 	if(n==-1){
313e12c5d1SDavid du Colombier 		_syserrno();
323e12c5d1SDavid du Colombier 		return NULL;
333e12c5d1SDavid du Colombier 	}
343e12c5d1SDavid du Colombier 	_fdinfo[n].flags = FD_ISOPEN;
353e12c5d1SDavid du Colombier 	_fdinfo[n].oflags = 2;
363e12c5d1SDavid du Colombier 	f->fd=n;
373e12c5d1SDavid du Colombier 	f->flags=0;
383e12c5d1SDavid du Colombier 	f->state=OPEN;
393e12c5d1SDavid du Colombier 	f->buf=0;
403e12c5d1SDavid du Colombier 	f->rp=0;
413e12c5d1SDavid du Colombier 	f->wp=0;
423e12c5d1SDavid du Colombier 	f->lp=0;
433e12c5d1SDavid du Colombier 	return f;
443e12c5d1SDavid du Colombier }
45