--- sys/sys/socket.h.orig Mon Feb 25 19:32:57 2002 +++ sys/sys/socket.h Tue Feb 26 00:12:02 2002 @@ -78,6 +78,7 @@ #define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ #define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ #define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */ +#define SO_NOSIGPIPE 0x0800 /* no sigpipe on epipe */ #define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */ /* --- sys/kern/sys_generic.c.orig Mon Feb 25 19:22:18 2002 +++ sys/kern/sys_generic.c Mon Feb 25 19:22:55 2002 @@ -409,7 +409,8 @@ if (auio.uio_resid != cnt && (error == ERESTART || error == EINTR || error == EWOULDBLOCK)) error = 0; - if (error == EPIPE) + /* The socket layer handles SIGPIPE */ + if (error == EPIPE && fp->f_type != DTYPE_SOCKET) psignal(p, SIGPIPE); } cnt -= auio.uio_resid; --- sys/kern/uipc_socket.c.orig Mon Feb 25 19:26:17 2002 +++ sys/kern/uipc_socket.c Tue Feb 26 10:30:59 2002 @@ -1157,6 +1157,7 @@ case SO_REUSEPORT: case SO_OOBINLINE: case SO_TIMESTAMP: + case SO_NOSIGPIPE: error = sooptcopyin(sopt, &optval, sizeof optval, sizeof optval); if (error) @@ -1339,6 +1340,7 @@ case SO_BROADCAST: case SO_OOBINLINE: case SO_TIMESTAMP: + case SO_NOSIGPIPE: optval = so->so_options & sopt->sopt_name; integer: error = sooptcopyout(sopt, &optval, sizeof optval); --- sys/kern/uipc_syscalls.c.orig Mon Feb 25 19:59:54 2002 +++ sys/kern/uipc_syscalls.c Mon Feb 25 20:01:48 2002 @@ -586,7 +586,8 @@ if (auio.uio_resid != len && (error == ERESTART || error == EINTR || error == EWOULDBLOCK)) error = 0; - if (error == EPIPE) + /* Generation of SIGPIPE can be controlled per socket */ + if (error == EPIPE && !(so->so_options & SO_NOSIGPIPE)) psignal(p, SIGPIPE); } if (error == 0)