aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Brown <kbrown@cornell.edu>2021-05-10 17:48:35 -0400
committerKen Brown <kbrown@cornell.edu>2021-06-04 12:36:45 -0400
commit61116b051a08c49d0ecf972fdc10ec0a91f5314f (patch)
treeed36f9772ef5a5f7a91095fdde7093db47f7ea9d
parent37226b27637404600525e4230933043d8105879a (diff)
downloadnewlib-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.cc62
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 ());