> 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
> 
> 

Reply via email to