• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* close replacement.
2     Copyright (C) 2008-2012 Free Software Foundation, Inc.
3  
4     This program is free software: you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 3 of the License, or
7     (at your option) any later version.
8  
9     This program 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 General Public License for more details.
13  
14     You should have received a copy of the GNU General Public License
15     along with this program.  If not, see <http://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  #include "msvc-inval.h"
26  
27  #undef close
28  
29  #if HAVE_MSVC_INVALID_PARAMETER_HANDLER
30  static int
close_nothrow(int fd)31  close_nothrow (int fd)
32  {
33    int result;
34  
35    TRY_MSVC_INVAL
36      {
37        result = close (fd);
38      }
39    CATCH_MSVC_INVAL
40      {
41        result = -1;
42        errno = EBADF;
43      }
44    DONE_MSVC_INVAL;
45  
46    return result;
47  }
48  #else
49  # define close_nothrow close
50  #endif
51  
52  /* Override close() to call into other gnulib modules.  */
53  
54  int
rpl_close(int fd)55  rpl_close (int fd)
56  {
57  #if WINDOWS_SOCKETS
58    int retval = execute_all_close_hooks (close_nothrow, fd);
59  #else
60    int retval = close_nothrow (fd);
61  #endif
62  
63  #if REPLACE_FCHDIR
64    if (retval >= 0)
65      _gl_unregister_fd (fd);
66  #endif
67  
68    return retval;
69  }
70