X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsockets.c;h=4e905e1ddd7a8c3c641fe55adc5c6dbc15a75897;hb=135351c549050196b5c1322b3ab1e956565ab3d8;hp=9d5c54792888eca80025f9123d2c1db7fa4fa52b;hpb=d9576a558fefb2660292e7d4baccd23ea67ecf47;p=gnulib.git diff --git a/lib/sockets.c b/lib/sockets.c index 9d5c54792..4e905e1dd 100644 --- a/lib/sockets.c +++ b/lib/sockets.c @@ -1,6 +1,6 @@ /* sockets.c --- wrappers for Windows socket functions - Copyright (C) 2008-2009 Free Software Foundation, Inc. + Copyright (C) 2008-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,12 +25,12 @@ #if WINDOWS_SOCKETS /* This includes winsock2.h on MinGW. */ -#include +# include -#include "close-hook.h" +# include "close-hook.h" /* Get set_winsock_errno, FD_TO_SOCKET etc. */ -#include "w32sock.h" +# include "w32sock.h" static int close_fd_maybe_socket (int fd, const struct close_hook *remaining_list) @@ -46,21 +46,21 @@ close_fd_maybe_socket (int fd, const struct close_hook *remaining_list) { /* fd refers to a socket. */ /* FIXME: other applications, like squid, use an undocumented - _free_osfhnd free function. But this is not enough: The 'osfile' - flags for fd also needs to be cleared, but it is hard to access it. - Instead, here we just close twice the file descriptor. */ + _free_osfhnd free function. But this is not enough: The 'osfile' + flags for fd also needs to be cleared, but it is hard to access it. + Instead, here we just close twice the file descriptor. */ if (closesocket (sock)) - { - set_winsock_errno (); - return -1; - } + { + set_winsock_errno (); + return -1; + } else - { - /* This call frees the file descriptor and does a - CloseHandle ((HANDLE) _get_osfhandle (fd)), which fails. */ - _close (fd); - return 0; - } + { + /* This call frees the file descriptor and does a + CloseHandle ((HANDLE) _get_osfhandle (fd)), which fails. */ + _close (fd); + return 0; + } } else /* Some other type of file descriptor. */ @@ -69,23 +69,31 @@ close_fd_maybe_socket (int fd, const struct close_hook *remaining_list) static struct close_hook close_sockets_hook; -#endif +static int initialized_sockets_version /* = 0 */; + +#endif /* WINDOWS_SOCKETS */ int -gl_sockets_startup (int version) +gl_sockets_startup (int version _GL_UNUSED) { #if WINDOWS_SOCKETS - WSADATA data; - int err; + if (version > initialized_sockets_version) + { + WSADATA data; + int err; - err = WSAStartup (version, &data); - if (err != 0) - return 1; + err = WSAStartup (version, &data); + if (err != 0) + return 1; + + if (data.wVersion < version) + return 2; - if (data.wVersion < version) - return 2; + if (initialized_sockets_version == 0) + register_close_hook (close_fd_maybe_socket, &close_sockets_hook); - register_close_hook (close_fd_maybe_socket, &close_sockets_hook); + initialized_sockets_version = version; + } #endif return 0; @@ -97,6 +105,8 @@ gl_sockets_cleanup (void) #if WINDOWS_SOCKETS int err; + initialized_sockets_version = 0; + unregister_close_hook (&close_sockets_hook); err = WSACleanup ();