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