From: Christian Brauner Date: Sat, 23 Dec 2017 11:19:51 +0000 (+0100) Subject: console: add some pty helpers X-Git-Tag: lxc-2.0.10~419 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a6324bed6aca47b98e72c370dfb7df748b320e1;p=thirdparty%2Flxc.git console: add some pty helpers - int lxc_make_controlling_pty() - int lxc_login_pty() - void lxc_pty_conf_free() - void lxc_pty_info_init() - void lxc_pty_init() Signed-off-by: Christian Brauner --- diff --git a/src/lxc/conf.c b/src/lxc/conf.c index ddfd84aa2..b90a18f9d 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -73,6 +73,7 @@ #include "cgroup.h" #include "conf.h" #include "confile_utils.h" +#include "console.h" #include "error.h" #include "log.h" #include "lxclock.h" @@ -3489,8 +3490,7 @@ void lxc_conf_free(struct lxc_conf *conf) return; if (current_config == conf) current_config = NULL; - free(conf->console.log_path); - free(conf->console.path); + lxc_pty_conf_free(&conf->console); free(conf->rootfs.mount); free(conf->rootfs.bdev_type); free(conf->rootfs.options); diff --git a/src/lxc/console.c b/src/lxc/console.c index 24d191adf..81e1f37e0 100644 --- a/src/lxc/console.c +++ b/src/lxc/console.c @@ -861,3 +861,58 @@ close_fds: return ret; } + +int lxc_make_controlling_pty(int fd) +{ + int ret; + + setsid(); + + ret = ioctl(fd, TIOCSCTTY, (char *)NULL); + if (ret < 0) + return -1; + + return 0; +} + +int lxc_login_pty(int fd) +{ + int ret; + + ret = lxc_make_controlling_pty(fd); + if (ret < 0) + return -1; + + ret = lxc_console_set_stdfds(fd); + if (ret < 0) + return -1; + + if (fd > STDERR_FILENO) + close(fd); + + return 0; +} + +void lxc_pty_info_init(struct lxc_pty_info *pty) +{ + pty->name[0] = '\0'; + pty->master = -EBADF; + pty->slave = -EBADF; + pty->busy = -1; +} + +void lxc_pty_init(struct lxc_console *pty) +{ + memset(pty, 0, sizeof(*pty)); + pty->slave = -EBADF; + pty->master = -EBADF; + pty->peer = -EBADF; + pty->log_fd = -EBADF; + lxc_pty_info_init(&pty->peerpty); +} + +void lxc_pty_conf_free(struct lxc_console *console) +{ + free(console->log_path); + free(console->path); +} diff --git a/src/lxc/console.h b/src/lxc/console.h index 779d1cac5..dcdf364c4 100644 --- a/src/lxc/console.h +++ b/src/lxc/console.h @@ -230,4 +230,10 @@ extern void lxc_console_signal_fini(struct lxc_tty_state *ts); extern int lxc_console_cb_con(int fd, uint32_t events, void *data, struct lxc_epoll_descr *descr); +extern int lxc_make_controlling_pty(int fd); +extern int lxc_login_pty(int fd); +extern void lxc_pty_conf_free(struct lxc_console *console); +extern void lxc_pty_info_init(struct lxc_pty_info *pty); +extern void lxc_pty_init(struct lxc_console *pty); + #endif diff --git a/src/lxc/start.c b/src/lxc/start.c index 3049d8c0f..474a20e71 100644 --- a/src/lxc/start.c +++ b/src/lxc/start.c @@ -665,6 +665,7 @@ on_error: int lxc_init(const char *name, struct lxc_handler *handler) { + int ret; const char *loglevel; struct lxc_conf *conf = handler->conf;