From patchwork Wed Jul 12 07:35:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Hoyes X-Patchwork-Id: 13309662 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 40455EB64DD for ; Wed, 12 Jul 2023 07:37:09 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.561994.878542 (Exim 4.92) (envelope-from ) id 1qJUP5-0007Ni-BH; Wed, 12 Jul 2023 07:36:51 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 561994.878542; Wed, 12 Jul 2023 07:36:51 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qJUP5-0007Nb-8M; Wed, 12 Jul 2023 07:36:51 +0000 Received: by outflank-mailman (input) for mailman id 561994; Wed, 12 Jul 2023 07:36:49 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qJUP3-0007NH-LY for xen-devel@lists.xenproject.org; Wed, 12 Jul 2023 07:36:49 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-sth1.inumbo.com (Halon) with ESMTP id dba223d9-2086-11ee-b239-6b7b168915f2; Wed, 12 Jul 2023 09:36:48 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A1E1E2F4; Wed, 12 Jul 2023 00:37:29 -0700 (PDT) Received: from e125920.cambridge.arm.com (unknown [10.1.199.64]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5434F3F67D; Wed, 12 Jul 2023 00:36:46 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: dba223d9-2086-11ee-b239-6b7b168915f2 From: Peter Hoyes To: xen-devel@lists.xenproject.org Cc: bertrand.marquis@arm.com, wei.chen@arm.com, luca.fancellu@arm.com, Peter Hoyes , Wei Liu , Anthony PERARD Subject: [PATCH v4 1/2] tools/console: Add escape argument to configure escape character Date: Wed, 12 Jul 2023 08:35:55 +0100 Message-Id: <20230712073556.14719-2-peter.hoyes@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230712073556.14719-1-peter.hoyes@arm.com> References: <20230712073556.14719-1-peter.hoyes@arm.com> MIME-Version: 1.0 From: Peter Hoyes Dom0 may be accessed via telnet, meaning the default escape character (which is the same as telnet's) cannot be directly used to exit the console. It would be helpful to make the escape character customizable in such use cases. Add --escape argument to console tool for this purpose. Add argument to getopt options, parse and validate the escape character and pass value to console_loop. If --escape is not specified, it falls back to the existing behavior using DEFAULT_ESCAPE_SEQUENCE. Signed-off-by: Peter Hoyes --- tools/console/client/main.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tools/console/client/main.c b/tools/console/client/main.c index 6775006488..d2dcc3ddca 100644 --- a/tools/console/client/main.c +++ b/tools/console/client/main.c @@ -42,7 +42,7 @@ #include #include "xenctrl.h" -#define ESCAPE_CHARACTER 0x1d +#define DEFAULT_ESCAPE_CHARACTER 0x1d static volatile sig_atomic_t received_signal = 0; static char lockfile[sizeof (XEN_LOCK_DIR "/xenconsole.") + 8] = { 0 }; @@ -77,6 +77,7 @@ static void usage(const char *program) { " -n, --num N use console number N\n" " --type TYPE console type. must be 'pv', 'serial' or 'vuart'\n" " --start-notify-fd N file descriptor used to notify parent\n" + " --escape E escape sequence to exit console\n" , program); } @@ -174,7 +175,7 @@ static void restore_term(int fd, struct termios *old) } static int console_loop(int fd, struct xs_handle *xs, char *pty_path, - bool interactive) + bool interactive, char escape_character) { int ret, xs_fd = xs_fileno(xs), max_fd = -1; @@ -215,7 +216,7 @@ static int console_loop(int fd, struct xs_handle *xs, char *pty_path, char msg[60]; len = read(STDIN_FILENO, msg, sizeof(msg)); - if (len == 1 && msg[0] == ESCAPE_CHARACTER) { + if (len == 1 && msg[0] == escape_character) { return 0; } @@ -335,6 +336,7 @@ int main(int argc, char **argv) { "help", 0, 0, 'h' }, { "start-notify-fd", 1, 0, 's' }, { "interactive", 0, 0, 'i' }, + { "escape", 1, 0, 'e' }, { 0 }, }; @@ -345,6 +347,7 @@ int main(int argc, char **argv) console_type type = CONSOLE_INVAL; bool interactive = 0; const char *console_names = "serial, pv, vuart"; + char escape_character = DEFAULT_ESCAPE_CHARACTER; while((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) { switch(ch) { @@ -375,6 +378,16 @@ int main(int argc, char **argv) case 'i': interactive = 1; break; + case 'e': + if (optarg[0] == '^' && optarg[1] && optarg[2] == '\0') + escape_character = optarg[1] & 0x1f; + else if (optarg[0] && optarg[1] == '\0') + escape_character = optarg[0]; + else { + fprintf(stderr, "Invalid escape argument\n"); + exit(EINVAL); + } + break; default: fprintf(stderr, "Invalid argument\n"); fprintf(stderr, "Try `%s --help' for more information.\n", @@ -493,7 +506,7 @@ int main(int argc, char **argv) close(start_notify_fd); } - console_loop(spty, xs, path, interactive); + console_loop(spty, xs, path, interactive, escape_character); free(path); free(dom_path); From patchwork Wed Jul 12 07:35:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Hoyes X-Patchwork-Id: 13309663 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 62F5AEB64D9 for ; Wed, 12 Jul 2023 07:37:17 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.561995.878553 (Exim 4.92) (envelope-from ) id 1qJUP7-0007dp-In; Wed, 12 Jul 2023 07:36:53 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 561995.878553; Wed, 12 Jul 2023 07:36:53 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qJUP7-0007dc-FP; Wed, 12 Jul 2023 07:36:53 +0000 Received: by outflank-mailman (input) for mailman id 561995; Wed, 12 Jul 2023 07:36:52 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qJUP6-00075l-4H for xen-devel@lists.xenproject.org; Wed, 12 Jul 2023 07:36:52 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id dcda4d88-2086-11ee-8611-37d641c3527e; Wed, 12 Jul 2023 09:36:50 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9BAE8D75; Wed, 12 Jul 2023 00:37:31 -0700 (PDT) Received: from e125920.cambridge.arm.com (unknown [10.1.199.64]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 19E4C3F67D; Wed, 12 Jul 2023 00:36:47 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: dcda4d88-2086-11ee-8611-37d641c3527e From: Peter Hoyes To: xen-devel@lists.xenproject.org Cc: bertrand.marquis@arm.com, wei.chen@arm.com, luca.fancellu@arm.com, Peter Hoyes , Wei Liu , Anthony PERARD , Juergen Gross Subject: [PATCH v4 2/2] xl: Add escape character argument to xl console Date: Wed, 12 Jul 2023 08:35:56 +0100 Message-Id: <20230712073556.14719-3-peter.hoyes@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230712073556.14719-1-peter.hoyes@arm.com> References: <20230712073556.14719-1-peter.hoyes@arm.com> MIME-Version: 1.0 From: Peter Hoyes Add -e argument to xl console and pass to new escape_character argument of libxl_console_exec. Introduce a new API version to support this new argument and advertise the new functionality in libxl.h In libxl_console_exec, there are currently two call sites to execl, which uses varargs, in order to support optionally passing 'start-notify-fd' to the console client. In order to support passing the 'escape' argument optionally too, refactor to instead have a single call site to execv, which has the same behavior but takes an array of arguments. If -e is not specified, --escape is not passed to the console client and the existing value (^]) is used as a default. Update the xl docs. Signed-off-by: Peter Hoyes --- docs/man/xl.1.pod.in | 8 ++++++- tools/include/libxl.h | 39 +++++++++++++++++++++++++++++--- tools/libs/light/libxl_console.c | 30 +++++++++++++++++------- tools/xl/xl_cmdtable.c | 3 ++- tools/xl/xl_console.c | 10 +++++--- tools/xl/xl_vmcontrol.c | 2 +- 6 files changed, 75 insertions(+), 17 deletions(-) diff --git a/docs/man/xl.1.pod.in b/docs/man/xl.1.pod.in index 101e14241d..9ba22a8fa2 100644 --- a/docs/man/xl.1.pod.in +++ b/docs/man/xl.1.pod.in @@ -222,7 +222,8 @@ Attach to the console of a domain specified by I. If you've set up your domains to have a traditional login console this will look much like a normal text login screen. -Use the key combination Ctrl+] to detach from the domain console. +Use the escape character key combination (default Ctrl+]) to detach from the +domain console. B @@ -239,6 +240,11 @@ emulated serial for HVM guests and PV console for PV guests. Connect to console number I. Console numbers start from 0. +=item I<-e escapechar> + +Customize the escape sequence used to detach from the domain console to +I. If not specified, the value "^]" is used. + =back =item B [I] I diff --git a/tools/include/libxl.h b/tools/include/libxl.h index cac641a7eb..21e43cc839 100644 --- a/tools/include/libxl.h +++ b/tools/include/libxl.h @@ -81,6 +81,15 @@ */ #define LIBXL_HAVE_CONSOLE_NOTIFY_FD 1 +/* LIBXL_HAVE_CONSOLE_ESCAPE_CHARACTER + * + * If this is defined, libxl_console_exec and + * libxl_primary_console_exe take an escape_character parameter. That + * parameter will be used to modify the escape sequence used to exit the + * console. + */ +#define LIBXL_HAVE_CONSOLE_ESCAPE_CHARACTER 1 + /* LIBXL_HAVE_CONST_COPY_AND_LENGTH_FUNCTIONS * * If this is defined, the copy functions have constified src parameter and the @@ -790,7 +799,8 @@ typedef struct libxl__ctx libxl_ctx; #if LIBXL_API_VERSION != 0x040200 && LIBXL_API_VERSION != 0x040300 && \ LIBXL_API_VERSION != 0x040400 && LIBXL_API_VERSION != 0x040500 && \ LIBXL_API_VERSION != 0x040700 && LIBXL_API_VERSION != 0x040800 && \ - LIBXL_API_VERSION != 0x041300 && LIBXL_API_VERSION != 0x041400 + LIBXL_API_VERSION != 0x041300 && LIBXL_API_VERSION != 0x041400 && \ + LIBXL_API_VERSION != 0x041800 #error Unknown LIBXL_API_VERSION #endif #endif @@ -1958,7 +1968,8 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass); * the caller that it has connected to the guest console. */ int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, - libxl_console_type type, int notify_fd); + libxl_console_type type, int notify_fd, + char* escape_character); /* libxl_primary_console_exec finds the domid and console number * corresponding to the primary console of the given vm, then calls * libxl_console_exec with the right arguments (domid might be different @@ -1968,9 +1979,12 @@ int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, * guests using pygrub. * If notify_fd is not -1, xenconsole will write 0x00 to it to nofity * the caller that it has connected to the guest console. + * If escape_character is not NULL, the provided value is used to exit + * the guest console. */ int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm, - int notify_fd); + int notify_fd, + char* escape_character); #if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION < 0x040800 @@ -1989,6 +2003,25 @@ static inline int libxl_primary_console_exec_0x040700(libxl_ctx *ctx, } #define libxl_primary_console_exec libxl_primary_console_exec_0x040700 +#elif defined(LIBXL_API_VERSION) && LIBXL_API_VERSION < 0x041800 + +static inline int libxl_console_exec_0x041800(libxl_ctx *ctx, uint32_t domid, + int cons_num, + libxl_console_type type, + int notify_fd) +{ + return libxl_console_exec(ctx, domid, cons_num, type, notify_fd, NULL); +} +#define libxl_console_exec libxl_console_exec_0x041800 + +static inline int libxl_primary_console_exec_0x041800(libxl_ctx *ctx, + uint32_t domid_vm, + int notify_fd) +{ + return libxl_primary_console_exec(ctx, domid_vm, notify_fd, NULL); +} +#define libxl_primary_console_exec libxl_primary_console_exec_0x041800 + #endif /* libxl_console_get_tty retrieves the specified domain's console tty path diff --git a/tools/libs/light/libxl_console.c b/tools/libs/light/libxl_console.c index f497be141b..0b7293fe71 100644 --- a/tools/libs/light/libxl_console.c +++ b/tools/libs/light/libxl_console.c @@ -52,7 +52,8 @@ out: } int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, - libxl_console_type type, int notify_fd) + libxl_console_type type, int notify_fd, + char* escape_character) { GC_INIT(ctx); char *p = GCSPRINTF("%s/xenconsole", libxl__private_bindir_path()); @@ -75,15 +76,26 @@ int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, goto out; } + char *args[] = { + p, domid_s, "--num", cons_num_s, "--type", cons_type_s, + NULL, NULL, NULL, NULL, // start-notify-fd, escape + NULL, // list terminator - do not use + }; + char **args_extra = args + 6; + if (notify_fd != -1) { notify_fd_s = GCSPRINTF("%d", notify_fd); - execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s, - "--start-notify-fd", notify_fd_s, (void *)NULL); - } else { - execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s, - (void *)NULL); + *args_extra++ = "--start-notify-fd"; + *args_extra++ = notify_fd_s; } + if (escape_character) { + *args_extra++ = "--escape"; + *args_extra++ = escape_character; + } + + execv(p, args); + out: GC_FREE; return ERROR_FAIL; @@ -156,7 +168,8 @@ out: return rc; } -int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm, int notify_fd) +int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm, int notify_fd, + char* escape_character) { uint32_t domid; int cons_num; @@ -165,7 +178,8 @@ int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm, int notify_fd) rc = libxl__primary_console_find(ctx, domid_vm, &domid, &cons_num, &type); if ( rc ) return rc; - return libxl_console_exec(ctx, domid, cons_num, type, notify_fd); + return libxl_console_exec(ctx, domid, cons_num, type, notify_fd, + escape_character); } int libxl_primary_console_get_tty(libxl_ctx *ctx, uint32_t domid_vm, diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c index ccf4d83584..67604e9536 100644 --- a/tools/xl/xl_cmdtable.c +++ b/tools/xl/xl_cmdtable.c @@ -141,7 +141,8 @@ const struct cmd_spec cmd_table[] = { "Attach to domain's console", "[options] \n" "-t console type, pv , serial or vuart\n" - "-n console number" + "-n console number\n" + "-e escape character" }, { "vncviewer", &main_vncviewer, 0, 0, diff --git a/tools/xl/xl_console.c b/tools/xl/xl_console.c index b27f9e0136..5633c6f6f7 100644 --- a/tools/xl/xl_console.c +++ b/tools/xl/xl_console.c @@ -28,8 +28,9 @@ int main_console(int argc, char **argv) int opt = 0, num = 0; libxl_console_type type = 0; const char *console_names = "pv, serial, vuart"; + char* escape_character = NULL; - SWITCH_FOREACH_OPT(opt, "n:t:", NULL, "console", 1) { + SWITCH_FOREACH_OPT(opt, "n:t:e:", NULL, "console", 1) { case 't': if (!strcmp(optarg, "pv")) type = LIBXL_CONSOLE_TYPE_PV; @@ -45,13 +46,16 @@ int main_console(int argc, char **argv) case 'n': num = atoi(optarg); break; + case 'e': + escape_character = optarg; + break; } domid = find_domain(argv[optind]); if (!type) - libxl_primary_console_exec(ctx, domid, -1); + libxl_primary_console_exec(ctx, domid, -1, escape_character); else - libxl_console_exec(ctx, domid, num, type, -1); + libxl_console_exec(ctx, domid, num, type, -1, escape_character); fprintf(stderr, "Unable to attach console\n"); return EXIT_FAILURE; } diff --git a/tools/xl/xl_vmcontrol.c b/tools/xl/xl_vmcontrol.c index 5518c78dc6..03971927e9 100644 --- a/tools/xl/xl_vmcontrol.c +++ b/tools/xl/xl_vmcontrol.c @@ -643,7 +643,7 @@ static void autoconnect_console(libxl_ctx *ctx_ignored, postfork(); sleep(1); - libxl_primary_console_exec(ctx, bldomid, notify_fd); + libxl_primary_console_exec(ctx, bldomid, notify_fd, NULL); /* Do not return. xl continued in child process */ perror("xl: unable to exec console client"); _exit(1);