int main(int argc, char **argv) { int ret; struct uterm_monitor *mon; size_t onum; onum = sizeof(options) / sizeof(*options); ret = test_prepare(options, onum, argc, argv, &eloop); if (ret) goto err_fail; if (!setlocale(LC_ALL, "")) { log_err("Cannot set locale: %m"); ret = -EFAULT; goto err_exit; } ret = uterm_monitor_new(&mon, eloop, monitor_event, NULL); if (ret) goto err_exit; ret = ev_eloop_register_signal_cb(eloop, SIGQUIT, sig_quit, NULL); if (ret) goto err_mon; system("stty -echo"); uterm_monitor_scan(mon); ev_eloop_run(eloop, -1); system("stty echo"); ev_eloop_unregister_signal_cb(eloop, SIGQUIT, sig_quit, NULL); err_mon: uterm_monitor_unref(mon); err_exit: test_exit(options, onum, eloop); err_fail: if (ret != -ECANCELED) test_fail(ret); return abs(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; }