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