]> git.proxmox.com Git - mirror_lxc.git/commitdiff
Added -e to lxc-console to change command character (defaults to '^a')
authorTaisuke Yamada <tai@rakugaki.org>
Mon, 18 Jan 2010 22:08:12 +0000 (23:08 +0100)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Mon, 18 Jan 2010 22:08:12 +0000 (23:08 +0100)
I noticed lxc-console uses '^a' as command-mode prefix to
escape out of console session, so created a patch to make it
configurable. With this, you can do

  lxc-console -n foo -e ^t

and exit the session with 'Ctrl+t q'.

For emacs-binding addicts (like me), it's always nice to
let shell handle '^a' as 'beginning-of-line' command...

Signed-off-by: Taisuke Yamada <tai@rakugaki.org>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/arguments.h
src/lxc/lxc_console.c

index 71ca6693889dda7ca9bfdcd215497ef67d3d2fd3..3bc027d473b82fe47ee832543ba7828a45e1b9d6 100644 (file)
@@ -51,6 +51,7 @@ struct lxc_arguments {
 
        /* for lxc-console */
        int ttynum;
+       char escape;
 
        /* for lxc-wait */
        char *states;
index 2ee1c483faeea5ee38035acefd17251465a8a802..7f0e83e1d3c609cb9f893b06d6de73b8573d15b0 100644 (file)
 
 lxc_log_define(lxc_console_ui, lxc_console);
 
+static char etoc(const char *expr)
+{
+       /* returns "control code" of given expression */
+       char c = expr[0] == '^' ? expr[1] : expr[0];
+       return 1 + ((c > 'Z') ? (c - 'a') : (c - 'Z'));
+}
+
 static int my_parser(struct lxc_arguments* args, int c, char* arg)
 {
        switch (c) {
        case 't': args->ttynum = atoi(arg); break;
+       case 'e': args->escape = etoc(arg); break;
        }
        return 0;
 }
 
 static const struct option my_longopts[] = {
        {"tty", required_argument, 0, 't'},
+       {"escape", required_argument, 0, 'e'},
        LXC_COMMON_OPTIONS
 };
 
@@ -67,12 +76,14 @@ static struct lxc_arguments my_args = {
 lxc-console logs on the container with the identifier NAME\n\
 \n\
 Options :\n\
-  -n, --name=NAME   NAME for name of the container\n\
-  -t, --tty=NUMBER  console tty number\n",
+  -n, --name=NAME      NAME for name of the container\n\
+  -t, --tty=NUMBER     console tty number\n\
+  -e, --escape=PREFIX  prefix for escape command\n",
        .options  = my_longopts,
        .parser   = my_parser,
        .checker  = NULL,
        .ttynum = -1,
+       .escape = 1,
 };
 
 static int master = -1;
@@ -131,7 +142,8 @@ int main(int argc, char *argv[])
        if (err)
                goto out;
 
-       fprintf(stderr, "\nType <Ctrl+a q> to exit the console\n");
+       fprintf(stderr, "\nType <Ctrl+%c q> to exit the console\n",
+                'a' + my_args.escape - 1);
 
        setsid();
        signal(SIGWINCH, sigwinch);
@@ -167,7 +179,7 @@ int main(int argc, char *argv[])
                        }
 
                        /* we want to exit the console with Ctrl+a q */
-                       if (c == 1) {
+                       if (c == my_args.escape) {
                                wait4q = !wait4q;
                                continue;
                        }