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 ColombierFILE *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