From: Thomas Schwinge Date: Sat, 2 Dec 2017 10:07:17 +0000 (+0000) Subject: socket_flags X-Git-Tag: archive/raspbian/2.25-3+rpi1^2~107 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=281ee85ed223e33d1e299db4e76a7d342253739e;p=glibc.git socket_flags 2008-12-17 Thomas Schwinge SOCK_CLOEXEC and SOCK_NONBLOCK for socket on GNU Hurd. * sysdeps/mach/hurd/socket.c (__socket): Handle SOCK_CLOEXEC and SOCK_NONBLOCK. * sysdeps/mach/hurd/kernel-features.h (__ASSUME_SOCK_CLOEXEC): Define. Gbp-Pq: Topic hurd-i386 Gbp-Pq: Name tg-socket_flags.diff --- diff --git a/sysdeps/mach/hurd/kernel-features.h b/sysdeps/mach/hurd/kernel-features.h index 687c7f0eb..14e61ace3 100644 --- a/sysdeps/mach/hurd/kernel-features.h +++ b/sysdeps/mach/hurd/kernel-features.h @@ -23,3 +23,4 @@ #define __ASSUME_O_CLOEXEC 1 #define __ASSUME_DUP3 1 #define __ASSUME_ACCEPT4 1 +#define __ASSUME_SOCK_CLOEXEC 1 diff --git a/sysdeps/mach/hurd/socket.c b/sysdeps/mach/hurd/socket.c index 9412821d1..0857c1fa6 100644 --- a/sysdeps/mach/hurd/socket.c +++ b/sysdeps/mach/hurd/socket.c @@ -21,6 +21,7 @@ #include #include #include +#include /* 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)