> Date: Thu, 16 Jan 2020 15:26:13 +0100
> From: Klemens Nanni <[email protected]>
> Content-Type: text/plain; charset=us-ascii
> Content-Disposition: inline
>
> 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?
Sure, if Ingo is happy with this it has my blessing.
> 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
>
>