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 1236866 : _PUBLIC_ int set_blocking(int fd, bool set) 36 : { 37 18877 : 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 1236866 : if((val = fcntl(fd, F_GETFL, 0)) == -1) 49 0 : return -1; 50 1236866 : if(set) /* Turn blocking on - ie. clear nonblock flag */ 51 107157 : val &= ~FLAG_TO_SET; 52 : else 53 1129709 : val |= FLAG_TO_SET; 54 1236866 : return fcntl( fd, F_SETFL, val); 55 : #undef FLAG_TO_SET 56 : } 57 : 58 : 59 520992 : _PUBLIC_ bool smb_set_close_on_exec(int fd) 60 : { 61 : #ifdef FD_CLOEXEC 62 16533 : int val; 63 : 64 520992 : val = fcntl(fd, F_GETFD, 0); 65 520992 : if (val >= 0) { 66 520992 : val |= FD_CLOEXEC; 67 520992 : val = fcntl(fd, F_SETFD, val); 68 520992 : if (val != -1) { 69 520992 : return true; 70 : } 71 : } 72 : #else 73 : errno = ENOSYS; 74 : #endif 75 0 : return false; 76 : }