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.
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.
#include "mainloop-signal.h"
#include "util.h"
#include "xmalloc.h"
+#include "log.h"
struct pa_signal_event {
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);
while (signals)
pa_signal_free(signals);
- api->io_free(io_event);
+
+ api->io_free(io_event);
io_event = NULL;
close(signal_pipe[0]);