| /* | |
| @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; | |
| } |