Date: Tue, 31 Oct 95 18:25:01 +0100 From: Andreas Haakh <haakh@socrates.st.bauing.th-darmstadt.de> To: FreeBSD-gnats-submit@freebsd.org, ah@alvman.robin.de, haakh%socrates@socrates.st.bauing.th-darmstadt.de Subject: misc/804: fdformat - patch to add DOS-filsystem Message-ID: <9510311725.AA21194@socrates.st.bauing.th-darmstadt.de> Resent-Message-ID: <199510311740.JAA10329@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 804
>Category: misc
>Synopsis: fdformat did not create DOS-filesystem
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Tue Oct 31 09:40:01 PST 1995
>Last-Modified:
>Originator: Andreas Haakh
>Organization:
not at all...
>Release: FreeBSD 2.0.5-RELEASE i386
>Environment:
irrelevant
>Description:
fdformat just did a raw format on floppies. You could not
mount_msdos them.
>How-To-Repeat:
obvious
>Fix:
I added an option (-D) to write a dos-filesystem to the floppies.
The changes are based on msdosfs and mformat (mtools).
Files included from /sys/msdosfs/ should be moved to /usr/include/...
The conext-diffs are included and change the following files
relative to /usr/src/ :
sys/msdosfs/bootsect.h (a bug - has probably no
influence on msdosfs)
usr.sbin/fdformat/fdformat.c
usr.sbin/fdformat/fdformat.1
//////////////////////START OF PATCH////////////////////////////////////////
*** sys/msdosfs/bootsect.h.orig Fri Oct 27 12:56:37 1995
--- sys/msdosfs/bootsect.h Fri Oct 27 12:56:19 1995
***************
*** 28,32 ****
char bsBPB[19]; /* BIOS parameter block */
char bsDriveNumber; /* drive number (0x80) */
! char bsBootCode[474]; /* pad so structure is 512 bytes long */
u_short bsBootSectSig;
#define BOOTSIG 0xaa55
--- 28,32 ----
char bsBPB[19]; /* BIOS parameter block */
char bsDriveNumber; /* drive number (0x80) */
! char bsBootCode[479]; /* pad so structure is 512 bytes long */
u_short bsBootSectSig;
#define BOOTSIG 0xaa55
*** usr.sbin/fdformat/fdformat.c.orig Tue May 30 05:47:39 1995
--- usr.sbin/fdformat/fdformat.c Fri Oct 27 18:10:59 1995
***************
*** 37,40 ****
--- 37,44 ----
* Andrew A. Chernov, ache@astral.msk.su
* Thu Jan 27 00:47:24 MSK 1994
+ *
+ * Added creation of DOS filesystem
+ * Andreas Haakh, ah@alman.RoBIN.de
+ * Fri Oct 27 18:10:59 1995
*/
***************
*** 48,51 ****
--- 52,57 ----
#include <errno.h>
#include <machine/ioctl_fd.h>
+ #include "/sys/msdosfs/bootsect.h" /* for DOS filesystem */
+ #include "/sys/msdosfs/bpb.h"
static void
***************
*** 139,146 ****
}
static void
usage (void)
{
! printf("Usage:\n\tfdformat [-q] [-n | -v] [-f #] [-c #] [-s #] [-h #]\n");
printf("\t\t [-r #] [-g #] [-i #] [-S #] [-F #] [-t #] devname\n");
printf("Options:\n");
--- 145,355 ----
}
+ static int
+ write_FAT(int fd, struct fd_type *fdt) {
+
+ int i, Media, SecPerClust, RootDirBlks, FATsecs;
+ struct bootsector33 bs33;
+ struct byte_bpb33 *b33;
+
+
+ b33 = (struct byte_bpb33 *) bs33.bsBPB;
+
+ if (sizeof(bs33) != 512) {
+ fprintf(stderr,"Check definition of struct bootsector33!\n");
+ fprintf(stderr,"Sizof (struct bootsector33) != 512.\n");
+ exit (3);
+ }
+
+
+ /* The following code is heavily borrowed from msdosfs
+ * and mformat from mtools.
+ *
+ * I have no documentation about the FAT. So I just rely
+ * on those two sources :-))
+ *
+ * This function returns the number of written boot, FAT
+ * and root-dir blocks.
+ */
+
+ switch(fdt->size/2) { /* size in KBytes */
+ int FatGuess, NumClus;
+ case 160:
+ Media = 0xfe;
+ SecPerClust = 1;
+ RootDirBlks = 4;
+ FATsecs = 1;
+ break;
+ cas 180:
+ Media = 0xfc;
+ SecPerClust = 1;
+ RootDirBlks = 4;
+ FATsecs = 2;
+ break;
+ case 320:
+ Media = 0xff;
+ SecPerClust = 2;
+ RootDirBlks = 7;
+ FATsecs = 1;+ break;
+ case 360:
+ Media = 0xfd;
+ SecPerClust = 2;
+ RootDirBlks = 7;
+ FATsec = 2;
+ break;
+ case 720:
+ Media = 0xf9;
+ SecPerClust = 2;
+ RootDirBlks = 7;
+ FTsecs = 3;
+ break;
+ case 1200:
+ Media = 0xf9;
+ SecPerClust = 1;
+ RootDirBlks = 14
+ FATsecs = 7;
+ break;
+ case 1440:
+ Media = 0xf0;
+ SecPerClust = 1;
+ RootDirBls = 14;
+ FATsecs = 9;
+ break;
+ case 800:
+ case 820:
+ case 1480:
+ default: /* non standard format */
+ Media = 0xf0;
+ if (fdt->heads == 1) {
+ SecPerClust = 1;
+ RootDirBlks = 4;
+ }else {
+ if (fdt->size > 2000) {
+ SecPerClust = 1;
+ RootDrBlks = 14;
+ } else {
+ SecPerClust = 2;
+ RootDirBlks = 7;
+ }
+ }
+ /* fatlength. 341 is the number of 12 bit fat entries
+ * per sector */
+ FatGuess = ((fdt->size/ SecPerClust) / 341.0) + 0.95;
+ NumClus = (fdt->size - RootDirBlks - 2 * FatGuess - 1)
+ / SecPerClust;
+ FATsecs = (NumClus / 341.) + 1;
+ break;
+ }
+
+ /* Set up the boot secor */
+
+ bs33.bsJump[0] = 0xeb;
+ bs33.bsJump[1] = 0x44;
+ bs33.bsJump[2] = 0x90;
+ strncy(bs33.bsOemName,"4.4BSD ",8);
+
+ putushort(b33->bpbBytesPerSec, 512);
+ b33->bpbSecPerClut = SecPerClust;
+ putushort(b33->bpbResSectors,1);
+ b33->bpbFATs = 2;
+ putushort(b33->bpbootDirEnts, RootDirBlks * 16);
+ putushort(b33->bpbSectors, fdt->size);
+ b33->bpbMedia = Meda;
+ putushort(b33->bpbFATsecs, FATsecs);
+ putushort(b33->bpbSecPerTrack, fdt->sectrc);
+ putushort(b33->bpbHeads, fdt->heads);
+ putushort(b33->bpbHiddenSecs, 0);
+
+ bs33.bsriveNumber = 0x00;
+ /* clear the bootcode */
+ memset(bs33.bsBootCode, 0, sizeof bs33.bsBootode);
+ bs33.bsBootSectSig = BOOTSIG;
+
+
+ #ifdef TEST_DOS_FAT
+ printf("jmp: %02x%02x%02xn",bs33.bsJump[0],
+ bs33.bsJump[1], bs33.bsJump[2]);
+ printf("OEM: %s\n",bs33.bsOemName);+ printf("Drv: %04x\n", bs33.bsDriveNumber);
+ printf("Sig: %04x\n", bs33.bsBootSectSig);
+
printf("Bytes/sector = %4d\n", getushort(b33->bpbBytesPerSec));
+ printf("Sectors/cluser = %4d\n", b33->bpbSecPerClust);
+ printf("Reserved sectors = %4d\n", getushort(b33->bpbResectors));
+ printf("Sectors/track = %4d\n", getushort(b33->bpbSecPerTrack));
+ printf("Numer of FATs = %4d\n", b33->bpbFATs);
+ printf("Root dir entries = %4d\n", getushort(b33->bpbRotDirEnts));
+ printf("Total # of secs = %4d\n", getushort(b33->bpbSectors));
+ printf("Medi descriptor = %4d %c\n", b33->bpbMedia, b33->bpbMedia);
+ printf("Sectors/FAT = %4d\n", gtushort(b33->bpbFATsecs));
+ printf("Number of heads = %4d\n", getushort(b33->bpbHeads));
+ rintf("Hidden sectors = %4d\n", getushort(b33->bpbHiddenSecs));
+ #endif
+
+ /* write bootsctor to disk */
+ lseek(fd, (off_t) 0, SEEK_SET);
+ if (512 != write(fd, &bs33, 512) ) {
+ error("Error writing DOS-block0.\n");
+ exit (3);
+ }
+
+
+ /*
+ * now we use bs33 for AT and root directory
+ */
+ memset(&bs33, 0, (size_t) 512);
+
+ /* first FAT first block /
+ bs33.bsJump[0] = Media;
+ bs33.bsJump[1] = 0xff;
+ bs33.bsJump[2] = 0xff;
+ if (512 != rite(fd, &bs33, 512) ) {
+ perror("Error writing FAT.\n");
+ exit (3);
+ }
+
+ /* first AT remaining blocks */
+ bs33.bsJump[0] = 0x00;
+ bs33.bsJump[1] = 0x00;
+ bs33.bsJup[2] = 0x00;
+ for (i = 1; i < FATsecs; i++)
+ if (512 != write(fd, &bs33, 512) ) {
+ perror(Error writing FAT.\n");
+ exit (3);
+ }
+
+ /* second FAT first block */
+ bs33.bsJump[] = Media;
+ bs33.bsJump[1] = 0xff;
+ bs33.bsJump[2] = 0xff;
+ if (512 != write(fd, &bs33, 52) ) {
+ perror("Error writing FAT.\n");
+ exit (3);
+ }
+
+ /* second FAT remaining bloks */
+ bs33.bsJump[0] = 0x00;
+ bs33.bsJump[1] = 0x00;
+ bs33.bsJump[2] = 0x00;
+ for (i =1; i < FATsecs; i++)
+ if (512 != write(fd, &bs33, 512) ) {
+ perror("Error writin FAT.\n");
+ exit (3);
+ }
+
+ /* the root directory */
+ for (i = 0; i < RootDirBlks; ++)
+ if (512 != write(fd, &bs33, 512) ) {
+ perror("Error writing FAT.\n");
+ exit (3);
+ }
+
+ return (1 + 2 * FATsecs + RootDirBlks);
+ }
+
static void
usage (void)
{
! pritf("Usage:\n\tfdformat [-q] [-n | -v] [-D] [-f #] [-c #] [-s #] [-h #]\n");
printf("\t\t [-r#] [-g #] [-i #] [-S #] [-F #] [-t #] devname\n");
printf("Options:\n");
**************
*** 161,164 ****
--- 370,374 ----
printf("\t-F #\tspecify fill byte\n");
printf("\t-t#\tnumber of steps per track\n");
+ printf("\t-D #\twrite a DOS filsystem on floppy\n");
ext(2);
}
***************
*** 189,198 ****
int format = -1, cyls = -1, secs = -1, heads = -1 intleave = -1;
int rate = -1, gaplen = -1, secsize = -1, steps = -1;
! int fill = 0xf6, qiet = 0, verify = 1, verify_only = 0;
int fd, c, track, error, tracks_per_dot, bytes_per_trak, errs;
const char *devname, *suffix;
struct fd_type fdt;
! while((c = getopt(argc, rgv, "f:c:s:h:r:g:S:F:t:i:qvn")) != -1)
switch(c) {
case 'f': /* format in kilobytes */--- 399,408 ----
int format = -1, cyls = -1, secs = -1, heads = -1, intleave = -1;
int rae = -1, gaplen = -1, secsize = -1, steps = -1;
! int fill = 0xf6, quiet = 0, verify = 1, verif_only = 0, dosfat = 0;
int fd, c, track, error, tracks_per_dot, bytes_per_track, errs;
cost char *devname, *suffix;
struct fd_type fdt;
! while((c = getopt(argc, argv, "f:c:sh:r:g:S:F:t:i:qvnD")) != -1)
switch(c) {
case 'f': /* format in kilobytes */
**************
*** 243,246 ****
--- 453,459 ----
verify = 0;
break;
+ case 'D':
+ dosfat =1;
+ break;
case 'v':
***************
*** 309,312 ****
--- 522,526 ----
if (verfy_only) {
+ dosfat = 0;
if(!quiet)
printf("Verify %dK floppy `%s'.\n",
**************
*** 361,366 ****
}
}
! if(!quiet)
printf(" done.\n");
return errs;
--- 575585 ----
}
}
! if(!quiet) {
printf(" done.\n");
+ if (dosfat)
+ printf("Creatig DOS filesystem.\n");
+ }
+ if (dosfat)
+ write_FAT(fd, &fdt);
return errs;
*** ur.sbin/fdformat/fdformat.1.orig Fri Oct 28 18:07:32 1994
--- usr.sbin/fdformat/fdformat.1 Fri Ot 27 16:17:19 1995
***************
*** 34,37 ****
--- 34,38 ----
.Bq Fl v
.Bq Fl n
+ .Bq FlD
.Bq Fl f Ar capacity
.Bq Fl c Ar cyls
***************
*** 81,84 ****
--- 82,87 ----
.ItFl v
Don't format, verify only.
+ .It Fl D
+ write a DOS filesystem on floppy after frmatting.
.It Fl c Ar cyls
.It Fl s Ar secs
***************
*** 116,120 ****
1 is returne on any errors during floppy formatting, and an exit status
of 2 reflects invalid arguments gven to the program (along with an
! appropriate information written to diagnostic output).
.Sh SE ALSO
.Xr fdc 4 .
--- 119,124 ----
1 is returned on any errors during floppy formatting, ad an exit status
of 2 reflects invalid arguments given to the program (along with an
! appropiate information written to diagnostic output). An exit status
! of 3 indicates an error writin the DOS filsystem.
.Sh SEE ALSO
.Xr fdc 4 .
***************
*** 131,133 ****
.ifn Joerg Wunsch,
.if t J\(:org Wunsch,
! Dresden, with changes by Serge Vakulenko and Andrew A Chernov, Moscow.
--- 135,138 ----
.if n Joerg Wunsch,
.if t J\(:org Wunsch,
! Dresden, wit changes by Serge Vakulenko, Andrew A. Chernov, Moscow and
! Andreas Haakh, Darmstadt.
/////////////////////END OF PATCH////////////////////////////////////////
--
Andreas Haakh \ ah@alvman.RoBIN.de
Kirschberg 12 b \ +49 6155 6615
64347 Griesheim \_________________________________________
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9510311725.AA21194>
