Line data Source code
1 : /* 2 : * Unix SMB/CIFS implementation. 3 : * Samba utility functions 4 : * Copyright (C) Volker Lendecke 2014 5 : * 6 : * This program is free software; you can redistribute it and/or modify 7 : * it under the terms of the GNU General Public License as published by 8 : * the Free Software Foundation; either version 3 of the License, or 9 : * (at your option) any later version. 10 : * 11 : * This program is distributed in the hope that it will be useful, 12 : * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 : * GNU General Public License for more details. 15 : * 16 : * You should have received a copy of the GNU General Public License 17 : * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 : */ 19 : 20 : #include "replace.h" 21 : #include "system/filesys.h" 22 : #include "close_low_fd.h" 23 : 24 48 : _PUBLIC_ int close_low_fd(int fd) 25 : { 26 : #ifndef VALGRIND 27 : int ret, dev_null; 28 : 29 48 : dev_null = open("/dev/null", O_RDWR, 0); 30 : 31 48 : if ((dev_null == -1) && (errno == ENFILE)) { 32 : /* 33 : * Try to free up an fd 34 : */ 35 0 : ret = close(fd); 36 0 : if (ret != 0) { 37 0 : return errno; 38 : } 39 : } 40 : 41 48 : dev_null = open("/dev/null", O_RDWR, 0); 42 48 : if (dev_null == -1) { 43 0 : dev_null = open("/dev/null", O_WRONLY, 0); 44 : } 45 48 : if (dev_null == -1) { 46 0 : return errno; 47 : } 48 : 49 48 : if (dev_null == fd) { 50 : /* 51 : * This can happen in the ENFILE case above 52 : */ 53 0 : return 0; 54 : } 55 : 56 48 : ret = dup2(dev_null, fd); 57 48 : if (ret == -1) { 58 0 : int err = errno; 59 0 : close(dev_null); 60 0 : return err; 61 : } 62 48 : close(dev_null); 63 : #endif 64 48 : return 0; 65 : }