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

[Xen-devel] [PATCH] Extending XL console command to take -e option that allows user to change escape character. Previously, Escape character was hardcoded as 0x1d i.e '^]'. Now, User has can provide escape character of his/her choice. It can be specified as any char starting with ^. For example, xl console -e ^a testDomain



---
 tools/console/client/main.c | 26 ++++++++++++++++++++++++--
 tools/libxl/libxl.c         | 15 ++++++++++-----
 tools/libxl/libxl.h         | 23 ++++++++++++++++++++---
 tools/libxl/xl_cmdimpl.c    | 30 ++++++++++++++++++++++++------
 tools/libxl/xl_cmdtable.c   |  5 +++--
 5 files changed, 81 insertions(+), 18 deletions(-)

diff --git a/tools/console/client/main.c b/tools/console/client/main.c
index d006fdc..e175bbe 100644
--- a/tools/console/client/main.c
+++ b/tools/console/client/main.c
@@ -35,6 +35,7 @@
 #include <sys/select.h>
 #include <err.h>
 #include <string.h>
+#include <ctype.h>
 #ifdef __sun__
 #include <sys/stropts.h>
 #endif
@@ -45,10 +46,12 @@
 
 #define ESCAPE_CHARACTER 0x1d
 
+
+
 static volatile sig_atomic_t received_signal = 0;
 static char lockfile[sizeof (XEN_LOCK_DIR "/xenconsole.") + 8] = { 0 };
 static int lockfd = -1;
-
+static char escapechar = ESCAPE_CHARACTER;
 static void sighandler(int signum)
 {
        received_signal = 1;
@@ -214,7 +217,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] == escapechar) {
                                return 0;
                        } 
 
@@ -318,6 +321,19 @@ static void console_unlock(void)
        }
 }
 
+
+char getControlChar(char c) {
+       return (c ^ 0x40);
+}
+
+char getEscapeChar(const char *s)
+{
+    if (*s == '^')
+        return getControlChar(s[1]);
+
+    return *s;
+}
+
 int main(int argc, char **argv)
 {
        struct termios attr;
@@ -329,6 +345,7 @@ int main(int argc, char **argv)
        struct option lopt[] = {
                { "type",     1, 0, 't' },
                { "num",     1, 0, 'n' },
+               { "e",     1, 0, 'n' },
                { "help",    0, 0, 'h' },
                { 0 },
 
@@ -363,6 +380,11 @@ int main(int argc, char **argv)
                                exit(EINVAL);
                        }
                        break;
+               case 'e' :
+                   escapechar = getEscapeChar(optarg);
+            break;
+
+
                default:
                        fprintf(stderr, "Invalid argument\n");
                        fprintf(stderr, "Try `%s --help' for more 
information.\n", 
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 4cdc169..2b9ae22 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -1715,14 +1715,16 @@ static void domain_destroy_domid_cb(libxl__egc *egc,
 }
 
 int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num,
-                       libxl_console_type type)
+                       libxl_console_type type, char escapechar)
 {
+
+    
     GC_INIT(ctx);
     char *p = GCSPRINTF("%s/xenconsole", libxl__private_bindir_path());
     char *domid_s = GCSPRINTF("%d", domid);
     char *cons_num_s = GCSPRINTF("%d", cons_num);
     char *cons_type_s;
-
+    char *cons_escape_char = GCSPRINTF("%c", escapechar); 
     switch (type) {
     case LIBXL_CONSOLE_TYPE_PV:
         cons_type_s = "pv";
@@ -1734,7 +1736,10 @@ int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, 
int cons_num,
         goto out;
     }
 
-    execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s, (void 
*)NULL);
+   if(cons_escape_char == 0)
+        execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s,(void 
*)NULL);
+   else
+        execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s, 
"--e", cons_escape_char, (void *)NULL);
 
 out:
     GC_FREE;
@@ -1823,7 +1828,7 @@ out:
     return rc;
 }
 
-int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
+int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm, char 
escapechar)
 {
     uint32_t domid;
     int cons_num;
@@ -1832,7 +1837,7 @@ int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t 
domid_vm)
 
     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);
+    return libxl_console_exec(ctx, domid, cons_num, type, escapechar);
 }
 
 int libxl_primary_console_get_tty(libxl_ctx *ctx, uint32_t domid_vm,
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index f9e3ef5..4ac8cfd 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -218,6 +218,12 @@
 #define LIBXL_HAVE_SOFT_RESET 1
 
 /*
+ if user does not specify any escape character sequence then 
+ Default escape character will be ^] 
+ */
+
+#define CTRL_CLOSE_BRACKET '\e'
+/*
  * libxl ABI compatibility
  *
  * The only guarantee which libxl makes regarding ABI compatibility
@@ -1317,15 +1323,26 @@ int libxl_wait_for_free_memory(libxl_ctx *ctx, uint32_t 
domid, uint32_t memory_k
 int libxl_wait_for_memory_target(libxl_ctx *ctx, uint32_t domid, int 
wait_secs);
 
 int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass);
-int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, 
libxl_console_type type);
+
+
+/*
+ *  Escapechar can be specified , If specified given escape char will
+ *  be used for terminating logging. Otherwise default Ctrl-] will be used,
+ */
+int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, 
libxl_console_type type, char escapechar);
 /* 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
  * if the guest is using stubdoms).
  * This function can be called after creating the device model, in
  * case of HVM guests, and before libxl_run_bootloader in case of PV
- * guests using pygrub. */
-int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm);
+ * guests using pygrub. 
+ *
+ * Escapechar can be specified , If specified given escape char will
+ * be used for terminating logging. Otherwise default Ctrl-] will be used,
+ */
+ 
+int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm, char 
escapechar);
 
 /* libxl_console_get_tty retrieves the specified domain's console tty path
  * and stores it in path. Caller is responsible for freeing the memory.
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 990d3c9..da290b6 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -1,3 +1,4 @@
+
 /*
  * Copyright (C) 2009      Citrix Ltd.
  * Author Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
@@ -41,7 +42,9 @@
 #include "libxl_json.h"
 #include "libxlutil.h"
 #include "xl.h"
-
+#define ESCAPE_CHARACTER 0x1d
+char getControlChar(char c);
+char getEscapeChar(const char *s);
 /* For calls which return an errno on failure */
 #define CHK_ERRNOVAL( call ) ({                                         \
         int chk_errnoval = (call);                                      \
@@ -2623,7 +2626,7 @@ static void autoconnect_console(libxl_ctx *ctx_ignored,
     postfork();
 
     sleep(1);
-    libxl_primary_console_exec(ctx, bldomid);
+    libxl_primary_console_exec(ctx, bldomid, ESCAPE_CHARACTER);
     /* Do not return. xl continued in child process */
     perror("xl: unable to exec console client");
     _exit(1);
@@ -3411,14 +3414,24 @@ int main_cd_insert(int argc, char **argv)
     cd_insert(domid, virtdev, file);
     return 0;
 }
+char getControlChar(char c) {
+    return c ^ 0x40;
+}
+char getEscapeChar(const char *s)
+{
+    if (*s == '^')
+        return getControlChar(s[1]);
 
+    return *s;
+}
 int main_console(int argc, char **argv)
 {
     uint32_t domid;
     int opt = 0, num = 0;
+    char escapechar = ESCAPE_CHARACTER;
     libxl_console_type type = 0;
 
-    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;
@@ -3432,13 +3445,18 @@ int main_console(int argc, char **argv)
     case 'n':
         num = atoi(optarg);
         break;
+    case 'e':
+        escapechar = getEscapeChar(optarg);
+        break;
     }
 
     domid = find_domain(argv[optind]);
     if (!type)
-        libxl_primary_console_exec(ctx, domid);
-    else
-        libxl_console_exec(ctx, domid, num, type);
+        libxl_primary_console_exec(ctx, domid, escapechar);
+    else 
+        libxl_console_exec(ctx, domid, num, type, escapechar); 
+
+        
     fprintf(stderr, "Unable to attach console\n");
     return 1;
 }
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
index fdc1ac6..794c7c1 100644
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -133,8 +133,9 @@ struct cmd_spec cmd_table[] = {
       &main_console, 0, 0,
       "Attach to domain's console",
       "[options] <Domain>\n"
-      "-t <type>       console type, pv or serial\n"
-      "-n <number>     console number"
+      "-t <type>             console type, pv or serial\n"
+      "-n <number>           console number\n"
+      "-e <escapechar>       escape character"
     },
     { "vncviewer",
       &main_vncviewer, 0, 0,
-- 
1.9.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

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