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