diff options
author | Thomas Schwinge <tschwinge@gnu.org> | 2018-07-20 01:22:12 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-07-20 01:22:12 +0200 |
commit | 6008824221dfab2a6cb7fc2ffddf1b59ebda6e01 (patch) | |
tree | f236f32938a9aa04a7d4cb0c958266d6f47afc44 | |
parent | hurd: Enable thread-safe i386 atomic instructions (diff) | |
download | glibc-6008824221dfab2a6cb7fc2ffddf1b59ebda6e01.tar.gz glibc-6008824221dfab2a6cb7fc2ffddf1b59ebda6e01.tar.bz2 glibc-6008824221dfab2a6cb7fc2ffddf1b59ebda6e01.zip |
hurd: SOCK_CLOEXEC and SOCK_NONBLOCK for socket
* sysdeps/mach/hurd/socket.c (__socket): Handle SOCK_CLOEXEC and
SOCK_NONBLOCK.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/mach/hurd/socket.c | 15 |
2 files changed, 19 insertions, 1 deletions
@@ -3,6 +3,11 @@ * sysdeps/mach/hurd/i386/tls.h (_hurd_tls_init): Set multiple_threads to 1. +2018-07-20 Thomas Schwinge <tschwinge@gnu.org> + + * sysdeps/mach/hurd/socket.c (__socket): Handle SOCK_CLOEXEC and + SOCK_NONBLOCK. + 2018-07-19 Leonardo Sandoval <leonardo.sandoval.gonzalez@intel.com> * benchtests/scripts/compare_bench.py (__main__): use the argparse diff --git a/sysdeps/mach/hurd/socket.c b/sysdeps/mach/hurd/socket.c index 2c1b98c9e6..43f2c3b2b5 100644 --- a/sysdeps/mach/hurd/socket.c +++ b/sysdeps/mach/hurd/socket.c @@ -21,6 +21,7 @@ #include <hurd/socket.h> #include <hurd/fd.h> #include <fcntl.h> +#include <fcntl-internal.h> /* Create a new socket of type TYPE in domain DOMAIN, using protocol PROTOCOL. If PROTOCOL is zero, one is chosen automatically. @@ -30,6 +31,11 @@ __socket (int domain, int type, int protocol) { error_t err; socket_t sock, server; + int flags = sock_to_o_flags (type & ~SOCK_TYPE_MASK); + type &= SOCK_TYPE_MASK; + + if (flags & ~(O_CLOEXEC | O_NONBLOCK)) + return __hurd_fail (EINVAL); /* Find the socket server for DOMAIN. */ server = _hurd_socket_server (domain, 0); @@ -55,10 +61,17 @@ __socket (int domain, int type, int protocol) || err == MIG_BAD_ID || err == EOPNOTSUPP) err = EAFNOSUPPORT; + if (! err) + { + if (flags & O_NONBLOCK) + err = __io_set_some_openmodes (sock, O_NONBLOCK); + /* TODO: do we need special ERR massaging after the previous call? */ + } + if (err) return __hurd_fail (err); - return _hurd_intern_fd (sock, O_IGNORE_CTTY, 1); + return _hurd_intern_fd (sock, O_IGNORE_CTTY | flags, 1); } libc_hidden_def (__socket) |