static void start_output (CockpitPipe *self) { g_assert (self->priv->out_source == NULL); self->priv->out_source = cockpit_unix_fd_source_new (self->priv->out_fd, G_IO_OUT); g_source_set_name (self->priv->out_source, "pipe-output"); g_source_set_callback (self->priv->out_source, (GSourceFunc)dispatch_output, self, NULL); g_source_attach (self->priv->out_source, self->priv->context); }
guint cockpit_unix_fd_add_full (gint priority, gint fd, GIOCondition condition, GUnixFDSourceFunc function, gpointer user_data, GDestroyNotify notify) { GSource *source; guint ret; source = cockpit_unix_fd_source_new (fd, condition); g_source_set_priority (source, priority); g_source_set_callback (source, (GSourceFunc)function, user_data, notify); ret = g_source_attach (source, NULL); g_source_unref (source); return ret; }
static void cockpit_pipe_constructed (GObject *object) { CockpitPipe *self = COCKPIT_PIPE (object); GError *error = NULL; G_OBJECT_CLASS (cockpit_pipe_parent_class)->constructed (object); if (self->priv->in_fd >= 0) { if (!g_unix_set_fd_nonblocking (self->priv->in_fd, TRUE, &error)) { g_warning ("%s: couldn't set file descriptor to non-blocking: %s", self->priv->name, error->message); g_clear_error (&error); } self->priv->in_source = cockpit_unix_fd_source_new (self->priv->in_fd, G_IO_IN); g_source_set_name (self->priv->in_source, "pipe-input"); g_source_set_callback (self->priv->in_source, (GSourceFunc)dispatch_input, self, NULL); g_source_attach (self->priv->in_source, self->priv->context); } if (self->priv->out_fd >= 0) { if (!g_unix_set_fd_nonblocking (self->priv->out_fd, TRUE, &error)) { g_warning ("%s: couldn't set file descriptor to non-blocking: %s", self->priv->name, error->message); g_clear_error (&error); } start_output (self); } if (self->priv->err_fd >= 0) { if (!g_unix_set_fd_nonblocking (self->priv->err_fd, TRUE, &error)) { g_warning ("%s: couldn't set file descriptor to non-blocking: %s", self->priv->name, error->message); g_clear_error (&error); } self->priv->err_buffer = g_byte_array_new (); self->priv->err_source = cockpit_unix_fd_source_new (self->priv->err_fd, G_IO_IN); g_source_set_name (self->priv->err_source, "pipe-error"); g_source_set_callback (self->priv->err_source, (GSourceFunc)dispatch_error, self, NULL); g_source_attach (self->priv->err_source, self->priv->context); } if (self->priv->pid) { self->priv->is_process = TRUE; /* We may need this watch to outlast this process ... */ self->priv->watch_arg = g_new0 (CockpitPipe *, 1); *(self->priv->watch_arg) = self; self->priv->child = g_child_watch_source_new (self->priv->pid); g_source_set_callback (self->priv->child, (GSourceFunc)on_child_reap, self->priv->watch_arg, g_free); g_source_attach (self->priv->child, self->priv->context); }