The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/2196
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Signed-off-by: Christian Brauner <[email protected]>
From 49379222b503ade3a22fe65add7dee3fef4f8129 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 11:50:12 +0100 Subject: [PATCH 01/25] mainloop: add LXC_MAINLOOP_ERROR Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/mainloop.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lxc/mainloop.h b/src/lxc/mainloop.h index ea53a012c..44f76a443 100644 --- a/src/lxc/mainloop.h +++ b/src/lxc/mainloop.h @@ -27,6 +27,7 @@ #include <stdint.h> #include "list.h" +#define LXC_MAINLOOP_ERROR -1 #define LXC_MAINLOOP_CONTINUE 0 #define LXC_MAINLOOP_CLOSE 1 From 2e943b7b469770be541ecabcdc0df922c20e6f3b Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 11:50:38 +0100 Subject: [PATCH 02/25] terminal: lxc_terminal_signalfd_cb() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 4bc7d8575..be46f0b73 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -117,7 +117,7 @@ int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata, ret = read(fd, &siginfo, sizeof(siginfo)); if (ret < 0 || (size_t)ret < sizeof(siginfo)) { ERROR("Failed to read signal info"); - return -1; + return LXC_MAINLOOP_ERROR; } if (siginfo.ssi_signo == SIGTERM) { @@ -128,7 +128,7 @@ int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata, if (siginfo.ssi_signo == SIGWINCH) lxc_terminal_winch(ts); - return 0; + return LXC_MAINLOOP_CONTINUE; } struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd) From e62912bdbc8b4bc8cd3bc5719c627480ff3a84a8 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 11:51:04 +0100 Subject: [PATCH 03/25] terminal: non-functional changes Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index be46f0b73..0d782d804 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -23,15 +23,14 @@ #include <errno.h> #include <fcntl.h> +#include <lxc/lxccontainer.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> -#include <termios.h> -#include <unistd.h> #include <sys/epoll.h> #include <sys/types.h> - -#include <lxc/lxccontainer.h> +#include <termios.h> +#include <unistd.h> #include "af_unix.h" #include "caps.h" @@ -41,7 +40,7 @@ #include "log.h" #include "lxclock.h" #include "mainloop.h" -#include "start.h" /* for struct lxc_handler */ +#include "start.h" #include "terminal.h" #include "utils.h" From b6d5de95f966064c0e9e29e4ff1470833abc76ae Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 11:51:21 +0100 Subject: [PATCH 04/25] terminal: error out when SIGTERM cannot be added This should be an error condition. Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 0d782d804..2100ce29c 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -133,7 +133,7 @@ int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata, struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd) { int ret; - bool istty; + bool istty = false; sigset_t mask; struct lxc_terminal_state *ts; @@ -146,20 +146,31 @@ struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd) ts->masterfd = dstfd; ts->sigfd = -1; - sigemptyset(&mask); + ret = sigemptyset(&mask); + if (ret < 0) { + SYSERROR("Failed to initialize an empty signal set"); + goto on_error; + } - istty = isatty(srcfd) == 1; + istty = (isatty(srcfd) == 1); if (!istty) { INFO("fd %d does not refer to a tty device", srcfd); } else { /* Add tty to list to be scanned at SIGWINCH time. */ lxc_list_add_elem(&ts->node, ts); lxc_list_add_tail(&lxc_ttys, &ts->node); - sigaddset(&mask, SIGWINCH); + ret = sigaddset(&mask, SIGWINCH); + if (ret < 0) + NOTICE("%s - Failed to add SIGWINCH to signal set", + strerror(errno)); } /* Exit the mainloop cleanly on SIGTERM. */ - sigaddset(&mask, SIGTERM); + ret = sigaddset(&mask, SIGTERM); + if (ret < 0) { + SYSERROR("Failed to add SIGWINCH to signal set"); + goto on_error; + } ret = sigprocmask(SIG_BLOCK, &mask, &ts->oldmask); if (ret < 0) { @@ -183,8 +194,10 @@ struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd) close(ts->sigfd); ts->sigfd = -1; } + if (istty) lxc_list_del(&ts->node); + return ts; } From ec98fb30ae6eb7ff24c385e59cb2b2573017e910 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 11:55:36 +0100 Subject: [PATCH 05/25] terminal: lxc_terminal_signal_fini() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 2100ce29c..8f3290fd7 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -206,7 +206,10 @@ void lxc_terminal_signal_fini(struct lxc_terminal_state *ts) if (ts->sigfd >= 0) { close(ts->sigfd); - if (sigprocmask(SIG_SETMASK, &ts->oldmask, NULL) < 0) + int ret; + + ret = sigprocmask(SIG_SETMASK, &ts->oldmask, NULL); + if (ret < 0) WARN("%s - Failed to restore signal mask", strerror(errno)); } From cb48c2fc8e01283a84d456afae0bbffecc74dc7e Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 11:56:55 +0100 Subject: [PATCH 06/25] terminal: lxc_terminal_write_log_file() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 8f3290fd7..cc95857c6 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -258,11 +258,11 @@ static int lxc_terminal_rotate_log_file(struct lxc_terminal *terminal) } static int lxc_terminal_write_log_file(struct lxc_terminal *terminal, char *buf, - int bytes_read) + int bytes_read) { int ret; - int64_t space_left = -1; struct stat st; + int64_t space_left = -1; if (terminal->log_fd < 0) return 0; From c2c3b30dd75f37db1ea22bf6972fb65ea71c37d6 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 11:58:50 +0100 Subject: [PATCH 07/25] terminal: lxc_terminal_io_cb() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index cc95857c6..492ce2c07 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -419,7 +419,7 @@ int lxc_terminal_io_cb(int fd, uint32_t events, void *data, if (w_log < 0) TRACE("Failed to write %d bytes to terminal log", r); - return 0; + return LXC_MAINLOOP_CONTINUE; } static int lxc_terminal_mainloop_add_peer(struct lxc_terminal *terminal) From 3eb6b30c81ee149e5c8cd6050bf3e33d4e2315d3 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:00:14 +0100 Subject: [PATCH 08/25] terminal: lxc_terminal_mainloop_add() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 492ce2c07..cfb8d43bf 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -449,7 +449,7 @@ static int lxc_terminal_mainloop_add_peer(struct lxc_terminal *terminal) } int lxc_terminal_mainloop_add(struct lxc_epoll_descr *descr, - struct lxc_terminal *terminal) + struct lxc_terminal *terminal) { int ret; @@ -461,7 +461,8 @@ int lxc_terminal_mainloop_add(struct lxc_epoll_descr *descr, ret = lxc_mainloop_add_handler(descr, terminal->master, lxc_terminal_io_cb, terminal); if (ret < 0) { - ERROR("Failed to add handler for %d to mainloop", terminal->master); + ERROR("Failed to add handler for terminal master fd %d to " + "mainloop", terminal->master); return -1; } @@ -469,11 +470,8 @@ int lxc_terminal_mainloop_add(struct lxc_epoll_descr *descr, * does attach to it in lxc_terminal_allocate(). */ terminal->descr = descr; - ret = lxc_terminal_mainloop_add_peer(terminal); - if (ret < 0) - return -1; - return 0; + return lxc_terminal_mainloop_add_peer(terminal); } int lxc_setup_tios(int fd, struct termios *oldtios) From 6579c882f79dbed4a68871dd1cf3ae93d28bcaf0 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:02:51 +0100 Subject: [PATCH 09/25] terminal: lxc_setup_tios() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index cfb8d43bf..334ee53af 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -476,16 +476,18 @@ int lxc_terminal_mainloop_add(struct lxc_epoll_descr *descr, int lxc_setup_tios(int fd, struct termios *oldtios) { + int ret; struct termios newtios; if (!isatty(fd)) { - ERROR("'%d' is not a tty", fd); + ERROR("File descriptor %d does not refert to a terminal", fd); return -1; } - /* Get current termios */ - if (tcgetattr(fd, oldtios)) { - SYSERROR("failed to get current terminal settings"); + /* Get current termios. */ + ret = tcgetattr(fd, oldtios); + if (ret < 0) { + SYSERROR("Failed to get current terminal settings"); return -1; } @@ -514,8 +516,9 @@ int lxc_setup_tios(int fd, struct termios *oldtios) newtios.c_cc[VTIME] = 0; /* Set new attributes. */ - if (tcsetattr(fd, TCSAFLUSH, &newtios)) { - ERROR("failed to set new terminal settings"); + ret = tcsetattr(fd, TCSAFLUSH, &newtios); + if (ret < 0) { + ERROR("Failed to set new terminal settings"); return -1; } From ea84dc59067f1813b260ed8edb8935926df6c6e3 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:04:58 +0100 Subject: [PATCH 10/25] terminal: lxc_terminal_peer_proxy_free() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 334ee53af..7cdfd93c5 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -531,12 +531,17 @@ static void lxc_terminal_peer_proxy_free(struct lxc_terminal *terminal) lxc_terminal_signal_fini(terminal->tty_state); terminal->tty_state = NULL; } + close(terminal->proxy.master); - close(terminal->proxy.slave); terminal->proxy.master = -1; + + close(terminal->proxy.slave); terminal->proxy.slave = -1; + terminal->proxy.busy = -1; + terminal->proxy.name[0] = '\0'; + terminal->peer = -1; } From 89947f357217e1c03d47ef9a0e5d3f41468d6ba8 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:11:16 +0100 Subject: [PATCH 11/25] terminal: lxc_terminal_peer_proxy_alloc() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 7cdfd93c5..95f95f571 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -545,53 +545,58 @@ static void lxc_terminal_peer_proxy_free(struct lxc_terminal *terminal) terminal->peer = -1; } -static int lxc_terminal_peer_proxy_alloc(struct lxc_terminal *terminal, int sockfd) +static int lxc_terminal_peer_proxy_alloc(struct lxc_terminal *terminal, + int sockfd) { + int ret; struct termios oldtermio; struct lxc_terminal_state *ts; - int ret; if (terminal->master < 0) { ERROR("Terminal not set up"); return -1; } + if (terminal->proxy.busy != -1 || terminal->peer != -1) { NOTICE("Terminal already in use"); return -1; } + if (terminal->tty_state) { - ERROR("Terminal already has tty_state"); + ERROR("Terminal has already been initialized"); return -1; } - /* this is the proxy pty that will be given to the client, and that - * the real pty master will send to / recv from + /* This is the proxy pty that will be given to the client, and that + * the real pty master will send to / recv from. */ ret = openpty(&terminal->proxy.master, &terminal->proxy.slave, - terminal->proxy.name, NULL, NULL); - if (ret) { - SYSERROR("failed to create proxy pty"); + terminal->proxy.name, NULL, NULL); + if (ret < 0) { + SYSERROR("Failed to open proxy terminal"); return -1; } - if (lxc_setup_tios(terminal->proxy.slave, &oldtermio) < 0) - goto err1; + ret = lxc_setup_tios(terminal->proxy.slave, &oldtermio); + if (ret < 0) + goto on_error; ts = lxc_terminal_signal_init(terminal->proxy.master, terminal->master); if (!ts) - goto err1; + goto on_error; terminal->tty_state = ts; terminal->peer = terminal->proxy.slave; terminal->proxy.busy = sockfd; ret = lxc_terminal_mainloop_add_peer(terminal); if (ret < 0) - goto err1; + goto on_error; - DEBUG("%d peermaster:%d sockfd:%d", lxc_raw_getpid(), terminal->proxy.master, sockfd); + NOTICE("Opened proxy terminal with master fd %d and slave fd %d", + terminal->proxy.master, terminal->proxy.slave); return 0; -err1: +on_error: lxc_terminal_peer_proxy_free(terminal); return -1; } From 645250d18e4562a8fec449301c09c29ee4d060eb Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:12:59 +0100 Subject: [PATCH 12/25] terminal: lxc_terminal_allocate() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 95f95f571..d5df31bc3 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -603,13 +603,18 @@ static int lxc_terminal_peer_proxy_alloc(struct lxc_terminal *terminal, int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttyreq) { - int masterfd = -1, ttynum; + int ttynum; + int masterfd = -1; struct lxc_tty_info *ttys = &conf->ttys; struct lxc_terminal *terminal = &conf->console; if (*ttyreq == 0) { - if (lxc_terminal_peer_proxy_alloc(terminal, sockfd) < 0) + int ret; + + ret = lxc_terminal_peer_proxy_alloc(terminal, sockfd); + if (ret < 0) goto out; + masterfd = terminal->proxy.master; goto out; } @@ -621,16 +626,17 @@ int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttyreq) if (ttys->tty[*ttyreq - 1].busy) goto out; - /* the requested tty is available */ + /* The requested tty is available. */ ttynum = *ttyreq; goto out_tty; } - /* search for next available tty, fixup index tty1 => [0] */ - for (ttynum = 1; ttynum <= ttys->nbtty && ttys->tty[ttynum - 1].busy; ttynum++) + /* Search for next available tty, fixup index tty1 => [0]. */ + for (ttynum = 1; ttynum <= ttys->nbtty && ttys->tty[ttynum - 1].busy; ttynum++) { ; + } - /* we didn't find any available slot for tty */ + /* We didn't find any available slot for tty. */ if (ttynum > ttys->nbtty) goto out; @@ -639,6 +645,7 @@ int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttyreq) out_tty: ttys->tty[ttynum - 1].busy = sockfd; masterfd = ttys->tty[ttynum - 1].master; + out: return masterfd; } From 34aa0bd5615decbf83c12d4c4cc7cd3c27d1c80a Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:14:04 +0100 Subject: [PATCH 13/25] terminal: lxc_terminal_free() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index d5df31bc3..bfdeefa7c 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -656,15 +656,15 @@ void lxc_terminal_free(struct lxc_conf *conf, int fd) struct lxc_tty_info *ttys = &conf->ttys; struct lxc_terminal *terminal = &conf->console; - for (i = 0; i < ttys->nbtty; i++) { + for (i = 0; i < ttys->nbtty; i++) if (ttys->tty[i].busy == fd) ttys->tty[i].busy = 0; - } - if (terminal->proxy.busy == fd) { - lxc_mainloop_del_handler(terminal->descr, terminal->proxy.slave); - lxc_terminal_peer_proxy_free(terminal); - } + if (terminal->proxy.busy != fd) + return; + + lxc_mainloop_del_handler(terminal->descr, terminal->proxy.slave); + lxc_terminal_peer_proxy_free(terminal); } static int lxc_terminal_peer_default(struct lxc_terminal *terminal) From 8e8ee84610dc5cf475a88c436c2b5410acc92219 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:20:02 +0100 Subject: [PATCH 14/25] terminal: lxc_terminal_peer_default() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 54 +++++++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index bfdeefa7c..447700077 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -674,65 +674,69 @@ static int lxc_terminal_peer_default(struct lxc_terminal *terminal) int fd; int ret = 0; - /* If no terminal was given, try current controlling terminal, there - * won't be one if we were started as a daemon (-d). - */ - if (!path && !access("/dev/tty", F_OK)) { - fd = open("/dev/tty", O_RDWR); - if (fd >= 0) { - close(fd); - path = "/dev/tty"; + if (!path) { + ret = access("/dev/tty", F_OK); + if (ret == 0) { + /* If no terminal was given, try current controlling + * terminal, there won't be one if we were started as a + * daemon (-d). + */ + fd = open("/dev/tty", O_RDWR); + if (fd >= 0) { + close(fd); + path = "/dev/tty"; + } } } if (!path) { errno = ENOTTY; - DEBUG("process does not have a controlling terminal"); - goto out; + DEBUG("Theh process does not have a controlling terminal"); + goto on_succes; } terminal->peer = lxc_unpriv(open(path, O_RDWR | O_CLOEXEC)); if (terminal->peer < 0) { - ERROR("Failed to open \"%s\": %s", path, strerror(errno)); + ERROR("%s - Failed to open proxy terminal \"%s\"", + strerror(errno), path); return -ENOTTY; } - DEBUG("using \"%s\" as peer tty device", path); + DEBUG("Using terminal \"%s\" as proxy", path); if (!isatty(terminal->peer)) { - ERROR("file descriptor for file \"%s\" does not refer to a tty device", path); - goto on_error1; + ERROR("File descriptor for \"%s\" does not refer to a terminal", path); + goto on_error_free_tios; } ts = lxc_terminal_signal_init(terminal->peer, terminal->master); terminal->tty_state = ts; if (!ts) { WARN("Failed to install signal handler"); - goto on_error1; + goto on_error_free_tios; } lxc_terminal_winsz(terminal->peer, terminal->master); terminal->tios = malloc(sizeof(*terminal->tios)); - if (!terminal->tios) { - SYSERROR("failed to allocate memory"); - goto on_error1; - } + if (!terminal->tios) + goto on_error_free_tios; - if (lxc_setup_tios(terminal->peer, terminal->tios) < 0) - goto on_error2; + ret = lxc_setup_tios(terminal->peer, terminal->tios); + if (ret < 0) + goto on_error_close_peer; else - goto out; + goto on_succes; -on_error2: +on_error_free_tios: free(terminal->tios); terminal->tios = NULL; -on_error1: +on_error_close_peer: close(terminal->peer); terminal->peer = -1; ret = -ENOTTY; -out: +on_succes: return ret; } From 68eb9e7b913f2e0fc8c37ebf2e77d5433ebd7e18 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:22:23 +0100 Subject: [PATCH 15/25] terminal: lxc_terminal_create() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 447700077..c03508cdb 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -872,13 +872,11 @@ int lxc_terminal_create_log_file(struct lxc_terminal *terminal) int lxc_terminal_create(struct lxc_terminal *terminal) { - int ret, saved_errno; + int ret; - ret = openpty(&terminal->master, &terminal->slave, terminal->name, NULL, - NULL); - saved_errno = errno; + ret = openpty(&terminal->master, &terminal->slave, terminal->name, NULL, NULL); if (ret < 0) { - ERROR("%s - Failed to allocate a pty", strerror(saved_errno)); + SYSERROR("Failed to open terminal"); return -1; } @@ -896,7 +894,7 @@ int lxc_terminal_create(struct lxc_terminal *terminal) ret = lxc_terminal_peer_default(terminal); if (ret < 0) { - ERROR("Failed to allocate a peer pty device"); + ERROR("Failed to allocate proxy terminal"); goto err; } From e78cf05b234a5bfe5dfa0884fd8d710a4e2c2987 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:23:06 +0100 Subject: [PATCH 16/25] terminal: lxc_terminal_setup() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index c03508cdb..08db3e3ff 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -910,8 +910,8 @@ int lxc_terminal_setup(struct lxc_conf *conf) int ret; struct lxc_terminal *terminal = &conf->console; - if (terminal->path && !strcmp(terminal->path, "none")) { - INFO("No terminal was requested"); + if (terminal->path && strcmp(terminal->path, "none") == 0) { + INFO("No terminal requested"); return 0; } @@ -919,12 +919,10 @@ int lxc_terminal_setup(struct lxc_conf *conf) if (ret < 0) return -1; - /* create terminal log file */ ret = lxc_terminal_create_log_file(terminal); if (ret < 0) goto err; - /* create terminal ringbuffer */ ret = lxc_terminal_create_ringbuf(terminal); if (ret < 0) goto err; From 012df71931bf924f6324e924df9bc16bfc9fbfba Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:40:43 +0100 Subject: [PATCH 17/25] terminal: lxc_terminal_set_stdfds() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 08db3e3ff..535573329 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -934,28 +934,33 @@ int lxc_terminal_setup(struct lxc_conf *conf) return -ENODEV; } +static bool __terminal_dup2(int duplicate, int original) +{ + int ret; + + if (!isatty(original)) + return true; + + ret = dup2(duplicate, original); + if (ret < 0) { + SYSERROR("Failed to dup2(%d, %d)", duplicate, original); + return false; + } + + return true; +} + int lxc_terminal_set_stdfds(int fd) { + int i; + if (fd < 0) return 0; - if (isatty(STDIN_FILENO)) - if (dup2(fd, STDIN_FILENO) < 0) { - SYSERROR("failed to duplicate stdin."); - return -1; - } - - if (isatty(STDOUT_FILENO)) - if (dup2(fd, STDOUT_FILENO) < 0) { - SYSERROR("failed to duplicate stdout."); + for (i = 0; i < 3; i++) + if (!__terminal_dup2(fd, (int[]){STDIN_FILENO, STDOUT_FILENO, + STDERR_FILENO}[i])) return -1; - } - - if (isatty(STDERR_FILENO)) - if (dup2(fd, STDERR_FILENO) < 0) { - SYSERROR("failed to duplicate stderr."); - return -1; - } return 0; } From f9e4d4639c44ce0710b66576c1e0419a04c1854b Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:42:31 +0100 Subject: [PATCH 18/25] terminal: lxc_terminal_stdin_cb() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 535573329..724e78e2c 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -966,22 +966,24 @@ int lxc_terminal_set_stdfds(int fd) } int lxc_terminal_stdin_cb(int fd, uint32_t events, void *cbdata, - struct lxc_epoll_descr *descr) + struct lxc_epoll_descr *descr) { - struct lxc_terminal_state *ts = cbdata; + int ret; char c; + struct lxc_terminal_state *ts = cbdata; if (fd != ts->stdinfd) return LXC_MAINLOOP_CLOSE; - if (lxc_read_nointr(ts->stdinfd, &c, 1) <= 0) + ret = lxc_read_nointr(ts->stdinfd, &c, 1); + if (ret <= 0) return LXC_MAINLOOP_CLOSE; if (ts->escape >= 1) { /* we want to exit the terminal with Ctrl+a q */ if (c == ts->escape && !ts->saw_escape) { ts->saw_escape = 1; - return 0; + return LXC_MAINLOOP_CONTINUE; } if (c == 'q' && ts->saw_escape) @@ -990,10 +992,11 @@ int lxc_terminal_stdin_cb(int fd, uint32_t events, void *cbdata, ts->saw_escape = 0; } - if (lxc_write_nointr(ts->masterfd, &c, 1) <= 0) + ret = lxc_write_nointr(ts->masterfd, &c, 1); + if (ret <= 0) return LXC_MAINLOOP_CLOSE; - return 0; + return LXC_MAINLOOP_CONTINUE; } int lxc_terminal_master_cb(int fd, uint32_t events, void *cbdata, From 818d454a24c9fd9b0f5ea42b0981d509321bfd71 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:43:47 +0100 Subject: [PATCH 19/25] terminal: lxc_terminal_master_cb() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 724e78e2c..568b47054 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -1002,9 +1002,9 @@ int lxc_terminal_stdin_cb(int fd, uint32_t events, void *cbdata, int lxc_terminal_master_cb(int fd, uint32_t events, void *cbdata, struct lxc_epoll_descr *descr) { - struct lxc_terminal_state *ts = cbdata; - char buf[LXC_TERMINAL_BUFFER_SIZE]; int r, w; + char buf[LXC_TERMINAL_BUFFER_SIZE]; + struct lxc_terminal_state *ts = cbdata; if (fd != ts->masterfd) return LXC_MAINLOOP_CLOSE; @@ -1014,14 +1014,10 @@ int lxc_terminal_master_cb(int fd, uint32_t events, void *cbdata, return LXC_MAINLOOP_CLOSE; w = lxc_write_nointr(ts->stdoutfd, buf, r); - if (w <= 0) { + if (w <= 0 || w != r) return LXC_MAINLOOP_CLOSE; - } else if (w != r) { - SYSERROR("Failed to write"); - return 1; - } - return 0; + return LXC_MAINLOOP_CONTINUE; } int lxc_terminal_getfd(struct lxc_container *c, int *ttynum, int *masterfd) From 01b5b89ef6ec8caa2a58d826aeade7fffe7967be Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:45:07 +0100 Subject: [PATCH 20/25] terminal: lxc_console() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 568b47054..d0aeb1fed 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -1029,7 +1029,7 @@ int lxc_console(struct lxc_container *c, int ttynum, int stdinfd, int stdoutfd, int stderrfd, int escape) { - int ret, ttyfd, masterfd; + int masterfd, ret, ttyfd; struct lxc_epoll_descr descr; struct termios oldtios; struct lxc_terminal_state *ts; @@ -1058,7 +1058,7 @@ int lxc_console(struct lxc_container *c, int ttynum, lxc_terminal_winsz(stdinfd, masterfd); lxc_cmd_terminal_winch(ts->winch_proxy, ts->winch_proxy_lxcpath); } else { - INFO("File descriptor %d does not refer to a tty device", stdinfd); + INFO("File descriptor %d does not refer to a terminal", stdinfd); } ret = lxc_mainloop_open(&descr); From 073e148b3f43a58a072de5750f476b0d9b2b73c3 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:46:36 +0100 Subject: [PATCH 21/25] terminal: lxc_make_controlling_terminal() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/attach.c | 2 +- src/lxc/terminal.c | 4 ++-- src/lxc/terminal.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lxc/attach.c b/src/lxc/attach.c index 243c91c65..04ff172cd 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -846,7 +846,7 @@ static int attach_child_main(struct attach_clone_payload *payload) } if (options->stdin_fd > 0 && isatty(options->stdin_fd)) { - ret = lxc_make_controlling_pty(options->stdin_fd); + ret = lxc_make_controlling_terminal(options->stdin_fd); if (ret < 0) goto on_error; } diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index d0aeb1fed..8862a27fd 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -1134,7 +1134,7 @@ int lxc_console(struct lxc_container *c, int ttynum, return ret; } -int lxc_make_controlling_pty(int fd) +int lxc_make_controlling_terminal(int fd) { int ret; @@ -1151,7 +1151,7 @@ int lxc_login_pty(int fd) { int ret; - ret = lxc_make_controlling_pty(fd); + ret = lxc_make_controlling_terminal(fd); if (ret < 0) return -1; diff --git a/src/lxc/terminal.h b/src/lxc/terminal.h index e9b95c434..79ee4a1d1 100644 --- a/src/lxc/terminal.h +++ b/src/lxc/terminal.h @@ -281,7 +281,7 @@ extern int lxc_terminal_create_log_file(struct lxc_terminal *console); extern int lxc_terminal_io_cb(int fd, uint32_t events, void *data, struct lxc_epoll_descr *descr); -extern int lxc_make_controlling_pty(int fd); +extern int lxc_make_controlling_terminal(int fd); extern int lxc_login_pty(int fd); extern void lxc_terminal_conf_free(struct lxc_terminal *console); extern void lxc_terminal_info_init(struct lxc_terminal_info *pty); From 80b1a5de15e1e5a5129c9d8338b2227fa8df6d13 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:48:28 +0100 Subject: [PATCH 22/25] terminal: lxc_terminal_prepare_login() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/attach.c | 2 +- src/lxc/terminal.c | 2 +- src/lxc/terminal.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lxc/attach.c b/src/lxc/attach.c index 04ff172cd..d3b7d342b 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -958,7 +958,7 @@ static int attach_child_main(struct attach_clone_payload *payload) } if (options->attach_flags & LXC_ATTACH_ALLOCATE_PTY) { - ret = lxc_login_pty(payload->pty_fd); + ret = lxc_terminal_prepare_login(payload->pty_fd); if (ret < 0) { SYSERROR("Failed to prepare pty file descriptor %d", payload->pty_fd); goto on_error; diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 8862a27fd..1047448ff 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -1147,7 +1147,7 @@ int lxc_make_controlling_terminal(int fd) return 0; } -int lxc_login_pty(int fd) +int lxc_terminal_prepare_login(int fd) { int ret; diff --git a/src/lxc/terminal.h b/src/lxc/terminal.h index 79ee4a1d1..90703988f 100644 --- a/src/lxc/terminal.h +++ b/src/lxc/terminal.h @@ -282,7 +282,7 @@ extern int lxc_terminal_io_cb(int fd, uint32_t events, void *data, struct lxc_epoll_descr *descr); extern int lxc_make_controlling_terminal(int fd); -extern int lxc_login_pty(int fd); +extern int lxc_terminal_prepare_login(int fd); extern void lxc_terminal_conf_free(struct lxc_terminal *console); extern void lxc_terminal_info_init(struct lxc_terminal_info *pty); extern void lxc_terminal_init(struct lxc_terminal *pty); From ea6d511f60712e77c310bf9a63595831505079c6 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:49:45 +0100 Subject: [PATCH 23/25] terminal: lxc_terminal_map_ids() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 1047448ff..150d55bc9 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -1191,24 +1191,23 @@ void lxc_terminal_conf_free(struct lxc_terminal *terminal) lxc_ringbuf_release(&terminal->ringbuf); } -int lxc_terminal_map_ids(struct lxc_conf *c, struct lxc_terminal *pty) +int lxc_terminal_map_ids(struct lxc_conf *c, struct lxc_terminal *terminal) { int ret; if (lxc_list_empty(&c->id_map)) return 0; - ret = strcmp(pty->name, ""); - if (ret == 0) + if (strcmp(terminal->name, "") == 0) return 0; - ret = chown_mapped_root(pty->name, c); + ret = chown_mapped_root(terminal->name, c); if (ret < 0) { - ERROR("Failed to chown \"%s\"", pty->name); + ERROR("Failed to chown terminal \"%s\"", terminal->name); return -1; } - TRACE("Chowned \"%s\"", pty->name); + TRACE("Chowned terminal \"%s\"", terminal->name); return 0; } From f027a12a611252c53bcbc8120d73fe027eb3f678 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 12:51:05 +0100 Subject: [PATCH 24/25] terminal: non-functional changes Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 150d55bc9..7d6bc9217 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -567,8 +567,8 @@ static int lxc_terminal_peer_proxy_alloc(struct lxc_terminal *terminal, return -1; } - /* This is the proxy pty that will be given to the client, and that - * the real pty master will send to / recv from. + /* This is the proxy terminal that will be given to the client, and + * that the real terminal master will send to / recv from. */ ret = openpty(&terminal->proxy.master, &terminal->proxy.slave, terminal->proxy.name, NULL, NULL); From dd1562ad34b7d2d3cb0e41fb7b59ddb216118db7 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Wed, 28 Feb 2018 13:02:05 +0100 Subject: [PATCH 25/25] terminal: non-functional changes Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/terminal.c | 24 ++++---- src/lxc/terminal.h | 166 ++++++++++++++++++++++++++++------------------------- 2 files changed, 99 insertions(+), 91 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 7d6bc9217..10c553a2b 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -1165,22 +1165,22 @@ int lxc_terminal_prepare_login(int fd) return 0; } -void lxc_terminal_info_init(struct lxc_terminal_info *pty) +void lxc_terminal_info_init(struct lxc_terminal_info *terminal) { - pty->name[0] = '\0'; - pty->master = -EBADF; - pty->slave = -EBADF; - pty->busy = -1; + terminal->name[0] = '\0'; + terminal->master = -EBADF; + terminal->slave = -EBADF; + terminal->busy = -1; } -void lxc_terminal_init(struct lxc_terminal *pty) +void lxc_terminal_init(struct lxc_terminal *terminal) { - memset(pty, 0, sizeof(*pty)); - pty->slave = -EBADF; - pty->master = -EBADF; - pty->peer = -EBADF; - pty->log_fd = -EBADF; - lxc_terminal_info_init(&pty->proxy); + memset(terminal, 0, sizeof(*terminal)); + terminal->slave = -EBADF; + terminal->master = -EBADF; + terminal->peer = -EBADF; + terminal->log_fd = -EBADF; + lxc_terminal_info_init(&terminal->proxy); } void lxc_terminal_conf_free(struct lxc_terminal *terminal) diff --git a/src/lxc/terminal.h b/src/lxc/terminal.h index 90703988f..7077b02dd 100644 --- a/src/lxc/terminal.h +++ b/src/lxc/terminal.h @@ -21,8 +21,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __LXC_CONSOLE_H -#define __LXC_CONSOLE_H +#ifndef __LXC_TERMINAL_H +#define __LXC_TERMINAL_H #include "config.h" @@ -36,15 +36,17 @@ struct lxc_container; struct lxc_conf; struct lxc_epoll_descr; -/* Defines a structure containing a pty information for virtualizing a tty - * @name : the path name of the slave pty side - * @master : the file descriptor of the master - * @slave : the file descriptor of the slave - */ struct lxc_terminal_info { + /* the path name of the slave side */ char name[MAXPATHLEN]; + + /* the file descriptor of the master */ int master; + + /* the file descriptor of the slave */ int slave; + + /* whether the terminal is currently used */ int busy; }; @@ -53,25 +55,32 @@ struct lxc_terminal_state { int stdinfd; int stdoutfd; int masterfd; - /* Escape sequence to use for exiting the pty. A single char can be - * specified. The pty can then exited by doing: Ctrl + specified_char + - * q. This field is checked by lxc_terminal_stdin_cb(). Set to -1 to - * disable exiting the pty via a escape sequence. + + /* Escape sequence to use for exiting the terminal. A single char can + * be specified. The terminal can then exited by doing: Ctrl + + * specified_char + q. This field is checked by + * lxc_terminal_stdin_cb(). Set to -1 to disable exiting the terminal + * via a escape sequence. */ int escape; + /* Used internally by lxc_terminal_stdin_cb() to check whether an * escape sequence has been received. */ int saw_escape; + /* Name of the container to forward the SIGWINCH event to. */ const char *winch_proxy; + /* Path of the container to forward the SIGWINCH event to. */ const char *winch_proxy_lxcpath; + /* File descriptor that accepts signals. If set to -1 no signal handler * could be installed. This also means that the sigset_t oldmask member * is meaningless. */ int sigfd; + sigset_t oldmask; }; @@ -86,7 +95,7 @@ struct lxc_terminal { struct termios *tios; struct lxc_terminal_state *tty_state; - struct /* lxc_console_log */ { + struct /* lxc_terminal_log */ { /* size of the log file */ uint64_t log_size; @@ -109,7 +118,7 @@ struct lxc_terminal { }; }; -/* +/** * lxc_terminal_allocate: allocate the console or a tty * * @conf : the configuration of the container to allocate from @@ -119,61 +128,54 @@ struct lxc_terminal { */ extern int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttynum); -/* - * Create a new pty: - * - calls openpty() to allocate a master/slave pty pair +/** + * Create a new terminal: + * - calls openpty() to allocate a master/slave pair * - sets the FD_CLOEXEC flag on the master/slave fds - * - allocates either the current controlling pty (default) or a user specified - * pty as peer pty for the newly created master/slave pair + * - allocates either the current controlling terminal (default) or a user + * specified terminal as proxy for the newly created master/slave pair * - sets up SIGWINCH handler, winsz, and new terminal settings * (Handlers for SIGWINCH and I/O are not registered in a mainloop.) - * (For an unprivileged container the created pty on the host is not - * automatically chowned to the uid/gid of the unprivileged user. For this - * ttys_shift_ids() can be called.) */ extern int lxc_terminal_create(struct lxc_terminal *console); /** - * lxc_terminal_setup: Create a new pty. - * - In addition to lxc_terminal_create() also sets up all pty logs. + * lxc_terminal_setup: Create a new terminal. + * - In addition to lxc_terminal_create() also sets up logging. */ extern int lxc_terminal_setup(struct lxc_conf *); -/* - * Delete a pty created via lxc_terminal_setup(): - * - set old terminal settings - * - memory allocated via lxc_terminal_setup() is free()ed. - * - close master/slave pty pair and allocated fd for the peer (usually - * /dev/tty) - * Registered handlers in a mainloop are not automatically deleted. +/** + * Delete a terminal created via lxc_terminal_create() or lxc_terminal_setup(): + * Note, registered handlers are not automatically deleted. */ extern void lxc_terminal_delete(struct lxc_terminal *); -/* - * lxc_terminal_free: mark the console or a tty as unallocated, free any - * resources allocated by lxc_terminal_allocate(). +/** + * lxc_terminal_free: mark the terminal as unallocated and free any resources + * allocated by lxc_terminal_allocate(). * * @conf : the configuration of the container whose tty was closed * @fd : the socket fd whose remote side was closed, which indicated - * the console or tty is no longer in use. this is used to match - * which console/tty is being freed. + * the terminal is no longer in use. this is used to match + * which terminal is being freed. */ extern void lxc_terminal_free(struct lxc_conf *conf, int fd); -/* - * Register pty event handlers in an open mainloop +/** + * Register terminal event handlers in an open mainloop. */ extern int lxc_terminal_mainloop_add(struct lxc_epoll_descr *, struct lxc_terminal *); -/* - * Handle SIGWINCH events on the allocated ptys. +/** + * Handle SIGWINCH events on the allocated terminals. */ extern void lxc_terminal_sigwinch(int sig); -/* - * Connect to one of the ptys given to the container via lxc.tty.max. - * - allocates either the current controlling pty (default) or a user specified - * pty as peer pty for the containers tty +/** + * Connect to one of the ttys given to the container via lxc.tty.max. + * - allocates either the current controlling terminal (default) or a user specified + * terminal as proxy terminal for the containers tty * - sets up SIGWINCH handler, winsz, and new terminal settings * - opens mainloop * - registers SIGWINCH, I/O handlers in the mainloop @@ -183,24 +185,24 @@ extern int lxc_console(struct lxc_container *c, int ttynum, int stdinfd, int stdoutfd, int stderrfd, int escape); -/* - * Allocate one of the ptys given to the container via lxc.tty.max. Returns an - * open fd to the allocated pty. - * Set ttynum to -1 to allocate the first available pty, or to a value within - * the range specified by lxc.tty.max to allocate a specific pty. +/** + * Allocate one of the tty given to the container via lxc.tty.max. Returns an + * open fd to the allocated tty. + * Set ttynum to -1 to allocate the first available tty, or to a value within + * the range specified by lxc.tty.max to allocate a specific tty. */ -extern int lxc_terminal_getfd(struct lxc_container *c, int *ttynum, +extern int lxc_terminal_getfd(struct lxc_container *c, int *ttynum, int *masterfd); -/* - * Make fd a duplicate of the standard file descriptors: - * fd is made a duplicate of a specific standard file descriptor iff the - * standard file descriptor refers to a pty. +/** + * Make fd a duplicate of the standard file descriptors. The fd is made a + * duplicate of a specific standard file descriptor iff the standard file + * descriptor refers to a terminal. */ extern int lxc_terminal_set_stdfds(int fd); -/* - * Handler for events on the stdin fd of the pty. To be registered via the +/** + * Handler for events on the stdin fd of the terminal. To be registered via the * corresponding functions declared and defined in mainloop.{c,h} or * lxc_terminal_mainloop_add(). * This function exits the loop cleanly when an EPOLLHUP event is received. @@ -208,42 +210,46 @@ extern int lxc_terminal_set_stdfds(int fd); extern int lxc_terminal_stdin_cb(int fd, uint32_t events, void *cbdata, struct lxc_epoll_descr *descr); -/* - * Handler for events on the master fd of the pty. To be registered via the - * corresponding functions declared and defined in mainloop.{c,h} or +/** + * Handler for events on the master fd of the terminal. To be registered via + * the corresponding functions declared and defined in mainloop.{c,h} or * lxc_terminal_mainloop_add(). * This function exits the loop cleanly when an EPOLLHUP event is received. */ extern int lxc_terminal_master_cb(int fd, uint32_t events, void *cbdata, struct lxc_epoll_descr *descr); -/* +/** * Setup new terminal properties. The old terminal settings are stored in * oldtios. */ extern int lxc_setup_tios(int fd, struct termios *oldtios); -/* +/** * lxc_terminal_winsz: propagate winsz from one terminal to another * - * @srcfd : terminal to get size from (typically a slave pty) - * @dstfd : terminal to set size on (typically a master pty) + * @srcfd + * - terminal to get size from (typically a slave pty) + * @dstfd + * - terminal to set size on (typically a master pty) */ extern void lxc_terminal_winsz(int srcfd, int dstfd); /* * lxc_terminal_signal_init: install signal handler * - * @srcfd : src for winsz in SIGWINCH handler - * @dstfd : dst for winsz in SIGWINCH handler + * @srcfd + * - src for winsz in SIGWINCH handler + * @dstfd + * - dst for winsz in SIGWINCH handler * - * Returns lxc_terminal_state structure on success or NULL on failure. The sigfd - * member of the returned lxc_terminal_state can be select()/poll()ed/epoll()ed - * on (ie added to a mainloop) for signals. + * Returns lxc_terminal_state structure on success or NULL on failure. The + * sigfd member of the returned lxc_terminal_state can be + * select()/poll()ed/epoll()ed on (i.e. added to a mainloop) for signals. * - * Must be called with process_lock held to protect the lxc_ttys list, or - * from a non-threaded context. + * Must be called with process_lock held to protect the lxc_ttys list, or from + * a non-threaded context. * * Note that the signal handler isn't installed as a classic asychronous * handler, rather signalfd(2) is used so that we can handle the signal when @@ -256,17 +262,18 @@ extern void lxc_terminal_winsz(int srcfd, int dstfd); */ extern struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd); -/* +/** * Handler for signal events. To be registered via the corresponding functions * declared and defined in mainloop.{c,h} or lxc_terminal_mainloop_add(). */ extern int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata, struct lxc_epoll_descr *descr); -/* +/** * lxc_terminal_signal_fini: uninstall signal handler * - * @ts : the lxc_terminal_state returned by lxc_terminal_signal_init + * @ts + * - the lxc_terminal_state returned by lxc_terminal_signal_init * * Restore the saved signal handler that was in effect at the time * lxc_terminal_signal_init() was called. @@ -276,16 +283,17 @@ extern int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata, */ extern void lxc_terminal_signal_fini(struct lxc_terminal_state *ts); -extern int lxc_terminal_write_ringbuffer(struct lxc_terminal *console); -extern int lxc_terminal_create_log_file(struct lxc_terminal *console); +extern int lxc_terminal_write_ringbuffer(struct lxc_terminal *terminal); +extern int lxc_terminal_create_log_file(struct lxc_terminal *terminal); extern int lxc_terminal_io_cb(int fd, uint32_t events, void *data, struct lxc_epoll_descr *descr); extern int lxc_make_controlling_terminal(int fd); extern int lxc_terminal_prepare_login(int fd); -extern void lxc_terminal_conf_free(struct lxc_terminal *console); -extern void lxc_terminal_info_init(struct lxc_terminal_info *pty); -extern void lxc_terminal_init(struct lxc_terminal *pty); -extern int lxc_terminal_map_ids(struct lxc_conf *c, struct lxc_terminal *pty); +extern void lxc_terminal_conf_free(struct lxc_terminal *terminal); +extern void lxc_terminal_info_init(struct lxc_terminal_info *terminal); +extern void lxc_terminal_init(struct lxc_terminal *terminal); +extern int lxc_terminal_map_ids(struct lxc_conf *c, + struct lxc_terminal *terminal); -#endif +#endif /* __LXC_TERMINAL_H */
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
