Is there any possibility that the same -c option could be added to > ldomctl panic -c <guest> It would be very useful.
On Thu, 16 Jan 2020 at 14:31, Klemens Nanni <[email protected]> wrote: > On Thu, Jan 16, 2020 at 02:27:42PM +0100, Klemens Nanni wrote: > > Just like vmctl(8), this implements the little convenience for ldomctl: > > > > $ doas ./obj/ldomctl start -c guest4 > > Connected to /dev/ttyV3 (speed 9600) > > ... > > > > To avoid duplicate code, I moved the now common exec routine into > > console_exec() which is used by guest_console() and guest_start(). > Here's with updated usage: > > $ ./obj/ldomctl > usage: ldomctl delete|select configuration > ldomctl download directory > ldomctl dump|list|list-io > ldomctl init-system [-n] file > ldomctl create-vdisk -s size file > ldomctl start [-c] domain > ldomctl console|panic|status|stop [domain] > > OK? > > > Index: ldomctl.8 > =================================================================== > RCS file: /cvs/src/usr.sbin/ldomctl/ldomctl.8,v > retrieving revision 1.24 > diff -u -p -r1.24 ldomctl.8 > --- ldomctl.8 9 Jan 2020 21:30:18 -0000 1.24 > +++ ldomctl.8 16 Jan 2020 13:02:43 -0000 > @@ -94,8 +94,12 @@ the default behaviour is to enter > .It Cm select Ar configuration > Select the next logical domain configuration to use > (after resetting the machine). > -.It Cm start Ar domain > +.It Cm start Oo Fl c Oc Ar domain > Start a guest domain. > +.Bl -tag -width Fl > +.It Fl c > +Automatically connect to the guest console. > +.El > .It Cm status Op Ar domain > Display status information for > .Ar domain , > Index: ldomctl.c > =================================================================== > RCS file: /cvs/src/usr.sbin/ldomctl/ldomctl.c,v > retrieving revision 1.34 > diff -u -p -r1.34 ldomctl.c > --- ldomctl.c 4 Jan 2020 17:30:41 -0000 1.34 > +++ ldomctl.c 16 Jan 2020 14:24:24 -0000 > @@ -131,7 +131,10 @@ usage(void) > "\t%1$s dump|list|list-io\n" > "\t%1$s init-system [-n] file\n" > "\t%1$s create-vdisk -s size file\n" > - "\t%1$s console|panic|start|status|stop [domain]\n", > getprogname()); > + "\t%1$s start [-c] domain\n" > + "\t%1$s console|panic|status|stop [domain]\n", > + getprogname()); > + > exit(EXIT_FAILURE); > } > > @@ -399,23 +402,61 @@ download(int argc, char **argv) > } > > void > +console_exec(uint64_t gid) > +{ > + struct guest *guest; > + char console_str[8]; > + > + if (gid == 0) > + errx(1, "no console for primary domain"); > + > + TAILQ_FOREACH(guest, &guest_list, link) { > + if (guest->gid != gid) > + continue; > + snprintf(console_str, sizeof(console_str), > + "ttyV%llu", guest->gid - 1); > + > + closefrom(STDERR_FILENO + 1); > + execl(LDOMCTL_CU, LDOMCTL_CU, "-r", "-l", console_str, > + (char *)NULL); > + err(1, "failed to open console"); > + } > +} > + > +void > guest_start(int argc, char **argv) > { > struct hvctl_msg msg; > ssize_t nbytes; > + uint64_t gid; > + int ch, console = 0; > > - if (argc != 2) > + while ((ch = getopt(argc, argv, "c")) != -1) { > + switch (ch) { > + case 'c': > + console = 1; > + break; > + default: > + usage(); > + } > + } > + argc -= optind; > + argv += optind; > + > + if (argc != 1) > usage(); > > hv_config(); > > + gid = find_guest(argv[0]); > + > /* > * Start guest domain. > */ > bzero(&msg, sizeof(msg)); > msg.hdr.op = HVCTL_OP_GUEST_START; > msg.hdr.seq = hvctl_seq++; > - msg.msg.guestop.guestid = find_guest(argv[1]); > + msg.msg.guestop.guestid = gid; > nbytes = write(hvctl_fd, &msg, sizeof(msg)); > if (nbytes != sizeof(msg)) > err(1, "write"); > @@ -424,6 +465,9 @@ guest_start(int argc, char **argv) > nbytes = read(hvctl_fd, &msg, sizeof(msg)); > if (nbytes != sizeof(msg)) > err(1, "read"); > + > + if (console) > + console_exec(gid); > } > > void > @@ -615,9 +659,7 @@ guest_status(int argc, char **argv) > void > guest_console(int argc, char **argv) > { > - struct guest *guest; > uint64_t gid; > - char console_str[8]; > > if (argc != 2) > usage(); > @@ -625,20 +667,8 @@ guest_console(int argc, char **argv) > hv_config(); > > gid = find_guest(argv[1]); > - if (gid == 0) > - errx(1, "no console for primary domain"); > > - TAILQ_FOREACH(guest, &guest_list, link) { > - if (guest->gid != gid) > - continue; > - snprintf(console_str, sizeof(console_str), > - "ttyV%llu", guest->gid - 1); > - > - closefrom(STDERR_FILENO + 1); > - execl(LDOMCTL_CU, LDOMCTL_CU, "-r", "-l", console_str, > - (char *)NULL); > - err(1, "failed to open console"); > - } > + console_exec(gid); > } > > void > >
