]> code.delx.au - pulseaudio/blobdiff - polyp/mainloop-signal.c
Make the whole stuff LGPL only
[pulseaudio] / polyp / mainloop-signal.c
index f7ff7e93be257dde000e249bb6fe43091946dec3..89f195ed328103680991969d27e8af924cd4e15b 100644 (file)
@@ -4,7 +4,7 @@
   This file is part of polypaudio.
  
   polypaudio is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published
+  it under the terms of the GNU Lesser General Public License as published
   by the Free Software Foundation; either version 2 of the License,
   or (at your option) any later version.
  
@@ -13,7 +13,7 @@
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   General Public License for more details.
  
-  You should have received a copy of the GNU General Public License
+  You should have received a copy of the GNU Lesser General Public License
   along with polypaudio; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
   USA.
@@ -34,6 +34,7 @@
 #include "mainloop-signal.h"
 #include "util.h"
 #include "xmalloc.h"
+#include "log.h"
 
 struct pa_signal_event {
     int sig;
@@ -54,45 +55,45 @@ static void signal_handler(int sig) {
 }
 
 static void callback(struct pa_mainloop_api*a, struct pa_io_event*e, int fd, enum pa_io_event_flags f, void *userdata) {
+    ssize_t r;
+    int sig;
+    struct pa_signal_event*s;
     assert(a && e && f == PA_IO_EVENT_INPUT && e == io_event && fd == signal_pipe[0]);
 
-    for (;;) {
-        ssize_t r;
-        int sig;
-        struct pa_signal_event*s;
         
-        if ((r = read(signal_pipe[0], &sig, sizeof(sig))) < 0) {
-            if (errno == EAGAIN)
-                return;
-
-            fprintf(stderr, "signal.c: read(): %s\n", strerror(errno));
-            return;
-        }
-
-        if (r != sizeof(sig)) {
-            fprintf(stderr, "signal.c: short read()\n");
+    if ((r = read(signal_pipe[0], &sig, sizeof(sig))) < 0) {
+        if (errno == EAGAIN)
             return;
-        }
 
-        for (s = signals; s; s = s->next) 
-            if (s->sig == sig) {
-                assert(s->callback);
-                s->callback(a, s, sig, s->userdata);
-                break;
-            }
+        pa_log(__FILE__": read(): %s\n", strerror(errno));
+        return;
     }
+    
+    if (r != sizeof(sig)) {
+        pa_log(__FILE__": short read()\n");
+        return;
+    }
+    
+    for (s = signals; s; s = s->next) 
+        if (s->sig == sig) {
+            assert(s->callback);
+            s->callback(a, s, sig, s->userdata);
+            break;
+        }
 }
 
 int pa_signal_init(struct pa_mainloop_api *a) {
     assert(!api && a && signal_pipe[0] == -1 && signal_pipe[1] == -1 && !io_event);
     
     if (pipe(signal_pipe) < 0) {
-        fprintf(stderr, "pipe() failed: %s\n", strerror(errno));
+        pa_log(__FILE__": pipe() failed: %s\n", strerror(errno));
         return -1;
     }
 
     pa_make_nonblock_fd(signal_pipe[0]);
     pa_make_nonblock_fd(signal_pipe[1]);
+    pa_fd_set_cloexec(signal_pipe[0], 1);
+    pa_fd_set_cloexec(signal_pipe[1], 1);
 
     api = a;
     io_event = api->io_new(api, signal_pipe[0], PA_IO_EVENT_INPUT, callback, NULL);
@@ -106,7 +107,8 @@ void pa_signal_done(void) {
     while (signals)
         pa_signal_free(signals);
 
-    api->io_free(io_event);
+
+        api->io_free(io_event);
     io_event = NULL;
 
     close(signal_pipe[0]);