bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

winsock.c split


From: Simon Josefsson
Subject: winsock.c split
Date: Tue, 21 Oct 2008 12:21:37 +0200
User-agent: Gnus/5.110011 (No Gnus v0.11) Emacs/22.2 (gnu/linux)

I have pushed this, but would appreciate testing and review.  In
particular, I'm not sure the close module is handled correctly.  The
modules appears to pass simple self-tests for me on x86 and mingw32 at
least.  (Of course, there aren't any self-tests for each individual
module right now... that's for later.)

/Simon

>From 11ee0e1340f95ccb9954e522f6e003b3125eb109 Mon Sep 17 00:00:00 2001
From: Simon Josefsson <address@hidden>
Date: Tue, 21 Oct 2008 12:17:19 +0200
Subject: [PATCH] Split winsock.c into many smaller files.
 * lib/close.c: Add _gl_close_fd_maybe_socket from winsock.c.
 * lib/accept.c: New file, based on winsock.c.
 * lib/bind.c: New file, based on winsock.c.
 * lib/connect.c: New file, based on winsock.c.
 * lib/getpeername.c: New file, based on winsock.c.
 * lib/getsockname.c: New file, based on winsock.c.
 * lib/getsockopt.c: New file, based on winsock.c.
 * lib/ioctl.c: New file, based on winsock.c.
 * lib/listen.c: New file, based on winsock.c.
 * lib/recv.c: New file, based on winsock.c.
 * lib/recvfrom.c: New file, based on winsock.c.
 * lib/send.c: New file, based on winsock.c.
 * lib/sendto.c: New file, based on winsock.c.
 * lib/setsockopt.c: New file, based on winsock.c.
 * lib/shutdown.c: New file, based on winsock.c.
 * lib/socket.c: New file, based on winsock.c.
 * lib/w32sock.h: New file, based on winsock.c.
 * lib/winsock.c: Remove file.
 * modules/accept: Likewise.
 * modules/bind: Likewise.
 * modules/connect: Likewise.
 * modules/getpeername: Likewise.
 * modules/getsockname: Likewise.
 * modules/getsockopt: Likewise.
 * modules/ioctl: Likewise.
 * modules/listen: Likewise.
 * modules/recv: Likewise.
 * modules/recvfrom: Likewise.
 * modules/send: Likewise.
 * modules/sendto: Likewise.
 * modules/setsockopt: Likewise.
 * modules/shutdown: Likewise.
 * modules/socket: Use socket.c instead of winsock.c.
 * modules/sys_socket: Remove (unneeded?) dependency on winsock.c.
 * doc/posix-functions/accept.texi: Doc fix.
 * doc/posix-functions/bind.texi: Doc fix.
 * doc/posix-functions/close.texi: Doc fix.
 * doc/posix-functions/connect.texi: Doc fix.
 * doc/posix-functions/getpeername.texi: Doc fix.
 * doc/posix-functions/getsockname.texi: Doc fix.
 * doc/posix-functions/getsockopt.texi: Doc fix.
 * doc/posix-functions/ioctl.texi: Doc fix.
 * doc/posix-functions/listen.texi: Doc fix.
 * doc/posix-functions/recv.texi: Doc fix.
 * doc/posix-functions/recvfrom.texi: Doc fix.
 * doc/posix-functions/send.texi: Doc fix.
 * doc/posix-functions/sendto.texi: Doc fix.
 * doc/posix-functions/setsockopt.texi: Doc fix.
 * doc/posix-functions/shutdown.texi: Doc fix.
 * doc/posix-functions/socket.texi: Doc fix.

---
 ChangeLog                            |   53 +++++
 doc/posix-functions/accept.texi      |    5 +-
 doc/posix-functions/bind.texi        |    5 +-
 doc/posix-functions/close.texi       |    4 +
 doc/posix-functions/connect.texi     |    5 +-
 doc/posix-functions/getpeername.texi |    5 +-
 doc/posix-functions/getsockname.texi |    5 +-
 doc/posix-functions/getsockopt.texi  |    5 +-
 doc/posix-functions/ioctl.texi       |    5 +-
 doc/posix-functions/listen.texi      |    5 +-
 doc/posix-functions/recv.texi        |    5 +-
 doc/posix-functions/recvfrom.texi    |    5 +-
 doc/posix-functions/send.texi        |    5 +-
 doc/posix-functions/sendto.texi      |    5 +-
 doc/posix-functions/setsockopt.texi  |    5 +-
 doc/posix-functions/shutdown.texi    |    5 +-
 doc/posix-functions/socket.texi      |    5 +-
 lib/accept.c                         |   42 ++++
 lib/bind.c                           |   40 ++++
 lib/close.c                          |   37 ++++
 lib/connect.c                        |   47 +++++
 lib/getpeername.c                    |   40 ++++
 lib/getsockname.c                    |   40 ++++
 lib/getsockopt.c                     |   40 ++++
 lib/ioctl.c                          |   51 +++++
 lib/listen.c                         |   40 ++++
 lib/recv.c                           |   40 ++++
 lib/recvfrom.c                       |   48 +++++
 lib/send.c                           |   40 ++++
 lib/sendto.c                         |   41 ++++
 lib/setsockopt.c                     |   40 ++++
 lib/shutdown.c                       |   40 ++++
 lib/socket.c                         |   45 +++++
 lib/w32sock.h                        |   62 ++++++
 lib/winsock.c                        |  348 ----------------------------------
 modules/accept                       |    5 +-
 modules/bind                         |    5 +-
 modules/connect                      |    5 +-
 modules/getpeername                  |    5 +-
 modules/getsockname                  |    5 +-
 modules/getsockopt                   |    5 +-
 modules/ioctl                        |    5 +-
 modules/listen                       |    5 +-
 modules/recv                         |    5 +-
 modules/recvfrom                     |    5 +-
 modules/send                         |    5 +-
 modules/sendto                       |    5 +-
 modules/setsockopt                   |    5 +-
 modules/shutdown                     |    5 +-
 modules/socket                       |    5 +-
 modules/sys_socket                   |    1 -
 51 files changed, 880 insertions(+), 409 deletions(-)
 create mode 100644 lib/accept.c
 create mode 100644 lib/bind.c
 create mode 100644 lib/connect.c
 create mode 100644 lib/getpeername.c
 create mode 100644 lib/getsockname.c
 create mode 100644 lib/getsockopt.c
 create mode 100644 lib/ioctl.c
 create mode 100644 lib/listen.c
 create mode 100644 lib/recv.c
 create mode 100644 lib/recvfrom.c
 create mode 100644 lib/send.c
 create mode 100644 lib/sendto.c
 create mode 100644 lib/setsockopt.c
 create mode 100644 lib/shutdown.c
 create mode 100644 lib/socket.c
 create mode 100644 lib/w32sock.h
 delete mode 100644 lib/winsock.c

diff --git a/ChangeLog b/ChangeLog
index 86b9c18..d151664 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,56 @@
+2008-10-21  Simon Josefsson  <address@hidden>
+
+       * lib/close.c: Add _gl_close_fd_maybe_socket from winsock.c.
+       * lib/accept.c: New file, based on winsock.c.
+       * lib/bind.c: New file, based on winsock.c.
+       * lib/connect.c: New file, based on winsock.c.
+       * lib/getpeername.c: New file, based on winsock.c.
+       * lib/getsockname.c: New file, based on winsock.c.
+       * lib/getsockopt.c: New file, based on winsock.c.
+       * lib/ioctl.c: New file, based on winsock.c.
+       * lib/listen.c: New file, based on winsock.c.
+       * lib/recv.c: New file, based on winsock.c.
+       * lib/recvfrom.c: New file, based on winsock.c.
+       * lib/send.c: New file, based on winsock.c.
+       * lib/sendto.c: New file, based on winsock.c.
+       * lib/setsockopt.c: New file, based on winsock.c.
+       * lib/shutdown.c: New file, based on winsock.c.
+       * lib/socket.c: New file, based on winsock.c.
+       * lib/w32sock.h: New file, based on winsock.c.
+       * lib/winsock.c: Remove file.
+       * modules/accept: Likewise.
+       * modules/bind: Likewise.
+       * modules/connect: Likewise.
+       * modules/getpeername: Likewise.
+       * modules/getsockname: Likewise.
+       * modules/getsockopt: Likewise.
+       * modules/ioctl: Likewise.
+       * modules/listen: Likewise.
+       * modules/recv: Likewise.
+       * modules/recvfrom: Likewise.
+       * modules/send: Likewise.
+       * modules/sendto: Likewise.
+       * modules/setsockopt: Likewise.
+       * modules/shutdown: Likewise.
+       * modules/socket: Use socket.c instead of winsock.c.
+       * modules/sys_socket: Remove (unneeded?) dependency on winsock.c.
+       * doc/posix-functions/accept.texi: Doc fix.
+       * doc/posix-functions/bind.texi: Doc fix.
+       * doc/posix-functions/close.texi: Doc fix.
+       * doc/posix-functions/connect.texi: Doc fix.
+       * doc/posix-functions/getpeername.texi: Doc fix.
+       * doc/posix-functions/getsockname.texi: Doc fix.
+       * doc/posix-functions/getsockopt.texi: Doc fix.
+       * doc/posix-functions/ioctl.texi: Doc fix.
+       * doc/posix-functions/listen.texi: Doc fix.
+       * doc/posix-functions/recv.texi: Doc fix.
+       * doc/posix-functions/recvfrom.texi: Doc fix.
+       * doc/posix-functions/send.texi: Doc fix.
+       * doc/posix-functions/sendto.texi: Doc fix.
+       * doc/posix-functions/setsockopt.texi: Doc fix.
+       * doc/posix-functions/shutdown.texi: Doc fix.
+       * doc/posix-functions/socket.texi: Doc fix.
+
 2008-10-20  Bruno Haible  <address@hidden>
 
        Take into account the role of SIGABRT_COMPAT on Windows 2008.
diff --git a/doc/posix-functions/accept.texi b/doc/posix-functions/accept.texi
index 18ddee7..99d539c 100644
--- a/doc/posix-functions/accept.texi
+++ b/doc/posix-functions/accept.texi
@@ -14,8 +14,9 @@ the @code{accept} function can not be used in calls to 
@code{read},
 @code{write}, and @code{close}; you have to use @code{recv}, @code{send},
 @code{closesocket} in these cases instead.
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for @code{accept}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/bind.texi b/doc/posix-functions/bind.texi
index 0be1553..ca629d3 100644
--- a/doc/posix-functions/bind.texi
+++ b/doc/posix-functions/bind.texi
@@ -9,8 +9,9 @@ Gnulib module: bind
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for @code{bind}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/close.texi b/doc/posix-functions/close.texi
index 252caea..7065efa 100644
--- a/doc/posix-functions/close.texi
+++ b/doc/posix-functions/close.texi
@@ -12,6 +12,10 @@ Portability problems fixed by Gnulib:
 On Windows platforms (excluding Cygwin), @code{socket} and @code{accept}
 do not return file descriptors that can be closed by @code{close}.
 Instead, @code{closesocket} must be used.
address@hidden
+On Windows platforms (excluding Cygwin), error codes for @code{close}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/connect.texi b/doc/posix-functions/connect.texi
index fe03a0b..8676055 100644
--- a/doc/posix-functions/connect.texi
+++ b/doc/posix-functions/connect.texi
@@ -9,8 +9,9 @@ Gnulib module: connect
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for
address@hidden are not placed in @code{errno}, and
address@hidden must be used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/getpeername.texi 
b/doc/posix-functions/getpeername.texi
index 753533e..8fc7caa 100644
--- a/doc/posix-functions/getpeername.texi
+++ b/doc/posix-functions/getpeername.texi
@@ -9,8 +9,9 @@ Gnulib module: getpeername
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for
address@hidden are not placed in @code{errno}, and
address@hidden must be used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/getsockname.texi 
b/doc/posix-functions/getsockname.texi
index f8aadcb..ba9103e 100644
--- a/doc/posix-functions/getsockname.texi
+++ b/doc/posix-functions/getsockname.texi
@@ -9,8 +9,9 @@ Gnulib module: getsockname
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for
address@hidden are not placed in @code{errno}, and
address@hidden must be used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/getsockopt.texi 
b/doc/posix-functions/getsockopt.texi
index c77617c..8197f3b 100644
--- a/doc/posix-functions/getsockopt.texi
+++ b/doc/posix-functions/getsockopt.texi
@@ -9,8 +9,9 @@ Gnulib module: getsockopt
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for
address@hidden are not placed in @code{errno}, and
address@hidden must be used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/ioctl.texi b/doc/posix-functions/ioctl.texi
index 123069b..85ba764 100644
--- a/doc/posix-functions/ioctl.texi
+++ b/doc/posix-functions/ioctl.texi
@@ -9,8 +9,9 @@ Gnulib module: ioctl
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for @code{ioctl}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
 @item
 @code{ioctl} is called @code{ioctlsocket} under mingw
 @end itemize
diff --git a/doc/posix-functions/listen.texi b/doc/posix-functions/listen.texi
index 176c56d..3b19d18 100644
--- a/doc/posix-functions/listen.texi
+++ b/doc/posix-functions/listen.texi
@@ -9,8 +9,9 @@ Gnulib module: listen
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for @code{listen}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/recv.texi b/doc/posix-functions/recv.texi
index 63c3e0d..ec664b8 100644
--- a/doc/posix-functions/recv.texi
+++ b/doc/posix-functions/recv.texi
@@ -9,8 +9,9 @@ Gnulib module: recv
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for @code{recv}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/recvfrom.texi 
b/doc/posix-functions/recvfrom.texi
index 78e4c57..0097fd4 100644
--- a/doc/posix-functions/recvfrom.texi
+++ b/doc/posix-functions/recvfrom.texi
@@ -9,8 +9,9 @@ Gnulib module: recvfrom
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for
address@hidden are not placed in @code{errno}, and
address@hidden must be used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/send.texi b/doc/posix-functions/send.texi
index d9d8ded..749f8da 100644
--- a/doc/posix-functions/send.texi
+++ b/doc/posix-functions/send.texi
@@ -9,8 +9,9 @@ Gnulib module: send
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for @code{send}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/sendto.texi b/doc/posix-functions/sendto.texi
index e8b9083..fa62739 100644
--- a/doc/posix-functions/sendto.texi
+++ b/doc/posix-functions/sendto.texi
@@ -9,8 +9,9 @@ Gnulib module: sendto
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for @code{sendto}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/setsockopt.texi 
b/doc/posix-functions/setsockopt.texi
index 5d05f87..0384e9a 100644
--- a/doc/posix-functions/setsockopt.texi
+++ b/doc/posix-functions/setsockopt.texi
@@ -9,8 +9,9 @@ Gnulib module: setsockopt
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for
address@hidden are not placed in @code{errno}, and
address@hidden must be used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/shutdown.texi 
b/doc/posix-functions/shutdown.texi
index 794ddce..4fc8194 100644
--- a/doc/posix-functions/shutdown.texi
+++ b/doc/posix-functions/shutdown.texi
@@ -9,8 +9,9 @@ Gnulib module: shutdown
 Portability problems fixed by Gnulib:
 @itemize
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{shutdown} are
-not placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for
address@hidden are not placed in @code{errno}, and
address@hidden must be used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/doc/posix-functions/socket.texi b/doc/posix-functions/socket.texi
index 8b2f0b4..e07a702 100644
--- a/doc/posix-functions/socket.texi
+++ b/doc/posix-functions/socket.texi
@@ -14,8 +14,9 @@ the @code{socket} function can not be used in calls to 
@code{read},
 @code{write}, and @code{close}; you have to use @code{recv}, @code{send},
 @code{closesocket} in these cases instead.
 @item
-On Windows platforms (excluding Cygwin), error codes for @code{accept} are not
-placed in @code{errno}, and @code{WSAGetLastError} must be used instead.
+On Windows platforms (excluding Cygwin), error codes for @code{socket}
+are not placed in @code{errno}, and @code{WSAGetLastError} must be
+used instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/lib/accept.c b/lib/accept.c
new file mode 100644
index 0000000..ae46537
--- /dev/null
+++ b/lib/accept.c
@@ -0,0 +1,42 @@
+/* accept.c --- wrappers for Windows accept function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef accept
+
+int
+rpl_accept (int fd, struct sockaddr *addr, int *addrlen)
+{
+  SOCKET fh = accept (FD_TO_SOCKET (fd), addr, addrlen);
+  if (fh == INVALID_SOCKET)
+    {
+      set_winsock_errno ();
+      return -1;
+    }
+  else
+    return SOCKET_TO_FD (fh);
+}
diff --git a/lib/bind.c b/lib/bind.c
new file mode 100644
index 0000000..108a239
--- /dev/null
+++ b/lib/bind.c
@@ -0,0 +1,40 @@
+/* bind.c --- wrappers for Windows bind function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef bind
+
+int
+rpl_bind (int fd, struct sockaddr *sockaddr, int len)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = bind (sock, sockaddr, len);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/close.c b/lib/close.c
index 9b05066..79313c0 100644
--- a/lib/close.c
+++ b/lib/close.c
@@ -20,9 +20,46 @@
 #include <unistd.h>
 
 #if GNULIB_SYS_SOCKET
+# define WIN32_LEAN_AND_MEAN
 # include <sys/socket.h>
 #endif
 
+#if HAVE__GL_CLOSE_FD_MAYBE_SOCKET
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+int
+_gl_close_fd_maybe_socket (int fd)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  WSANETWORKEVENTS ev;
+
+  ev.lNetworkEvents = 0xDEADBEEF;
+  WSAEnumNetworkEvents (sock, NULL, &ev);
+  if (ev.lNetworkEvents != 0xDEADBEEF)
+    {
+      /* 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.  */
+      if (closesocket (sock))
+       {
+         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;
+       }
+    }
+  else
+    return _close (fd);
+}
+#endif
 
 /* Override close() to call into other gnulib modules.  */
 
diff --git a/lib/connect.c b/lib/connect.c
new file mode 100644
index 0000000..c7abf20
--- /dev/null
+++ b/lib/connect.c
@@ -0,0 +1,47 @@
+/* connect.c --- wrappers for Windows connect function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef connect
+
+int
+rpl_connect (int fd, struct sockaddr *sockaddr, int len)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = connect (sock, sockaddr, len);
+  if (r < 0)
+    {
+      /* EINPROGRESS is not returned by WinSock 2.0; for backwards
+        compatibility, connect(2) uses EWOULDBLOCK.  */
+      if (WSAGetLastError () == WSAEWOULDBLOCK)
+       WSASetLastError (WSAEINPROGRESS);
+
+      set_winsock_errno ();
+    }
+
+  return r;
+}
diff --git a/lib/getpeername.c b/lib/getpeername.c
new file mode 100644
index 0000000..83491cb
--- /dev/null
+++ b/lib/getpeername.c
@@ -0,0 +1,40 @@
+/* getpeername.c --- wrappers for Windows getpeername function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getpeername
+
+int
+rpl_getpeername (int fd, struct sockaddr *addr, int *addrlen)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = getpeername (sock, addr, addrlen);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/getsockname.c b/lib/getsockname.c
new file mode 100644
index 0000000..97b8e8c
--- /dev/null
+++ b/lib/getsockname.c
@@ -0,0 +1,40 @@
+/* getsockname.c --- wrappers for Windows getsockname function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getsockname
+
+int
+rpl_getsockname (int fd, struct sockaddr *addr, int *addrlen)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = getsockname (sock, addr, addrlen);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/getsockopt.c b/lib/getsockopt.c
new file mode 100644
index 0000000..7be8bed
--- /dev/null
+++ b/lib/getsockopt.c
@@ -0,0 +1,40 @@
+/* getsockopt.c --- wrappers for Windows getsockopt function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getsockopt
+
+int
+rpl_getsockopt (int fd, int level, int optname, void *optval, int *optlen)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = getsockopt (sock, level, optname, optval, optlen);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/ioctl.c b/lib/ioctl.c
new file mode 100644
index 0000000..98a94b6
--- /dev/null
+++ b/lib/ioctl.c
@@ -0,0 +1,51 @@
+/* ioctl.c --- wrappers for Windows ioctl function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#include <stdarg.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef ioctl
+
+int
+rpl_ioctl (int fd, int req, ...)
+{
+  void *buf;
+  va_list args;
+  SOCKET sock;
+  int r;
+
+  va_start (args, req);
+  buf = va_arg (args, void *);
+  va_end (args);
+
+  sock = FD_TO_SOCKET (fd);
+  r = ioctlsocket (sock, req, buf);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/listen.c b/lib/listen.c
new file mode 100644
index 0000000..49e0a08
--- /dev/null
+++ b/lib/listen.c
@@ -0,0 +1,40 @@
+/* listen.c --- wrappers for Windows listen function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef listen
+
+int
+rpl_listen (int fd, int backlog)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = listen (sock, backlog);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/recv.c b/lib/recv.c
new file mode 100644
index 0000000..78c0461
--- /dev/null
+++ b/lib/recv.c
@@ -0,0 +1,40 @@
+/* recv.c --- wrappers for Windows recv function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef recv
+
+int
+rpl_recv (int fd, void *buf, int len, int flags)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = recv (sock, buf, len, flags);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/recvfrom.c b/lib/recvfrom.c
new file mode 100644
index 0000000..52fa3c8
--- /dev/null
+++ b/lib/recvfrom.c
@@ -0,0 +1,48 @@
+/* recvfrom.c --- wrappers for Windows recvfrom function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef recvfrom
+
+int
+rpl_recvfrom (int fd, void *buf, int len, int flags, struct sockaddr *from,
+             int *fromlen)
+{
+  int frombufsize = *fromlen;
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = recvfrom (sock, buf, len, flags, from, fromlen);
+
+  if (r < 0)
+    set_winsock_errno ();
+
+  /* Winsock recvfrom() only returns a valid 'from' when the socket is
+     connectionless.  POSIX gives a valid 'from' for all types of sockets.  */
+  else if (*fromlen == frombufsize)
+    rpl_getpeername (fd, from, fromlen);
+
+  return r;
+}
diff --git a/lib/send.c b/lib/send.c
new file mode 100644
index 0000000..4d2ca16
--- /dev/null
+++ b/lib/send.c
@@ -0,0 +1,40 @@
+/* send.c --- wrappers for Windows send function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef send
+
+int
+rpl_send (int fd, const void *buf, int len, int flags)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = send (sock, buf, len, flags);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/sendto.c b/lib/sendto.c
new file mode 100644
index 0000000..888b0f6
--- /dev/null
+++ b/lib/sendto.c
@@ -0,0 +1,41 @@
+/* sendto.c --- wrappers for Windows sendto function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef sendto
+
+int
+rpl_sendto (int fd, const void *buf, int len, int flags,
+           struct sockaddr *to, int tolen)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = sendto (sock, buf, len, flags, to, tolen);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/setsockopt.c b/lib/setsockopt.c
new file mode 100644
index 0000000..09f048e
--- /dev/null
+++ b/lib/setsockopt.c
@@ -0,0 +1,40 @@
+/* setsockopt.c --- wrappers for Windows setsockopt function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef setsockopt
+
+int
+rpl_setsockopt (int fd, int level, int optname, const void *optval, int optlen)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = setsockopt (sock, level, optname, optval, optlen);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/shutdown.c b/lib/shutdown.c
new file mode 100644
index 0000000..290d706
--- /dev/null
+++ b/lib/shutdown.c
@@ -0,0 +1,40 @@
+/* shutdown.c --- wrappers for Windows shutdown function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef shutdown
+
+int
+rpl_shutdown (int fd, int how)
+{
+  SOCKET sock = FD_TO_SOCKET (fd);
+  int r = shutdown (sock, how);
+  if (r < 0)
+    set_winsock_errno ();
+
+  return r;
+}
diff --git a/lib/socket.c b/lib/socket.c
new file mode 100644
index 0000000..f14906a
--- /dev/null
+++ b/lib/socket.c
@@ -0,0 +1,45 @@
+/* socket.c --- wrappers for Windows socket function
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef socket
+
+int
+rpl_socket (int domain, int type, int protocol)
+{
+  /* We have to use WSASocket() to create non-overlapped IO sockets.
+     Overlapped IO sockets cannot be used with read/write.  */
+  SOCKET fh = WSASocket (domain, type, protocol, NULL, 0, 0);
+
+  if (fh == INVALID_SOCKET)
+    {
+      set_winsock_errno ();
+      return -1;
+    }
+  else
+    return SOCKET_TO_FD (fh);
+}
diff --git a/lib/w32sock.h b/lib/w32sock.h
new file mode 100644
index 0000000..0622985
--- /dev/null
+++ b/lib/w32sock.h
@@ -0,0 +1,62 @@
+/* w32sock.h --- internal auxilliary functions for Windows socket functions
+
+   Copyright (C) 2008 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
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Paolo Bonzini */
+
+#include <errno.h>
+
+/* Get O_RDWR and O_BINARY.  */
+#include <fcntl.h>
+
+/* Get _get_osfhandle() and _open_osfhandle().  */
+#include <io.h>
+
+#define FD_TO_SOCKET(fd)   ((SOCKET) _get_osfhandle ((fd)))
+#define SOCKET_TO_FD(fh)   (_open_osfhandle ((long) (fh), O_RDWR | O_BINARY))
+
+static inline void
+set_winsock_errno (void)
+{
+  int err = WSAGetLastError ();
+  WSASetLastError (0);
+
+  /* Map some WSAE* errors to the runtime library's error codes.  */
+  switch (err)
+    {
+    case WSA_INVALID_HANDLE:
+      errno = EBADF;
+      break;
+    case WSA_NOT_ENOUGH_MEMORY:
+      errno = ENOMEM;
+      break;
+    case WSA_INVALID_PARAMETER:
+      errno = EINVAL;
+      break;
+    case WSAEWOULDBLOCK:
+      errno = EWOULDBLOCK;
+      break;
+    case WSAENAMETOOLONG:
+      errno = ENAMETOOLONG;
+      break;
+    case WSAENOTEMPTY:
+      errno = ENOTEMPTY;
+      break;
+    default:
+      errno = (err > 10000 && err < 10025) ? err - 10000 : err;
+      break;
+    }
+}
diff --git a/lib/winsock.c b/lib/winsock.c
deleted file mode 100644
index 979360b..0000000
--- a/lib/winsock.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/* winsock.c --- wrappers for Windows socket functions
-
-   Copyright (C) 2008 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
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* Written by Paolo Bonzini */
-
-#include <config.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <io.h>
-#include <sys/socket.h>
-#if GNULIB_IOCTL
-#include <sys/ioctl.h>
-#endif
-
-#undef socket
-#undef connect
-#undef accept
-#undef bind
-#undef getpeername
-#undef getsockname
-#undef getsockopt
-#undef listen
-#undef recv
-#undef send
-#undef recvfrom
-#undef sendto
-#undef setsockopt
-#undef shutdown
-
-#define FD_TO_SOCKET(fd)   ((SOCKET) _get_osfhandle ((fd)))
-#define SOCKET_TO_FD(fh)   (_open_osfhandle ((long) (fh), O_RDWR | O_BINARY))
-
-
-static inline void
-set_winsock_errno (void)
-{
-  int err = WSAGetLastError ();
-  WSASetLastError (0);
-
-  /* Map some WSAE* errors to the runtime library's error codes.  */
-  switch (err)
-    {
-    case WSA_INVALID_HANDLE:
-      errno = EBADF;
-      break;
-    case WSA_NOT_ENOUGH_MEMORY:
-      errno = ENOMEM;
-      break;
-    case WSA_INVALID_PARAMETER:
-      errno = EINVAL;
-      break;
-    case WSAEWOULDBLOCK:
-      errno = EWOULDBLOCK;
-      break;
-    case WSAENAMETOOLONG:
-      errno = ENAMETOOLONG;
-      break;
-    case WSAENOTEMPTY:
-      errno = ENOTEMPTY;
-      break;
-    default:
-      errno = (err > 10000 && err < 10025) ? err - 10000 : err;
-      break;
-    }
-}
-
-
-/* Hook for gnulib module close.  */
-
-#if HAVE__GL_CLOSE_FD_MAYBE_SOCKET
-int
-_gl_close_fd_maybe_socket (int fd)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  WSANETWORKEVENTS ev;
-
-  ev.lNetworkEvents = 0xDEADBEEF;
-  WSAEnumNetworkEvents (sock, NULL, &ev);
-  if (ev.lNetworkEvents != 0xDEADBEEF)
-    {
-      /* 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.  */
-      if (closesocket (sock))
-       {
-         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;
-       }
-    }
-  else
-    return _close (fd);
-}
-#endif
-
-
-/* Wrappers for WinSock functions.  */
-
-#if GNULIB_SOCKET
-int
-rpl_socket (int domain, int type, int protocol)
-{
-  /* We have to use WSASocket() to create non-overlapped IO sockets.
-     Overlapped IO sockets cannot be used with read/write.  */
-  SOCKET fh = WSASocket (domain, type, protocol, NULL, 0, 0);
-
-  if (fh == INVALID_SOCKET)
-    {
-      set_winsock_errno ();
-      return -1;
-    }
-  else
-    return SOCKET_TO_FD (fh);
-}
-#endif
-
-#if GNULIB_CONNECT
-int
-rpl_connect (int fd, struct sockaddr *sockaddr, int len)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = connect (sock, sockaddr, len);
-  if (r < 0)
-    {
-      /* EINPROGRESS is not returned by WinSock 2.0; for backwards
-        compatibility, connect(2) uses EWOULDBLOCK.  */
-      if (WSAGetLastError () == WSAEWOULDBLOCK)
-        WSASetLastError (WSAEINPROGRESS);
-
-      set_winsock_errno ();
-    }
-
-  return r;
-}
-#endif
-
-#if GNULIB_ACCEPT
-int
-rpl_accept (int fd, struct sockaddr *addr, int *addrlen)
-{
-  SOCKET fh = accept (FD_TO_SOCKET (fd), addr, addrlen);
-  if (fh == INVALID_SOCKET)
-    {
-      set_winsock_errno ();
-      return -1;
-    }
-  else
-    return SOCKET_TO_FD (fh);
-}
-#endif
-
-#if GNULIB_BIND
-int
-rpl_bind (int fd, struct sockaddr *sockaddr, int len)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = bind (sock, sockaddr, len);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
-
-#if GNULIB_GETPEERNAME
-int
-rpl_getpeername (int fd, struct sockaddr *addr, int *addrlen)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = getpeername (sock, addr, addrlen);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
-
-#if GNULIB_GETSOCKNAME
-int
-rpl_getsockname (int fd, struct sockaddr *addr, int *addrlen)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = getsockname (sock, addr, addrlen);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
-
-#if GNULIB_GETSOCKOPT
-int
-rpl_getsockopt (int fd, int level, int optname, void *optval, int *optlen)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = getsockopt (sock, level, optname, optval, optlen);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
-
-#if GNULIB_LISTEN
-int
-rpl_listen (int fd, int backlog)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = listen (sock, backlog);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
-
-#if GNULIB_IOCTL
-int
-rpl_ioctl (int fd, int req, ...)
-{
-  void *buf;
-  va_list args;
-  SOCKET sock;
-  int r;
-
-  va_start (args, req);
-  buf = va_arg (args, void *);
-  va_end (args);
-
-  sock = FD_TO_SOCKET (fd);
-  r = ioctlsocket (sock, req, buf);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
-
-#if GNULIB_RECV
-int
-rpl_recv (int fd, void *buf, int len, int flags)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = recv (sock, buf, len, flags);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
-
-#if GNULIB_SEND
-int
-rpl_send (int fd, const void *buf, int len, int flags)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = send (sock, buf, len, flags);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
-
-#if GNULIB_RECVFROM
-int
-rpl_recvfrom (int fd, void *buf, int len, int flags, struct sockaddr *from,
-             int *fromlen)
-{
-  int frombufsize = *fromlen;
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = recvfrom (sock, buf, len, flags, from, fromlen);
-
-  if (r < 0)
-    set_winsock_errno ();
-
-  /* Winsock recvfrom() only returns a valid 'from' when the socket is
-     connectionless.  POSIX gives a valid 'from' for all types of sockets.  */
-  else if (*fromlen == frombufsize)
-    rpl_getpeername (fd, from, fromlen);
-
-  return r;
-}
-#endif
-
-#if GNULIB_SENDTO
-int
-rpl_sendto (int fd, const void *buf, int len, int flags,
-           struct sockaddr *to, int tolen)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = sendto (sock, buf, len, flags, to, tolen);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
-
-#if GNULIB_SETSOCKOPT
-int
-rpl_setsockopt (int fd, int level, int optname, const void *optval, int optlen)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = setsockopt (sock, level, optname, optval, optlen);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
-
-#if GNULIB_SHUTDOWN
-int
-rpl_shutdown (int fd, int how)
-{
-  SOCKET sock = FD_TO_SOCKET (fd);
-  int r = shutdown (sock, how);
-  if (r < 0)
-    set_winsock_errno ();
-
-  return r;
-}
-#endif
diff --git a/modules/accept b/modules/accept
index f786882..d1c954e 100644
--- a/modules/accept
+++ b/modules/accept
@@ -2,7 +2,8 @@ Description:
 accept() function: accept a connection to a server socket.
 
 Files:
-lib/winsock.c
+lib/accept.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([accept])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([accept])
 
diff --git a/modules/bind b/modules/bind
index 856148a..050f0e6 100644
--- a/modules/bind
+++ b/modules/bind
@@ -2,7 +2,8 @@ Description:
 bind() function: bind a server socket to a port.
 
 Files:
-lib/winsock.c
+lib/bind.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([bind])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([bind])
 
diff --git a/modules/connect b/modules/connect
index 304e107..1381ffa 100644
--- a/modules/connect
+++ b/modules/connect
@@ -2,7 +2,8 @@ Description:
 connect() function: connect a client socket.
 
 Files:
-lib/winsock.c
+lib/connect.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([connect])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([connect])
 
diff --git a/modules/getpeername b/modules/getpeername
index f980bb8..a8a4fca 100644
--- a/modules/getpeername
+++ b/modules/getpeername
@@ -3,7 +3,8 @@ getpeername() function: return information about the remote end 
of a connected
 socket.
 
 Files:
-lib/winsock.c
+lib/getpeername.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -12,7 +13,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([getpeername])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([getpeername])
 
diff --git a/modules/getsockname b/modules/getsockname
index 2b4fd64..a7f8881 100644
--- a/modules/getsockname
+++ b/modules/getsockname
@@ -3,7 +3,8 @@ getsockname() function: return information about the local end 
of a connected
 socket.
 
 Files:
-lib/winsock.c
+lib/getsockname.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -12,7 +13,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([getsockname])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([getsockname])
 
diff --git a/modules/getsockopt b/modules/getsockopt
index a4e3131..efb762a 100644
--- a/modules/getsockopt
+++ b/modules/getsockopt
@@ -2,7 +2,8 @@ Description:
 getsockopt() function: retrieve optional settings on a socket.
 
 Files:
-lib/winsock.c
+lib/getsockopt.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([getsockopt])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([getsockopt])
 
diff --git a/modules/ioctl b/modules/ioctl
index b425dee..08e5955 100644
--- a/modules/ioctl
+++ b/modules/ioctl
@@ -2,7 +2,8 @@ Description:
 ioctl() function: issue device specific requests on files, devices, or sockets.
 
 Files:
-lib/winsock.c
+lib/ioctl.c
+lib/w32sock.h
 
 Depends-on:
 sys_ioctl
@@ -12,7 +13,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([ioctl])
   gl_REPLACE_SYS_IOCTL_H
 fi
 gl_SYS_IOCTL_MODULE_INDICATOR([ioctl])
diff --git a/modules/listen b/modules/listen
index bbaa7a5..6912f5d 100644
--- a/modules/listen
+++ b/modules/listen
@@ -2,7 +2,8 @@ Description:
 listen() function: make a server socket ready for accepting connections.
 
 Files:
-lib/winsock.c
+lib/listen.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([listen])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([listen])
 
diff --git a/modules/recv b/modules/recv
index a532240..04602f9 100644
--- a/modules/recv
+++ b/modules/recv
@@ -2,7 +2,8 @@ Description:
 recv() function: receive (read) data from a connected socket.
 
 Files:
-lib/winsock.c
+lib/recv.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([recv])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([recv])
 
diff --git a/modules/recvfrom b/modules/recvfrom
index 5fee084..8237565 100644
--- a/modules/recvfrom
+++ b/modules/recvfrom
@@ -2,7 +2,8 @@ Description:
 recvfrom() function: receive (read) data from a potentially unconnected socket.
 
 Files:
-lib/winsock.c
+lib/recvfrom.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -12,7 +13,7 @@ getpeername
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([recvfrom])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([recvfrom])
 
diff --git a/modules/send b/modules/send
index 75309ce..4317d6f 100644
--- a/modules/send
+++ b/modules/send
@@ -2,7 +2,8 @@ Description:
 send() function: send (write) data to a connected socket.
 
 Files:
-lib/winsock.c
+lib/send.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([send])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([send])
 
diff --git a/modules/sendto b/modules/sendto
index 888d0dc..d9a292c 100644
--- a/modules/sendto
+++ b/modules/sendto
@@ -2,7 +2,8 @@ Description:
 sendto() function: send (write) data to a potentially unconnected socket.
 
 Files:
-lib/winsock.c
+lib/sendto.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([sendto])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([sendto])
 
diff --git a/modules/setsockopt b/modules/setsockopt
index 5cd3d1d..d665f8e 100644
--- a/modules/setsockopt
+++ b/modules/setsockopt
@@ -2,7 +2,8 @@ Description:
 setsockopt() function: specify optional settings on a socket.
 
 Files:
-lib/winsock.c
+lib/setsockopt.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([setsockopt])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([setsockopt])
 
diff --git a/modules/shutdown b/modules/shutdown
index e6d4178..c1e0621 100644
--- a/modules/shutdown
+++ b/modules/shutdown
@@ -2,7 +2,8 @@ Description:
 shutdown() function: initiate a graceful shutdown of a socket.
 
 Files:
-lib/winsock.c
+lib/shutdown.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([shutdown])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([shutdown])
 
diff --git a/modules/socket b/modules/socket
index 900d9ec..070ba3f 100644
--- a/modules/socket
+++ b/modules/socket
@@ -2,7 +2,8 @@ Description:
 socket() function: create a socket.
 
 Files:
-lib/winsock.c
+lib/socket.c
+lib/w32sock.h
 
 Depends-on:
 sys_socket
@@ -11,7 +12,7 @@ errno
 configure.ac:
 AC_REQUIRE([gl_HEADER_SYS_SOCKET])
 if test "$ac_cv_header_winsock2_h" = yes; then
-  AC_LIBOBJ([winsock])
+  AC_LIBOBJ([socket])
 fi
 gl_SYS_SOCKET_MODULE_INDICATOR([socket])
 
diff --git a/modules/sys_socket b/modules/sys_socket
index 553b84b..9505caf 100644
--- a/modules/sys_socket
+++ b/modules/sys_socket
@@ -3,7 +3,6 @@ A POSIX-like <sys/socket.h>.
 
 Files:
 lib/sys_socket.in.h
-lib/winsock.c
 m4/sys_socket_h.m4
 m4/sockpfaf.m4
 m4/unistd_h.m4
-- 
1.5.6.5





reply via email to

[Prev in Thread] Current Thread [Next in Thread]