From db609dffdeef7f7634f72b3e81f542f5ea760583 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Sat, 23 Dec 2017 11:59:36 +0100 Subject: [PATCH] console: move pty creation to separate function Signed-off-by: Christian Brauner --- src/lxc/console.c | 69 ++++++++++++++++++++++++++++++++++------------- src/lxc/console.h | 6 +++++ 2 files changed, 56 insertions(+), 19 deletions(-) diff --git a/src/lxc/console.c b/src/lxc/console.c index bf9b8b719..24d191adf 100644 --- a/src/lxc/console.c +++ b/src/lxc/console.c @@ -576,24 +576,32 @@ void lxc_console_delete(struct lxc_console *console) console->log_fd = -1; } -int lxc_console_create(struct lxc_conf *conf) +/** + * This is the console log file. Please note that the console log file is + * (implementation wise not content wise) independent of the console ringbuffer. + */ +int lxc_console_create_log_file(struct lxc_console *console) { - int ret, saved_errno; - struct lxc_console *console = &conf->console; - - if (!conf->rootfs.path) { - INFO("Container does not have a rootfs. The console will be " - "shared with the host"); + if (!console->log_path) return 0; - } - if (console->path && !strcmp(console->path, "none")) { - INFO("No console was requested"); - return 0; + console->log_fd = lxc_unpriv(open(console->log_path, O_CLOEXEC | O_RDWR | O_CREAT | O_APPEND, 0600)); + if (console->log_fd < 0) { + SYSERROR("Failed to open console log file \"%s\"", console->log_path); + return -1; } + DEBUG("Using \"%s\" as console log file", console->log_path); + return 0; +} + +int lxc_pty_create(struct lxc_console *console) +{ + int ret, saved_errno; + process_lock(); - ret = openpty(&console->master, &console->slave, console->name, NULL, NULL); + ret = openpty(&console->master, &console->slave, console->name, NULL, + NULL); saved_errno = errno; process_unlock(); if (ret < 0) { @@ -619,15 +627,38 @@ int lxc_console_create(struct lxc_conf *conf) goto err; } - if (console->log_path) { - console->log_fd = lxc_unpriv(open(console->log_path, O_CLOEXEC | O_RDWR | O_CREAT | O_APPEND, 0600)); - if (console->log_fd < 0) { - SYSERROR("Failed to open console log file \"%s\"", console->log_path); - goto err; - } - DEBUG("Using \"%s\" as console log file", console->log_path); + return 0; + +err: + lxc_console_delete(console); + return -ENODEV; +} + +int lxc_console_create(struct lxc_conf *conf) +{ + int ret; + struct lxc_console *console = &conf->console; + + if (!conf->rootfs.path) { + INFO("Container does not have a rootfs. The console will be " + "shared with the host"); + return 0; } + if (console->path && !strcmp(console->path, "none")) { + INFO("No console was requested"); + return 0; + } + + ret = lxc_pty_create(console); + if (ret < 0) + return -1; + + /* create console log file */ + ret = lxc_console_create_log_file(console); + if (ret < 0) + goto err; + return 0; err: diff --git a/src/lxc/console.h b/src/lxc/console.h index 290ede639..779d1cac5 100644 --- a/src/lxc/console.h +++ b/src/lxc/console.h @@ -82,6 +82,12 @@ extern int lxc_console_allocate(struct lxc_conf *conf, int sockfd, int *ttynum) * automatically chowned to the uid/gid of the unprivileged user. For this * ttys_shift_ids() can be called.) */ +extern int lxc_pty_create(struct lxc_console *console); + +/** + * lxc_console_create: Create a new pty. + * - In addition to lxc_pty_create() also sets up all pty logs. + */ extern int lxc_console_create(struct lxc_conf *); /* -- 2.47.2