I believe I found a more portable solution. We use signal(SIGPIPE, SIG_IGN); which will block SIGPIPE, and if MSG_NOSIGNAL is not supported we set it to 0x0 so that it just gets ignored. Hopefully this is a more comprehensive solution.
From ea38d52b8301eacaf0b7cd76ba5e1c2bf601f4f5 Mon Sep 17 00:00:00 2001 From: Cameron Katri <katri.cameron@gmail.com> Date: Mon, 31 Aug 2020 09:50:09 -0400 Subject: [PATCH] Fix compilation on Darwin
--- lib/libalpm/util.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index b70a8192..4a51b63f 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -34,6 +34,11 @@ #include <fnmatch.h> #include <poll.h> +/* no MSG_NOSIGNAL support */ +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0x0 +#endif + /* libarchive */ #include <archive.h> #include <archive_entry.h> @@ -474,6 +479,8 @@ static int _alpm_chroot_write_to_child(alpm_handle_t *handle, int fd, } } + signal(SIGPIPE, SIG_IGN); + nwrite = send(fd, buf, *buf_size, MSG_NOSIGNAL); if(nwrite != -1) { @@ -557,8 +564,11 @@ static void _alpm_reset_signals(void) int *i, signals[] = { SIGABRT, SIGALRM, SIGBUS, SIGCHLD, SIGCONT, SIGFPE, SIGHUP, SIGILL, SIGINT, SIGKILL, SIGPIPE, SIGQUIT, SIGSEGV, SIGSTOP, SIGTERM, SIGTSTP, - SIGTTIN, SIGTTOU, SIGUSR1, SIGUSR2, SIGPOLL, SIGPROF, SIGSYS, SIGTRAP, + SIGTTIN, SIGTTOU, SIGUSR1, SIGUSR2, SIGPROF, SIGSYS, SIGTRAP, SIGURG, SIGVTALRM, SIGXCPU, SIGXFSZ, +#ifndef __APPLE__ + SIGPOLL, +#endif 0 }; struct sigaction def; -- 2.28.0