Throughout change "WinSock" to "Winsock" in comments.
* fhandler_socket.cc (fhandler_socket::sendmsg): Add missing call to get_inet_addr to convert AF_LOCAL to AF_INET sockets. * net.cc (cygwin_socket): Workaround UDP Winsock problem. Add comment to explain why. * select.cc: Include winsock2.h rather than winsock.h.
This commit is contained in:
parent
108b037ea3
commit
c487f2fef5
@ -1,3 +1,12 @@
|
|||||||
|
2011-07-29 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
Throughout change "WinSock" to "Winsock" in comments.
|
||||||
|
* fhandler_socket.cc (fhandler_socket::sendmsg): Add missing call to
|
||||||
|
get_inet_addr to convert AF_LOCAL to AF_INET sockets.
|
||||||
|
* net.cc (cygwin_socket): Workaround UDP Winsock problem. Add comment
|
||||||
|
to explain why.
|
||||||
|
* select.cc: Include winsock2.h rather than winsock.h.
|
||||||
|
|
||||||
2011-07-26 Corinna Vinschen <corinna@vinschen.de>
|
2011-07-26 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler_disk_file.cc (__DIR_mounts::eval_ino): Create path_conv
|
* fhandler_disk_file.cc (__DIR_mounts::eval_ino): Create path_conv
|
||||||
|
@ -1129,7 +1129,7 @@ fhandler_socket::listen (int backlog)
|
|||||||
{
|
{
|
||||||
/* It's perfectly valid to call listen on an unbound INET socket.
|
/* It's perfectly valid to call listen on an unbound INET socket.
|
||||||
In this case the socket is automatically bound to an unused
|
In this case the socket is automatically bound to an unused
|
||||||
port number, listening on all interfaces. On Winsock, listen
|
port number, listening on all interfaces. On WinSock, listen
|
||||||
fails with WSAEINVAL when it's called on an unbound socket.
|
fails with WSAEINVAL when it's called on an unbound socket.
|
||||||
So we have to bind manually here to have POSIX semantics. */
|
So we have to bind manually here to have POSIX semantics. */
|
||||||
if (get_addr_family () == AF_INET)
|
if (get_addr_family () == AF_INET)
|
||||||
@ -1283,7 +1283,7 @@ fhandler_socket::getsockname (struct sockaddr *name, int *namelen)
|
|||||||
{
|
{
|
||||||
if (WSAGetLastError () == WSAEINVAL)
|
if (WSAGetLastError () == WSAEINVAL)
|
||||||
{
|
{
|
||||||
/* Winsock returns WSAEINVAL if the socket is locally
|
/* WinSock returns WSAEINVAL if the socket is locally
|
||||||
unbound. Per SUSv3 this is not an error condition.
|
unbound. Per SUSv3 this is not an error condition.
|
||||||
We're faking a valid return value here by creating the
|
We're faking a valid return value here by creating the
|
||||||
same content in the sockaddr structure as on Linux. */
|
same content in the sockaddr structure as on Linux. */
|
||||||
@ -1454,7 +1454,7 @@ fhandler_socket::recv_internal (LPWSAMSG wsamsg)
|
|||||||
about that and fails, while the same test is omitted in the recv
|
about that and fails, while the same test is omitted in the recv
|
||||||
functions.
|
functions.
|
||||||
|
|
||||||
This also covers another weird case: Winsock returns WSAEFAULT if
|
This also covers another weird case: WinSock returns WSAEFAULT if
|
||||||
namelen is a valid pointer while name is NULL. Both parameters are
|
namelen is a valid pointer while name is NULL. Both parameters are
|
||||||
ignored for TCP sockets, so this only occurs when using UDP socket. */
|
ignored for TCP sockets, so this only occurs when using UDP socket. */
|
||||||
else if (!wsamsg->name || get_socket_type () == SOCK_STREAM)
|
else if (!wsamsg->name || get_socket_type () == SOCK_STREAM)
|
||||||
@ -1698,9 +1698,17 @@ fhandler_socket::sendto (const void *ptr, size_t len, int flags,
|
|||||||
int
|
int
|
||||||
fhandler_socket::sendmsg (const struct msghdr *msg, int flags)
|
fhandler_socket::sendmsg (const struct msghdr *msg, int flags)
|
||||||
{
|
{
|
||||||
|
/* TODO: Descriptor passing on AF_LOCAL sockets. */
|
||||||
|
|
||||||
|
struct sockaddr_storage sst;
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
pthread_testcancel ();
|
pthread_testcancel ();
|
||||||
|
|
||||||
/* TODO: Descriptor passing on AF_LOCAL sockets. */
|
if (msg->msg_name
|
||||||
|
&& get_inet_addr ((struct sockaddr *) msg->msg_name, msg->msg_namelen,
|
||||||
|
&sst, &len) == SOCKET_ERROR)
|
||||||
|
return SOCKET_ERROR;
|
||||||
|
|
||||||
WSABUF wsabuf[msg->msg_iovlen];
|
WSABUF wsabuf[msg->msg_iovlen];
|
||||||
WSABUF *wsaptr = wsabuf;
|
WSABUF *wsaptr = wsabuf;
|
||||||
@ -1710,7 +1718,7 @@ fhandler_socket::sendmsg (const struct msghdr *msg, int flags)
|
|||||||
wsaptr->len = iovptr->iov_len;
|
wsaptr->len = iovptr->iov_len;
|
||||||
(wsaptr++)->buf = (char *) (iovptr++)->iov_base;
|
(wsaptr++)->buf = (char *) (iovptr++)->iov_base;
|
||||||
}
|
}
|
||||||
WSAMSG wsamsg = { (struct sockaddr *) msg->msg_name, msg->msg_namelen,
|
WSAMSG wsamsg = { msg->msg_name ? (struct sockaddr *) &sst : NULL, len,
|
||||||
wsabuf, msg->msg_iovlen,
|
wsabuf, msg->msg_iovlen,
|
||||||
/* Disappointing but true: Even if WSASendMsg is
|
/* Disappointing but true: Even if WSASendMsg is
|
||||||
supported, it's only supported for datagram and
|
supported, it's only supported for datagram and
|
||||||
@ -1730,7 +1738,7 @@ fhandler_socket::shutdown (int how)
|
|||||||
|
|
||||||
/* Linux allows to call shutdown for any socket, even if it's not connected.
|
/* Linux allows to call shutdown for any socket, even if it's not connected.
|
||||||
This also disables to call accept on this socket, if shutdown has been
|
This also disables to call accept on this socket, if shutdown has been
|
||||||
called with the SHUT_RD or SHUT_RDWR parameter. In contrast, Winsock
|
called with the SHUT_RD or SHUT_RDWR parameter. In contrast, WinSock
|
||||||
only allows to call shutdown on a connected socket. The accept function
|
only allows to call shutdown on a connected socket. The accept function
|
||||||
is in no way affected. So, what we do here is to fake success, and to
|
is in no way affected. So, what we do here is to fake success, and to
|
||||||
change the event settings so that an FD_CLOSE event is triggered for the
|
change the event settings so that an FD_CLOSE event is triggered for the
|
||||||
|
@ -639,6 +639,23 @@ cygwin_socket (int af, int type, int protocol)
|
|||||||
((fhandler_socket *) fd)->set_nonblocking (true);
|
((fhandler_socket *) fd)->set_nonblocking (true);
|
||||||
if (flags & SOCK_CLOEXEC)
|
if (flags & SOCK_CLOEXEC)
|
||||||
((fhandler_socket *) fd)->set_close_on_exec (true);
|
((fhandler_socket *) fd)->set_close_on_exec (true);
|
||||||
|
if (type == SOCK_DGRAM)
|
||||||
|
{
|
||||||
|
/* Workaround the problem that a missing listener on a UDP socket
|
||||||
|
in a call to sendto will result in select/WSAEnumNetworkEvents
|
||||||
|
reporting that the socket has pending data and a subsequent call
|
||||||
|
to recvfrom will return -1 with error set to WSAECONNRESET.
|
||||||
|
|
||||||
|
This problem is a regression introduced in Windows 2000.
|
||||||
|
Instead of fixing the problem, a new socket IOCTL code has
|
||||||
|
been added, see http://support.microsoft.com/kb/263823 */
|
||||||
|
BOOL cr = FALSE;
|
||||||
|
DWORD blen;
|
||||||
|
if (WSAIoctl (soc, SIO_UDP_CONNRESET, &cr, sizeof cr, NULL, 0,
|
||||||
|
&blen, NULL, NULL) == SOCKET_ERROR)
|
||||||
|
debug_printf ("Reset SIO_UDP_CONNRESET: WinSock error %lu",
|
||||||
|
WSAGetLastError ());
|
||||||
|
}
|
||||||
res = fd;
|
res = fd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -723,7 +740,7 @@ cygwin_setsockopt (int fd, int level, int optname, const void *optval,
|
|||||||
res = -1;
|
res = -1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Old applications still use the old Winsock1 IPPROTO_IP values. */
|
/* Old applications still use the old WinSock1 IPPROTO_IP values. */
|
||||||
if (level == IPPROTO_IP && CYGWIN_VERSION_CHECK_FOR_USING_WINSOCK1_VALUES)
|
if (level == IPPROTO_IP && CYGWIN_VERSION_CHECK_FOR_USING_WINSOCK1_VALUES)
|
||||||
optname = convert_ws1_ip_optname (optname);
|
optname = convert_ws1_ip_optname (optname);
|
||||||
|
|
||||||
@ -822,7 +839,7 @@ cygwin_getsockopt (int fd, int level, int optname, void *optval,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Old applications still use the old Winsock1 IPPROTO_IP values. */
|
/* Old applications still use the old WinSock1 IPPROTO_IP values. */
|
||||||
if (level == IPPROTO_IP && CYGWIN_VERSION_CHECK_FOR_USING_WINSOCK1_VALUES)
|
if (level == IPPROTO_IP && CYGWIN_VERSION_CHECK_FOR_USING_WINSOCK1_VALUES)
|
||||||
optname = convert_ws1_ip_optname (optname);
|
optname = convert_ws1_ip_optname (optname);
|
||||||
res = getsockopt (fh->get_socket (), level, optname, (char *) optval,
|
res = getsockopt (fh->get_socket (), level, optname, (char *) optval,
|
||||||
@ -3345,7 +3362,7 @@ ga_aistruct (struct addrinfo ***paipnext, const struct addrinfo *hintsp,
|
|||||||
|
|
||||||
/* Cygwin specific: The ga_clone function is split up to allow an easy
|
/* Cygwin specific: The ga_clone function is split up to allow an easy
|
||||||
duplication of addrinfo structs. This is used to duplicate the
|
duplication of addrinfo structs. This is used to duplicate the
|
||||||
structures from Winsock, so that we have the allocation of the structs
|
structures from WinSock, so that we have the allocation of the structs
|
||||||
returned to the application under control. This is especially helpful
|
returned to the application under control. This is especially helpful
|
||||||
for the AI_V4MAPPED case prior to Vista. */
|
for the AI_V4MAPPED case prior to Vista. */
|
||||||
static struct addrinfo *
|
static struct addrinfo *
|
||||||
@ -4271,7 +4288,7 @@ cygwin_getaddrinfo (const char *hostname, const char *servname,
|
|||||||
| AI_NUMERICSERV | AI_ADDRCONFIG | AI_V4MAPPED)))
|
| AI_NUMERICSERV | AI_ADDRCONFIG | AI_V4MAPPED)))
|
||||||
return EAI_BADFLAGS;
|
return EAI_BADFLAGS;
|
||||||
/* AI_NUMERICSERV is not supported in our replacement getaddrinfo, nor
|
/* AI_NUMERICSERV is not supported in our replacement getaddrinfo, nor
|
||||||
is it supported by Winsock prior to Vista. We just check the servname
|
is it supported by WinSock prior to Vista. We just check the servname
|
||||||
parameter by ourselves here. */
|
parameter by ourselves here. */
|
||||||
if (hints && (hints->ai_flags & AI_NUMERICSERV))
|
if (hints && (hints->ai_flags & AI_NUMERICSERV))
|
||||||
{
|
{
|
||||||
@ -4364,7 +4381,7 @@ cygwin_getnameinfo (const struct sockaddr *sa, socklen_t salen,
|
|||||||
return ipv4_getnameinfo (sa, salen, host, hostlen, serv, servlen, flags);
|
return ipv4_getnameinfo (sa, salen, host, hostlen, serv, servlen, flags);
|
||||||
|
|
||||||
/* When the incoming port number does not resolve to a well-known service,
|
/* When the incoming port number does not resolve to a well-known service,
|
||||||
Winsock's getnameinfo up to Windows 2003 returns with error WSANO_DATA
|
WinSock's getnameinfo up to Windows 2003 returns with error WSANO_DATA
|
||||||
instead of setting `serv' to the numeric port number string, as required
|
instead of setting `serv' to the numeric port number string, as required
|
||||||
by RFC 3493. This is fixed on Vista and later. To avoid the error on
|
by RFC 3493. This is fixed on Vista and later. To avoid the error on
|
||||||
systems up to Windows 2003, we check if the port number resolves
|
systems up to Windows 2003, we check if the port number resolves
|
||||||
|
@ -23,7 +23,7 @@ details. */
|
|||||||
#include <winuser.h>
|
#include <winuser.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#define USE_SYS_TYPES_FD_SET
|
#define USE_SYS_TYPES_FD_SET
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#include "cygerrno.h"
|
#include "cygerrno.h"
|
||||||
#include "security.h"
|
#include "security.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user