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