static struct sol_mainloop_source * event_create_source(sd_event *event) { struct sol_mainloop_source *source; struct source_ctx *ctx; ctx = malloc(sizeof(*ctx)); SOL_NULL_CHECK(ctx, NULL); ctx->event = sd_event_ref(event); ctx->fd_handler = sol_fd_add(sd_event_get_fd(event), SOL_FD_FLAGS_IN | SOL_FD_FLAGS_HUP | SOL_FD_FLAGS_ERR, on_sd_event_fd, ctx); SOL_NULL_CHECK_GOTO(ctx->fd_handler, error_fd); source = sol_mainloop_source_add(&source_type, ctx); SOL_NULL_CHECK_GOTO(source, error_source); return source; error_source: sol_fd_del(ctx->fd_handler); error_fd: sd_event_unref(ctx->event); free(ctx); return NULL; }
GSource *g_sd_event_create_source(sd_event *event) { SDEventSource *source; source = (SDEventSource *)g_source_new(&event_funcs, sizeof(SDEventSource)); source->event = sd_event_ref(event); source->pollfd.fd = sd_event_get_fd(event); source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR; g_source_add_poll((GSource *)source, &source->pollfd); return (GSource *)source; }