Line data Source code
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 3 of the License, or
8 : (at your option) 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, see <http://www.gnu.org/licenses/>.
17 :
18 : The code is taken from glibc/manual/llio.texi */
19 :
20 : #include <config.h>
21 :
22 : #include "cloexec.h"
23 :
24 : #include <unistd.h>
25 : #include <fcntl.h>
26 :
27 : #ifndef FD_CLOEXEC
28 : # define FD_CLOEXEC 1
29 : #endif
30 :
31 : /* Set the `FD_CLOEXEC' flag of DESC if VALUE is true,
32 : or clear the flag if VALUE is false.
33 : Return 0 on success, or -1 on error with `errno' set. */
34 :
35 : int
36 8 : set_cloexec_flag (int desc, bool value)
37 : {
38 : #if defined F_GETFD && defined F_SETFD
39 :
40 8 : int flags = fcntl (desc, F_GETFD, 0);
41 :
42 8 : if (0 <= flags)
43 : {
44 8 : int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC);
45 :
46 8 : if (flags == newflags
47 8 : || fcntl (desc, F_SETFD, newflags) != -1)
48 8 : return 0;
49 : }
50 :
51 0 : return -1;
52 :
53 : #else
54 :
55 : return 0;
56 :
57 : #endif
58 : }
|