1  /* Open a stdio stream on an anonymous temporary file.  Hurd version.
       2     Copyright (C) 2001-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <stdio.h>
      20  #include <hurd.h>
      21  #include <hurd/fs.h>
      22  #include <hurd/fd.h>
      23  #include <fcntl.h>
      24  #include <unistd.h>
      25  #include <iolibio.h>
      26  
      27  /* This returns a new stream opened on a temporary file (generated
      28     by tmpnam).  The file is opened with mode "w+b" (binary read/write).
      29     If we couldn't generate a unique filename or the file couldn't
      30     be opened, NULL is returned.  */
      31  FILE *
      32  __tmpfile (void)
      33  {
      34    error_t err;
      35    file_t file;
      36    int fd;
      37    FILE *f;
      38  
      39    /* Get a port to the directory that will contain the file.  */
      40    const char *dirname = __libc_secure_getenv ("TMPDIR") ?: P_tmpdir;
      41    file_t dir = __file_name_lookup (dirname, 0, 0);
      42    if (dir == MACH_PORT_NULL)
      43      return NULL;
      44  
      45    /* Create an unnamed file in the temporary directory.  */
      46    err = __dir_mkfile (dir, O_RDWR, S_IRUSR | S_IWUSR, &file);
      47    __mach_port_deallocate (__mach_task_self (), dir);
      48    if (err)
      49      return __hurd_fail (err), NULL;
      50  
      51    /* Get a file descriptor for that port.  POSIX.1 requires that streams
      52       returned by tmpfile allocate file descriptors as fopen would.  */
      53    fd = _hurd_intern_fd (file, O_RDWR, 1); /* dealloc on error */
      54    if (fd < 0)
      55      return NULL;
      56  
      57    /* Open a stream on the unnamed file.
      58       It will cease to exist when this stream is closed.  */
      59    if ((f = _IO_fdopen (fd, "w+b")) == NULL)
      60      __close (fd);
      61  
      62    return f;
      63  }
      64  
      65  #include <shlib-compat.h>
      66  versioned_symbol (libc, __tmpfile, tmpfile, GLIBC_2_1);
      67  
      68  weak_alias (__tmpfile, tmpfile64)