[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen master] tools/console: Add escape argument to configure escape character



commit 01e0e70c9a6d61d404082994d4d5b9828392e5e3
Author:     Peter Hoyes <Peter.Hoyes@xxxxxxx>
AuthorDate: Thu Jul 27 09:47:33 2023 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu Jul 27 09:47:33 2023 +0200

    tools/console: Add escape argument to configure escape character
    
    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 <Peter.Hoyes@xxxxxxx>
    Reviewed-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
    Reviewed-by: Hongda Deng <hongda.deng@xxxxxxx>
---
 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 <xenstore.h>
 #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);
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.