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