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;