Add interleave > 1 support by Poul-Henning Kamp.
authorAndrey Chernov <ache@FreeBSD.org>
Thu, 10 Feb 1994 01:15:01 +0000 (01:15 +0000)
committerAndrey Chernov <ache@FreeBSD.org>
Thu, 10 Feb 1994 01:15:01 +0000 (01:15 +0000)
Chack valid range of sectors per track.

usr.sbin/fdformat/fdformat.1
usr.sbin/fdformat/fdformat.c

index fce0f7e..b395c9e 100644 (file)
@@ -111,8 +111,6 @@ An exit status of 0 is returned upon successful operation. Exit status
 1 is returned on any errors during floppy formatting, and an exit status
 of 2 reflects invalid arguments given to the program (along with an
 appropriate information written to diagnostic output).
 1 is returned on any errors during floppy formatting, and an exit status
 of 2 reflects invalid arguments given to the program (along with an
 appropriate information written to diagnostic output).
-.Sh BUGS
-The only valid interleave factor value is 1.
 .Sh SEE ALSO
 .Xr fd 4 .
 .Sh HISTORY
 .Sh SEE ALSO
 .Xr fd 4 .
 .Sh HISTORY
index f29013d..dc8fba8 100644 (file)
 
 static void
 format_track(int fd, int cyl, int secs, int head, int rate,
 
 static void
 format_track(int fd, int cyl, int secs, int head, int rate,
-            int gaplen, int secsize, int fill)
+            int gaplen, int secsize, int fill,int interleave)
 {
        struct fd_formb f;
 {
        struct fd_formb f;
-       register int i;
+       register int i,j;
+       int il[FD_MAX_NSEC];
+
+       memset(il,0,sizeof il);
+       for(j = 0, i = 1; i <= secs; i++) {
+           while(il[(j%secs)+1]) j++;
+           il[(j%secs)+1] = i;
+           j += interleave;
+       }
 
        f.format_version = FD_FORMAT_VERSION;
        f.head = head;
 
        f.format_version = FD_FORMAT_VERSION;
        f.head = head;
@@ -68,7 +76,7 @@ format_track(int fd, int cyl, int secs, int head, int rate,
        for(i = 0; i < secs; i++) {
                f.fd_formb_cylno(i) = cyl;
                f.fd_formb_headno(i) = head;
        for(i = 0; i < secs; i++) {
                f.fd_formb_cylno(i) = cyl;
                f.fd_formb_headno(i) = head;
-               f.fd_formb_secno(i) = i + 1;
+               f.fd_formb_secno(i) = il[i+1];
                f.fd_formb_secsize(i) = secsize;
        }
        if(ioctl(fd, FD_FORM, (caddr_t)&f) < 0) {
                f.fd_formb_secsize(i) = secsize;
        }
        if(ioctl(fd, FD_FORM, (caddr_t)&f) < 0) {
@@ -274,15 +282,15 @@ main(int argc, char **argv)
 
        if (cyls >= 0)    fdt.tracks = cyls;
        if (secs >= 0)    fdt.sectrac = secs;
 
        if (cyls >= 0)    fdt.tracks = cyls;
        if (secs >= 0)    fdt.sectrac = secs;
+       if (fdt.sectrac > FD_MAX_NSEC) {
+               fprintf(stderr, "fdformat: too many sectors per track, max value is %d\n", FD_MAX_NSEC);
+               exit(2);
+       }
        if (heads >= 0)   fdt.heads = heads;
        if (gaplen >= 0)  fdt.f_gap = gaplen;
        if (secsize >= 0) fdt.secsize = secsize;
        if (steps >= 0)   fdt.steptrac = steps;
        if (intleave >= 0) fdt.f_inter = intleave;
        if (heads >= 0)   fdt.heads = heads;
        if (gaplen >= 0)  fdt.f_gap = gaplen;
        if (secsize >= 0) fdt.secsize = secsize;
        if (steps >= 0)   fdt.steptrac = steps;
        if (intleave >= 0) fdt.f_inter = intleave;
-       if (fdt.f_inter != 1) {
-               fprintf(stderr, "fdformat: can't format with interleave != 1 yet\n");
-               exit(2);
-       }
 
        bytes_per_track = fdt.sectrac * (1<<fdt.secsize) * 128;
        tracks_per_dot = fdt.tracks * fdt.heads / 40;
 
        bytes_per_track = fdt.sectrac * (1<<fdt.secsize) * 128;
        tracks_per_dot = fdt.tracks * fdt.heads / 40;
@@ -317,7 +325,8 @@ main(int argc, char **argv)
        for (track = 0; track < fdt.tracks * fdt.heads; track++) {
                if (!verify_only) {
                        format_track(fd, track / 2, fdt.sectrac, track & 1,
        for (track = 0; track < fdt.tracks * fdt.heads; track++) {
                if (!verify_only) {
                        format_track(fd, track / 2, fdt.sectrac, track & 1,
-                               fdt.trans, fdt.f_gap, fdt.secsize, fill);
+                               fdt.trans, fdt.f_gap, fdt.secsize, fill,
+                               fdt.f_inter);
                        if(!quiet && !((track + 1) % tracks_per_dot)) {
                                putchar('F');
                                fflush(stdout);
                        if(!quiet && !((track + 1) % tracks_per_dot)) {
                                putchar('F');
                                fflush(stdout);