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