root/lib/cloexec.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. set_cloexec_flag
  2. dup_cloexec

     1 /* cloexec.c - set or clear the close-on-exec descriptor flag
     2 
     3    Copyright (C) 1991, 2004-2006, 2009-2023 Free Software Foundation,
     4    Inc.
     5 
     6    This file is free software: you can redistribute it and/or modify
     7    it under the terms of the GNU Lesser General Public License as
     8    published by the Free Software Foundation; either version 2.1 of the
     9    License, or (at your option) any later version.
    10 
    11    This file is distributed in the hope that it will be useful,
    12    but WITHOUT ANY WARRANTY; without even the implied warranty of
    13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    14    GNU Lesser General Public License for more details.
    15 
    16    You should have received a copy of the GNU Lesser General Public License
    17    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
    18 
    19 /* The code is taken from glibc/manual/llio.texi  */
    20 
    21 #include <config.h>
    22 
    23 #include "cloexec.h"
    24 
    25 #include <errno.h>
    26 #include <fcntl.h>
    27 #include <unistd.h>
    28 
    29 /* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true,
    30    or clear the flag if VALUE is false.
    31    Return 0 on success, or -1 on error with 'errno' set.
    32 
    33    Note that on MingW, this function does NOT protect DESC from being
    34    inherited into spawned children.  Instead, either use dup_cloexec
    35    followed by closing the original DESC, or use interfaces such as
    36    open or pipe2 that accept flags like O_CLOEXEC to create DESC
    37    non-inheritable in the first place.  */
    38 
    39 int
    40 set_cloexec_flag (int desc, bool value)
    41 {
    42 #ifdef F_SETFD
    43 
    44   int flags = fcntl (desc, F_GETFD, 0);
    45 
    46   if (0 <= flags)
    47     {
    48       int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC);
    49 
    50       if (flags == newflags
    51           || fcntl (desc, F_SETFD, newflags) != -1)
    52         return 0;
    53     }
    54 
    55   return -1;
    56 
    57 #else /* !F_SETFD */
    58 
    59   /* Use dup2 to reject invalid file descriptors; the cloexec flag
    60      will be unaffected.  */
    61   if (desc < 0)
    62     {
    63       errno = EBADF;
    64       return -1;
    65     }
    66   if (dup2 (desc, desc) < 0)
    67     /* errno is EBADF here.  */
    68     return -1;
    69 
    70   /* There is nothing we can do on this kind of platform.  Punt.  */
    71   return 0;
    72 #endif /* !F_SETFD */
    73 }
    74 
    75 
    76 /* Duplicates a file handle FD, while marking the copy to be closed
    77    prior to exec or spawn.  Returns -1 and sets errno if FD could not
    78    be duplicated.  */
    79 
    80 int
    81 dup_cloexec (int fd)
    82 {
    83   return fcntl (fd, F_DUPFD_CLOEXEC, 0);
    84 }

/* [<][>][^][v][top][bottom][index][help] */