diff options
author | Ken Brown <kbrown@cornell.edu> | 2021-04-07 20:07:53 +0300 |
---|---|---|
committer | Ken Brown <kbrown@cornell.edu> | 2021-04-14 17:07:15 +0300 |
commit | 1322dfbf981c6871fb139d46f352950781d9a45a (patch) | |
tree | 3bc3d47dfadb8cf5f6e445fee566f23be5db7c98 | |
parent | 70df7f9dad3fc0d2d44655e9ab7dceed1005f6ad (diff) |
Cygwin: AF_UNIX: implement saw_shutdown_write
For consistency between the fhandler_socket_unix and
fhandler_socket_wsock classes, add a virtual
fhandler_socket::saw_shutdown_write and implement it for
fhandler_socket_unix. (It was already implemented for
fhandler_socket_wsock.)
Use saw_shutdown_write and saw_shutdown_read in select.cc and
fhandler_socket_unix.cc where appropriate.
-rw-r--r-- | winsup/cygwin/fhandler.h | 2 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_socket_unix.cc | 10 | ||||
-rw-r--r-- | winsup/cygwin/select.cc | 7 |
3 files changed, 10 insertions, 9 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 721a432c2..2687a27f4 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -607,6 +607,7 @@ class fhandler_socket: public fhandler_base virtual conn_state connect_state (conn_state val) = 0; virtual conn_state connect_state () const = 0; virtual bool saw_shutdown_read () const = 0; + virtual bool saw_shutdown_write () const = 0; virtual int ioctl (unsigned int cmd, void *); virtual int fcntl (int cmd, intptr_t); @@ -1261,6 +1262,7 @@ class fhandler_socket_unix : public fhandler_socket int saw_shutdown (int shut) { return shmem->shutdown (shut); } int saw_shutdown () const { return shmem->shutdown (); } bool saw_shutdown_read () const { return !!(saw_shutdown () & _SHUT_RECV); } + bool saw_shutdown_write () const { return !!(saw_shutdown () & _SHUT_SEND); } int open (int flags, mode_t mode = 0); int close (); diff --git a/winsup/cygwin/fhandler_socket_unix.cc b/winsup/cygwin/fhandler_socket_unix.cc index cdf9fa001..3f8b3ff6d 100644 --- a/winsup/cygwin/fhandler_socket_unix.cc +++ b/winsup/cygwin/fhandler_socket_unix.cc @@ -2476,7 +2476,7 @@ fhandler_socket_unix::recvmsg (struct msghdr *msg, int flags) /* FIXME: This isn't quite right. There may be data in the pipe that hasn't been read yet. */ grab_admin_pkt (); - if (saw_shutdown () & _SHUT_RECV || tot == 0) + if (saw_shutdown_read () || tot == 0) { ret = 0; __leave; @@ -2607,7 +2607,7 @@ restart: { /* FIXME: Check for error? */ grab_admin_pkt (false); - if (saw_shutdown () & _SHUT_RECV) + if (saw_shutdown_read ()) { ret = 0; __leave; @@ -2732,7 +2732,7 @@ restart1: { /* FIXME: Check for error? */ grab_admin_pkt (false); - if (saw_shutdown () & _SHUT_RECV) + if (saw_shutdown_read ()) { ret = nbytes_read; __leave; @@ -2805,7 +2805,7 @@ restart2: if (packet->admin_pkt) { process_admin_pkt (packet); - if (saw_shutdown () & _SHUT_RECV) + if (saw_shutdown_read ()) { ret = nbytes_read; __leave; @@ -3178,7 +3178,7 @@ fhandler_socket_unix::sendmsg (const struct msghdr *msg, int flags) __leave; } grab_admin_pkt (); - if (saw_shutdown () & _SHUT_SEND) + if (saw_shutdown_write ()) { set_errno (EPIPE); /* FIXME: Linux calls for SIGPIPE here, but Posix diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 14cf2149d..014be8dcc 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -1981,7 +1981,7 @@ peek_socket_unix (select_record *me, bool) { /* FIXME: Check for error? */ fh->grab_admin_pkt (false); - if (fh->saw_shutdown () & _SHUT_RECV) + if (fh->saw_shutdown_read ()) { select_printf ("read: saw shutdown"); gotone += me->read_ready = true; @@ -2175,7 +2175,7 @@ fhandler_socket_unix::select_read (select_stuff *ss) s->cleanup = socket_unix_cleanup; s->read_selected = true; grab_admin_pkt (); - s->read_ready = (saw_shutdown () & _SHUT_RECV); + s->read_ready = saw_shutdown_read ()); return s; } @@ -2191,8 +2191,7 @@ fhandler_socket_unix::select_write (select_stuff *ss) s->verify = verify_ok; s->cleanup = socket_unix_cleanup; s->write_selected = true; - s->write_ready = (saw_shutdown () & _SHUT_SEND) - || connect_state () == unconnected; + s->write_ready = saw_shutdown_write () || connect_state () == unconnected; if (connect_state () != unconnected) { s->except_ready = saw_shutdown (); |