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/ChangeLog | 14 ++++++++++++++ winsup/cygwin/fhandler.h | 3 +++ winsup/cygwin/net.cc | 31 +++++++++++++++++++++++-------- 3 files changed, 40 insertions(+), 8 deletions(-) (limited to 'winsup') diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 45925f179..b74c6627e 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,17 @@ +2002-04-12 Corinna Vinschen + + * net.cc (cygwin_accept): Set socket type for accepted socket. + (socketpair): Set socket type for both sockets. + +2002-04-12 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. + 2002-04-09 Mark Bradshaw * cygwin.din: Add strptime. diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 3cad291d0..cc54024be 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -357,6 +357,7 @@ class fhandler_socket: public fhandler_base { private: int addr_family; + int type; int connect_secret [4]; HANDLE secret_event; struct _WSAPROTOCOL_INFOA *prot_info_ptr; @@ -397,6 +398,8 @@ class fhandler_socket: public fhandler_base select_record *select_except (select_record *s); void set_addr_family (int af) {addr_family = af;} int get_addr_family () {return addr_family;} + void set_socket_type (int st) { type = st;} + int get_socket_type () {return type;} void set_sun_path (const char *path); char *get_sun_path () {return sun_path;} void set_connect_secret (); 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