From 11ee0e1340f95ccb9954e522f6e003b3125eb109 Mon Sep 17 00:00:00 2001 From: Simon Josefsson 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 86b9c189e..d151664af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,56 @@ +2008-10-21 Simon Josefsson + + * 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 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 18ddee765..99d539c3d 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 0be155311..ca629d3e7 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 252caea61..7065efaca 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 fe03a0b75..8676055fd 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 753533e50..8fc7caaa4 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 f8aadcb20..ba9103e05 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 c77617c9b..8197f3bf0 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 123069b8c..85ba764a4 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 176c56d5d..3b19d1874 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 63c3e0da0..ec664b8e2 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 78e4c575b..0097fd411 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 d9d8dedf6..749f8da67 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 e8b9083d7..fa627397f 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 5d05f8740..0384e9a0e 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 794ddced0..4fc8194a7 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 8b2f0b41f..e07a70245 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 000000000..ae4653779 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..108a2393c --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 9b050668a..79313c008 100644 --- a/lib/close.c +++ b/lib/close.c @@ -20,9 +20,46 @@ #include #if GNULIB_SYS_SOCKET +# define WIN32_LEAN_AND_MEAN # include #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 000000000..c7abf204d --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..83491cbd2 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..97b8e8cfe --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..7be8bed51 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..98a94b672 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..49e0a0842 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..78c046159 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..52fa3c8d4 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..4d2ca16c9 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..888b0f621 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..09f048e48 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..290d70616 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..f14906a0d --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +#define WIN32_LEAN_AND_MEAN +/* Get winsock2.h. */ +#include + +/* 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 000000000..0622985b8 --- /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 . */ + +/* Written by Paolo Bonzini */ + +#include + +/* Get O_RDWR and O_BINARY. */ +#include + +/* Get _get_osfhandle() and _open_osfhandle(). */ +#include + +#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 979360b76..000000000 --- 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 . */ - -/* Written by Paolo Bonzini */ - -#include -#include -#include -#include -#include -#include -#include -#include -#if GNULIB_IOCTL -#include -#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 f78688200..d1c954edb 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 856148a9f..050f0e65c 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 304e1076d..1381ffaf9 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 f980bb80b..a8a4fcaff 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 2b4fd6469..a7f8881c7 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 a4e3131dd..efb762af5 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 b425dee9d..08e595518 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 bbaa7a5c4..6912f5d69 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 a5322409e..04602f980 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 5fee08471..8237565b9 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 75309ce8b..4317d6fb9 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 888d0dc7f..d9a292c85 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 5cd3d1db0..d665f8ee6 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 e6d417814..c1e062104 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 900d9ec95..070ba3f2f 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 553b84b70..9505cafb8 100644 --- a/modules/sys_socket +++ b/modules/sys_socket @@ -3,7 +3,6 @@ A POSIX-like . Files: lib/sys_socket.in.h -lib/winsock.c m4/sys_socket_h.m4 m4/sockpfaf.m4 m4/unistd_h.m4 -- 2.11.0