This moves setup code from main() into its own function so instead of
upfront it can be used only when and where needed.

With the exception of `create-vdisk' all currently open /dev/hvctl;  for
that command I added a rather quirky goto to avoid this unneeded step,
but `list-io' for example does not need /dev/hvctl at all either.

So instead of adding more quirks, split as per above and clearly call
hv_config() from the commands that *do* require it.

This also effectively defers such privileged operations after all argv[]
parsing is done, that is the code fails earlier on invalid input without
file I/O for nothing.

With that in, I can easily add more commands not requiring hvctl access,
e.g. a dry-run configuration check.

OK?


Index: ldomctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/ldomctl/ldomctl.c,v
retrieving revision 1.31
diff -u -p -r1.31 ldomctl.c
--- ldomctl.c   28 Dec 2019 18:36:02 -0000      1.31
+++ ldomctl.c   31 Dec 2019 02:15:14 -0000
@@ -83,6 +83,7 @@ struct command commands[] = {
 
 void hv_open(void);
 void hv_close(void);
+void hv_config(void);
 void hv_read(uint64_t, void *, size_t);
 void hv_write(uint64_t, void *, size_t);
 
@@ -103,11 +104,6 @@ int
 main(int argc, char **argv)
 {
        struct command *cmdp;
-       struct hvctl_msg msg;
-       ssize_t nbytes;
-       struct md_header hdr;
-       struct md_node *node;
-       struct md_prop *prop;
 
        if (argc < 2)
                usage();
@@ -122,46 +118,6 @@ main(int argc, char **argv)
        if (cmdp->cmd_name == NULL)
                usage();
 
-       if (strcmp(argv[0], "create-vdisk") == 0)
-               goto skip_hv;
-
-       hv_open();
-
-       /*
-        * Request config.
-        */
-       bzero(&msg, sizeof(msg));
-       msg.hdr.op = HVCTL_OP_GET_HVCONFIG;
-       msg.hdr.seq = hvctl_seq++;
-       nbytes = write(hvctl_fd, &msg, sizeof(msg));
-       if (nbytes != sizeof(msg))
-               err(1, "write");
-
-       bzero(&msg, sizeof(msg));
-       nbytes = read(hvctl_fd, &msg, sizeof(msg));
-       if (nbytes != sizeof(msg))
-               err(1, "read");
-
-       hv_membase = msg.msg.hvcnf.hv_membase;
-       hv_memsize = msg.msg.hvcnf.hv_memsize;
-
-       hv_mdpa = msg.msg.hvcnf.hvmdp;
-       hv_read(hv_mdpa, &hdr, sizeof(hdr));
-       hvmd_len = sizeof(hdr) + hdr.node_blk_sz + hdr.name_blk_sz +
-           hdr.data_blk_sz;
-       hvmd_buf = xmalloc(hvmd_len);
-       hv_read(hv_mdpa, hvmd_buf, hvmd_len);
-
-       hvmd = md_ingest(hvmd_buf, hvmd_len);
-       node = md_find_node(hvmd, "guests");
-       TAILQ_INIT(&guest_list);
-       TAILQ_FOREACH(prop, &node->prop_list, link) {
-               if (prop->tag == MD_PROP_ARC &&
-                   strcmp(prop->name->str, "fwd") == 0)
-                       add_guest(prop->d.arc.node);
-       }
-
-skip_hv:
        (cmdp->cmd_func)(argc, argv);
 
        exit(EXIT_SUCCESS);
@@ -288,6 +244,8 @@ init_system(int argc, char **argv)
        if (argc != 2)
                usage();
 
+       hv_config();
+
        build_config(argv[1]);
 }
 
@@ -300,6 +258,8 @@ list(int argc, char **argv)
        if (argc != 1)
                usage();
 
+       hv_config();
+
        dc = ds_conn_open("/dev/spds", NULL);
        mdstore_register(dc);
        while (TAILQ_EMPTY(&mdstore_sets))
@@ -332,6 +292,8 @@ xselect(int argc, char **argv)
        if (argc != 2)
                usage();
 
+       hv_config();
+
        dc = ds_conn_open("/dev/spds", NULL);
        mdstore_register(dc);
        while (TAILQ_EMPTY(&mdstore_sets))
@@ -351,6 +313,8 @@ delete(int argc, char **argv)
        if (strcmp(argv[1], "factory-default") == 0)
                errx(1, "\"%s\" should not be deleted", argv[1]);
 
+       hv_config();
+
        dc = ds_conn_open("/dev/spds", NULL);
        mdstore_register(dc);
        while (TAILQ_EMPTY(&mdstore_sets))
@@ -409,6 +373,8 @@ download(int argc, char **argv)
        if (argc != 2)
                usage();
 
+       hv_config();
+
        dc = ds_conn_open("/dev/spds", NULL);
        mdstore_register(dc);
        while (TAILQ_EMPTY(&mdstore_sets))
@@ -426,6 +392,8 @@ guest_start(int argc, char **argv)
        if (argc != 2)
                usage();
 
+       hv_config();
+
        /*
         * Start guest domain.
         */
@@ -452,6 +420,8 @@ guest_stop(int argc, char **argv)
        if (argc != 2)
                usage();
 
+       hv_config();
+
        /*
         * Stop guest domain.
         */
@@ -478,6 +448,8 @@ guest_panic(int argc, char **argv)
        if (argc != 2)
                usage();
 
+       hv_config();
+
        /*
         * Stop guest domain.
         */
@@ -513,6 +485,9 @@ guest_status(int argc, char **argv)
 
        if (argc < 1 || argc > 2)
                usage();
+
+       hv_config();
+
        if (argc == 2)
                gid = find_guest(argv[1]);
 
@@ -632,6 +607,8 @@ guest_console(int argc, char **argv)
        if (argc != 2)
                usage();
 
+       hv_config();
+
        gid = find_guest(argv[1]);
        if (gid == 0)
                errx(1, "no console for primary domain");
@@ -700,6 +677,52 @@ hv_close(void)
 {
        close(hvctl_fd);
        hvctl_fd = -1;
+}
+
+void
+hv_config(void)
+{
+       struct hvctl_msg msg;
+       ssize_t nbytes;
+       struct md_header hdr;
+       struct md_node *node;
+       struct md_prop *prop;
+
+       hv_open();
+
+       /*
+        * Request config.
+        */
+       bzero(&msg, sizeof(msg));
+       msg.hdr.op = HVCTL_OP_GET_HVCONFIG;
+       msg.hdr.seq = hvctl_seq++;
+       nbytes = write(hvctl_fd, &msg, sizeof(msg));
+       if (nbytes != sizeof(msg))
+               err(1, "write");
+
+       bzero(&msg, sizeof(msg));
+       nbytes = read(hvctl_fd, &msg, sizeof(msg));
+       if (nbytes != sizeof(msg))
+               err(1, "read");
+
+       hv_membase = msg.msg.hvcnf.hv_membase;
+       hv_memsize = msg.msg.hvcnf.hv_memsize;
+
+       hv_mdpa = msg.msg.hvcnf.hvmdp;
+       hv_read(hv_mdpa, &hdr, sizeof(hdr));
+       hvmd_len = sizeof(hdr) + hdr.node_blk_sz + hdr.name_blk_sz +
+           hdr.data_blk_sz;
+       hvmd_buf = xmalloc(hvmd_len);
+       hv_read(hv_mdpa, hvmd_buf, hvmd_len);
+
+       hvmd = md_ingest(hvmd_buf, hvmd_len);
+       node = md_find_node(hvmd, "guests");
+       TAILQ_INIT(&guest_list);
+       TAILQ_FOREACH(prop, &node->prop_list, link) {
+               if (prop->tag == MD_PROP_ARC &&
+                   strcmp(prop->name->str, "fwd") == 0)
+                       add_guest(prop->d.arc.node);
+       }
 }
 
 void

Reply via email to