NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: bin/54201: disklabel(8) annoyingly overrides user intent when run as a "native" tool



The following reply was made to PR bin/54201; it has been noted by GNATS.

From: mlelstv%serpens.de@localhost (Michael van Elst)
To: gnats-bugs%netbsd.org@localhost
Cc: 
Subject: Re: bin/54201: disklabel(8) annoyingly overrides user intent when run as a "native" tool
Date: Mon, 13 May 2019 05:14:05 -0000 (UTC)

 thorpej%me.com@localhost writes:
 
 >The handling of the -m flag seems unnecessarily complex in the disklabel(8) code, and also seems that how it works to lead to user confusion.
 
 Maybe this:
 
 Index: main.c
 ===================================================================
 RCS file: /cvsroot/src/sbin/disklabel/main.c,v
 retrieving revision 1.50
 diff -p -u -r1.50 main.c
 --- main.c	27 Jun 2018 01:14:48 -0000	1.50
 +++ main.c	13 May 2019 05:12:38 -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;
 
 -- 
 -- 
                                 Michael van Elst
 Internet: mlelstv%serpens.de@localhost
                                 "A potential Snark may lurk in every tree."
 


Home | Main Index | Thread Index | Old Index