Module Name:    src
Committed By:   mlelstv
Date:           Tue Jul  2 16:23:48 UTC 2019

Modified Files:
        src/sbin/disklabel: disklabel.8 main.c

Log Message:
Add options to define labelsector and -offset and number of slices.
Make options to chose alternate label position for systems using MBR
more intuitive. -m now selects mode with MBR, -n selects mode without,
independent of the machine defaults.


To generate a diff of this commit:
cvs rdiff -u -r1.68 -r1.69 src/sbin/disklabel/disklabel.8
cvs rdiff -u -r1.50 -r1.51 src/sbin/disklabel/main.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/disklabel/disklabel.8
diff -u src/sbin/disklabel/disklabel.8:1.68 src/sbin/disklabel/disklabel.8:1.69
--- src/sbin/disklabel/disklabel.8:1.68	Mon Jul  3 21:33:41 2017
+++ src/sbin/disklabel/disklabel.8	Tue Jul  2 16:23:47 2019
@@ -1,4 +1,4 @@
-.\"	$NetBSD: disklabel.8,v 1.68 2017/07/03 21:33:41 wiz Exp $
+.\"	$NetBSD: disklabel.8,v 1.69 2019/07/02 16:23:47 mlelstv Exp $
 .\"
 .\" Copyright (c) 1987, 1988, 1991, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -41,37 +41,52 @@
 .Sh SYNOPSIS
 .\" disklabel: read label
 .Nm
-.Op Fl ACDFmrtv
+.Op Fl ACDFmnrtv
 .Op Fl B Ar endian
+.Op Fl L Ar sector
 .Op Fl M Ar machine
+.Op Fl O Ar offset
+.Op Fl P Ar size
 .Ar disk
 .\" disklabel -e: read/modify/write using $EDITOR
 .Nm
 .Fl e
-.Op Fl CDFImrv
+.Op Fl CDFImnrv
 .Op Fl B Ar endian
+.Op Fl L Ar sector
 .Op Fl M Ar machine
+.Op Fl O Ar offset
+.Op Fl P Ar size
 .Ar disk
 .\" disklabel -i: read/modify/write using builtin commands
 .Nm
 .Fl i
-.Op Fl DFImrv
+.Op Fl DFImnrv
 .Op Fl B Ar endian
+.Op Fl L Ar sector
 .Op Fl M Ar machine
+.Op Fl O Ar offset
+.Op Fl P Ar size
 .Ar disk
 .\" disklabel -R: write from edited output
 .Nm
 .Fl R
-.Op Fl DFmrv
+.Op Fl DFmnrv
 .Op Fl B Ar endian
+.Op Fl L Ar sector
 .Op Fl M Ar machine
+.Op Fl O Ar offset
+.Op Fl P Ar size
 .Ar disk Ar protofile
 .\" disklabel -w: write from disctab entry
 .Nm
 .Fl w
-.Op Fl DFmrv
+.Op Fl DFmnrv
 .Op Fl B Ar endian
+.Op Fl L Ar sector
 .Op Fl M Ar machine
+.Op Fl O Ar offset
+.Op Fl P Ar size
 .Op Fl f Ar disktab
 .Ar disk Ar disktype
 .Oo Ar packid Oc
@@ -189,8 +204,23 @@ Specify the name of a file to use instea
 .It Fl M Ar machine
 Specify the machine to generate a label for.
 Defaults to the current machine it is compiled for.
+Specific details can be overridden via environment
+and with the options
+.Fl B, L, O, p, m
+and
+.Fl n.
+.It Fl L
+num specify the relative sector number of the disklabel
+similar to the environment variable DISKLABELSECTOR.
+.It Fl O
+num specify the relative byte offset of the disklabel.
+similar to the environment variable DISKLABELOFFSET.
+.It Fl P
+num specify the size of the partition table.
 .It Fl m
 expect the label to have an MBR.
+.It Fl n
+expect the label not to have an MBR.
 .It Fl r
 Read/write the disk directly rather than using
 .Xr ioctl 2
@@ -368,3 +398,12 @@ flag causes
 to write directly to disk, and bypass the format translation.
 This will result in a disk label that the PROMs will not recognize,
 and that therefore cannot be booted from.
+.Pp
+The
+.Fl m
+flag previously toggled between using an MBR and not using an MBR,
+with the default being implied by the machine type.
+It now always enables MBR mode, independent of the machine default.
+Use the
+.Fl n
+flag to disable MBR mode.

Index: src/sbin/disklabel/main.c
diff -u src/sbin/disklabel/main.c:1.50 src/sbin/disklabel/main.c:1.51
--- src/sbin/disklabel/main.c:1.50	Wed Jun 27 01:14:48 2018
+++ src/sbin/disklabel/main.c	Tue Jul  2 16:23:47 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.50 2018/06/27 01:14:48 kamil Exp $	*/
+/*	$NetBSD: main.c,v 1.51 2019/07/02 16:23:47 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -76,7 +76,7 @@ __COPYRIGHT("@(#) Copyright (c) 1987, 19
 static char sccsid[] = "@(#)disklabel.c	8.4 (Berkeley) 5/4/95";
 /* from static char sccsid[] = "@(#)disklabel.c	1.2 (Symmetric) 11/28/85"; */
 #else
-__RCSID("$NetBSD: main.c,v 1.50 2018/06/27 01:14:48 kamil Exp $");
+__RCSID("$NetBSD: main.c,v 1.51 2019/07/02 16:23:47 mlelstv Exp $");
 #endif
 #endif	/* not lint */
 
@@ -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 < 1 || 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;
@@ -600,6 +612,10 @@ main(int argc, char *argv[])
 			usage();
 	}
 
+	if (maxpartitions > MAXPARTITIONS) {
+		errx(1, "too large maxpartitions > %u\n", MAXPARTITIONS);
+	}
+
 #if !defined(NATIVELABEL_ONLY)
 	if (maxpartitions == 0) {
 		errx(1, "unknown label: use -M/-B and $MACHINE/$MACHINE_ARCH");
@@ -989,7 +1005,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 +1385,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 +1394,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;

Reply via email to