From 2ba450ef74f82b31d23754fe7137dc83e195bf41 Mon Sep 17 00:00:00 2001
From: Bruno Haible <bruno@clisp.org>
Date: Sun, 2 Aug 2009 16:39:07 +0200
Subject: [PATCH] Allow multiple calls to gl_sockets_startup.

---
 ChangeLog     |  8 ++++++++
 lib/sockets.c | 26 ++++++++++++++++++--------
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e2be535db5..3309b7b672 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-08-02  Bruno Haible  <bruno@clisp.org>
+
+	Allow multiple calls to gl_sockets_startup.
+	* lib/sockets.c (initialized_sockets_version): New variable.
+	(gl_sockets_startup): Do nothing if already called for this or a higher
+	version.
+	(gl_sockets_cleanup): Reset initialized_sockets_version.
+
 2009-08-03  Simon Josefsson  <simon@josefsson.org>
 
 	* tests/test-argp-version-etc-1.sh: Use EXEEXT.  Don't fail on
diff --git a/lib/sockets.c b/lib/sockets.c
index 9d5c547928..7cb9981d12 100644
--- a/lib/sockets.c
+++ b/lib/sockets.c
@@ -69,23 +69,31 @@ close_fd_maybe_socket (int fd, const struct close_hook *remaining_list)
 
 static struct close_hook close_sockets_hook;
 
+static int initialized_sockets_version /* = 0 */;
+
 #endif
 
 int
 gl_sockets_startup (int version)
 {
 #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 ();
-- 
2.30.2