(root)/
gettext-0.22.4/
gettext-tools/
gnulib-lib/
spawn_faction_addclose.c
       1  /* Copyright (C) 2000, 2009-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     This file is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU Lesser General Public License as
       6     published by the Free Software Foundation; either version 2.1 of the
       7     License, or (at your option) any later version.
       8  
       9     This file 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
      12     GNU Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public License
      15     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  #include <config.h>
      18  
      19  /* Specification.  */
      20  #include <spawn.h>
      21  
      22  #include <errno.h>
      23  #include <unistd.h>
      24  
      25  #if !_LIBC
      26  # define __sysconf(open_max) getdtablesize ()
      27  #endif
      28  
      29  #if REPLACE_POSIX_SPAWN
      30  # include "spawn_int.h"
      31  #endif
      32  
      33  /* Add an action to FILE-ACTIONS which tells the implementation to call
      34     'close' for the given file descriptor during the 'spawn' call.  */
      35  int
      36  posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *file_actions,
      37                                     int fd)
      38  #undef posix_spawn_file_actions_addclose
      39  {
      40    int maxfd = __sysconf (_SC_OPEN_MAX);
      41  
      42    /* Test for the validity of the file descriptor.  */
      43    if (fd < 0 || fd >= maxfd)
      44      return EBADF;
      45  
      46  #if !REPLACE_POSIX_SPAWN
      47    return posix_spawn_file_actions_addclose (file_actions, fd);
      48  #else
      49    /* Allocate more memory if needed.  */
      50    if (file_actions->_used == file_actions->_allocated
      51        && __posix_spawn_file_actions_realloc (file_actions) != 0)
      52      /* This can only mean we ran out of memory.  */
      53      return ENOMEM;
      54  
      55    {
      56      struct __spawn_action *rec;
      57  
      58      /* Add the new value.  */
      59      rec = &file_actions->_actions[file_actions->_used];
      60      rec->tag = spawn_do_close;
      61      rec->action.open_action.fd = fd;
      62  
      63      /* Account for the new entry.  */
      64      ++file_actions->_used;
      65  
      66      return 0;
      67    }
      68  #endif
      69  }