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