(root)/
gettext-0.22.4/
gettext-tools/
gnulib-lib/
spawn_faction_addopen.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 <stdlib.h>
      24  #include <string.h>
      25  #include <unistd.h>
      26  
      27  #if !_LIBC
      28  # define __sysconf(open_max) getdtablesize ()
      29  #endif
      30  
      31  #if REPLACE_POSIX_SPAWN
      32  # include "spawn_int.h"
      33  #endif
      34  
      35  /* Add an action to FILE-ACTIONS which tells the implementation to call
      36     'open' for the given file during the 'spawn' call.  */
      37  int
      38  posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions,
      39                                    int fd, const char *path, int oflag,
      40                                    mode_t mode)
      41  #undef posix_spawn_file_actions_addopen
      42  {
      43    int maxfd = __sysconf (_SC_OPEN_MAX);
      44  
      45    /* Test for the validity of the file descriptor.  */
      46    if (fd < 0 || fd >= maxfd)
      47      return EBADF;
      48  
      49  #if !REPLACE_POSIX_SPAWN
      50    return posix_spawn_file_actions_addopen (file_actions, fd, path, oflag, mode);
      51  #else
      52    {
      53      /* Copy PATH, because the caller may free it before calling posix_spawn()
      54         or posix_spawnp().  */
      55      char *path_copy = strdup (path);
      56      if (path_copy == NULL)
      57        return ENOMEM;
      58  
      59      /* Allocate more memory if needed.  */
      60      if (file_actions->_used == file_actions->_allocated
      61          && __posix_spawn_file_actions_realloc (file_actions) != 0)
      62        {
      63          /* This can only mean we ran out of memory.  */
      64          free (path_copy);
      65          return ENOMEM;
      66        }
      67  
      68      {
      69        struct __spawn_action *rec;
      70  
      71        /* Add the new value.  */
      72        rec = &file_actions->_actions[file_actions->_used];
      73        rec->tag = spawn_do_open;
      74        rec->action.open_action.fd = fd;
      75        rec->action.open_action.path = path_copy;
      76        rec->action.open_action.oflag = oflag;
      77        rec->action.open_action.mode = mode;
      78  
      79        /* Account for the new entry.  */
      80        ++file_actions->_used;
      81  
      82        return 0;
      83      }
      84    }
      85  #endif
      86  }