Module Name:    src
Committed By:   christos
Date:           Sat Oct  4 01:00:42 UTC 2014

Modified Files:
        src/sbin/gpt: gpt.8 gpt.c

Log Message:
Allow specifying sector and media size on the command line.


To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/sbin/gpt/gpt.8
cvs rdiff -u -r1.35 -r1.36 src/sbin/gpt/gpt.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/gpt/gpt.8
diff -u src/sbin/gpt/gpt.8:1.32 src/sbin/gpt/gpt.8:1.33
--- src/sbin/gpt/gpt.8:1.32	Mon Sep 29 01:56:43 2014
+++ src/sbin/gpt/gpt.8	Fri Oct  3 21:00:42 2014
@@ -1,4 +1,4 @@
-.\" $NetBSD: gpt.8,v 1.32 2014/09/29 05:56:43 jnemeth Exp $
+.\" $NetBSD: gpt.8,v 1.33 2014/10/04 01:00:42 christos Exp $
 .\"
 .\" Copyright (c) 2002 Marcel Moolenaar
 .\" All rights reserved.
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD: src/sbin/gpt/gpt.8,v 1.17 2006/06/22 22:22:32 marcel Exp $
 .\"
-.Dd September 29, 2014
+.Dd October 3, 2014
 .Dt GPT 8
 .Os
 .Sh NAME
@@ -68,6 +68,12 @@ Not all commands use all default setting
 have an effect on all commands.
 .Pp
 The
+.Fl m Ar mediasize
+option overrides the default media size for the device (obtained
+from the kernel if possible) or defaulting to the file size for
+plain files.
+.Pp
+The
 .Fl p Ar partitions
 option allows the user to change the number of partitions the GPT can
 accommodate.
@@ -86,6 +92,13 @@ Currently this option is primarily usefu
 command, but the intent
 is to use it to implement dry-run behaviour.
 .Pp
+The 
+.Fl s Ar sectorsize
+option overrides the default sector size for the device (obtained
+from the kernel if possible) or
+.Dv 512
+for plain files.
+.Pp
 The
 .Fl v
 option controls the verbosity level.

Index: src/sbin/gpt/gpt.c
diff -u src/sbin/gpt/gpt.c:1.35 src/sbin/gpt/gpt.c:1.36
--- src/sbin/gpt/gpt.c:1.35	Thu Oct  2 15:15:21 2014
+++ src/sbin/gpt/gpt.c	Fri Oct  3 21:00:42 2014
@@ -35,7 +35,7 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/gpt.c,v 1.16 2006/07/07 02:44:23 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: gpt.c,v 1.35 2014/10/02 19:15:21 joerg Exp $");
+__RCSID("$NetBSD: gpt.c,v 1.36 2014/10/04 01:00:42 christos Exp $");
 #endif
 
 #include <sys/param.h>
@@ -375,6 +375,9 @@ drvctl(const char *name, u_int *sector_s
 	int dfd, res;
 	char *dname, *p;
 
+	if (*sector_size && *media_size)
+		return 0;
+
 	if ((dfd = open("/dev/drvctl", O_RDONLY)) == -1) {
 		warn("%s: /dev/drvctl", __func__);
 		return -1;
@@ -434,13 +437,15 @@ drvctl(const char *name, u_int *sector_s
 	if (number == NULL)
 		goto out;
 
-	*sector_size = prop_number_integer_value(number);
+	if (*sector_size == 0)
+		*sector_size = prop_number_integer_value(number);
 
 	number = prop_dictionary_get(geometry, "sectors-per-unit");
 	if (number == NULL)
 		goto out;
 
-	*media_size = prop_number_integer_value(number) * *sector_size;
+	if (*media_size == 0)
+		*media_size = prop_number_integer_value(number) * *sector_size;
 
 	return 0;
 out:
@@ -572,21 +577,26 @@ gpt_open(const char *dev)
 
 	if ((sb.st_mode & S_IFMT) != S_IFREG) {
 #ifdef DIOCGSECTORSIZE
-		if (ioctl(fd, DIOCGSECTORSIZE, &secsz) == -1 ||
-		    ioctl(fd, DIOCGMEDIASIZE, &mediasz) == -1)
+		if ((secsz == 0 && ioctl(fd, DIOCGSECTORSIZE, &secsz) == -1) ||
+		    (mediasz == 0 && ioctl(fd, DIOCGMEDIASIZE, &mediasz) == -1))
 			goto close;
 #endif
 #ifndef HAVE_NBTOOL_CONFIG_H
 		if (drvctl(device_name, &secsz, &mediasz) == -1)
 			goto close;
 #endif
+		if (secsz == 0 || mediasz == 0)
+			errx(1, "Please specify sector/media size");
 	} else {
-		secsz = 512;	/* Fixed size for files. */
-		if (sb.st_size % secsz) {
-			errno = EINVAL;
-			goto close;
+		if (secsz == 0)
+			secsz = 512;	/* Fixed size for files. */
+		if (mediasz == 0) {
+			if (sb.st_size % secsz) {
+				errno = EINVAL;
+				goto close;
+			}
+			mediasz = sb.st_size;
 		}
-		mediasz = sb.st_size;
 	}
 
 	/*
@@ -670,61 +680,53 @@ usage(void)
 #ifndef HAVE_NBTOOL_CONFIG_H
 	extern const char backupmsg[], restoremsg[];
 #endif
-
+	const char *p = getprogname();
+	const char *f =
+	    "[-rv] [-m <mediasize>] [-p <partitionnum>] [-s <sectorsize>]";
 
 	fprintf(stderr,
-	    "usage: %s %s\n"
-	    "       %s %s\n"
-#ifndef HAVE_NBTOOL_CONFIG_H
-	    "       %s %s\n"
-#endif
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %*s %s\n"
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %s %s\n"
+	    "Usage: %s %s <command> [<args>]\n", p, f);
+	fprintf(stderr, 
+	    "Commands:\n"
 #ifndef HAVE_NBTOOL_CONFIG_H
-	    "       %s %s\n"
+	    "       %s\n"
+	    "       %s\n"
 #endif
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %s %s\n"
-	    "       %*s %s\n"
-	    "       %s %s\n",
-	    getprogname(), addmsg1,
-	    getprogname(), addmsg2,
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n"
+	    "       %s\n",
+	    addmsg1, addmsg2,
 #ifndef HAVE_NBTOOL_CONFIG_H
-	    getprogname(), backupmsg,
+	    backupmsg,
 #endif
-	    getprogname(), biosbootmsg,
-	    getprogname(), createmsg,
-	    getprogname(), destroymsg,
-	    getprogname(), labelmsg1,
-	    getprogname(), labelmsg2,
-	    (int)strlen(getprogname()), "", labelmsg3,
-	    getprogname(), migratemsg,
-	    getprogname(), recovermsg,
-	    getprogname(), removemsg1,
-	    getprogname(), removemsg2,
-	    getprogname(), resizemsg,
-	    getprogname(), resizediskmsg,
+	    biosbootmsg, createmsg, destroymsg,
+	    labelmsg1, labelmsg2, labelmsg3,
+	    migratemsg, recovermsg,
+	    removemsg1, removemsg2,
+	    resizemsg, resizediskmsg,
 #ifndef HAVE_NBTOOL_CONFIG_H
-	    getprogname(), restoremsg,
+	    restoremsg,
 #endif
-	    getprogname(), setmsg,
-	    getprogname(), showmsg,
-	    getprogname(), typemsg1,
-	    getprogname(), typemsg2,
-	    (int)strlen(getprogname()), "", typemsg3,
-	    getprogname(), unsetmsg);
+	    setmsg, showmsg,
+	    typemsg1, typemsg2, typemsg3,
+	    unsetmsg);
 	exit(1);
 }
 
@@ -751,8 +753,15 @@ main(int argc, char *argv[])
 	int ch, i;
 
 	/* Get the generic options */
-	while ((ch = getopt(argc, argv, "p:rv")) != -1) {
+	while ((ch = getopt(argc, argv, "m:p:rs:v")) != -1) {
 		switch(ch) {
+		case 'm':
+			if (mediasz > 0)
+				usage();
+			mediasz = strtoul(optarg, &p, 10);
+			if (*p != 0 || mediasz < 1)
+				usage();
+			break;
 		case 'p':
 			if (parts > 0)
 				usage();
@@ -763,6 +772,13 @@ main(int argc, char *argv[])
 		case 'r':
 			readonly = 1;
 			break;
+		case 's':
+			if (secsz > 0)
+				usage();
+			secsz = strtoul(optarg, &p, 10);
+			if (*p != 0 || secsz < 1)
+				usage();
+			break;
 		case 'v':
 			verbose++;
 			break;

Reply via email to