diff --git a/src/plugin.c b/src/plugin.c
index 64e61ab73d2b1c31ade1bce65fcd8c5cf3664083..dcca7b817d4a345a3d181a6ec5dfca74a83023a6 100644 (file)
--- a/src/plugin.c
+++ b/src/plugin.c
/* ncmpc (Ncurses MPD Client)
- * (c) 2004-2010 The Music Player Daemon Project
+ * (c) 2004-2017 The Music Player Daemon Project
* Project homepage: http://musicpd.org
*
* This program is free software; you can redistribute it and/or modify
#include <sys/wait.h>
struct plugin_pipe {
+ struct plugin_cycle *cycle;
+
/** the pipe to the plugin process, or -1 if none is currently
open */
int fd;
- /** the GLib channel of #fd */
- GIOChannel *channel;
- /** the GLib IO watch of #channel */
+ /** the GLib IO watch of #fd */
guint event_id;
/** the output of the current plugin */
GString *data;
static void
plugin_eof(struct plugin_cycle *cycle, struct plugin_pipe *p)
{
- g_io_channel_unref(p->channel);
close(p->fd);
p->fd = -1;
plugin_data(gcc_unused GIOChannel *source,
gcc_unused GIOCondition condition, gpointer data)
{
- struct plugin_cycle *cycle = data;
+ struct plugin_pipe *p = data;
+ assert(p->fd >= 0);
+
+ struct plugin_cycle *cycle = p->cycle;
assert(cycle != NULL);
assert(cycle->pid > 0);
- struct plugin_pipe *p = NULL;
- if (source == cycle->pipe_stdout.channel)
- p = &cycle->pipe_stdout;
- else if (source == cycle->pipe_stderr.channel)
- p = &cycle->pipe_stderr;
- assert(p != NULL);
- assert(p->fd >= 0);
-
char buffer[256];
ssize_t nbytes = condition & G_IO_IN
? read(p->fd, buffer, sizeof(buffer))
static void
plugin_fd_add(struct plugin_cycle *cycle, struct plugin_pipe *p, int fd)
{
+ p->cycle = cycle;
p->fd = fd;
p->data = g_string_new(NULL);
- p->channel = g_io_channel_unix_new(fd);
- p->event_id = g_io_add_watch(p->channel, G_IO_IN|G_IO_HUP,
+ GIOChannel *channel = g_io_channel_unix_new(fd);
+ p->event_id = g_io_add_watch(channel, G_IO_IN|G_IO_HUP,
plugin_data, cycle);
+ g_io_channel_unref(channel);
}
static int
if (cycle->next_plugin >= cycle->list->plugins->len) {
/* no plugins left */
- g_timeout_add(0, plugin_delayed_fail, cycle);
+ g_idle_add(plugin_delayed_fail, cycle);
return;
}
cycle->next_plugin++);
if (start_plugin(cycle, plugin_path) < 0) {
/* system error */
- g_timeout_add(0, plugin_delayed_fail, cycle);
+ g_idle_add(plugin_delayed_fail, cycle);
return;
}
}
{
if (p->fd >= 0) {
g_source_remove(p->event_id);
- g_io_channel_unref(p->channel);
close(p->fd);
}
}