audioc: Switch to blocking file descriptors.
[paraslash.git] / signal.c
index bded532ed209ab4fa686d1e93147a4cfc4a5bcce..0b4b6f0b847171e3c68311c4075c2d26f017a5b3 100644 (file)
--- a/signal.c
+++ b/signal.c
@@ -151,27 +151,24 @@ void para_install_sighandler(int sig)
 /**
  * Return the number of the next pending signal.
  *
- * This should be called if the fd for the signal pipe is ready for reading.
+ * \param rfds Th fd_set containing the signal pipe.
  *
- * \return On success, the number of the received signal is returned.  If the
- * read returned zero or was interrupted by another signal the function returns
- * 0.  Otherwise, a negative error value is returned.
+ * \return On success, the number of the received signal is returned. If there
+ * is no signal currently pending, the function returns zero. On read errors
+ * from the signal pipe, the process is terminated.
  */
-int para_next_signal(void)
+int para_next_signal(fd_set *rfds)
 {
-       int s;
-       ssize_t r = read(signal_pipe[0], &s, sizeof(s));
+       size_t n;
+       int s, ret = read_nonblock(signal_pipe[0], &s, sizeof(s), rfds, &n);
 
-       if (!r) {
-               PARA_CRIT_LOG("read from signal pipe returned zero\n");
-               return 0;
-       }
-       if (r < 0) {
-               if (errno == EAGAIN || errno == EINTR)
-                       return 0;
-               return -ERRNO_TO_PARA_ERROR(errno);
+       if (ret < 0) {
+               PARA_EMERG_LOG("%s\n", para_strerror(-ret));
+               exit(EXIT_FAILURE);
        }
-       assert(r == sizeof(s));
+       if (n == 0)
+               return 0;
+       assert(n == sizeof(s));
        PARA_DEBUG_LOG("next signal: %d\n", s);
        return s;
 }