Source-Changes-HG archive

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

[src/trunk]: src/sbin/gpt Allow specifying sector and media size on the comma...



details:   https://anonhg.NetBSD.org/src/rev/40e4161f3015
branches:  trunk
changeset: 802827:40e4161f3015
user:      christos <christos%NetBSD.org@localhost>
date:      Sat Oct 04 01:00:42 2014 +0000

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

diffstat:

 sbin/gpt/gpt.8 |   17 ++++++-
 sbin/gpt/gpt.c |  132 +++++++++++++++++++++++++++++++-------------------------
 2 files changed, 89 insertions(+), 60 deletions(-)

diffs (251 lines):

diff -r 2d5bebff53a2 -r 40e4161f3015 sbin/gpt/gpt.8
--- a/sbin/gpt/gpt.8    Fri Oct 03 20:56:24 2014 +0000
+++ b/sbin/gpt/gpt.8    Sat Oct 04 01:00:42 2014 +0000
@@ -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 @@
 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 @@
 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.
diff -r 2d5bebff53a2 -r 40e4161f3015 sbin/gpt/gpt.c
--- a/sbin/gpt/gpt.c    Fri Oct 03 20:56:24 2014 +0000
+++ b/sbin/gpt/gpt.c    Sat Oct 04 01:00:42 2014 +0000
@@ -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 @@
        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 @@
        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 @@
 
        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 @@
 #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"
+           "Usage: %s %s <command> [<args>]\n", p, f);
+       fprintf(stderr, 
+           "Commands:\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"
-#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 @@
        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 @@
                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;



Home | Main Index | Thread Index | Old Index