1169695Skan/* 2169695Skan 3169695Skan@deftypefn Supplemental char* tmpnam (char *@var{s}) 4169695Skan 5169695SkanThis function attempts to create a name for a temporary file, which 6169695Skanwill be a valid file name yet not exist when @code{tmpnam} checks for 7169695Skanit. @var{s} must point to a buffer of at least @code{L_tmpnam} bytes, 8169695Skanor be @code{NULL}. Use of this function creates a security risk, and it must 9169695Skannot be used in new projects. Use @code{mkstemp} instead. 10169695Skan 11169695Skan@end deftypefn 12169695Skan 13169695Skan*/ 14169695Skan 15169695Skan#include <stdio.h> 16169695Skan 17169695Skan#ifndef L_tmpnam 18169695Skan#define L_tmpnam 100 19169695Skan#endif 20169695Skan#ifndef P_tmpdir 21169695Skan#define P_tmpdir "/usr/tmp" 22169695Skan#endif 23169695Skan 24169695Skanstatic char tmpnam_buffer[L_tmpnam]; 25169695Skanstatic int tmpnam_counter; 26169695Skan 27169695Skanextern int getpid (void); 28169695Skan 29169695Skanchar * 30169695Skantmpnam (char *s) 31169695Skan{ 32169695Skan int pid = getpid (); 33169695Skan 34169695Skan if (s == NULL) 35169695Skan s = tmpnam_buffer; 36169695Skan 37169695Skan /* Generate the filename and make sure that there isn't one called 38169695Skan it already. */ 39169695Skan 40169695Skan while (1) 41169695Skan { 42169695Skan FILE *f; 43169695Skan sprintf (s, "%s/%s%x.%x", P_tmpdir, "t", pid, tmpnam_counter); 44169695Skan f = fopen (s, "r"); 45169695Skan if (f == NULL) 46169695Skan break; 47169695Skan tmpnam_counter++; 48169695Skan fclose (f); 49169695Skan } 50169695Skan 51169695Skan return s; 52169695Skan} 53