From e98affdaa8c0588ad31338bbadca4d5544c38e35 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Sat, 23 Dec 2017 12:19:51 +0100 Subject: [PATCH] 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 --- src/lxc/conf.c | 7 ++---- src/lxc/console.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++ src/lxc/console.h | 6 +++++ 3 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/lxc/conf.c b/src/lxc/conf.c index affc41e16..4cab6e74c 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" @@ -3720,11 +3721,7 @@ void lxc_conf_free(struct lxc_conf *conf) return; if (current_config == conf) current_config = NULL; - free(conf->console.buffer_log_file); - free(conf->console.log_path); - free(conf->console.path); - if (conf->console.buffer_size > 0 && conf->console.ringbuf.addr) - lxc_ringbuf_release(&conf->console.ringbuf); + 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 a650af6db..aceaa4509 100644 --- a/src/lxc/console.c +++ b/src/lxc/console.c @@ -985,3 +985,62 @@ 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; + pty->buffer_log_file_fd = -EBADF; + lxc_pty_info_init(&pty->peerpty); +} + +void lxc_pty_conf_free(struct lxc_console *console) +{ + free(console->buffer_log_file); + free(console->log_path); + free(console->path); + if (console->buffer_size > 0 && console->ringbuf.addr) + lxc_ringbuf_release(&console->ringbuf); +} diff --git a/src/lxc/console.h b/src/lxc/console.h index f358437c3..bd54ed3bb 100644 --- a/src/lxc/console.h +++ b/src/lxc/console.h @@ -232,4 +232,10 @@ extern int lxc_console_create_log_file(struct lxc_console *console); 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 -- 2.47.2