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; }