2016-11-25 17:18:40 +01:00
|
|
|
/*
|
|
|
|
* This file is part of the UCB release of Plan 9. It is subject to the license
|
|
|
|
* terms in the LICENSE file found in the top-level directory of this
|
|
|
|
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
|
|
|
|
* part of the UCB release of Plan 9, including this file, may be copied,
|
|
|
|
* modified, propagated, or distributed except according to the terms contained
|
|
|
|
* in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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"
|
|
|
|
|
|
|
|
static char tmpsmade[FOPEN_MAX][L_tmpnam+1];
|
|
|
|
static int ntmps = 0;
|
|
|
|
|
|
|
|
static void rmtmps(void);
|
|
|
|
|
|
|
|
FILE *tmpfile(void){
|
|
|
|
FILE *f;
|
|
|
|
static char name[]="/tmp/tf0000000000000";
|
|
|
|
char *p;
|
2016-12-01 00:09:42 +01:00
|
|
|
while(access(name, AEXIST)==0){
|
2016-11-25 17:18:40 +01:00
|
|
|
p=name+7;
|
|
|
|
while(*p=='9') *p++='0';
|
|
|
|
if(*p=='\0') return NULL;
|
|
|
|
++*p;
|
|
|
|
}
|
|
|
|
f=fopen(name, "wb+");
|
|
|
|
if(f && ntmps<FOPEN_MAX){
|
|
|
|
if(ntmps==0)
|
|
|
|
atexit(rmtmps);
|
|
|
|
strcpy(tmpsmade[ntmps++], name);
|
|
|
|
}
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
rmtmps(void)
|
|
|
|
{
|
|
|
|
int i;
|
2016-12-01 00:09:42 +01:00
|
|
|
|
2016-11-25 17:18:40 +01:00
|
|
|
for(i=0; i<ntmps; i++)
|
|
|
|
remove(tmpsmade[i]);
|
|
|
|
}
|