I've made some trivial changes to fdisk's config file parsing code to
allow the user to specify -1 as the length of a slice to force it to run
to the end of the disk.  This allows you to create a set of fixed sized
slices and then one that fills the disk without having to worry about
the actual size of the disk.  The actual code is almost exactly the same
as the code for -I.

As noted in the addition to the manpage, no check is performed to insure
that the hog slice is actually the last slice on the disk.  This is done
because 1) fdisk isn't really set up to allow for that kind of checking
and 2) my partition tables already have overlaping partitions due to
using fake partitions for disk versioning.

I'd like to commit this soon with the intent to MFC it after 4.8.

Comments, objections, etc?

Thanks,
Brooks

Index: fdisk.8
===================================================================
RCS file: /usr/cvs/src/sbin/fdisk/fdisk.8,v
retrieving revision 1.34
diff -u -p -r1.34 fdisk.8
--- fdisk.8     21 Aug 2002 18:10:07 -0000      1.34
+++ fdisk.8     27 Feb 2003 23:54:36 -0000
@@ -364,6 +364,11 @@ starting at sector
 for
 .Ar length
 sectors.
+If
+.Ar length
+is -1, the slice will extend to the end of the disk.
+No checks are performed to insure the slice is actually the last slice
+on the disk.
 .Pp
 Only those slices explicitly mentioned by these lines are modified;
 any slice not referenced by a
Index: fdisk.c
===================================================================
RCS file: /usr/cvs/src/sbin/fdisk/fdisk.c,v
retrieving revision 1.68
diff -u -p -r1.68 fdisk.c
--- fdisk.c     30 Dec 2002 21:18:04 -0000      1.68
+++ fdisk.c     28 Feb 2003 01:37:58 -0000
@@ -947,7 +947,7 @@ parse_config_line(char *line, CMD *comma
                break;          /* found comment */
            if (isalpha(*cp))
                command->args[command->n_args].argtype = *cp++;
-           if (!isdigit(*cp))
+           if (!isdigit(*cp) && *cp != '-')
                break;          /* assume end of line */
            end = NULL;
            command->args[command->n_args].arg_val = strtol(cp, &end, 0);
@@ -1077,7 +1077,16 @@ process_partition(CMD *command)
        bzero((char *)partp, sizeof (struct dos_partition));
        partp->dp_typ = command->args[1].arg_val;
        partp->dp_start = command->args[2].arg_val;
-       partp->dp_size = command->args[3].arg_val;
+       /*
+        * If the user passed -1 as the length, assume they wanted to
+        * fill the disk to the end with this partition.
+        */
+       if (command->args[3].arg_val == -1) {
+               partp->dp_size = ((disksecs - partp->dp_start) / dos_cylsecs) * 
+                   dos_cylsecs - dos_sectors;
+       } else {
+               partp->dp_size = command->args[3].arg_val;
+       }
        max_end = partp->dp_start + partp->dp_size;
 
                if (partp->dp_typ == 0) {

-- 
Any statement of the form "X is the one, true Y" is FALSE.
PGP fingerprint 655D 519C 26A7 82E7 2529  9BF0 5D8E 8BE9 F238 1AD4

Attachment: pgp00000.pgp
Description: PGP signature

Reply via email to