static gboolean
start_process_launcher (GIOChannel *read_channel, GIOChannel *write_channel,
                        gboolean daemon)
{
    gboolean success = TRUE;
    MilterManagerProcessLauncher *launcher;
    MilterReader *reader;
    MilterWriter *writer;
    gchar *error_message = NULL;
    MilterSyslogLogger *logger;
    MilterEventLoop *loop;
    GError *error = NULL;

    logger = milter_syslog_logger_new("milter-manager-process-launcher",
                                      NULL);

    reader = milter_reader_io_channel_new(read_channel);
    g_io_channel_unref(read_channel);

    writer = milter_writer_io_channel_new(write_channel);

    launcher = milter_manager_process_launcher_new();
    milter_agent_set_reader(MILTER_AGENT(launcher), reader);
    milter_agent_set_writer(MILTER_AGENT(launcher), writer);
    g_object_unref(reader);
    g_object_unref(writer);

    loop = milter_glib_event_loop_new(NULL);
    milter_agent_set_event_loop(MILTER_AGENT(launcher), loop);
    g_object_unref(loop);

    if (!milter_agent_start(MILTER_AGENT(launcher), &error)) {
        milter_error("[process-launcher][error][start] %s",
                     error->message);
        g_error_free(error);
        success = FALSE;
    }

    if (success && daemon && !milter_utils_detach_io(&error_message)) {
        milter_error("[process-launcher][error] failed to detach IO: %s",
                     error_message);
        g_free(error_message);
        success = FALSE;
    }

    if (success) {
        g_signal_connect(launcher, "finished",
                         G_CALLBACK(cb_launcher_finished), NULL);
        milter_manager_process_launcher_run(launcher);
    }

    g_object_unref(launcher);

    g_object_unref(logger);

    return success;
}
static VALUE
glib_initialize (int argc, VALUE *argv, VALUE self)
{
    VALUE main_context;
    MilterEventLoop *event_loop;

    rb_scan_args(argc, argv, "01", &main_context);

    event_loop = milter_glib_event_loop_new(RVAL2GOBJ(main_context));
    G_INITIALIZE(self, event_loop);
    rb_milter_event_loop_setup(event_loop);

    return Qnil;
}