[comp.os.minix] fdisk

ast@cs.vu.nl (Andy Tanenbaum) (01/15/89)

The fdisk that Robert Regn posted a while back came in here truncated.  Could
you please post the cdif against 1.3 again.  Has this been thoroughly tested?
Fdisk is not the kind of program one would like to have bugs in.

Andy Tanenbaum (ast@cs.vu.nl)

rtregn@immd3.informatik.uni-erlangen.de (Robert Regn) (01/21/89)

From article <1904@ast.cs.vu.nl>, by ast@cs.vu.nl (Andy Tanenbaum):
> 
> The fdisk that Robert Regn posted a while back came in here truncated.  Could
> you please post the cdif against 1.3 again.  Has this been thoroughly tested?
> Fdisk is not the kind of program one would like to have bugs in.
> 

For such disks I have a little improved fdisk.c. It's usage is:
		 fdisk [-heads] [/dev/hdx]
The default is -4  and /dev/hd0. It recognizes DOS4 (for 3.3) and
Xenix partitions also.

I have used it several times. The changes are not great so I think it has no
bugs - and it prints the number of heads for your check.

A good improvement would be to print the partitions in the same order as
they are mapped by the disk driver into /dev/hd[1-4]. So the danger destroying
another filesystem with mkfs is reduced.

*** minix/1.3/a.fertig/commands/fdisk.c	Tue Oct  4 12:43:10 1988
--- FDISK.C	Tue Dec  6 16:53:34 1988
***************
*** 55,61 ****
--- 55,64 ----
  char	secbuf[SECSIZE];
  char	*devname;
  char	*dosstr  = "  DOS  ";
+ char	*dosstr4 = " DOS  4";
  char	*ndosstr = "Non-DOS";
+ char	*xenstr = " Xenix ";
+ int heads;
  
  #ifdef DOS
  union	REGS	regs;
***************
*** 75,86 ****
  
  	/* init */
  
! 	if (argc != 2) {
! 		printf("Usage: fdisk /dev/hdx\n");
  		exit(1);
  	}
  
! 	devname = argv[1];
  	getboot(secbuf);	/* get boot sector	*/
  
  	do {
--- 78,99 ----
  
  	/* init */
  
! 	if (  argc > 1 && (*++argv)[0] == '-')		/*flag*/
! 		{heads = atoi( & (*argv)[1]);
! 		 printf("heads: %d	", heads);
! 		 argv++;
! 		 argc--;
! 		}
! 	else	heads = NHEAD;
! 
! 	if (argc > 2) {
! 		printf("Usage: fdisk [-heads] [/dev/hdx]\n");
  		exit(1);
  	}
  
! 	if ( argc == 1)
! 		devname = "/dev/hd0";
! 	else	devname = *argv;
  	getboot(secbuf);	/* get boot sector	*/
  
  	do {
***************
*** 339,346 ****
  
  	if (entry->sysind == 0x01)
  		typestring = dosstr;
! 	else
! 		typestring = ndosstr;
  	printf("%5d         %s  ",number,typestring);
  	temp = entry->start_sec & 0xc0;
  	low_cyl = (entry->start_cyl & 0xff) + (temp << 2);
--- 352,363 ----
  
  	if (entry->sysind == 0x01)
  		typestring = dosstr;
! 	else	if (entry->sysind == 0x02)
! 		typestring = xenstr;
! 	else	if (entry->sysind == 0x04)
! 		typestring = dosstr4;
! 		else
! 			typestring = ndosstr;
  	printf("%5d         %s  ",number,typestring);
  	temp = entry->start_sec & 0xc0;
  	low_cyl = (entry->start_cyl & 0xff) + (temp << 2);
***************
*** 423,432 ****
  {
  	int	bigcyl;
  
! 	bigcyl = logsec / (NHEAD * NSEC);
  	*sec = (logsec % NSEC) + 1 + ((bigcyl >> 2) & 0xc0);
  	*cyl = bigcyl & 0xff;
! 	*hd = (logsec % (NHEAD * NSEC)) / NSEC;
  }
  
  /*
--- 440,449 ----
  {
  	int	bigcyl;
  
! 	bigcyl = logsec / (heads * NSEC);
  	*sec = (logsec % NSEC) + 1 + ((bigcyl >> 2) & 0xc0);
  	*cyl = bigcyl & 0xff;
! 	*hd = (logsec % (heads * NSEC)) / NSEC;
  }
  
  /*
***************
*** 487,497 ****
  		return;
  	}
  	low = first & 0xffff;
! 	low = low * NSEC * NHEAD;
  	if (low == 0)
  		low = 1; /* sec0 is master boot record */
  	high = last & 0xffff;
! 	high = (high + 1)*NSEC*NHEAD - 1;
  	entry->lowsec = low;
  	entry->size = high - low + 1;
  	sec_to_hst(low,
--- 504,514 ----
  		return;
  	}
  	low = first & 0xffff;
! 	low = low * NSEC * heads;
  	if (low == 0)
  		low = 1; /* sec0 is master boot record */
  	high = last & 0xffff;
! 	high = (high + 1)*NSEC*heads - 1;
  	entry->lowsec = low;
  	entry->size = high - low + 1;
  	sec_to_hst(low,
-------------------------------------------------

Robert Regn	
rtregn@faui32.uucp
rtregn@immd3.informatik.uni-erlangen.de			West Germany

nall@loligo.cc.fsu.edu (John Nall) (10/06/89)

In an earlier message, I pointed out that fdisk has the number
of heads wired in (a variable called NHEAD), but that this can
be changed by using "fdisk -n" where "n" is the actual number
of heads.  For example, to partition a disk with 9 heads, one
would say "fdisk -9 /dev/hd5" (if it were a second hard disk).

HOWEVER...it has been pointed out to me that this was a change
to fdisk which was inserted at the 1.4a level, and that people
running an earlier version of Minix do not have such an option.

So, for those with an earlier version of Minix (why in the world
don't you upgrade??!), just change the variable NHEAD and recompile
fdisk.





======================================================================
John Nall                              Internet:  nall@nu.cs.fsu.edu
Computer Science Department            Florida State University
    "Today, a Moon Moth -- tomorrow, a Sea Dragon Conquerer!!"