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]

[Hurd] MSG_NOSIGNAL implementation


Hello,

The patch below implements MSG_NOSIGNAL for GNU/Hurd.  However, I'm
wondering about the actual value for MSG_NOSIGNAL.  GNU/Hurd is
currently using sysdeps/unix/bsd/bsd4.4/bits/socket.h, which doesn't
define it, and probably for good reason: FreeBSD uses 0x20000, NetBSD
uses 0x400, OpenBSD and DragonFly don't define it.  Should we add a
sysdeps/mach/hurd/bits/socket.h?

Samuel

2008-06-30  Samuel Thibault  <samuel.thibault@ens-lyon.org>

	* sysdeps/mach/hurd/recv.c (__recv): Do not call __hurd_dfail if flags
	contain MSG_NOSIGNAL.
	* sysdeps/mach/hurd/recvfrom.c (__recvfrom): Likewise
	* sysdeps/mach/hurd/recvmsg.c (__recvmsg): Likewise
	* sysdeps/mach/hurd/send.c (__send): Likewise
	* sysdeps/mach/hurd/sendfrom.c (__sendfrom): Likewise
	* sysdeps/mach/hurd/sendmsg.c (__sendmsg): Likewise

Index: sysdeps/mach/hurd/recv.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mach/hurd/recv.c,v
retrieving revision 1.9
diff -u -p -r1.9 recv.c
--- sysdeps/mach/hurd/recv.c	22 Feb 2005 22:51:00 -0000	1.9
+++ sysdeps/mach/hurd/recv.c	30 Jun 2008 22:41:47 -0000
 
@@ -48,7 +48,7 @@ __recv (fd, buf, n, flags)
 					       &cdata, &clen,
 					       &flags,
 					       n)))
-    return __hurd_dfail (fd, err);
+    return flags & MSG_NOSIGNAL ? err : __hurd_dfail (fd, err);
 
   __mach_port_deallocate (__mach_task_self (), addrport);
   __vm_deallocate (__mach_task_self (), (vm_address_t) cdata, clen);
Index: sysdeps/mach/hurd/recvfrom.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mach/hurd/recvfrom.c,v
retrieving revision 1.12
diff -u -p -r1.12 recvfrom.c
--- sysdeps/mach/hurd/recvfrom.c	15 May 2002 00:08:24 -0000	1.12
+++ sysdeps/mach/hurd/recvfrom.c	30 Jun 2008 22:41:47 -0000
@@ -52,7 +52,7 @@ __recvfrom (fd, buf, n, flags, addrarg, 
 					       &cdata, &clen,
 					       &flags,
 					       n)))
-    return __hurd_dfail (fd, err);
+    return flags & MSG_NOSIGNAL ? err : __hurd_dfail (fd, err);
 
   /* Get address data for the returned address port if requested.  */
   if (addr != NULL)
@@ -74,7 +74,7 @@ __recvfrom (fd, buf, n, flags, addrarg, 
       if (err)
 	{
 	  __mach_port_deallocate (__mach_task_self (), addrport);
-	  return __hurd_dfail (fd, err);
+	  return flags & MSG_NOSIGNAL ? err : __hurd_dfail (fd, err);
 	}
       
       if (*addr_len > buflen)
Index: sysdeps/mach/hurd/recvmsg.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mach/hurd/recvmsg.c,v
retrieving revision 1.3
diff -u -p -r1.3 recvmsg.c
--- sysdeps/mach/hurd/recvmsg.c	26 Aug 2002 22:39:46 -0000	1.3
+++ sysdeps/mach/hurd/recvmsg.c	30 Jun 2008 22:41:47 -0000
@@ -63,7 +63,7 @@ __libc_recvmsg (int fd, struct msghdr *m
 					       &ports, &nports,
 					       &cdata, &clen,
 					       &message->msg_flags, amount)))
-    return __hurd_dfail (fd, err);
+    return flags & MSG_NOSIGNAL ? err : __hurd_dfail (fd, err);
 
   if (message->msg_name != NULL)
     {
@@ -84,7 +84,7 @@ __libc_recvmsg (int fd, struct msghdr *m
       if (err)
 	{
 	  __mach_port_deallocate (__mach_task_self (), aport);
-	  return __hurd_dfail (fd, err);
+	  return flags & MSG_NOSIGNAL ? err : __hurd_dfail (fd, err);
 	}
 
       if (message->msg_namelen > buflen)
Index: sysdeps/mach/hurd/send.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mach/hurd/send.c,v
retrieving revision 1.12
diff -u -p -r1.12 send.c
--- sysdeps/mach/hurd/send.c	3 Aug 2002 06:53:36 -0000	1.12
+++ sysdeps/mach/hurd/send.c	30 Jun 2008 22:41:47 -0000
@@ -38,7 +38,7 @@ __send (fd, buf, n, flags)
 					   NULL, MACH_MSG_TYPE_COPY_SEND, 0,
 					   NULL, 0, &wrote));
 
-  return err ? __hurd_dfail (fd, err) : wrote;
+  return err ? flags & MSG_NOSIGNAL ? err : __hurd_dfail (fd, err) : wrote;
 }
 libc_hidden_def (__send)
 weak_alias (__send, send)
Index: sysdeps/mach/hurd/sendmsg.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mach/hurd/sendmsg.c,v
retrieving revision 1.4
diff -u -p -r1.4 sendmsg.c
--- sysdeps/mach/hurd/sendmsg.c	11 Feb 2004 02:01:03 -0000	1.4
+++ sysdeps/mach/hurd/sendmsg.c	30 Jun 2008 22:41:47 -0000
@@ -149,7 +149,7 @@ __libc_sendmsg (int fd, const struct msg
   if (dealloc)
     __vm_deallocate (__mach_task_self (), data.addr, len);
 
-  return err ? __hurd_dfail (fd, err) : amount;
+  return err ? flags & MSG_NOSIGNAL ? err : __hurd_dfail (fd, err) : amount;
 }
 
 weak_alias (__libc_sendmsg, sendmsg)
Index: sysdeps/mach/hurd/sendto.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mach/hurd/sendto.c,v
retrieving revision 1.15
diff -u -p -r1.15 sendto.c
--- sysdeps/mach/hurd/sendto.c	15 May 2002 00:05:38 -0000	1.15
+++ sysdeps/mach/hurd/sendto.c	30 Jun 2008 22:41:47 -0000
@@ -79,7 +79,7 @@ __sendto (int fd,
 			  err;
 			}));
 
-  return err ? __hurd_dfail (fd, err) : wrote;
+  return err ? flags & MSG_NOSIGNAL ? err : __hurd_dfail (fd, err) : wrote;
 }
 
 weak_alias (__sendto, sendto)


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