From 2d074efe44e4230db067f2d09325cb242e817a0b Mon Sep 17 00:00:00 2001 From: phil Date: Fri, 5 Sep 1997 21:26:57 +0000 Subject: [PATCH] -- add -b flag for setting fdisk's idea of BIOS geometry from command line -- cleanup so WARNS=1 works -- man page updated to reality. --- sbin/fdisk/Makefile | 4 ++- sbin/fdisk/fdisk.8 | 29 +++++++++++++----- sbin/fdisk/fdisk.c | 71 ++++++++++++++++++++++++++++++--------------- 3 files changed, 72 insertions(+), 32 deletions(-) diff --git a/sbin/fdisk/Makefile b/sbin/fdisk/Makefile index cec8ae26cec3..30aa8f4c6696 100644 --- a/sbin/fdisk/Makefile +++ b/sbin/fdisk/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.5 1997/06/23 04:23:50 mrg Exp $ +# $NetBSD: Makefile,v 1.6 1997/09/05 21:26:57 phil Exp $ .if ${MACHINE} == "i386" || ${MACHINE} == "powerpc" @@ -8,4 +8,6 @@ SRCS= fdisk.c MAN= fdisk.8 +WARNS=1 + .include diff --git a/sbin/fdisk/fdisk.8 b/sbin/fdisk/fdisk.8 index 56999c65b091..5860e8ffa179 100644 --- a/sbin/fdisk/fdisk.8 +++ b/sbin/fdisk/fdisk.8 @@ -1,4 +1,4 @@ -.\" $NetBSD: fdisk.8,v 1.9 1997/08/11 23:31:41 phil Exp $ +.\" $NetBSD: fdisk.8,v 1.10 1997/09/05 21:26:59 phil Exp $ .\" .Dd April 4, 1993 .Dt FDISK 8 @@ -10,7 +10,8 @@ .Nm .Op Fl aiufS .Op Fl 0 | 1 | 2 | 3 -.Op Fl s Ar id offset size +.Op Fl b Ar cylinders/heads/sectors +.Op Fl s Ar id/start/size .Op Ar device .Sh PROLOGUE In order for the BIOS to boot the kernel, certain conventions must be @@ -153,32 +154,44 @@ to use the whole disk for NetBSD, and marking the last partition active. The flags .Fl 0 , .Fl 1 , -.Fl 2 and +.Fl 2 +and .Fl 3 allow the user to selectively update or set to active a specific partition. .Pp The .Fl s -flag allows the user to specify the partition type, offset and +flag allows the user to specify the partition type, start and size from the command line. This flag requires the use of the partition selection flag. .Pp The +.Fl b +flag allows the user to specify the BIOS parameters for +cylinders, heads and sectors. It is used only in conjunction with the +.Fl i +and +.Fl u +flags. +.Pp +The .Fl f flag makes .Nm -work in a non-interactive mode. You can not change the disk parameters -in this mode. This is provided only so scripts or other programs may +work in a non-interactive mode. In this mode, you can only change the +disk parameters by using the +.Fl b +flag. This is provided only so scripts or other programs may use fdisk as part of an automatic installation process. Using the .Fl f flag with the .Fl u -makes it impossible to specify +makes it impossible to specify the starting and ending .Em cylinder, head and .Em sector -fields. +fields. They will be automatically computed using the BIOS geometry. .Pp The .Fl S diff --git a/sbin/fdisk/fdisk.c b/sbin/fdisk/fdisk.c index 040650fa62fe..1aebbd891e06 100644 --- a/sbin/fdisk/fdisk.c +++ b/sbin/fdisk/fdisk.c @@ -1,4 +1,4 @@ -/* $NetBSD: fdisk.c,v 1.15 1997/08/11 23:31:42 phil Exp $ */ +/* $NetBSD: fdisk.c,v 1.16 1997/09/05 21:27:00 phil Exp $ */ /* * Mach Operating System @@ -26,8 +26,10 @@ * the rights to redistribute these changes. */ +#include + #ifndef lint -static char rcsid[] = "$NetBSD: fdisk.c,v 1.15 1997/08/11 23:31:42 phil Exp $"; +__RCSID("$NetBSD: fdisk.c,v 1.16 1997/09/05 21:27:00 phil Exp $"); #endif /* not lint */ #include @@ -84,6 +86,8 @@ int u_flag; /* update partition data */ int sh_flag; /* Output data as shell defines */ int f_flag; /* force --not interactive */ int s_flag; /* set id,offset,size */ +int b_flag; /* Set cyl, heads, secs (as c/h/s) */ +int b_cyl, b_head, b_sec; /* b_flag values. */ unsigned char bootcode[] = { 0x33, 0xc0, 0xfa, 0x8e, 0xd0, 0xbc, 0x00, 0x7c, 0x8e, 0xc0, 0x8e, 0xd8, 0xfb, 0x8b, 0xf4, 0xbf, @@ -220,6 +224,15 @@ int yesno __P((char *)); void decimal __P((char *, int *)); int type_match __P((const void *, const void *)); char *get_type __P((int)); +int get_mapping __P((int, int *, int *, int *, long *)); + +static inline unsigned short getshort __P((void *)); +static inline void putshort __P((void *p, unsigned short)); +static inline unsigned long getlong __P((void *)); +static inline void putlong __P((void *, unsigned long)); + + +int main __P((int, char **)); int main(argc, argv) @@ -231,9 +244,9 @@ main(argc, argv) int csysid, cstart, csize; /* For the b_flag. */ - a_flag = i_flag = u_flag = sh_flag = f_flag = s_flag = 0; + a_flag = i_flag = u_flag = sh_flag = f_flag = s_flag = b_flag = 0; csysid = cstart = csize = 0; - while ((ch = getopt(argc, argv, "0123Safisu")) != -1) + while ((ch = getopt(argc, argv, "0123Safius:b:")) != -1) switch (ch) { case '0': partition = 0; @@ -264,6 +277,23 @@ main(argc, argv) break; case 's': s_flag = 1; + if (sscanf (optarg, "%d/%d/%d", + &csysid, &cstart, &csize) != 3) { + (void)fprintf (stderr, "%s: Bad argument " + "to the -s flag.\n", + argv[0]); + exit (1); + } + break; + case 'b': + b_flag = 1; + if (sscanf (optarg, "%d/%d/%d", + &b_cyl, &b_head, &b_sec) != 3) { + (void)fprintf (stderr, "%s: Bad argument " + "to the -b flag.\n", + argv[0]); + exit (1); + } break; default: usage(); @@ -280,18 +310,6 @@ main(argc, argv) usage(); } - /* get s_flag parameters. */ - if (s_flag) { - if (argc >= 3) { - csysid = atoi(argv[0]); - cstart = atoi(argv[1]); - csize = atoi(argv[2]); - argc -= 3; - argv += 3; - } else - usage(); - } - if (argc > 0) disk = argv[0]; @@ -307,7 +325,7 @@ main(argc, argv) printf("******* Working on device %s *******\n", disk); - if ((i_flag || u_flag) && !f_flag) + if ((i_flag || u_flag) && (!f_flag || b_flag)) get_params_to_use(); if (i_flag) @@ -350,7 +368,7 @@ void usage() { (void)fprintf(stderr, "usage: fdisk [-aiufS] [-0|-1|-2|-3] " - "[-s sysid start size] [device]\n"); + "[device]\n"); exit(1); } @@ -434,8 +452,8 @@ print_part(part) } printf("PART%dID=%d\n", part, partp->dp_typ); - printf("PART%dSIZE=%d\n", part, getlong(&partp->dp_size)); - printf("PART%dSTART=%d\n", part, getlong(&partp->dp_start)); + printf("PART%dSIZE=%ld\n", part, getlong(&partp->dp_size)); + printf("PART%dSTART=%ld\n", part, getlong(&partp->dp_start)); printf("PART%dFLAG=%x\n", part, partp->dp_flag); printf("PART%dBCYL=%d\n", part, DPCYL(partp->dp_scyl, partp->dp_ssect)); @@ -454,7 +472,7 @@ print_part(part) return; } printf("sysid %d (%s)\n", partp->dp_typ, get_type(partp->dp_typ)); - printf(" start %d, size %d (%d MB), flag %x\n", + printf(" start %ld, size %ld (%ld MB), flag %x\n", getlong(&partp->dp_start), getlong(&partp->dp_size), getlong(&partp->dp_size) * 512 / (1024 * 1024), partp->dp_flag); printf("\tbeg: cylinder %4d, head %3d, sector %2d\n", @@ -740,6 +758,13 @@ change_active(which) void get_params_to_use() { + if (b_flag) { + dos_cylinders = b_cyl; + dos_heads = b_head; + dos_sectors = b_sec; + dos_cylindersectors = dos_heads * dos_sectors; + return; + } print_params(); if (yesno("Do you want to change our idea of what BIOS thinks?")) { @@ -880,6 +905,7 @@ write_s0() flag = 0; if (ioctl(fd, DIOCWLABEL, &flag) < 0) warn("DIOCWLABEL"); + return 0; } int @@ -954,6 +980,5 @@ get_type(type) sizeof(struct part_type), type_match); if (ptr == 0) return ("unknown"); - else - return (ptr->name); + return (ptr->name); }