static int setup_app(struct kmscon_app *app) { int ret; ret = ev_eloop_new(&app->eloop); if (ret) goto err_app; ret = ev_eloop_register_signal_cb(app->eloop, SIGTERM, sig_generic, app); if (ret) goto err_app; ret = ev_eloop_register_signal_cb(app->eloop, SIGINT, sig_generic, app); if (ret) goto err_app; ret = ev_eloop_new_eloop(app->eloop, &app->vt_eloop); if (ret) goto err_app; ret = kmscon_vt_new(&app->vt, vt_switch, app); if (ret) goto err_app; ret = uterm_video_new(&app->video, app->eloop, UTERM_VIDEO_DRM, "/dev/dri/card0"); if (ret) goto err_app; ret = uterm_video_use(app->video); if (ret) goto err_app; ret = kmscon_input_new(&app->input); if (ret) goto err_app; ret = kmscon_input_connect_eloop(app->input, app->eloop); if (ret) goto err_app; ret = kmscon_vt_open(app->vt, KMSCON_VT_NEW, app->vt_eloop); if (ret) goto err_app; ret = kmscon_ui_new(&app->ui, app->eloop, app->video, app->input); if (ret) goto err_app; return 0; err_app: destroy_app(app); return ret; }
SHL_EXPORT int uvt_ctx_new(struct uvt_ctx **out, uvt_log_t log, void *log_data) { struct uvt_ctx *ctx; int ret; if (!out) return llog_dEINVAL(log, log_data); ctx = malloc(sizeof(*ctx)); if (!ctx) return llog_dENOMEM(log, log_data); memset(ctx, 0, sizeof(*ctx)); ctx->ref = 1; ctx->llog = log; ctx->llog_data = log_data; /* Default major/minor uses the TTY_MAJOR number with an offset of 2^15 * to avoid ID-clashes with any in-kernel TTY driver. As kernel drivers * use static IDs only, a lower number would be fine, too, but lets be * safe and just use high numbers. */ ctx->major = TTY_MAJOR; ctx->minor_offset = 16384; llog_debug(ctx, "new ctx %p", ctx); ret = ev_eloop_new(&ctx->eloop, ctx->llog, ctx->llog_data); if (ret) goto err_free; ctx->cuse_file = strdup("/dev/cuse"); if (!ctx->cuse_file) { ret = llog_ENOMEM(ctx); goto err_eloop; } ret = shl_flagset_new(&ctx->minors); if (ret) goto err_file; *out = ctx; return 0; err_file: free(ctx->cuse_file); err_eloop: ev_eloop_unref(ctx->eloop); err_free: free(ctx); return ret; }
static int setup_app(struct uvtd_app *app) { int ret, fd; shl_dlist_init(&app->seats); ret = ev_eloop_new(&app->eloop, log_llog, NULL); if (ret) { log_error("cannot create eloop object: %d", ret); goto err_app; } ret = ev_eloop_register_signal_cb(app->eloop, SIGTERM, app_sig_generic, app); if (ret) { log_error("cannot register SIGTERM signal handler: %d", ret); goto err_app; } ret = ev_eloop_register_signal_cb(app->eloop, SIGINT, app_sig_generic, app); if (ret) { log_error("cannot register SIGINT signal handler: %d", ret); goto err_app; } ret = ev_eloop_register_signal_cb(app->eloop, SIGPIPE, app_sig_ignore, app); if (ret) { log_error("cannot register SIGPIPE signal handler: %d", ret); goto err_app; } ret = uterm_monitor_new(&app->mon, app->eloop, app_monitor_event, app); if (ret) { log_error("cannot create device monitor: %d", ret); goto err_app; } ret = uvt_ctx_new(&app->ctx, log_llog, NULL); if (ret) { log_error("cannot create UVT context: %d", ret); goto err_app; } fd = uvt_ctx_get_fd(app->ctx); if (fd >= 0) { ret = ev_eloop_new_fd(app->eloop, &app->ctx_fd, fd, EV_READABLE, app_ctx_event, app); if (ret) { log_error("cannot create UVT ctx efd: %d", ret); goto err_app; } } log_debug("scanning for devices..."); uterm_monitor_scan(app->mon); return 0; err_app: destroy_app(app); return ret; }