Contrary to the synopsis and verbose output, using
     -p      Prepare filesystem.  This will create a new filesystem on the
             partition reserved for the boot loader on architectures that
             require one.

does only that:

        # installboot -nvp vnd0
        Using / as root
        would install bootstrap on /dev/rvnd0c
        using first-stage /usr/mdec/biosboot, second-stage /usr/mdec/boot
        would newfs 545c9bdf92aa18f9.i

No files under / are ever accessed, and no program would be installed on
the disk;  only the last line is actually true.

-p thus never cares about -r but the current code still always loads
unused files, the does the actual filesystem preparation before exiting
without doing anything with the loaded bootloader/stage files:

49 int
50 main(int argc, char **argv)
51 {
...
120         md_loadboot();
121 
122         if (prepare) {
123                 md_prepareboot(devfd, realdev);
124                 return 0;
125         }
126 
127 #ifdef SOFTRAID
128         sr_installboot(devfd, dev);
129 #else
130         md_installboot(devfd, realdev);
131 #endif
132 
133         return 0;
134 }


Hoist -p code to just do file preparation, thus stop printing false
information and fix the synopsis accordingly.

Initialise -r later only when needed such that the usage check for -p
can test whether -r was given without adding a new rflag or so.

All -p users live under /usr/src/distrib/ and exclusively call
        installboot -p $_disk

followed later on by
        installboot [anything but -p depending on platform] $_disk

I've checked all usage combination of flags and arguments, the new code
does what the new synopsis says.

Feedback? Objection? OK?


Index: installboot.8
===================================================================
RCS file: /cvs/src/usr.sbin/installboot/installboot.8,v
retrieving revision 1.5
diff -u -p -r1.5 installboot.8
--- installboot.8       20 Jul 2021 14:51:56 -0000      1.5
+++ installboot.8       18 Aug 2022 11:32:51 -0000
@@ -22,10 +22,14 @@
 .Nd install bootstrap on a disk
 .Sh SYNOPSIS
 .Nm installboot
-.Op Fl npv
+.Op Fl nv
 .Op Fl r Ar root
 .Ar disk
 .Op Ar stage1 Op Ar stage2
+.Nm
+.Op Fl nv
+.Fl p
+.Ar disk
 .Sh DESCRIPTION
 .Nm
 installs bootstrap on the specified disk.
@@ -38,7 +42,7 @@ the beginning of the disk.
 The options are as follows:
 .Bl -tag -width Ds
 .It Fl n
-Perform a dry run - do not actually write any bootstrap to the disk.
+Perform a dry run - do not actually write to the disk.
 .It Fl p
 Prepare filesystem.
 This will create a new filesystem on the partition reserved for the
Index: installboot.c
===================================================================
RCS file: /cvs/src/usr.sbin/installboot/installboot.c,v
retrieving revision 1.14
diff -u -p -r1.14 installboot.c
--- installboot.c       20 Jul 2021 14:51:56 -0000      1.14
+++ installboot.c       18 Aug 2022 11:42:43 -0000
@@ -31,17 +31,16 @@ int prepare;
 int    stages;
 int    verbose;
 
-char   *root = "/";
+char   *root;
 char   *stage1;
 char   *stage2;
 
 static __dead void
 usage(void)
 {
-       extern char *__progname;
-
-       fprintf(stderr, "usage: %s [-npv] [-r root] disk [stage1%s]\n",
-           __progname, (stages >= 2) ? " [stage2]" : "");
+       fprintf(stderr, "usage:\t%1$s [-nv] [-r root] disk [stage1%2$s]\n"
+           "\t%1$s [-nv] -p disk\n",
+           getprogname(), (stages >= 2) ? " [stage2]" : "");
 
        exit(1);
 }
@@ -80,6 +79,8 @@ main(int argc, char **argv)
 
        if (argc < 1 || argc > stages + 1)
                usage();
+       if (prepare && (root != NULL || argc > 1))
+               usage();
 
        dev = argv[0];
        if (argc > 1)
@@ -87,9 +88,21 @@ main(int argc, char **argv)
        if (argc > 2)
                stage2 = argv[2];
 
+       if ((devfd = opendev(dev, (nowrite ? O_RDONLY : O_RDWR), OPENDEV_PART,
+           &realdev)) == -1)
+               err(1, "open: %s", realdev);
+
+       if (prepare) {
+               md_prepareboot(devfd, realdev);
+               return 0;
+       }
+
        /* Prefix stages with root, unless they were user supplied. */
-       if (verbose)
+       if (verbose) {
+               if (root == NULL)
+                       root = "/";
                fprintf(stderr, "Using %s as root\n", root);
+       }
        if (argc <= 1 && stage1 != NULL) {
                stage1 = fileprefix(root, stage1);
                if (stage1 == NULL)
@@ -101,10 +114,6 @@ main(int argc, char **argv)
                        exit(1);
        }
 
-       if ((devfd = opendev(dev, (nowrite ? O_RDONLY : O_RDWR), OPENDEV_PART,
-           &realdev)) == -1)
-               err(1, "open: %s", realdev);
-
         if (verbose) {
                fprintf(stderr, "%s bootstrap on %s\n",
                    (nowrite ? "would install" : "installing"), realdev);
@@ -118,11 +127,6 @@ main(int argc, char **argv)
        }
 
        md_loadboot();
-
-       if (prepare) {
-               md_prepareboot(devfd, realdev);
-               return 0;
-       }
 
 #ifdef SOFTRAID
        sr_installboot(devfd, dev);

Reply via email to