示例#1
0
文件: main.c 项目: mdlh/kmscon
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;
}
示例#2
0
文件: uvt_ctx.c 项目: nachokb/kmscon
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;
}
示例#3
0
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;
}