diff options
author | Ken Brown <kbrown@cornell.edu> | 2021-05-10 17:48:35 -0400 |
---|---|---|
committer | Ken Brown <kbrown@cornell.edu> | 2021-06-04 12:36:45 -0400 |
commit | 61116b051a08c49d0ecf972fdc10ec0a91f5314f (patch) | |
tree | ed36f9772ef5a5f7a91095fdde7093db47f7ea9d | |
parent | 37226b27637404600525e4230933043d8105879a (diff) | |
download | newlib-61116b051a08c49d0ecf972fdc10ec0a91f5314f.zip newlib-61116b051a08c49d0ecf972fdc10ec0a91f5314f.tar.gz newlib-61116b051a08c49d0ecf972fdc10ec0a91f5314f.tar.bz2 |
Cygwin: AF_UNIX: adapt socketpair to mqueues
-rw-r--r-- | winsup/cygwin/fhandler_socket_unix.cc | 62 |
1 files changed, 41 insertions, 21 deletions
diff --git a/winsup/cygwin/fhandler_socket_unix.cc b/winsup/cygwin/fhandler_socket_unix.cc index 54bb0d9..07594d4 100644 --- a/winsup/cygwin/fhandler_socket_unix.cc +++ b/winsup/cygwin/fhandler_socket_unix.cc @@ -1271,8 +1271,9 @@ fhandler_socket_unix::socket (int af, int type, int protocol, int flags) } if (create_shmem () < 0) return -1; - rmem (262144); - wmem (262144); + /* rmem and wmem have no effect in mqueue implementation. */ + /* rmem (262144); */ + /* wmem (262144); */ set_addr_family (AF_UNIX); set_socket_type (type); set_flags (O_RDWR | O_BINARY); @@ -1291,6 +1292,7 @@ int fhandler_socket_unix::socketpair (int af, int type, int protocol, int flags, fhandler_socket *fh_out) { + mqd_t mqd; sun_name_t sun; fhandler_socket_unix *fh = (fhandler_socket_unix *) fh_out; @@ -1310,42 +1312,60 @@ fhandler_socket_unix::socketpair (int af, int type, int protocol, int flags, if (fh->create_shmem () < 0) goto fh_shmem_failed; /* socket() on both sockets */ - rmem (262144); - fh->rmem (262144); - wmem (262144); - fh->wmem (262144); + /* rmem (262144); */ + /* fh->rmem (262144); */ + /* wmem (262144); */ + /* fh->wmem (262144); */ set_addr_family (AF_UNIX); fh->set_addr_family (AF_UNIX); set_socket_type (type); fh->set_socket_type (type); + set_flags (O_RDWR | O_BINARY); + fh->set_flags (O_RDWR | O_BINARY); + if (flags & SOCK_NONBLOCK) + { + set_nonblocking (true); + fh->set_nonblocking (true); + } + if (flags & SOCK_CLOEXEC) + { + set_close_on_exec (true); + fh->set_close_on_exec (true); + } set_cred (); fh->set_cred (); set_unique_id (); + fh->set_unique_id (); set_ino (get_unique_id ()); - /* bind/listen 1st socket */ + fh->set_ino (fh->get_unique_id ()); + /* Create and open mqueues. */ gen_mqueue_name (); if (create_mqueue () < 0) goto create_mqueue_failed; + mqd = fh->open_mqueue (get_mqueue_name (), is_nonblocking ()); + if (mqd == (mqd_t) -1) + goto fh_open_mqueue_failed; + fh->set_mqd_out (mqd); + fh->gen_mqueue_name (); + if (fh->create_mqueue () < 0) + goto fh_create_mqueue_failed; + mqd = open_mqueue (get_mqueue_name (), is_nonblocking ()); + if (mqd == (mqd_t) -1) + goto open_mqueue_failed; + set_mqd_out (mqd); + /* bind 1st socket */ sun_path (&sun); fh->peer_sun_path (&sun); - connect_state (listener); + connect_state (connected); /* connect 2nd socket, even for DGRAM. There's no difference as far as socketpairs are concerned. */ - if (fh->open_mqueue (get_mqueue_name (), false) == (mqd_t) -1) - goto fh_open_mqueue_failed; fh->connect_state (connected); - if (flags & SOCK_NONBLOCK) - { - set_nonblocking (true); - fh->set_nonblocking (true); - } - if (flags & SOCK_CLOEXEC) - { - set_close_on_exec (true); - fh->set_close_on_exec (true); - } return 0; - +open_mqueue_failed: + mq_close (fh->get_mqd_in ()); + mq_unlink (fh->get_mqueue_name ()); +fh_create_mqueue_failed: + mq_close (fh->get_mqd_out ()); fh_open_mqueue_failed: mq_close (get_mqd_in ()); mq_unlink (get_mqueue_name ()); |