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