mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
hurd: SOCK_CLOEXEC and SOCK_NONBLOCK for socketpair
* sysdeps/mach/hurd/socketpair.c (__socketpair): Handle SOCK_CLOEXEC and SOCK_NONBLOCK.
This commit is contained in:
parent
6008824221
commit
75d5e4a09e
@ -7,6 +7,8 @@
|
||||
|
||||
* sysdeps/mach/hurd/socket.c (__socket): Handle SOCK_CLOEXEC and
|
||||
SOCK_NONBLOCK.
|
||||
* sysdeps/mach/hurd/socketpair.c (__socketpair): Handle SOCK_CLOEXEC
|
||||
and SOCK_NONBLOCK.
|
||||
|
||||
2018-07-19 Leonardo Sandoval <leonardo.sandoval.gonzalez@intel.com>
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <fcntl-internal.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@ -34,6 +35,11 @@ __socketpair (int domain, int type, int protocol, int fds[2])
|
||||
error_t err;
|
||||
socket_t server, sock1, sock2;
|
||||
int d1, d2;
|
||||
int flags = sock_to_o_flags (type & ~SOCK_TYPE_MASK);
|
||||
type &= SOCK_TYPE_MASK;
|
||||
|
||||
if (flags & ~(O_CLOEXEC | O_NONBLOCK))
|
||||
return __hurd_fail (EINVAL);
|
||||
|
||||
if (fds == NULL)
|
||||
return __hurd_fail (EINVAL);
|
||||
@ -56,6 +62,14 @@ __socketpair (int domain, int type, int protocol, int fds[2])
|
||||
return -1;
|
||||
err = __socket_create (server, type, protocol, &sock1);
|
||||
}
|
||||
/* TODO: do we need special ERR massaging here, like it is done in
|
||||
__socket? */
|
||||
if (! err)
|
||||
{
|
||||
if (flags & O_NONBLOCK)
|
||||
err = __io_set_some_openmodes (sock1, O_NONBLOCK);
|
||||
/* TODO: do we need special ERR massaging after the previous call? */
|
||||
}
|
||||
if (err)
|
||||
return __hurd_fail (err);
|
||||
if (err = __socket_create (server, type, protocol, &sock2))
|
||||
@ -63,7 +77,12 @@ __socketpair (int domain, int type, int protocol, int fds[2])
|
||||
__mach_port_deallocate (__mach_task_self (), sock1);
|
||||
return __hurd_fail (err);
|
||||
}
|
||||
if (err = __socket_connect2 (sock1, sock2))
|
||||
if (flags & O_NONBLOCK)
|
||||
err = __io_set_some_openmodes (sock2, O_NONBLOCK);
|
||||
/* TODO: do we need special ERR massaging after the previous call? */
|
||||
if (! err)
|
||||
err = __socket_connect2 (sock1, sock2);
|
||||
if (err)
|
||||
{
|
||||
__mach_port_deallocate (__mach_task_self (), sock1);
|
||||
__mach_port_deallocate (__mach_task_self (), sock2);
|
||||
@ -72,13 +91,13 @@ __socketpair (int domain, int type, int protocol, int fds[2])
|
||||
|
||||
/* Put the sockets into file descriptors. */
|
||||
|
||||
d1 = _hurd_intern_fd (sock1, O_IGNORE_CTTY, 1);
|
||||
d1 = _hurd_intern_fd (sock1, O_IGNORE_CTTY | flags, 1);
|
||||
if (d1 < 0)
|
||||
{
|
||||
__mach_port_deallocate (__mach_task_self (), sock2);
|
||||
return -1;
|
||||
}
|
||||
d2 = _hurd_intern_fd (sock2, O_IGNORE_CTTY, 1);
|
||||
d2 = _hurd_intern_fd (sock2, O_IGNORE_CTTY | flags, 1);
|
||||
if (d2 < 0)
|
||||
{
|
||||
err = errno;
|
||||
|
Loading…
Reference in New Issue
Block a user