console: adapt lxc_console_mainloop_add()

parent a93bfc5f
...@@ -269,31 +269,25 @@ static int lxc_console_mainloop_add_peer(struct lxc_console *console) ...@@ -269,31 +269,25 @@ static int lxc_console_mainloop_add_peer(struct lxc_console *console)
return 0; return 0;
} }
extern int lxc_console_mainloop_add(struct lxc_epoll_descr *descr, int lxc_console_mainloop_add(struct lxc_epoll_descr *descr,
struct lxc_conf *conf) struct lxc_console *console)
{ {
int ret; int ret;
struct lxc_console *console = &conf->console;
if (!conf->rootfs.path) {
INFO("no rootfs, no console.");
return 0;
}
if (console->master < 0) { if (console->master < 0) {
INFO("no console"); INFO("no console");
return 0; return 0;
} }
if (lxc_mainloop_add_handler(descr, console->master, ret = lxc_mainloop_add_handler(descr, console->master,
lxc_console_cb_con, console)) { lxc_console_cb_con, console);
ERROR("failed to add to mainloop console handler for '%d'", if (ret < 0) {
console->master); ERROR("Failed to add handler for %d to mainloop", console->master);
return -1; return -1;
} }
/* we cache the descr so that we can add an fd to it when someone /* We cache the descr so that we can add an fd to it when someone
* does attach to it in lxc_console_allocate() * does attach to it in lxc_console_allocate().
*/ */
console->descr = descr; console->descr = descr;
ret = lxc_console_mainloop_add_peer(console); ret = lxc_console_mainloop_add_peer(console);
......
...@@ -114,7 +114,7 @@ extern void lxc_console_free(struct lxc_conf *conf, int fd); ...@@ -114,7 +114,7 @@ extern void lxc_console_free(struct lxc_conf *conf, int fd);
/* /*
* Register pty event handlers in an open mainloop * Register pty event handlers in an open mainloop
*/ */
extern int lxc_console_mainloop_add(struct lxc_epoll_descr *, struct lxc_conf *); extern int lxc_console_mainloop_add(struct lxc_epoll_descr *, struct lxc_console *);
/* /*
* Handle SIGWINCH events on the allocated ptys. * Handle SIGWINCH events on the allocated ptys.
......
...@@ -459,6 +459,7 @@ int lxc_set_state(const char *name, struct lxc_handler *handler, ...@@ -459,6 +459,7 @@ int lxc_set_state(const char *name, struct lxc_handler *handler,
int lxc_poll(const char *name, struct lxc_handler *handler) int lxc_poll(const char *name, struct lxc_handler *handler)
{ {
int ret; int ret;
bool has_console = (handler->conf->rootfs.path != NULL);
struct lxc_epoll_descr descr, descr_console; struct lxc_epoll_descr descr, descr_console;
ret = lxc_mainloop_open(&descr); ret = lxc_mainloop_open(&descr);
...@@ -467,10 +468,12 @@ int lxc_poll(const char *name, struct lxc_handler *handler) ...@@ -467,10 +468,12 @@ int lxc_poll(const char *name, struct lxc_handler *handler)
goto out_sigfd; goto out_sigfd;
} }
ret = lxc_mainloop_open(&descr_console); if (has_console) {
if (ret < 0) { ret = lxc_mainloop_open(&descr_console);
ERROR("Failed to create console mainloop"); if (ret < 0) {
goto out_mainloop; ERROR("Failed to create console mainloop");
goto out_mainloop;
}
} }
ret = lxc_mainloop_add_handler(&descr, handler->sigfd, signal_handler, handler); ret = lxc_mainloop_add_handler(&descr, handler->sigfd, signal_handler, handler);
...@@ -479,12 +482,6 @@ int lxc_poll(const char *name, struct lxc_handler *handler) ...@@ -479,12 +482,6 @@ int lxc_poll(const char *name, struct lxc_handler *handler)
goto out_mainloop_console; goto out_mainloop_console;
} }
ret = lxc_console_mainloop_add(&descr, handler->conf);
if (ret < 0) {
ERROR("Failed to add console handlers to mainloop");
goto out_mainloop_console;
}
if (handler->conf->need_utmp_watch) { if (handler->conf->need_utmp_watch) {
#if HAVE_LIBCAP #if HAVE_LIBCAP
if (lxc_utmp_mainloop_add(&descr, handler)) { if (lxc_utmp_mainloop_add(&descr, handler)) {
...@@ -495,12 +492,21 @@ int lxc_poll(const char *name, struct lxc_handler *handler) ...@@ -495,12 +492,21 @@ int lxc_poll(const char *name, struct lxc_handler *handler)
DEBUG("Not starting utmp handler as CAP_SYS_BOOT cannot be dropped without capabilities support."); DEBUG("Not starting utmp handler as CAP_SYS_BOOT cannot be dropped without capabilities support.");
#endif #endif
} }
TRACE("lxc mainloop is ready");
ret = lxc_console_mainloop_add(&descr_console, handler->conf); if (has_console) {
if (ret < 0) { struct lxc_console *console = &handler->conf->console;
ERROR("Failed to add console handlers to console mainloop");
goto out_mainloop_console; ret = lxc_console_mainloop_add(&descr, console);
if (ret < 0) {
ERROR("Failed to add console handlers to mainloop");
goto out_mainloop_console;
}
ret = lxc_console_mainloop_add(&descr_console, console);
if (ret < 0) {
ERROR("Failed to add console handlers to console mainloop");
goto out_mainloop_console;
}
} }
ret = lxc_cmd_mainloop_add(name, &descr, handler); ret = lxc_cmd_mainloop_add(name, &descr, handler);
...@@ -517,15 +523,19 @@ int lxc_poll(const char *name, struct lxc_handler *handler) ...@@ -517,15 +523,19 @@ int lxc_poll(const char *name, struct lxc_handler *handler)
if (ret < 0 || !handler->init_died) if (ret < 0 || !handler->init_died)
goto out_mainloop; goto out_mainloop;
ret = lxc_mainloop(&descr_console, 0); if (has_console)
ret = lxc_mainloop(&descr_console, 0);
out_mainloop: out_mainloop:
lxc_mainloop_close(&descr); lxc_mainloop_close(&descr);
TRACE("Closed mainloop"); TRACE("Closed mainloop");
out_mainloop_console: out_mainloop_console:
lxc_mainloop_close(&descr_console); if (has_console) {
TRACE("Closed console mainloop"); lxc_mainloop_close(&descr_console);
TRACE("Closed console mainloop");
}
out_sigfd: out_sigfd:
close(handler->sigfd); close(handler->sigfd);
......
...@@ -356,7 +356,7 @@ static int get_pty_on_host(struct lxc_container *c, struct wrapargs *wrap, int * ...@@ -356,7 +356,7 @@ static int get_pty_on_host(struct lxc_container *c, struct wrapargs *wrap, int *
goto err2; goto err2;
} }
if (lxc_console_mainloop_add(&descr, conf) < 0) { if (lxc_console_mainloop_add(&descr, &conf->console) < 0) {
fprintf(stderr, "Failed to add handlers to lxc mainloop.\n"); fprintf(stderr, "Failed to add handlers to lxc mainloop.\n");
goto err3; goto err3;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment