From: Christian Brauner Date: Wed, 13 Apr 2016 13:23:35 +0000 (+0200) Subject: lxc-attach: error on -L/--pty-log + redirection X-Git-Tag: lxc-2.1.0~448^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c87524b77b3abf12f26c39d5b85d26ebc7aeaf97;p=thirdparty%2Flxc.git lxc-attach: error on -L/--pty-log + redirection pty logging only works correctly when stdout and stderr refer to a pty. If they do not, we do not dup2() them and lxc_console_cb_con() will never write to the corresponding log file descriptor. When redirection on stdout and stderr is used we can safely assume that the user is already logging to a file or /dev/null and creating an additional pty log doesn't seem to make sense. Signed-off-by: Christian Brauner --- diff --git a/src/lxc/lxc_attach.c b/src/lxc/lxc_attach.c index ed3ba0df0..58f658bfd 100644 --- a/src/lxc/lxc_attach.c +++ b/src/lxc/lxc_attach.c @@ -21,7 +21,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#define _GNU_SOURCE +#include "config.h" + #include #include #include @@ -38,7 +39,6 @@ #include "attach.h" #include "arguments.h" #include "caps.h" -#include "config.h" #include "confile.h" #include "console.h" #include "log.h" @@ -254,7 +254,7 @@ static int get_pty_on_host(struct lxc_container *c, struct wrapargs *wrap, int * INFO("Trying to allocate a pty on the host"); if (!isatty(args->ptyfd)) { - ERROR("stdin is not a tty"); + ERROR("Standard file descriptor does not refer to a pty\n."); return -1; } @@ -324,28 +324,40 @@ err1: return ret; } +static int stdfd_is_pty(void) +{ + if (isatty(STDIN_FILENO)) + return STDIN_FILENO; + if (isatty(STDOUT_FILENO)) + return STDOUT_FILENO; + if (isatty(STDERR_FILENO)) + return STDERR_FILENO; + + return -1; +} + int main(int argc, char *argv[]) { - int ret = -1; + int ret = -1, r; int wexit = 0; pid_t pid; lxc_attach_options_t attach_options = LXC_ATTACH_OPTIONS_DEFAULT; lxc_attach_command_t command = (lxc_attach_command_t){.program = NULL}; - ret = lxc_caps_init(); - if (ret) + r = lxc_caps_init(); + if (r) exit(EXIT_FAILURE); - ret = lxc_arguments_parse(&my_args, argc, argv); - if (ret) + r = lxc_arguments_parse(&my_args, argc, argv); + if (r) exit(EXIT_FAILURE); if (!my_args.log_file) my_args.log_file = "none"; - ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, + r = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority, my_args.progname, my_args.quiet, my_args.lxcpath[0]); - if (ret) + if (r) exit(EXIT_FAILURE); lxc_log_options_no_override(); @@ -388,19 +400,23 @@ int main(int argc, char *argv[]) command.argv = (char**)my_args.argv; } - if (isatty(STDIN_FILENO) || isatty(STDOUT_FILENO) || isatty(STDERR_FILENO)) { - struct wrapargs wrap = (struct wrapargs){ - .command = &command, + struct wrapargs wrap = (struct wrapargs){ + .command = &command, .options = &attach_options - }; - if (isatty(STDIN_FILENO)) - wrap.ptyfd = STDIN_FILENO; - else if (isatty(STDOUT_FILENO)) - wrap.ptyfd = STDOUT_FILENO; - else if (isatty(STDERR_FILENO)) - wrap.ptyfd = STDERR_FILENO; + }; + + wrap.ptyfd = stdfd_is_pty(); + if (wrap.ptyfd >= 0) { + if ((!isatty(STDOUT_FILENO) || !isatty(STDERR_FILENO)) && my_args.console_log) { + fprintf(stderr, "-L/--pty-log can only be used when stdout and stderr refer to a pty.\n"); + goto out; + } ret = get_pty_on_host(c, &wrap, &pid); } else { + if (my_args.console_log) { + fprintf(stderr, "-L/--pty-log can only be used when stdout and stderr refer to a pty.\n"); + goto out; + } if (command.program) ret = c->attach(c, lxc_attach_run_command, &command, &attach_options, &pid); else