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