|  | /* | 
|  |  | 
|  | @deftypefn Supplemental char* tmpnam (char *@var{s}) | 
|  |  | 
|  | This function attempts to create a name for a temporary file, which | 
|  | will be a valid file name yet not exist when @code{tmpnam} checks for | 
|  | it.  @var{s} must point to a buffer of at least @code{L_tmpnam} bytes, | 
|  | or be @code{NULL}.  Use of this function creates a security risk, and it must | 
|  | not be used in new projects.  Use @code{mkstemp} instead. | 
|  |  | 
|  | @end deftypefn | 
|  |  | 
|  | */ | 
|  |  | 
|  | #include <stdio.h> | 
|  |  | 
|  | #ifndef L_tmpnam | 
|  | #define L_tmpnam 100 | 
|  | #endif | 
|  | #ifndef P_tmpdir | 
|  | #define P_tmpdir "/usr/tmp" | 
|  | #endif | 
|  |  | 
|  | static char tmpnam_buffer[L_tmpnam]; | 
|  | static int tmpnam_counter; | 
|  |  | 
|  | extern int getpid (void); | 
|  |  | 
|  | char * | 
|  | tmpnam (char *s) | 
|  | { | 
|  | int pid = getpid (); | 
|  |  | 
|  | if (s == NULL) | 
|  | s = tmpnam_buffer; | 
|  |  | 
|  | /*  Generate the filename and make sure that there isn't one called | 
|  | it already.  */ | 
|  |  | 
|  | while (1) | 
|  | { | 
|  | FILE *f; | 
|  | sprintf (s, "%s/%s%x.%x", P_tmpdir, "t", pid, tmpnam_counter); | 
|  | f = fopen (s, "r"); | 
|  | if (f == NULL) | 
|  | break; | 
|  | tmpnam_counter++; | 
|  | fclose (f); | 
|  | } | 
|  |  | 
|  | return s; | 
|  | } |