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