1 /* close replacement. 2 Copyright (C) 2008-2021 Free Software Foundation, Inc. 3 4 This file is free software: you can redistribute it and/or modify 5 it under the terms of the GNU Lesser General Public License as 6 published by the Free Software Foundation; either version 2.1 of the 7 License, or (at your option) any later version. 8 9 This file is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public License 15 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 16 17 #include <config.h> 18 19 /* Specification. */ 20 #include <unistd.h> 21 22 #include <errno.h> 23 24 #include "fd-hook.h" 25 #if HAVE_MSVC_INVALID_PARAMETER_HANDLER 26 # include "msvc-inval.h" 27 #endif 28 29 #undef close 30 31 #if defined _WIN32 && !defined __CYGWIN__ 32 # if HAVE_MSVC_INVALID_PARAMETER_HANDLER 33 static int close_nothrow(int fd)34close_nothrow (int fd) 35 { 36 int result; 37 38 TRY_MSVC_INVAL 39 { 40 result = _close (fd); 41 } 42 CATCH_MSVC_INVAL 43 { 44 result = -1; 45 errno = EBADF; 46 } 47 DONE_MSVC_INVAL; 48 49 return result; 50 } 51 # else 52 # define close_nothrow _close 53 # endif 54 #else 55 # define close_nothrow close 56 #endif 57 58 /* Override close() to call into other gnulib modules. */ 59 60 int rpl_close(int fd)61rpl_close (int fd) 62 { 63 #if WINDOWS_SOCKETS 64 int retval = execute_all_close_hooks (close_nothrow, fd); 65 #else 66 int retval = close_nothrow (fd); 67 #endif 68 69 #if REPLACE_FCHDIR 70 if (retval >= 0) 71 _gl_unregister_fd (fd); 72 #endif 73 74 return retval; 75 } 76