Index: sbin/disklabel/main.c
===================================================================
RCS file: /cvsroot/src/sbin/disklabel/main.c,v
retrieving revision 1.50
diff -p -u -r1.50 main.c
--- sbin/disklabel/main.c       27 Jun 2018 01:14:48 -0000      1.50
+++ sbin/disklabel/main.c       29 Jun 2019 09:18:41 -0000
@@ -154,7 +154,6 @@ static      int     tflag;          /* Format output as d
static int     Dflag;          /* Delete old labels (use with write) */
static int     Iflag;          /* Read/write direct, but default if absent */
static int     lflag;          /* List all known file system types and exit */
-static int     mflag;          /* Expect disk to contain an MBR */
static int verbose;
static int read_all;           /* set if op = READ && Aflag */

@@ -481,6 +480,7 @@ main(int argc, char *argv[])
#endif
               DELETE
       } op = UNSPEC, old_op;
+       unsigned long val;

#ifndef HAVE_NBTOOL_CONFIG_H
#if !defined(NATIVELABEL_ONLY)
@@ -502,22 +502,13 @@ main(int argc, char *argv[])
       }
#endif

-       mflag = labelusesmbr;
-       if (mflag < 0) {
-#if HAVE_NBTOOL_CONFIG_H
-               warn("getlabelusesmbr() failed");
-#else
-               warn("getlabelusesmbr() failed");
-               mflag = LABELUSESMBR;
-#endif
-       }
#if HAVE_NBTOOL_CONFIG_H
       /* We must avoid doing any ioctl requests */
       Fflag = rflag = 1;
#endif

       error = 0;
-       while ((ch = getopt(argc, argv, "AB:CDFIM:NRWef:ilmrtvw")) != -1) {
+       while ((ch = getopt(argc, argv, "AB:CDFIL:M:NO:P:RWef:ilmnrtvw")) != -1) {
               old_op = op;
               switch (ch) {
               case 'A':       /* Action all labels */
@@ -559,6 +550,24 @@ main(int argc, char *argv[])
               case 'N':       /* Disallow writes to label sector */
                       op = SETREADONLY;
                       break;
+               case 'L':       /* Label sector */
+                       val = strtoul(optarg, NULL, 10);
+                       if ((val == ULONG_MAX && errno == ERANGE) || val > UINT_MAX)
+                               err(EXIT_FAILURE, "invalid label sector: %s", optarg);
+                       labelsector = val;
+                       break;
+               case 'O':       /* Label offset */
+                       val = strtoul(optarg, NULL, 10);
+                       if ((val == ULONG_MAX && errno == ERANGE) || val > UINT_MAX)
+                               err(EXIT_FAILURE, "invalid label offset: %s", optarg);
+                       labeloffset = val;
+                       break;
+               case 'P':       /* Max partitions */
+                       val = strtoul(optarg, NULL, 10);
+                       if ((val == ULONG_MAX && errno == ERANGE) || val > UINT_MAX)
+                               err(EXIT_FAILURE, "invalid max partitions: %s", optarg);
+                       maxpartitions = val;
+                       break;
               case 'W':       /* Allow writes to label sector */
                       op = SETWRITABLE;
                       break;
@@ -578,7 +587,10 @@ main(int argc, char *argv[])
                       lflag = 1;
                       break;
               case 'm':       /* Expect disk to have an MBR */
-                       mflag ^= 1;
+                       labelusesmbr = 1;
+                       break;
+               case 'n':       /* Expect disk to not have an MBR */
+                       labelusesmbr = 0;
                       break;
               case 'r':       /* Read/write label directly from disk */
                       rflag = 1;
@@ -989,7 +1001,7 @@ readlabel_mbr(int f, u_int sector)
static int
writelabel_mbr(int f, u_int sector)
{
-       return update_label(f, sector, mflag ? LABELOFFSET_MBR : ~0U) ? 2 : 0;
+       return update_label(f, sector, labelusesmbr ? LABELOFFSET_MBR : ~0U) ? 2 : 0;
}

#endif /* !NO_MBR_SUPPORT */
@@ -1369,7 +1381,7 @@ readlabel_direct(int f)
               }
       }

-       if (mflag && process_mbr(f, readlabel_mbr) == 0)
+       if (labelusesmbr && process_mbr(f, readlabel_mbr) == 0)
               return 0;

       disk_lp = find_label(f, 0);
@@ -1378,7 +1390,7 @@ readlabel_direct(int f)
               return 0;
       }

-       if (!mflag && process_mbr(f, readlabel_mbr) == 0)
+       if (!labelusesmbr && process_mbr(f, readlabel_mbr) == 0)
               return 0;

       return 1;