From fae28904e9bc81e39a14ff0bd3a35c955ba67001 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 8 Feb 2002 11:54:10 +0000 Subject: [PATCH] * dtable.cc (dtable::dup2): Store fd for fhandler_socket. * fhandler.h (fhandler_base::set_fd): New virtual method. (fhandler_base::get_fd): Ditto. (fhandler_socket::set_fd): Ditto. (fhandler_socket::get_fd): Ditto. * fhandler_socket.cc (fhandler_socket::read): Call cygwin_recv instead of native Winsock recv. (fhandler_socket::write): Call cygwin_send instead of native Winsock send. * net.cc (fdsock): Store fd in fhandler_socket. --- winsup/cygwin/ChangeLog | 13 +++++++++++++ winsup/cygwin/dtable.cc | 1 + winsup/cygwin/fhandler.h | 8 +++++++- winsup/cygwin/fhandler_socket.cc | 12 ++++++++++-- winsup/cygwin/net.cc | 1 + 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 84daf61e3..10e3df7c1 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,16 @@ +2002-02-08 Corinna Vinschen + + * dtable.cc (dtable::dup2): Store fd for fhandler_socket. + * fhandler.h (fhandler_base::set_fd): New virtual method. + (fhandler_base::get_fd): Ditto. + (fhandler_socket::set_fd): Ditto. + (fhandler_socket::get_fd): Ditto. + * fhandler_socket.cc (fhandler_socket::read): Call cygwin_recv instead + of native Winsock recv. + (fhandler_socket::write): Call cygwin_send instead of native Winsock + send. + * net.cc (fdsock): Store fd in fhandler_socket. + 2002-02-07 Corinna Vinschen * net.cc (cygwin_getsockname): Fix handling of NULL sun_path. diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc index f09ddec6c..ab6f3c218 100644 --- a/winsup/cygwin/dtable.cc +++ b/winsup/cygwin/dtable.cc @@ -411,6 +411,7 @@ dtable::dup2 (int oldfd, int newfd) if (!not_open (newfd)) _close (newfd); fds[newfd] = newfh; + newfh->set_fd (newfd); ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "dup"); MALLOC_CHECK; diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 039615d4d..f2b3f1387 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -351,6 +351,9 @@ class fhandler_base virtual void seekdir (DIR *, off_t); virtual void rewinddir (DIR *); virtual int closedir (DIR *); + + virtual void set_fd (int nfd) {} + virtual int get_fd () { return -1; } }; class fhandler_socket: public fhandler_base @@ -361,6 +364,7 @@ class fhandler_socket: public fhandler_base HANDLE secret_event; struct _WSAPROTOCOL_INFOA *prot_info_ptr; char *sun_path; + int fd; public: fhandler_socket (); @@ -391,8 +395,10 @@ class fhandler_socket: public fhandler_base select_record *select_read (select_record *s); select_record *select_write (select_record *s); select_record *select_except (select_record *s); - int get_addr_family () {return addr_family;} + void set_fd (int nfd) { fd = nfd; } + int get_fd () { return fd; } void set_addr_family (int af) {addr_family = af;} + int get_addr_family () {return addr_family;} void set_sun_path (const char *path); char *get_sun_path () {return sun_path;} void set_connect_secret (); diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index b62a203bf..33e9b39f3 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -251,27 +251,35 @@ fhandler_socket::fstat (struct stat *buf, path_conv *pc) return fh.fstat (buf, pc); } +extern "C" int cygwin_recv (int, void *, int, unsigned int); + int __stdcall fhandler_socket::read (void *ptr, size_t len) { sigframe thisframe (mainthread); - int res = recv (get_socket (), (char *) ptr, len, 0); + int res = cygwin_recv (get_fd (), (char *) ptr, len, 0); +#if 0 if (res == SOCKET_ERROR) set_winsock_errno (); +#endif return res; } +extern "C" int cygwin_send (int, const void *, int, unsigned int); + int fhandler_socket::write (const void *ptr, size_t len) { sigframe thisframe (mainthread); - int res = send (get_socket (), (const char *) ptr, len, 0); + int res = cygwin_send (get_fd (), (const char *) ptr, len, 0); +#if 0 if (res == SOCKET_ERROR) { set_winsock_errno (); if (get_errno () == ECONNABORTED || get_errno () == ECONNRESET) _raise (SIGPIPE); } +#endif return res; } diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc index a564f44fb..2f8ce8b1c 100644 --- a/winsup/cygwin/net.cc +++ b/winsup/cygwin/net.cc @@ -522,6 +522,7 @@ fdsock (int& fd, const char *name, SOCKET soc) else debug_printf ("not setting socket inheritance since winsock2_active %d", winsock2_active); fhandler_socket *fh = (fhandler_socket *) cygheap->fdtab.build_fhandler (fd, FH_SOCKET, name); + fh->set_fd (fd); fh->set_io_handle ((HANDLE) soc); fh->set_flags (O_RDWR); fh->set_name (name, name);