xref: /plan9/sys/src/ape/lib/ap/stdio/tmpfile.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier /*
2*3e12c5d1SDavid du Colombier  * This file not used on plan9: see ../plan9/tmpfile.c
3*3e12c5d1SDavid du Colombier  */
4*3e12c5d1SDavid du Colombier /*
5*3e12c5d1SDavid du Colombier  * pANS stdio -- tmpfile
6*3e12c5d1SDavid du Colombier  *
7*3e12c5d1SDavid du Colombier  * Bug: contains a critical section.  Two executions by the same
8*3e12c5d1SDavid du Colombier  * user could interleave as follows, both yielding the same file:
9*3e12c5d1SDavid du Colombier  *	access fails
10*3e12c5d1SDavid du Colombier  *			access fails
11*3e12c5d1SDavid du Colombier  *	fopen succeeds
12*3e12c5d1SDavid du Colombier  *			fopen succeeds
13*3e12c5d1SDavid du Colombier  *	unlink succeeds
14*3e12c5d1SDavid du Colombier  *			unlink fails
15*3e12c5d1SDavid du Colombier  * As I read the pANS, this can't reasonably use tmpnam to generate
16*3e12c5d1SDavid du Colombier  * the name, so that code is duplicated.
17*3e12c5d1SDavid du Colombier  */
18*3e12c5d1SDavid du Colombier #include "iolib.h"
tmpfile(void)19*3e12c5d1SDavid du Colombier FILE *tmpfile(void){
20*3e12c5d1SDavid du Colombier 	FILE *f;
21*3e12c5d1SDavid du Colombier 	static char name[]="/tmp/tf000000000000";
22*3e12c5d1SDavid du Colombier 	char *p;
23*3e12c5d1SDavid du Colombier 	while(access(name, 0)==0){
24*3e12c5d1SDavid du Colombier 		p=name+7;
25*3e12c5d1SDavid du Colombier 		while(*p=='9') *p++='0';
26*3e12c5d1SDavid du Colombier 		if(*p=='\0') return NULL;
27*3e12c5d1SDavid du Colombier 		++*p;
28*3e12c5d1SDavid du Colombier 	}
29*3e12c5d1SDavid du Colombier 	f=fopen(name, "wb+");
30*3e12c5d1SDavid du Colombier 	unlink(name);
31*3e12c5d1SDavid du Colombier 	return f;
32*3e12c5d1SDavid du Colombier }
33