mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-08 00:42:13 +00:00
Merge pull request #970 from brauner/2016-04-13/lxc_attach_log
lxc-attach: error on -L/--pty-log + redirection
This commit is contained in:
commit
ba03fa64b9
@ -21,7 +21,8 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
#include "config.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@ -38,7 +39,6 @@
|
|||||||
#include "attach.h"
|
#include "attach.h"
|
||||||
#include "arguments.h"
|
#include "arguments.h"
|
||||||
#include "caps.h"
|
#include "caps.h"
|
||||||
#include "config.h"
|
|
||||||
#include "confile.h"
|
#include "confile.h"
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
#include "log.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");
|
INFO("Trying to allocate a pty on the host");
|
||||||
|
|
||||||
if (!isatty(args->ptyfd)) {
|
if (!isatty(args->ptyfd)) {
|
||||||
ERROR("stdin is not a tty");
|
ERROR("Standard file descriptor does not refer to a pty\n.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,28 +324,40 @@ err1:
|
|||||||
return ret;
|
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 main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1, r;
|
||||||
int wexit = 0;
|
int wexit = 0;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
lxc_attach_options_t attach_options = LXC_ATTACH_OPTIONS_DEFAULT;
|
lxc_attach_options_t attach_options = LXC_ATTACH_OPTIONS_DEFAULT;
|
||||||
lxc_attach_command_t command = (lxc_attach_command_t){.program = NULL};
|
lxc_attach_command_t command = (lxc_attach_command_t){.program = NULL};
|
||||||
|
|
||||||
ret = lxc_caps_init();
|
r = lxc_caps_init();
|
||||||
if (ret)
|
if (r)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
ret = lxc_arguments_parse(&my_args, argc, argv);
|
r = lxc_arguments_parse(&my_args, argc, argv);
|
||||||
if (ret)
|
if (r)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
if (!my_args.log_file)
|
if (!my_args.log_file)
|
||||||
my_args.log_file = "none";
|
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]);
|
my_args.progname, my_args.quiet, my_args.lxcpath[0]);
|
||||||
if (ret)
|
if (r)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
lxc_log_options_no_override();
|
lxc_log_options_no_override();
|
||||||
|
|
||||||
@ -388,19 +400,23 @@ int main(int argc, char *argv[])
|
|||||||
command.argv = (char**)my_args.argv;
|
command.argv = (char**)my_args.argv;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isatty(STDIN_FILENO) || isatty(STDOUT_FILENO) || isatty(STDERR_FILENO)) {
|
|
||||||
struct wrapargs wrap = (struct wrapargs){
|
struct wrapargs wrap = (struct wrapargs){
|
||||||
.command = &command,
|
.command = &command,
|
||||||
.options = &attach_options
|
.options = &attach_options
|
||||||
};
|
};
|
||||||
if (isatty(STDIN_FILENO))
|
|
||||||
wrap.ptyfd = STDIN_FILENO;
|
wrap.ptyfd = stdfd_is_pty();
|
||||||
else if (isatty(STDOUT_FILENO))
|
if (wrap.ptyfd >= 0) {
|
||||||
wrap.ptyfd = STDOUT_FILENO;
|
if ((!isatty(STDOUT_FILENO) || !isatty(STDERR_FILENO)) && my_args.console_log) {
|
||||||
else if (isatty(STDERR_FILENO))
|
fprintf(stderr, "-L/--pty-log can only be used when stdout and stderr refer to a pty.\n");
|
||||||
wrap.ptyfd = STDERR_FILENO;
|
goto out;
|
||||||
|
}
|
||||||
ret = get_pty_on_host(c, &wrap, &pid);
|
ret = get_pty_on_host(c, &wrap, &pid);
|
||||||
} else {
|
} 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)
|
if (command.program)
|
||||||
ret = c->attach(c, lxc_attach_run_command, &command, &attach_options, &pid);
|
ret = c->attach(c, lxc_attach_run_command, &command, &attach_options, &pid);
|
||||||
else
|
else
|
||||||
|
@ -190,14 +190,16 @@ fi
|
|||||||
|
|
||||||
rm -f $out $err
|
rm -f $out $err
|
||||||
|
|
||||||
# Test whether logging pty output to a file works.
|
if [ $allocate_pty = "pty" ]; then
|
||||||
trap "rm -f /tmp/ptylog" EXIT INT QUIT PIPE
|
# Test whether logging pty output to a file works.
|
||||||
lxc-attach -n busy -L /tmp/ptylog -- hostname || FAIL "to allocate or setup pty"
|
trap "rm -f /tmp/ptylog" EXIT INT QUIT PIPE
|
||||||
if [ $allocate_pty == "pty" ] && [ ! -s /tmp/ptylog ]; then
|
lxc-attach -n busy -L /tmp/ptylog -- hostname || FAIL "to allocate or setup pty"
|
||||||
|
if [ ! -s /tmp/ptylog ]; then
|
||||||
FAIL "lxc-attach -n busy -L /tmp/ptylog -- hostname"
|
FAIL "lxc-attach -n busy -L /tmp/ptylog -- hostname"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -f /tmp/ptylog
|
rm -f /tmp/ptylog
|
||||||
|
fi
|
||||||
|
|
||||||
lxc-destroy -n busy -f
|
lxc-destroy -n busy -f
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user