(root)/
glibc-2.38/
stdio-common/
tmpnam.c
       1  /* Copyright (C) 1991-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <stdio.h>
      19  #include <string.h>
      20  
      21  static char tmpnam_buffer[L_tmpnam];
      22  
      23  /* Generate a unique filename in P_tmpdir.
      24  
      25     This function is *not* thread safe!  */
      26  char *
      27  tmpnam (char s[L_tmpnam])
      28  {
      29    /* By using two buffers we manage to be thread safe in the case
      30       where S != NULL.  */
      31    char tmpbufmem[L_tmpnam];
      32    char *tmpbuf = s ?: tmpbufmem;
      33  
      34    /* In the following call we use the buffer pointed to by S if
      35       non-NULL although we don't know the size.  But we limit the size
      36       to L_tmpnam characters in any case.  */
      37    if (__builtin_expect (__path_search (tmpbuf, L_tmpnam, NULL, NULL, 0),
      38  			0))
      39      return NULL;
      40  
      41    if (__glibc_unlikely (__gen_tempname (tmpbuf, 0, 0, __GT_NOCREATE)))
      42      return NULL;
      43  
      44    if (s == NULL)
      45      return (char *) memcpy (tmpnam_buffer, tmpbuf, L_tmpnam);
      46  
      47    return s;
      48  }
      49  
      50  link_warning (tmpnam,
      51  	      "the use of `tmpnam' is dangerous, better use `mkstemp'")