(root)/
tar-1.35/
gnu/
openat-safer.c
       1  /* Invoke openat, but avoid some glitches.
       2  
       3     Copyright (C) 2005-2006, 2008-2023 Free Software Foundation, Inc.
       4  
       5     This program is free software: you can redistribute it and/or modify
       6     it under the terms of the GNU General Public License as published by
       7     the Free Software Foundation, either version 3 of the License, or
       8     (at your option) any later version.
       9  
      10     This program 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
      13     GNU General Public License for more details.
      14  
      15     You should have received a copy of the GNU General Public License
      16     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      17  
      18  /* Written by Paul Eggert for open, ported by Eric Blake for openat.  */
      19  
      20  #include <config.h>
      21  
      22  #include "fcntl-safer.h"
      23  
      24  #include <fcntl.h>
      25  #include <stdarg.h>
      26  #include "unistd-safer.h"
      27  
      28  int
      29  openat_safer (int fd, char const *file, int flags, ...)
      30  {
      31    mode_t mode = 0;
      32  
      33    if (flags & O_CREAT)
      34      {
      35        va_list ap;
      36        va_start (ap, flags);
      37  
      38        /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
      39           creates crashing code when 'mode_t' is smaller than 'int'.  */
      40        mode = va_arg (ap, PROMOTED_MODE_T);
      41  
      42        va_end (ap);
      43      }
      44  
      45    return fd_safer (openat (fd, file, flags, mode));
      46  }