Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 : Samba utility functions
4 : Copyright (C) Andrew Tridgell 1992-1998
5 : Copyright (C) Jeremy Allison 2001-2002
6 : Copyright (C) Simo Sorce 2001
7 : Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2003.
8 : Copyright (C) James J Myers 2003
9 :
10 : This program is free software; you can redistribute it and/or modify
11 : it under the terms of the GNU General Public License as published by
12 : the Free Software Foundation; either version 3 of the License, or
13 : (at your option) any later version.
14 :
15 : This program is distributed in the hope that it will be useful,
16 : but WITHOUT ANY WARRANTY; without even the implied warranty of
17 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 : GNU General Public License for more details.
19 :
20 : You should have received a copy of the GNU General Public License
21 : along with this program. If not, see <http://www.gnu.org/licenses/>.
22 : */
23 :
24 : #include "replace.h"
25 : #include "system/filesys.h"
26 : #include "blocking.h"
27 :
28 : /**
29 : Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
30 : else
31 : if SYSV use O_NDELAY
32 : if BSD use FNDELAY
33 : **/
34 :
35 564566 : _PUBLIC_ int set_blocking(int fd, bool set)
36 : {
37 : int val;
38 : #ifdef O_NONBLOCK
39 : #define FLAG_TO_SET O_NONBLOCK
40 : #else
41 : #ifdef SYSV
42 : #define FLAG_TO_SET O_NDELAY
43 : #else /* BSD */
44 : #define FLAG_TO_SET FNDELAY
45 : #endif
46 : #endif
47 :
48 564566 : if((val = fcntl(fd, F_GETFL, 0)) == -1)
49 0 : return -1;
50 564566 : if(set) /* Turn blocking on - ie. clear nonblock flag */
51 8967 : val &= ~FLAG_TO_SET;
52 : else
53 555599 : val |= FLAG_TO_SET;
54 564566 : return fcntl( fd, F_SETFL, val);
55 : #undef FLAG_TO_SET
56 : }
57 :
58 :
59 291759 : _PUBLIC_ bool smb_set_close_on_exec(int fd)
60 : {
61 : #ifdef FD_CLOEXEC
62 : int val;
63 :
64 291759 : val = fcntl(fd, F_GETFD, 0);
65 291759 : if (val >= 0) {
66 291759 : val |= FD_CLOEXEC;
67 291759 : val = fcntl(fd, F_SETFD, val);
68 291759 : if (val != -1) {
69 291759 : return true;
70 : }
71 : }
72 : #else
73 : errno = ENOSYS;
74 : #endif
75 0 : return false;
76 : }
|