Date: Wed, 24 Jun 2009 08:28:41 GMT From: Jonathan Anderson <jona@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 165029 for review Message-ID: <200906240828.n5O8SfIU055001@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=165029 Change 165029 by jona@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--; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906240828.n5O8SfIU055001>