summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog53
-rw-r--r--doc/posix-functions/accept.texi5
-rw-r--r--doc/posix-functions/bind.texi5
-rw-r--r--doc/posix-functions/close.texi4
-rw-r--r--doc/posix-functions/connect.texi5
-rw-r--r--doc/posix-functions/getpeername.texi5
-rw-r--r--doc/posix-functions/getsockname.texi5
-rw-r--r--doc/posix-functions/getsockopt.texi5
-rw-r--r--doc/posix-functions/ioctl.texi5
-rw-r--r--doc/posix-functions/listen.texi5
-rw-r--r--doc/posix-functions/recv.texi5
-rw-r--r--doc/posix-functions/recvfrom.texi5
-rw-r--r--doc/posix-functions/send.texi5
-rw-r--r--doc/posix-functions/sendto.texi5
-rw-r--r--doc/posix-functions/setsockopt.texi5
-rw-r--r--doc/posix-functions/shutdown.texi5
-rw-r--r--doc/posix-functions/socket.texi5
-rw-r--r--lib/accept.c42
-rw-r--r--lib/bind.c40
-rw-r--r--lib/close.c37
-rw-r--r--lib/connect.c47
-rw-r--r--lib/getpeername.c40
-rw-r--r--lib/getsockname.c40
-rw-r--r--lib/getsockopt.c40
-rw-r--r--lib/ioctl.c51
-rw-r--r--lib/listen.c40
-rw-r--r--lib/recv.c40
-rw-r--r--lib/recvfrom.c48
-rw-r--r--lib/send.c40
-rw-r--r--lib/sendto.c41
-rw-r--r--lib/setsockopt.c40
-rw-r--r--lib/shutdown.c40
-rw-r--r--lib/socket.c45
-rw-r--r--lib/w32sock.h62
-rw-r--r--lib/winsock.c348
-rw-r--r--modules/accept5
-rw-r--r--modules/bind5
-rw-r--r--modules/connect5
-rw-r--r--modules/getpeername5
-rw-r--r--modules/getsockname5
-rw-r--r--modules/getsockopt5
-rw-r--r--modules/ioctl5
-rw-r--r--modules/listen5
-rw-r--r--modules/recv5
-rw-r--r--modules/recvfrom5
-rw-r--r--modules/send5
-rw-r--r--modules/sendto5
-rw-r--r--modules/setsockopt5
-rw-r--r--modules/shutdown5
-rw-r--r--modules/socket5
-rw-r--r--modules/sys_socket1
51 files changed, 880 insertions, 409 deletions
diff --git a/ChangeLog b/ChangeLog
index 86b9c189e0..d151664afc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,56 @@
+2008-10-21 Simon Josefsson <simon@josefsson.org>
+
+ * 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 <bruno@clisp.org>
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 18ddee7652..99d539c3db 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 0be155311a..ca629d3e7d 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 252caea616..7065efaca2 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.
+@item
+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 fe03a0b754..8676055fda 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
+@code{connect} 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/getpeername.texi b/doc/posix-functions/getpeername.texi
index 753533e50b..8fc7caaa4e 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
+@code{getpeername} 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/getsockname.texi b/doc/posix-functions/getsockname.texi
index f8aadcb20d..ba9103e059 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
+@code{getsockname} 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/getsockopt.texi b/doc/posix-functions/getsockopt.texi
index c77617c9b4..8197f3bf0a 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
+@code{getsockopt} 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/ioctl.texi b/doc/posix-functions/ioctl.texi
index 123069b8cc..85ba764a42 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 176c56d5d9..3b19d18747 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 63c3e0da0d..ec664b8e22 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 78e4c575b9..0097fd4119 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
+@code{recvfrom} 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/send.texi b/doc/posix-functions/send.texi
index d9d8dedf6c..749f8da671 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 e8b9083d73..fa627397fe 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 5d05f8740a..0384e9a0e6 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
+@code{setsockopt} 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/shutdown.texi b/doc/posix-functions/shutdown.texi
index 794ddced0f..4fc8194a79 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
+@code{shutdown} 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/socket.texi b/doc/posix-functions/socket.texi
index 8b2f0b41f4..e07a70245e 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 0000000000..ae46537792
--- /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 0000000000..108a2393ce
--- /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 9b050668a8..79313c0082 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 0000000000..c7abf204d2
--- /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 0000000000..83491cbd23
--- /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 0000000000..97b8e8cfe0
--- /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 0000000000..7be8bed51b
--- /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 0000000000..98a94b6721
--- /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 0000000000..49e0a08425
--- /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 0000000000..78c0461593
--- /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 0000000000..52fa3c8d4c
--- /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 0000000000..4d2ca16c9f
--- /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 0000000000..888b0f6213
--- /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 0000000000..09f048e48a
--- /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 0000000000..290d70616e
--- /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 0000000000..f14906a0df
--- /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 0000000000..0622985b81
--- /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 979360b763..0000000000
--- 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 f786882009..d1c954edbf 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 856148a9f1..050f0e65c7 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 304e1076d8..1381ffaf91 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 f980bb80b9..a8a4fcaff2 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 2b4fd6469a..a7f8881c74 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 a4e3131ddb..efb762af52 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 b425dee9d1..08e595518d 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 bbaa7a5c4c..6912f5d695 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 a5322409e4..04602f9801 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 5fee084716..8237565b9d 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 75309ce8b0..4317d6fb91 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 888d0dc7f5..d9a292c857 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 5cd3d1db0b..d665f8ee63 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 e6d4178140..c1e062104d 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 900d9ec95d..070ba3f2f0 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 553b84b706..9505cafb81 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