(linenum→info "unix/slp.c:2238")

coreutils/6.9/lib/cloexec.c

    1: /* closexec.c - set or clear the close-on-exec descriptor flag
    2: 
    3:    Copyright (C) 1991, 2004, 2005, 2006 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 2, or (at your option)
    8:    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, write to the Free Software Foundation,
   17:    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
   18: 
   19:    The code is taken from glibc/manual/llio.texi  */
   20: 
   21: #include <config.h>
   22: 
   23: #include "cloexec.h"
   24: 
   25: #include <unistd.h>
   26: #include <fcntl.h>
   27: 
   28: #ifndef FD_CLOEXEC
   29: # define FD_CLOEXEC 1
   30: #endif
   31: 
   32: /* Set the `FD_CLOEXEC' flag of DESC if VALUE is true,
   33:    or clear the flag if VALUE is false.
   34:    Return 0 on success, or -1 on error with `errno' set. */
   35: 
   36: int
   37: set_cloexec_flag (int desc, bool value)
   38: {
   39: #if defined F_GETFD && defined F_SETFD
   40: 
   41:   int flags = fcntl (desc, F_GETFD, 0);
   42: 
   43:   if (0 <= flags)
   44:     {
   45:       int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC);
   46: 
   47:       if (flags == newflags
   48:           || fcntl (desc, F_SETFD, newflags) != -1)
   49:         return 0;
   50:     }
   51: 
   52:   return -1;
   53: 
   54: #else
   55: 
   56:   return 0;
   57: 
   58: #endif
   59: }
Syntax (Markdown)