From 4deace13e4751f81db731dd18eb6aacd8963233e Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 12 Apr 2002 14:52:36 +0000 Subject: * net.cc (cygwin_accept): Set socket type for accepted socket. (socketpair): Set socket type for both sockets. From Egor Duda : * fhandler.h (class fhandler_socket): New member to store socket type. (fhandler_socket::get_socket_type): Access it. (fhandler_socket::set_socket_type): Ditto. * net.cc (cygwin_socket): Store socket type. (cygwin_connect): Disable security checks for connectionless sockets. (cygwin_accept): Ditto. --- winsup/cygwin/net.cc | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) (limited to 'winsup/cygwin/net.cc') diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc index 17826d628..c7b1302e6 100644 --- a/winsup/cygwin/net.cc +++ b/winsup/cygwin/net.cc @@ -518,6 +518,7 @@ cygwin_socket (int af, int type, int protocol) { int res = -1; SOCKET soc = 0; + fhandler_socket* fh = NULL; cygheap_fdnew fd; @@ -539,7 +540,12 @@ cygwin_socket (int af, int type, int protocol) else name = (type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket"); - fdsock (fd, name, soc)->set_addr_family (af); + fh = fdsock (fd, name, soc); + if (fh) + { + fh->set_addr_family (af); + fh->set_socket_type (type); + } res = fd; } @@ -881,7 +887,8 @@ cygwin_connect (int fd, } set_winsock_errno (); } - if (sock->get_addr_family () == AF_LOCAL) + if (sock->get_addr_family () == AF_LOCAL && + sock->get_socket_type () == SOCK_STREAM) { if (!res || in_progress) { @@ -1199,7 +1206,8 @@ cygwin_accept (int fd, struct sockaddr *peer, int *len) WSAGetLastError () == WSAEWOULDBLOCK) in_progress = TRUE; - if (sock->get_addr_family () == AF_LOCAL) + if (sock->get_addr_family () == AF_LOCAL && + sock->get_socket_type () == SOCK_STREAM) { if ((SOCKET) res != (SOCKET) INVALID_SOCKET || in_progress) { @@ -1242,6 +1250,7 @@ cygwin_accept (int fd, struct sockaddr *peer, int *len) if (sock->get_addr_family () == AF_LOCAL) res_fh->set_sun_path (sock->get_sun_path ()); res_fh->set_addr_family (sock->get_addr_family ()); + res_fh->set_socket_type (sock->get_socket_type ()); res = res_fd; } } @@ -2266,6 +2275,7 @@ socketpair (int family, int type, int protocol, int *sb) struct sockaddr_in sock_in, sock_out; int len; cygheap_fdnew sb0; + fhandler_socket *fh; if (__check_null_invalid_struct_errno (sb, 2 * sizeof(int))) return -1; @@ -2417,25 +2427,30 @@ socketpair (int family, int type, int protocol, int *sb) if (family == AF_LOCAL) { - fhandler_socket *fh; fh = fdsock (sb[0], type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket", insock); fh->set_sun_path (""); fh->set_addr_family (AF_LOCAL); + fh->set_socket_type (type); fh = fdsock (sb[1], type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket", outsock); fh->set_sun_path (""); fh->set_addr_family (AF_LOCAL); + fh->set_socket_type (type); } else { - fdsock (sb[0], type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp", - insock)->set_addr_family (AF_INET); - fdsock (sb[1], type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp", - outsock)->set_addr_family (AF_INET); + fh = fdsock (sb[0], type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp", + insock); + fh->set_addr_family (AF_INET); + fh->set_socket_type (type); + fh = fdsock (sb[1], type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp", + outsock); + fh->set_addr_family (AF_INET); + fh->set_socket_type (type); } done: -- cgit v1.2.3