exit(EXIT_FAILURE);
}
-/*
- * just write one integer to signal pipe
- */
+/* Write the signal number to the signal pipe, abort on errors. */
static void generic_signal_handler(int s)
{
- write(signal_pipe[1], &s, sizeof(int));
+ /*
+ * Signal handlers that make system calls must save a copy of errno on
+ * entry to the handler and restore it on exit, to prevent the
+ * possibility of overwriting a errno value that had previously been
+ * set in the main program.
+ */
+ int save_errno = errno;
+ ssize_t ret = write(signal_pipe[1], &s, sizeof(int));
+
+ if (ret == sizeof(int)) {
+ errno = save_errno;
+ return;
+ }
+ if (ret < 0)
+ DSS_EMERG_LOG(("%s\n", strerror(errno)));
+ else
+ DSS_EMERG_LOG(("short write to signal pipe\n"));
+ exit(EXIT_FAILURE);
}
/**