1*1debfc3dSmrg /* 2*1debfc3dSmrg 3*1debfc3dSmrg @deftypefn Supplemental char* tmpnam (char *@var{s}) 4*1debfc3dSmrg 5*1debfc3dSmrg This function attempts to create a name for a temporary file, which 6*1debfc3dSmrg will be a valid file name yet not exist when @code{tmpnam} checks for 7*1debfc3dSmrg it. @var{s} must point to a buffer of at least @code{L_tmpnam} bytes, 8*1debfc3dSmrg or be @code{NULL}. Use of this function creates a security risk, and it must 9*1debfc3dSmrg not be used in new projects. Use @code{mkstemp} instead. 10*1debfc3dSmrg 11*1debfc3dSmrg @end deftypefn 12*1debfc3dSmrg 13*1debfc3dSmrg */ 14*1debfc3dSmrg 15*1debfc3dSmrg #include <stdio.h> 16*1debfc3dSmrg 17*1debfc3dSmrg #ifndef L_tmpnam 18*1debfc3dSmrg #define L_tmpnam 100 19*1debfc3dSmrg #endif 20*1debfc3dSmrg #ifndef P_tmpdir 21*1debfc3dSmrg #define P_tmpdir "/usr/tmp" 22*1debfc3dSmrg #endif 23*1debfc3dSmrg 24*1debfc3dSmrg static char tmpnam_buffer[L_tmpnam]; 25*1debfc3dSmrg static int tmpnam_counter; 26*1debfc3dSmrg 27*1debfc3dSmrg extern int getpid (void); 28*1debfc3dSmrg 29*1debfc3dSmrg char * tmpnam(char * s)30*1debfc3dSmrgtmpnam (char *s) 31*1debfc3dSmrg { 32*1debfc3dSmrg int pid = getpid (); 33*1debfc3dSmrg 34*1debfc3dSmrg if (s == NULL) 35*1debfc3dSmrg s = tmpnam_buffer; 36*1debfc3dSmrg 37*1debfc3dSmrg /* Generate the filename and make sure that there isn't one called 38*1debfc3dSmrg it already. */ 39*1debfc3dSmrg 40*1debfc3dSmrg while (1) 41*1debfc3dSmrg { 42*1debfc3dSmrg FILE *f; 43*1debfc3dSmrg sprintf (s, "%s/%s%x.%x", P_tmpdir, "t", pid, tmpnam_counter); 44*1debfc3dSmrg f = fopen (s, "r"); 45*1debfc3dSmrg if (f == NULL) 46*1debfc3dSmrg break; 47*1debfc3dSmrg tmpnam_counter++; 48*1debfc3dSmrg fclose (f); 49*1debfc3dSmrg } 50*1debfc3dSmrg 51*1debfc3dSmrg return s; 52*1debfc3dSmrg } 53