From 259642322d5f399a63bcfac6df4acf50a62c75a8 Mon Sep 17 00:00:00 2001 From: Li Feng Date: Sat, 20 May 2017 17:40:36 +0800 Subject: [PATCH] DO NOT add the handles of adjust winsize when the 'stdin' is not a tty Signed-off-by: Li Feng --- src/lxc/console.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) mode change 100644 => 100755 src/lxc/console.c diff --git a/src/lxc/console.c b/src/lxc/console.c old mode 100644 new mode 100755 index 0cfc9ab84..61f9c7a49 --- a/src/lxc/console.c +++ b/src/lxc/console.c @@ -121,6 +121,11 @@ struct lxc_tty_state *lxc_console_sigwinch_init(int srcfd, int dstfd) ts->masterfd = dstfd; ts->sigfd = -1; + if (!isatty(srcfd)) { + INFO("fd %d does not refer to a tty device", srcfd); + return ts; + } + /* 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); @@ -128,20 +133,20 @@ struct lxc_tty_state *lxc_console_sigwinch_init(int srcfd, int dstfd) sigemptyset(&mask); sigaddset(&mask, SIGWINCH); if (sigprocmask(SIG_BLOCK, &mask, &ts->oldmask)) { - SYSERROR("failed to block SIGWINCH."); + SYSERROR("failed to block SIGWINCH"); ts->sigfd = -1; return ts; } ts->sigfd = signalfd(-1, &mask, 0); if (ts->sigfd < 0) { - SYSERROR("failed to get signalfd."); + SYSERROR("failed to create signal fd"); sigprocmask(SIG_SETMASK, &ts->oldmask, NULL); ts->sigfd = -1; return ts; } - DEBUG("%d got SIGWINCH fd %d", getpid(), ts->sigfd); + DEBUG("process %d created signal fd %d to handle SIGWINCH events", getpid(), ts->sigfd); return ts; } @@ -647,16 +652,17 @@ int lxc_console(struct lxc_container *c, int ttynum, struct lxc_epoll_descr descr; struct termios oldtios; struct lxc_tty_state *ts; + int istty = 0; - if (!isatty(stdinfd)) { - ERROR("stdin is not a tty"); - return -1; - } - - ret = lxc_setup_tios(stdinfd, &oldtios); - if (ret) { - ERROR("failed to setup tios"); - return -1; + istty = isatty(stdinfd); + if (istty) { + ret = lxc_setup_tios(stdinfd, &oldtios); + if (ret) { + ERROR("failed to setup terminal properties"); + return -1; + } + } else { + INFO("fd %d does not refer to a tty device", stdinfd); } ttyfd = lxc_cmd_console(c->name, &ttynum, &masterfd, c->config_path); @@ -684,8 +690,10 @@ int lxc_console(struct lxc_container *c, int ttynum, ts->winch_proxy = c->name; ts->winch_proxy_lxcpath = c->config_path; - lxc_console_winsz(stdinfd, masterfd); - lxc_cmd_console_winch(ts->winch_proxy, ts->winch_proxy_lxcpath); + if (istty) { + lxc_console_winsz(stdinfd, masterfd); + lxc_cmd_console_winch(ts->winch_proxy, ts->winch_proxy_lxcpath); + } ret = lxc_mainloop_open(&descr); if (ret) { @@ -733,8 +741,10 @@ err2: close(masterfd); close(ttyfd); err1: - tcsetattr(stdinfd, TCSAFLUSH, &oldtios); + if (istty) { + if (tcsetattr(stdinfd, TCSAFLUSH, &oldtios) < 0) + WARN("failed to reset terminal properties: %s.", strerror(errno)); + } return ret; } - -- 2.47.2