
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: }