In my case, accessing guest domain consoles always happens through SSH, ILOM, or conserver, so there's usually one more level to escape.
Changing cu(1)'s escape character makes things easier to type and harder to mess up (~. instead of ~~. kills SSH/whatever instead of the guest console). Using 'cu -l ttyV* -E@' is not an option as 'ldomctl console -E@ foo' takes care of the name-to-tty mapping, which may change with ldom.conf changes. 'ldomctl start|panic -c foo' also drop into the console but seem like briefly used shortcuts (watch boot log, debug a specific thing) whereas 'ldomctl console foo' is usually used for long running console access. Feedback? OK? (for after release) diff --git a/usr.sbin/ldomctl/ldomctl.8 b/usr.sbin/ldomctl/ldomctl.8 index 6d4b6dee6b5..776a2270809 100644 --- a/usr.sbin/ldomctl/ldomctl.8 +++ b/usr.sbin/ldomctl/ldomctl.8 @@ -44,10 +44,16 @@ in bytes. can be specified with a human-readable scale, using the format described in .Xr scan_scaled 3 , e.g. 512M. -.It Cm console Ar domain +.It Cm console Oo Fl E Ar escape_char Oc Ar domain Using .Xr cu 1 connect to the console of the guest domain. +.Bl -tag -width 3n +.It Fl E Ar escape_char +Specify an escape character as per +.Xr cu 1 +.Fl E . +.El .It Cm delete Ar configuration Delete the specified configuration from non-volatile storage. .It Cm download Ar directory diff --git a/usr.sbin/ldomctl/ldomctl.c b/usr.sbin/ldomctl/ldomctl.c index e48a560f7db..906ab414488 100644 --- a/usr.sbin/ldomctl/ldomctl.c +++ b/usr.sbin/ldomctl/ldomctl.c @@ -131,7 +131,8 @@ usage(void) "\t%1$s init-system [-n] file\n" "\t%1$s create-vdisk -s size file\n" "\t%1$s panic|start [-c] domain\n" - "\t%1$s console|status|stop [domain]\n", + "\t%1$s status|stop [domain]\n" + "\t%1$s console [-E escape_char] domain\n", getprogname()); exit(EXIT_FAILURE); @@ -403,7 +404,7 @@ download(int argc, char **argv) } void -console_exec(uint64_t gid) +console_exec(uint64_t gid, const char *escape_char) { struct guest *guest; char console_str[8]; @@ -419,6 +420,7 @@ console_exec(uint64_t gid) closefrom(STDERR_FILENO + 1); execl(LDOMCTL_CU, LDOMCTL_CU, "-r", "-l", console_str, + "-E", (escape_char != NULL) ? escape_char : "~", (char *)NULL); err(1, "failed to open console"); } @@ -468,7 +470,7 @@ guest_start(int argc, char **argv) err(1, "read"); if (console) - console_exec(gid); + console_exec(gid, NULL); } void @@ -543,7 +545,7 @@ guest_panic(int argc, char **argv) err(1, "read"); if (console) - console_exec(gid); + console_exec(gid, NULL); } void @@ -680,15 +682,29 @@ void guest_console(int argc, char **argv) { uint64_t gid; + int ch; + const char *Earg = NULL; - if (argc != 2) + while ((ch = getopt(argc, argv, "E:")) != -1) { + switch (ch) { + case 'E': + Earg = optarg; + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (argc != 1) usage(); hv_config(); - gid = find_guest(argv[1]); + gid = find_guest(argv[0]); - console_exec(gid); + console_exec(gid, Earg); } void