diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2002-04-12 14:52:36 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2002-04-12 14:52:36 +0000 |
commit | 4deace13e4751f81db731dd18eb6aacd8963233e (patch) | |
tree | 41cc20949ef2df9b3b1e94210351986d83c9a378 /winsup/cygwin/net.cc | |
parent | fcd631cf70fa7b10e8ee02799b54f75445d2dfc1 (diff) | |
download | cygnal-4deace13e4751f81db731dd18eb6aacd8963233e.tar.gz cygnal-4deace13e4751f81db731dd18eb6aacd8963233e.tar.bz2 cygnal-4deace13e4751f81db731dd18eb6aacd8963233e.zip |
* net.cc (cygwin_accept): Set socket type for accepted socket.
(socketpair): Set socket type for both sockets.
From Egor Duda <deo@logos-m.ru>:
* 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.
Diffstat (limited to 'winsup/cygwin/net.cc')
-rw-r--r-- | winsup/cygwin/net.cc | 31 |
1 files changed, 23 insertions, 8 deletions
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: |