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