lib-signals.c revision b0aa6aa9a8a485b18fa24579fb0da38f08a3b196
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2001-2003 Timo Sirainen */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "lib.h"
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "ioloop.h"
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "fd-close-on-exec.h"
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include "lib-signals.h"
af99ca825f4b7674ec6dd0269bbca665775205aaTimo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen#include <signal.h>
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen#include <unistd.h>
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen#define MAX_SIGNAL_VALUE 31
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstruct signal_handler {
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen signal_handler_t *handler;
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen void *context;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen bool delayed;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen struct signal_handler *next;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen};
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen/* Remember that these are accessed inside signal handler which may be called
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen even while we're initializing/deinitializing. Try hard to keep everything
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen in consistent state. */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic struct signal_handler *signal_handlers[MAX_SIGNAL_VALUE+1];
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainenstatic int sig_pipe_fd[2];
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic struct io *io_sig;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic void sig_handler(int signo)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen struct signal_handler *h;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen bool delayed_sent = FALSE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (signo < 0 || signo > MAX_SIGNAL_VALUE)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen return;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen /* remember that we're inside a signal handler which might have been
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen called at any time. don't do anything that's unsafe. */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen for (h = signal_handlers[signo]; h != NULL; h = h->next) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (!h->delayed)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen h->handler(signo, h->context);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen else if (!delayed_sent) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen int saved_errno = errno;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen unsigned char signo_byte = signo;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (write(sig_pipe_fd[1], &signo_byte, 1) != 1)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen i_error("write(sigpipe) failed: %m");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen delayed_sent = TRUE;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen errno = saved_errno;
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
2200adee458ca662d32b5ec0e01d8c5cba0cc0a8Timo Sirainenstatic void sig_ignore(int signo __attr_unused__)
b215322367dbd94df3e2e4bb643b53460e6adc51Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* if we used SIG_IGN instead of this function,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen the system call might be restarted */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenstatic void signal_read(void *context __attr_unused__)
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen unsigned char signal_buf[512];
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen unsigned char signal_mask[MAX_SIGNAL_VALUE+1];
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen ssize_t i, ret;
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen int signo;
57e1fdc2f8f2bf1c6fcd9523f93459404c2359c8Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen ret = read(sig_pipe_fd[0], signal_buf, sizeof(signal_buf));
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (ret > 0) {
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen memset(signal_mask, 0, sizeof(signal_mask));
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* move them to mask first to avoid calling same handler
35ef661bd85c64834e3e34eeeb3c393b81108760Timo Sirainen multiple times */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen for (i = 0; i < ret; i++) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen signo = signal_buf[i];
35ef661bd85c64834e3e34eeeb3c393b81108760Timo Sirainen if (signo > MAX_SIGNAL_VALUE) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen i_panic("sigpipe contains signal %d > %d",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen signo, MAX_SIGNAL_VALUE);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen signal_mask[signo] = 1;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* call the delayed handlers */
c39c3d8089fbdd8eb34646c25167aa4551064cf4Timo Sirainen for (signo = 0; signo < MAX_SIGNAL_VALUE; signo++) {
c39c3d8089fbdd8eb34646c25167aa4551064cf4Timo Sirainen if (signal_mask[signo] > 0) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen struct signal_handler *h =
bd63b5b860658b01b1f46f26d406e1e4a9dc019aTimo Sirainen signal_handlers[signo];
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen for (; h != NULL; h = h->next) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (h->delayed)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen h->handler(signo, h->context);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen } else if (ret < 0) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (errno != EAGAIN)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen i_fatal("read(sigpipe) failed: %m");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen } else {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen i_fatal("read(sigpipe) failed: EOF");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenvoid lib_signals_set_handler(int signo, bool delayed,
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen signal_handler_t *handler, void *context)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen struct signal_handler *h;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (signo < 0 || signo > MAX_SIGNAL_VALUE) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen i_panic("Trying to set signal %d handler, but max is %d",
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen signo, MAX_SIGNAL_VALUE);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (signal_handlers[signo] == NULL) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* first handler for this signal */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen struct sigaction act;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (sigemptyset(&act.sa_mask) < 0)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen i_fatal("sigemptyset(): %m");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen act.sa_flags = 0;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen act.sa_handler = handler != NULL ? sig_handler : sig_ignore;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (sigaction(signo, &act, NULL) < 0)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen i_fatal("sigaction(%d): %m", signo);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (handler == NULL) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen /* we're ignoring the handler, just return */
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen return;
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen }
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen }
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen i_assert(handler != NULL);
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen if (delayed && sig_pipe_fd[0] == -1) {
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen /* first delayed handler */
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen if (pipe(sig_pipe_fd) < 0)
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen i_fatal("pipe() failed: %m");
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen fd_close_on_exec(sig_pipe_fd[0], TRUE);
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen fd_close_on_exec(sig_pipe_fd[1], TRUE);
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen io_sig = io_add(sig_pipe_fd[0], IO_READ, signal_read, NULL);
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen }
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen h = i_new(struct signal_handler, 1);
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen h->handler = handler;
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen h->context = context;
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen h->delayed = delayed;
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen /* atomically set to signal_handlers[] list */
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen h->next = signal_handlers[signo];
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen signal_handlers[signo] = h;
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen}
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainenvoid lib_signals_ignore(int signo)
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen{
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen struct sigaction act;
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen if (signo < 0 || signo > MAX_SIGNAL_VALUE) {
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen i_panic("Trying to ignore signal %d, but max is %d",
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen signo, MAX_SIGNAL_VALUE);
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen }
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen i_assert(signal_handlers[signo] == NULL);
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen if (sigemptyset(&act.sa_mask) < 0)
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen i_fatal("sigemptyset(): %m");
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen act.sa_flags = SA_RESTART;
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen act.sa_handler = SIG_IGN;
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen if (sigaction(signo, &act, NULL) < 0)
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen i_fatal("sigaction(%d): %m", signo);
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen}
5fa253bd316540ec280ca76b39d62a9e32da228bTimo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainenvoid lib_signals_unset_handler(int signo, signal_handler_t *handler,
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen void *context)
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen{
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen struct signal_handler *h, **p;
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen for (p = &signal_handlers[signo]; *p != NULL; p = &(*p)->next) {
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen if ((*p)->handler == handler && (*p)->context == context) {
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen h = *p;
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen *p = h->next;
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen i_free(h);
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen return;
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen i_panic("lib_signals_unset_handler(%d, %p, %p): handler not found",
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen signo, (void *)handler, context);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainenvoid lib_signals_init(void)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen{
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen sig_pipe_fd[0] = sig_pipe_fd[1] = -1;
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen io_sig = NULL;
b10c3f9ed997748fdbb03b9daadc8c31eed02120Timo Sirainen
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen memset(signal_handlers, 0, sizeof(signal_handlers));
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainenvoid lib_signals_deinit(void)
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen{
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen struct signal_handler *handlers, *h;
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen int i;
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen for (i = 0; i < MAX_SIGNAL_VALUE; i++) {
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen if (signal_handlers[i] != NULL) {
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen /* atomically remove from signal_handlers[] list */
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen handlers = signal_handlers[i];
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen signal_handlers[i] = NULL;
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen while (handlers != NULL) {
30f6ac0eaf2be81072ee078ba5b232c368b89ff1Timo Sirainen h = handlers;
30f6ac0eaf2be81072ee078ba5b232c368b89ff1Timo Sirainen handlers = h->next;
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen i_free(h);
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen }
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen }
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen }
8c3872c26b18421d62c52cbfe0b81b1d79239f89Timo Sirainen
2f19f8ff906a0017b906763e0f7675d49ab0e58fTimo Sirainen if (io_sig != NULL)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen io_remove(&io_sig);
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (sig_pipe_fd[0] != -1) {
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen if (close(sig_pipe_fd[0]) < 0)
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen i_error("close(sigpipe) failed: %m");
e18e90938ffd9e31c796c405404be0b7dcd5c807Timo Sirainen if (close(sig_pipe_fd[1]) < 0)
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen i_error("close(sigpipe) failed: %m");
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen }
c8593b070319d0ff83f8d6c4b5ed5abf2d578a06Timo Sirainen}
31fd39a3a3d544b1a8afb9aef07f180d0d40fda2Timo Sirainen