PERFORCE change 165029 for review

Jonathan Anderson jona at FreeBSD.org
Wed Jun 24 08:28:42 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=165029

Change 165029 by jona at jona-trustedbsd-belle-vmware on 2009/06/24 08:28:40

	Block SIGPIPE

Affected files ...

.. //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/server.c#10 edit

Differences ...

==== //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/server.c#10 (text+ko) ====

@@ -20,9 +20,7 @@
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANT#
-#
-IES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
@@ -39,11 +37,13 @@
 
 #include <libuserangel.h>
 
+#include <err.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <sysexits.h>
 #include <unistd.h>
 
 #include "cap.h"
@@ -126,6 +126,19 @@
 
 	highest_fd = fd;
 
+
+	// No SIGPIPE, please
+	int on = 1;
+	if(setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on)))
+		err(EX_IOERR, "Error setting SO_NOSIGPIPE");
+
+	// Re-use the angel address if the server has recently shut down
+	if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
+		err(EX_IOERR, "Error setting SO_REUSEADRR");
+
+
+
+
 /*
 	TODO: do this?
 		rc = setsockopt(listen_sd, SOL_SOCKET,  SO_REUSEADDR,
@@ -245,7 +258,8 @@
 
 	if(!d)
 	{
-		if((errno == ENOENT) || (errno == ECONNRESET) || (errno == EAGAIN))
+		if((errno == ENOENT) || (errno == ECONNRESET) || (errno == EAGAIN)
+		   || (errno == EPIPE))
 			close_client(client, errno, "Client socket closed");
 
 		else perror("Error receiving from client");
@@ -453,7 +467,7 @@
 	FD_CLR(client, &clients);
 
 	if(client == highest_fd)
-		while(!FD_ISSET(highest_fd, &clients))
+		while(!FD_ISSET(highest_fd, &clients) && (highest_fd >= 0))
 			highest_fd--;
 }
 


More information about the p4-projects mailing list