This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patches to improve Hurd parts: socket and socketpair


2008-12-17  Thomas Schwinge  <tschwinge@gnu.org>

	* sysdeps/mach/hurd/socket.c (__socket): Handle SOCK_CLOEXEC
	and SOCK_NONBLOCK.
	* sysdeps/mach/hurd/socketpair.c (__socketpair): Likewise.

diff --git a/sysdeps/mach/hurd/socket.c b/sysdeps/mach/hurd/socket.c
index a707ed9..8b065b1 100644
--- a/sysdeps/mach/hurd/socket.c
+++ b/sysdeps/mach/hurd/socket.c
@@ -34,6 +34,11 @@ __socket (domain, type, 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);
@@ -59,10 +64,16 @@ __socket (domain, type, protocol)
       || err == MIG_BAD_ID || err == EOPNOTSUPP)
     err = EPFNOSUPPORT;
 
+  if (! err)
+    {
+      if (flags & O_NONBLOCK)
+	err = __io_set_some_openmodes (sock, O_NONBLOCK);
+    }
+
   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);
 }
 
 weak_alias (__socket, socket)
diff --git a/sysdeps/mach/hurd/socketpair.c b/sysdeps/mach/hurd/socketpair.c
index b124d20..54b8ff1 100644
--- a/sysdeps/mach/hurd/socketpair.c
+++ b/sysdeps/mach/hurd/socketpair.c
@@ -35,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);
@@ -57,6 +62,11 @@ __socketpair (int domain, int type, int protocol, int fds[2])
 	return -1;
       err = __socket_create (server, type, protocol, &sock1);
     }
+  if (! err)
+    {
+      if (flags & O_NONBLOCK)
+	err = __io_set_some_openmodes (sock1, O_NONBLOCK);
+    }
   if (err)
     return __hurd_fail (err);
   if (err = __socket_create (server, type, protocol, &sock2))
@@ -64,7 +74,11 @@ __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);
+  if (! err)
+    err = __socket_connect2 (sock1, sock2);
+  if (err)
     {
       __mach_port_deallocate (__mach_task_self (), sock1);
       __mach_port_deallocate (__mach_task_self (), sock2);
@@ -73,13 +87,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;

To discuss:

In __socket, do we need special err massaging after the
__io_set_some_openmodes call?

In __socketcall, should we do err massaging after the second
__socket_create calls, like it is done in __socket?

Again in __socketcall, analogous to the __socket question, do we need
special err massaging after the two __io_set_some_openmodes calls?

Attachment: signature.asc
Description: Digital signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]