On Tue, 2011-11-01 at 18:34 +0200, Sasha Levin wrote:
> This patch adds an option to provide information about redirection
> of terminal redirection to a PTY device within 'kvm stat'.
>
> Usage:
> 'kvm stat -p [term] -n [instance_name]'
>
> Will print information about redirection of terminal 'term' int instance
> 'instance_name'.
>
> Cc: Osier Yang <[email protected]>
> Signed-off-by: Sasha Levin <[email protected]>
Ping? Should I apply this patch? Is it actually useful for libvirt?
> ---
> tools/kvm/Documentation/kvm-stat.txt | 2 +
> tools/kvm/builtin-stat.c | 39 ++++++++++++++++++++++++++++++---
> tools/kvm/include/kvm/kvm-ipc.h | 1 +
> tools/kvm/include/kvm/term.h | 7 ++++++
> tools/kvm/term.c | 25 ++++++++++++++++++++-
> 5 files changed, 69 insertions(+), 5 deletions(-)
>
> diff --git a/tools/kvm/Documentation/kvm-stat.txt
> b/tools/kvm/Documentation/kvm-stat.txt
> index ce5ab54..5284aa9 100644
> --- a/tools/kvm/Documentation/kvm-stat.txt
> +++ b/tools/kvm/Documentation/kvm-stat.txt
> @@ -17,3 +17,5 @@ For a list of running instances see 'kvm list'.
>
> Commands:
> --memory, -m Display memory statistics
> + --pty, -p Display information about terminal's pty
> + device.
> diff --git a/tools/kvm/builtin-stat.c b/tools/kvm/builtin-stat.c
> index e28eb5b..2a46900 100644
> --- a/tools/kvm/builtin-stat.c
> +++ b/tools/kvm/builtin-stat.c
> @@ -4,6 +4,8 @@
> #include <kvm/kvm.h>
> #include <kvm/parse-options.h>
> #include <kvm/kvm-ipc.h>
> +#include <kvm/term.h>
> +#include <kvm/read-write.h>
>
> #include <sys/select.h>
> #include <stdio.h>
> @@ -18,6 +20,7 @@ struct stat_cmd {
> };
>
> static bool mem;
> +static int pty = -1;
> static bool all;
> static int instance;
> static const char *instance_name;
> @@ -30,6 +33,7 @@ static const char * const stat_usage[] = {
> static const struct option stat_options[] = {
> OPT_GROUP("Commands options:"),
> OPT_BOOLEAN('m', "memory", &mem, "Display memory statistics"),
> + OPT_INTEGER('p', "PTY info", &pty, "Display PTY path for given
> terminal"),
> OPT_GROUP("Instance options:"),
> OPT_BOOLEAN('a', "all", &all, "All instances"),
> OPT_STRING('n', "name", &instance_name, "name", "Instance name"),
> @@ -104,15 +108,40 @@ static int do_memstat(const char *name, int sock)
> return 0;
> }
>
> +static int do_pty(const char *name, int sock)
> +{
> + struct pty_cmd cmd = {KVM_IPC_TRM_PTY, 0, pty};
> + int r;
> + char pty_path[PATH_MAX] = {0};
> +
> + r = xwrite(sock, &cmd, sizeof(cmd));
> + if (r < 0)
> + return r;
> +
> + r = xread(sock, pty_path, PATH_MAX);
> + if (r < 0)
> + return r;
> +
> + printf("Instance %s mapped term %d to: %s\n", name, pty, pty_path);
> +
> + return 0;
> +}
> +
> int kvm_cmd_stat(int argc, const char **argv, const char *prefix)
> {
> parse_stat_options(argc, argv);
>
> - if (!mem)
> + if (!mem && pty == -1)
> usage_with_options(stat_usage, stat_options);
>
> - if (mem && all)
> - return kvm__enumerate_instances(do_memstat);
> + if (all) {
> + if (mem)
> + kvm__enumerate_instances(do_memstat);
> + if (pty != -1)
> + kvm__enumerate_instances(do_pty);
> +
> + return 0;
> + }
>
> if (instance_name == NULL &&
> instance == 0)
> @@ -125,7 +154,9 @@ int kvm_cmd_stat(int argc, const char **argv, const char
> *prefix)
> die("Failed locating instance");
>
> if (mem)
> - return do_memstat(instance_name, instance);
> + do_memstat(instance_name, instance);
> + if (pty != -1)
> + do_pty(instance_name, instance);
>
> return 0;
> }
> diff --git a/tools/kvm/include/kvm/kvm-ipc.h b/tools/kvm/include/kvm/kvm-ipc.h
> index 731767f..1d9599b 100644
> --- a/tools/kvm/include/kvm/kvm-ipc.h
> +++ b/tools/kvm/include/kvm/kvm-ipc.h
> @@ -17,6 +17,7 @@ enum {
> KVM_IPC_RESUME = 5,
> KVM_IPC_STOP = 6,
> KVM_IPC_PID = 7,
> + KVM_IPC_TRM_PTY = 8,
> };
>
> int kvm_ipc__register_handler(u32 type, void (*cb)(int fd, u32 type, u32
> len, u8 *msg));
> diff --git a/tools/kvm/include/kvm/term.h b/tools/kvm/include/kvm/term.h
> index 37ec731..06d5b4e 100644
> --- a/tools/kvm/include/kvm/term.h
> +++ b/tools/kvm/include/kvm/term.h
> @@ -2,10 +2,17 @@
> #define KVM__TERM_H
>
> #include <sys/uio.h>
> +#include <linux/types.h>
>
> #define CONSOLE_8250 1
> #define CONSOLE_VIRTIO 2
>
> +struct pty_cmd {
> + u32 type;
> + u32 len;
> + int pty;
> +};
> +
> int term_putc_iov(int who, struct iovec *iov, int iovcnt, int term);
> int term_getc_iov(int who, struct iovec *iov, int iovcnt, int term);
> int term_putc(int who, char *addr, int cnt, int term);
> diff --git a/tools/kvm/term.c b/tools/kvm/term.c
> index fb5d71c..4e0d946 100644
> --- a/tools/kvm/term.c
> +++ b/tools/kvm/term.c
> @@ -13,7 +13,7 @@
> #include "kvm/util.h"
> #include "kvm/kvm.h"
> #include "kvm/kvm-cpu.h"
> -
> +#include "kvm/kvm-ipc.h"
>
> #define TERM_FD_IN 0
> #define TERM_FD_OUT 1
> @@ -27,6 +27,7 @@ bool term_got_escape = false;
> int active_console;
>
> int term_fds[4][2];
> +char *term_names[4];
>
> int term_getc(int who, int term)
> {
> @@ -142,11 +143,31 @@ void term_set_tty(int term)
>
> close(slave);
>
> + term_names[term] = strdup(new_pty);
> +
> pr_info("Assigned terminal %d to pty %s\n", term, new_pty);
>
> term_fds[term][TERM_FD_IN] = term_fds[term][TERM_FD_OUT] = master;
> }
>
> +static void term_info(int fd, u32 type, u32 len, u8 *msg)
> +{
> + int r, id;
> + const char *res = "[none]";
> +
> + r = read(fd, &id, sizeof(id));
> + if (r < 0)
> + pr_warning("Failed reading term");
> +
> + if (term_names[id])
> + res = term_names[id];
> +
> + r = write(fd, res, strlen(res) + 1);
> +
> + if (r < 0)
> + pr_warning("Failed sending term info");
> +}
> +
> void term_init(void)
> {
> struct termios term;
> @@ -165,6 +186,8 @@ void term_init(void)
> term_fds[i][TERM_FD_OUT] = STDOUT_FILENO;
> }
>
> + kvm_ipc__register_handler(KVM_IPC_TRM_PTY, term_info);
> +
> signal(SIGTERM, term_sig_cleanup);
> atexit(term_cleanup);
> }
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html