Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37535758
en ru br
Репозитории ALT
S:5.5.20081027-alt4
5.1: 5.5.20081027-alt1
4.1: 5.5.20060227-alt1
4.0: 5.5.20060227-alt1
3.0: 5.5-alt1
www.altlinux.org/Changes

Группа :: Система/Ядро и оборудование
Пакет: fdutils

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: fdutils-5.5-20081027.diff
Скачать


diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/Changelog fdutils/Changelog
--- fdutils-5.5/Changelog	2005-03-03 22:41:49.000000000 +0100
+++ fdutils/Changelog	2006-02-27 23:01:38.000000000 +0100
@@ -1,3 +1,5 @@
+v20060227
+	* Fixed "zero-based" flag
 v20050303
 	* Fixed instant verification in superformat (now based on
 	FDRAWCMD, rather than VFS' read which is plagued by excessive
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/diskd.1 fdutils/doc/diskd.1
--- fdutils-5.5/doc/diskd.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/diskd.1	2008-10-27 20:53:44.000000000 +0100
@@ -1,4 +1,4 @@
-.TH diskd 1 "03Mar05" fdutils-5.5
+.TH diskd 1 "27oct08" fdutils-5.5
 .SH Name
 diskd - disk daemon; wait for disk to be inserted
 '\" t
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/diskseekd.1 fdutils/doc/diskseekd.1
--- fdutils-5.5/doc/diskseekd.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/diskseekd.1	2008-10-27 20:53:44.000000000 +0100
@@ -1,4 +1,4 @@
-.TH diskseekd 1 "03Mar05" fdutils-5.5
+.TH diskseekd 1 "27oct08" fdutils-5.5
 .SH Name
 diskseek, diskseekd - disk seek daemon; simulates Messy Dos' drive cleaning effect
 '\" t
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/fdmount.1 fdutils/doc/fdmount.1
--- fdutils-5.5/doc/fdmount.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/fdmount.1	2008-10-27 20:53:45.000000000 +0100
@@ -1,4 +1,4 @@
-.TH fdmount 1 "03Mar05" fdutils-5.5
+.TH fdmount 1 "27oct08" fdutils-5.5
 .SH Name
 fdmount - Floppy disk mount utility
 '\" t
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/fdrawcmd.1 fdutils/doc/fdrawcmd.1
--- fdutils-5.5/doc/fdrawcmd.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/fdrawcmd.1	2008-10-27 20:53:45.000000000 +0100
@@ -1,4 +1,4 @@
-.TH fdrawcmd 1 "03Mar05" fdutils-5.5
+.TH fdrawcmd 1 "27oct08" fdutils-5.5
 .SH Name
 fdrawcmd - send raw commands to the floppy disk controller
 '\" t
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/floppycontrol.1 fdutils/doc/floppycontrol.1
--- fdutils-5.5/doc/floppycontrol.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/floppycontrol.1	2008-10-27 20:53:45.000000000 +0100
@@ -1,4 +1,4 @@
-.TH floppycontrol 1 "03Mar05" fdutils-5.5
+.TH floppycontrol 1 "27oct08" fdutils-5.5
 .SH Name
 floppycontrol - floppy driver configuration utility
 '\" t
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/floppymeter.1 fdutils/doc/floppymeter.1
--- fdutils-5.5/doc/floppymeter.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/floppymeter.1	2008-10-27 20:53:45.000000000 +0100
@@ -1,4 +1,4 @@
-.TH floppymeter 1 "03Mar05" fdutils-5.5
+.TH floppymeter 1 "27oct08" fdutils-5.5
 .SH Name
 floppymeter - measure raw capacity and exact rotation speed of floppy drive
 '\" t
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/formatlist.texi fdutils/doc/formatlist.texi
--- fdutils-5.5/doc/formatlist.texi	2002-05-02 23:03:31.000000000 +0200
+++ fdutils/doc/formatlist.texi	2006-02-27 23:08:50.000000000 +0100
@@ -221,7 +221,7 @@
 setfdprm /dev/fd0H1520 1520 19 2 80 0 0x1b 0 0xcf 0x6c
 @end example
 
-@strong{Note:} This redefines the geometry for any device node with the
+@strong{NB:} This redefines the geometry for any device node with the
 same format number, not just the new node.
 
 The new geometry is only valid until the next reboot (or removal of the
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/getfdprm.1 fdutils/doc/getfdprm.1
--- fdutils-5.5/doc/getfdprm.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/getfdprm.1	2008-10-27 20:53:45.000000000 +0100
@@ -1,4 +1,4 @@
-.TH getfdprm 1 "03Mar05" fdutils-5.5
+.TH getfdprm 1 "27oct08" fdutils-5.5
 .SH Name
 getfdprm - print the current format information
 '\" t
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/makefloppies.1 fdutils/doc/makefloppies.1
--- fdutils-5.5/doc/makefloppies.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/makefloppies.1	2008-10-27 20:53:45.000000000 +0100
@@ -1,4 +1,4 @@
-.TH makefloppies 1 "03Mar05" fdutils-5.5
+.TH makefloppies 1 "27oct08" fdutils-5.5
 .SH Name
 MAKEFLOPPIES - Creates the default floppy device nodes.
 '\" t
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/setfdprm.1 fdutils/doc/setfdprm.1
--- fdutils-5.5/doc/setfdprm.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/setfdprm.1	2008-10-27 20:53:45.000000000 +0100
@@ -1,4 +1,4 @@
-.TH setfdprm 1 "03Mar05" fdutils-5.5
+.TH setfdprm 1 "27oct08" fdutils-5.5
 .SH Name
 setfdprm - sets user-provided floppy disk parameters
 '\" t
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/superformat.1 fdutils/doc/superformat.1
--- fdutils-5.5/doc/superformat.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/superformat.1	2008-10-27 20:53:45.000000000 +0100
@@ -1,4 +1,4 @@
-.TH superformat 1 "03Mar05" fdutils-5.5
+.TH superformat 1 "27oct08" fdutils-5.5
 .SH Name
 superformat - format floppies
 '\" t
@@ -79,7 +79,7 @@
 .in +0.3i
 \&\fR\&\f(CWsuperformat [\fR\&\f(CW-D \fIdos-drive\fR\&\f(CW] [\fR\&\f(CW-v \fIverbosity-level\fR\&\f(CW] [\fR\&\f(CW-b \fIbegin-track\fR\&\f(CW]
 [\fR\&\f(CW-e \fIend-track\fR\&\f(CW] [\fR\&\f(CW--superverify] [\fR\&\f(CW--dosverify]
-[\fR\&\f(CW--noverify] [\fR\&\f(CW--verify_later] [\fR\&\f(CW--zero-based]
+[\fR\&\f(CW--noverify] [\fR\&\f(CW--verify_later] [\fR\&\f(CW--first-sector-number \fIn\fR\&\f(CW] [\fR\&\f(CW--zero-based]
 [\fR\&\f(CW-G \fIformat-gap\fR\&\f(CW] [\fR\&\f(CW-F \fIfinal-gap\fR\&\f(CW] [\fR\&\f(CW-i \fIinterleave\fR\&\f(CW] [\fR\&\f(CW-c \fIchunksize\fR\&\f(CW]
 [\fR\&\f(CW-g \fIgap\fR\&\f(CW] [\fR\&\f(CW--absolute-skew \fIabsolute-skew\fR\&\f(CW] [\fR\&\f(CW--head-skew \fIhead-skew\fR\&\f(CW]
 [\fR\&\f(CW--track-skew \fItrack-skew\fR\&\f(CW] [\fR\&\f(CW--biggest-last] \fIdrive\fR\&\f(CW [\fImedia-description\fR\&\f(CW]
@@ -237,13 +237,12 @@
 For MSS formats, make sure that the biggest sector is last on the track.
 This makes the format more reliable on drives which are out of spec.
 .TP
+\&\fR\&\f(CW--first-sector-number\ \fIn\fR\&\f(CW\fR\ 
+Formats the disk with sector numbers starting at \fIn\fR, rather than
+1. Certain CP/M boxes or Music synthesizers use this format.
+.TP
 \&\fR\&\f(CW--zero-based\fR\ 
-Formats the disk with sector numbers starting at 0, rather than
-1. Certain CP/M boxes or Music synthesizers use this format. Those disks
-can currently not be read/written to by the standard Linux read/write
-API; you have to use fdrawcmd to access them.  As disk verifying is done
-by this API, verifying is automatically switched off when formatting
-zero-based.
+Shorthand for \fR\&\f(CW--first-sector-number 0\fR
 .PP
 .SH Sector\ skewing\ options
 .PP
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/superformat.texi fdutils/doc/superformat.texi
--- fdutils-5.5/doc/superformat.texi	2002-11-02 14:35:11.000000000 +0100
+++ fdutils/doc/superformat.texi	2008-10-27 20:53:41.000000000 +0100
@@ -6,7 +6,7 @@
 @example
 @code{superformat} [@code{-D} @var{dos-drive}] [@code{-v} @var{verbosity-level}] [@code{-b} @var{begin-track}]
 [@code{-e} @var{end-track}] [@code{--superverify}] [@code{--dosverify}]
-[@code{--noverify}] [@code{--verify_later}] [@code{--zero-based}]
+[@code{--noverify}] [@code{--verify_later}] [@code{--first-sector-number} @var{n}] [@code{--zero-based}]
 [@code{-G} @var{format-gap}] [@code{-F} @var{final-gap}] [@code{-i} @var{interleave}] [@code{-c} @var{chunksize}]
 [@code{-g} @var{gap}] [@code{--absolute-skew} @var{absolute-skew}] [@code{--head-skew} @var{head-skew}]
 [@code{--track-skew} @var{track-skew}] [@code{--biggest-last}] @var{drive} [@var{media-description}]
@@ -162,13 +162,12 @@
 For MSS formats, make sure that the biggest sector is last on the track.
 This makes the format more reliable on drives which are out of spec.
 
+@item --first-sector-number @var{n}
+Formats the disk with sector numbers starting at @var{n}, rather than
+1. Certain CP/M boxes or Music synthesizers use this format.
+
 @item --zero-based
-Formats the disk with sector numbers starting at 0, rather than
-1. Certain CP/M boxes or Music synthesizers use this format. Those disks
-can currently not be read/written to by the standard Linux read/write
-API; you have to use fdrawcmd to access them.  As disk verifying is done
-by this API, verifying is automatically switched off when formatting
-zero-based.
+Shorthand for @code{--first-sector-number 0}
 
 @end table
 
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/doc/xdfcopy.1 fdutils/doc/xdfcopy.1
--- fdutils-5.5/doc/xdfcopy.1	2005-03-03 22:55:18.000000000 +0100
+++ fdutils/doc/xdfcopy.1	2008-10-27 20:53:45.000000000 +0100
@@ -1,4 +1,4 @@
-.TH xdfcopy 1 "03Mar05" fdutils-5.5
+.TH xdfcopy 1 "27oct08" fdutils-5.5
 .SH Name
 xdfcopy - Program to copy and format Xdf disks in Linux
 '\" t
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/src/calc-format.c fdutils/src/calc-format.c
--- fdutils-5.5/src/calc-format.c	2004-02-28 23:00:28.000000000 +0100
+++ fdutils/src/calc-format.c	2008-10-27 20:19:20.000000000 +0100
@@ -10,8 +10,8 @@
 #define SSIZE(j)   ( (128<<j) + GAPSIZE(j) + header_size)
 
 
-static inline int chunks_in_sect(struct params *fd, int i, 
-				 int gap, int chunksize)
+static inline unsigned int chunks_in_sect(struct params *fd, int i, 
+					  int gap, int chunksize)
 {
 	return (SSIZE(i)-1) / chunksize + 1;
 }
@@ -28,22 +28,22 @@
 }
 
 
-static inline int firstSector(struct params *fd, int i)
+static inline unsigned int firstSector(struct params *fd, int i)
 {
 	if(i>=MAX_SIZECODE-1)
-		return 1;
+		return 0;
 	else
 		return fd->last_sect[i+1];
 }
 
-static inline int lastSector(struct params *fd, int i)
+static inline unsigned int lastSector(struct params *fd, int i)
 {
 	return fd->last_sect[i];
 }
 
-static inline int nrSectorsForSize(struct params *fd, int i)
+static inline unsigned int nrSectorsForSize(struct params *fd, int i)
 {
-	return  lastSector(fd, i) - firstSector(fd, i);
+	return lastSector(fd, i) - firstSector(fd, i);
 }
 
 
@@ -93,7 +93,7 @@
 	int i;
 	int nr_sectors;
 
-	cur_sector = 1;
+	cur_sector = 0;
 	sizes=0;
 	for (i=MAX_SIZECODE-1; i>=0; --i) {
 		if(i > max_sizecode)
@@ -107,7 +107,7 @@
 		if(nr_sectors)
 			sizes++;
 	}
-	fd->dsect = cur_sector-1; /* number of data sectors */
+	fd->dsect = cur_sector; /* number of data sectors */
 	if(sizes > 1)
 		fd->need_init = 1;
 
@@ -264,51 +264,54 @@
  */
 static void calc_sequence(struct params *fd, int tailsect)
 {
-	int sec_id, cur_sector, i;
+	int sec_id, cur_slot, i;
+	int *occupied = SafeNewArray(fd->dsect, int);
+	int last_slot = fd->dsect - 1;
 
-	fd->sequence = SafeNewArray(fd->dsect,struct fparm2);
-	cur_sector = fd->dsect-1;
+	fd->sequence = SafeNewArray(fd->dsect, struct fparm2);       
+	cur_slot = last_slot;
 
-	/* construct the sequence while working backwards.  cur_sector
+	/* construct the sequence while working backwards.  cur_slot
 	 * points to the place where the next sector will be placed.
 	 * We place it, then move circularily backwards placing more
 	 * and more sectors */
 	sec_id = tailsect;
 	fd->rotations = 0;
 	for(i=0; i < fd->dsect; 
-	    i++, cur_sector -= fd->actual_interleave, sec_id--) {
-		if (sec_id == 0)
-			sec_id = fd->dsect;
-
-		if ( cur_sector < 0) {
-			cur_sector += fd->dsect;
-			if(sec_id != fd->dsect)
+	    i++, cur_slot -= fd->actual_interleave, sec_id--) {
+		if (sec_id < 0)
+			sec_id = last_slot;
+
+		if ( cur_slot < 0) {
+			cur_slot += fd->dsect;
+			if(sec_id != last_slot)
 				fd->rotations++;
 		}
 			
 		/* slot occupied, look elsewhere */
-		while(fd->sequence[cur_sector].sect ){
-			cur_sector--;
-			if ( cur_sector < 0 ) {
-				cur_sector += fd->dsect;
-				if(sec_id != fd->dsect)
+		while(occupied[cur_slot]) {
+			cur_slot--;
+			if ( cur_slot < 0 ) {
+				cur_slot += fd->dsect;
+				if(sec_id != last_slot)
 					fd->rotations++;
 			}
 		}
 
 		/* place the sector */
-		fd->sequence[cur_sector].sect = sec_id;
-		fd->sequence[cur_sector].size = sizeOfSector(fd, sec_id);
+		fd->sequence[cur_slot].sect = sec_id;
+		fd->sequence[cur_slot].size = sizeOfSector(fd, sec_id);
+		occupied[cur_slot] = 1;
 	}
 
 	/* handle wrap-around between tailsect and tailsect+1 */
-	if(tailsect != fd->dsect) {
-		/* always add one rotation, because tailsect+1 cannot be
+	if(tailsect != last_slot) {
+		/* always add one rotation, because tailsect cannot be
 		 * at the last position, thus is necessarily earlyer */
 		fd->rotations++;
 		
 		if(fd->actual_interleave == 2 && 
-		   cur_sector + fd->actual_interleave == 1)
+		   cur_slot + fd->actual_interleave == 1)
 			/* if we use interleave, and the last sector was
 			 * placed at the first last position, add one
 			 * extra rotation for tailsect+1 following tailsect
@@ -333,11 +336,11 @@
 		max_offset = cur_sector;
 
 		/* offset of the starting sector */
-		if ( fd->sequence[i].sect == 1 )
+		if ( fd->sequence[i].sect == 0 )
 			fd->min = cur_sector * fd->chunksize;
 
 		/* offset of the end of the of the highest sector */
-		if (fd->sequence[i].sect == fd->dsect)
+		if (fd->sequence[i].sect == fd->dsect - 1)
 			track_end = cur_sector * fd->chunksize + 
 				header_size + index_size +
 				SSIZE(fd->sequence[i].size);
@@ -509,7 +512,7 @@
 	fd->min = 0;
 
 	for(i=0; i<sectors; i++){
-		fd->sequence[i].sect = i+1;
+		fd->sequence[i].sect = i;
 		fd->sequence[i].size = 2;
 		fd->sequence[i].offset = i;
 	}
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/src/fdmount.c fdutils/src/fdmount.c
--- fdutils-5.5/src/fdmount.c	2005-03-03 23:09:16.000000000 +0100
+++ fdutils/src/fdmount.c	2008-10-27 20:45:50.000000000 +0100
@@ -629,7 +629,7 @@
     struct mntent ms;
     struct floppy_drive_struct drivstat;
     char options[80+MAX_OPT]; 
-    char super[2048];
+    unsigned char super[2048];
     char *mountpoint;
    
     strncpy(curdev,devname, sizeof(curdev));
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/src/fdutils.h fdutils/src/fdutils.h
--- fdutils-5.5/src/fdutils.h	2002-05-02 23:03:31.000000000 +0200
+++ fdutils/src/fdutils.h	2008-10-25 22:17:36.000000000 +0200
@@ -1,4 +1,8 @@
+#ifndef __FDUTILS_H
+#define __FDUTILS_H
+
 #include <assert.h>
+#include <linux/fd.h>
 /* This file contains common structures understood by several of the
  * fdutils
  */
@@ -22,3 +26,17 @@
 #define SafeNew(type) ((type *)(safe_malloc(sizeof(type))))
 void *safe_malloc(size_t size);
 void *safe_calloc(size_t nmemb, size_t size);
+
+#ifndef FD_SWAPSIDES
+#define FD_SWAPSIDES 2
+#endif
+
+#ifndef FD_ZEROBASED
+#define FD_ZEROBASED 4
+#endif
+
+#ifndef FD_SECTBASEMASK
+#define FD_SECTBASEMASK 0x3fc
+#endif
+
+#endif
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/src/floppycontrol.c fdutils/src/floppycontrol.c
--- fdutils-5.5/src/floppycontrol.c	2002-11-02 14:36:43.000000000 +0100
+++ fdutils/src/floppycontrol.c	2008-10-26 09:27:38.000000000 +0100
@@ -379,7 +379,7 @@
 	}
 
 	if (mask & SET_RESET)
-		eioctl(fd, FDRESET, (void *)reset_now, "reset");
+		eioctl(fd, FDRESET, (void *)(long)reset_now, "reset");
 
 	if (mask & (PRINTSTATE | POLLSTATE) ){
 		if ( mask & POLLSTATE )
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/src/mediaprm.c fdutils/src/mediaprm.c
--- fdutils-5.5/src/mediaprm.c	2005-03-03 21:51:06.000000000 +0100
+++ fdutils/src/mediaprm.c	2008-10-27 20:34:09.000000000 +0100
@@ -21,6 +21,7 @@
 	FE_STRETCH,
 	FE_SWAPSIDES,
 	FE_ZEROBASED,
+	FE_FIRSTSECTORNUMBER,
 
 	FE_GAP,
 
@@ -36,7 +37,7 @@
 	FE_DENSITY,
 } field_t;
 
-static int SIZE, SECT, VSECT, HEAD, CYL, TPI, STRETCH, SWAPSIDES, ZEROBASED;
+static int SIZE, SECT, VSECT, HEAD, CYL, TPI, STRETCH, SWAPSIDES, ZEROBASED, FIRSTSECTORNUMBER=1;
 static int GAP, FM;
 static int PERP, SSIZE, _2M, DTR, SPEC1, FMT_GAP, DENSITY;
 static int ssize;
@@ -51,6 +52,7 @@
 #define F_STRETCH FE_STRETCH,&STRETCH
 #define F_SWAPSIDES FE_SWAPSIDES,&SWAPSIDES
 #define F_ZEROBASED FE_ZEROBASED,&ZEROBASED
+#define F_FIRSTSECTORNUMBER FE_FIRSTSECTORNUMBER,&FIRSTSECTORNUMBER
 
 #define F_GAP FE_GAP,&GAP
 
@@ -81,6 +83,8 @@
 
 	{ "swapsides", F_SWAPSIDES, 1},
 	{ "zerobased", F_ZEROBASED, 1},
+	{ "zero-based", F_ZEROBASED, 1},
+	{ "first-sector-number", F_FIRSTSECTORNUMBER, 0},
 
 	{ "gap", F_GAP, 0},
 
@@ -234,11 +238,25 @@
 	}
 	set_field(F_2M,0);
 
+	if(mask & (1 << FE_ZEROBASED)) {
+		if((mask & (1 << FE_FIRSTSECTORNUMBER)) &&
+		   FIRSTSECTORNUMBER != 0) {
+			fprintf(stderr,
+				"Zerobased incompatible with first-sector-number=%d\n",
+				FIRSTSECTORNUMBER);
+			exit(1);
+		} else
+			FIRSTSECTORNUMBER = 0;
+	} else if(! (mask & (1 << FE_FIRSTSECTORNUMBER))) {
+		FIRSTSECTORNUMBER = 1;
+	}
+
 	medprm->size = SIZE;
 	medprm->sect = VSECT / 512;
 	medprm->head = HEAD;
 	medprm->track = CYL;
-	medprm->stretch = STRETCH | (SWAPSIDES << 1) | (ZEROBASED << 2);
+	medprm->stretch = STRETCH | (SWAPSIDES << 1) | 
+	  ((1^FIRSTSECTORNUMBER) << 2);
 	medprm->gap = GAP;
 	medprm->rate = (FM<<7) | (PERP<<6) | (ssize<<3) | (_2M<<2) | DTR;
 	medprm->spec1 = SPEC1;
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/src/mediaprm.lex fdutils/src/mediaprm.lex
--- fdutils-5.5/src/mediaprm.lex	2002-05-02 23:03:31.000000000 +0200
+++ fdutils/src/mediaprm.lex	2006-02-27 22:56:21.000000000 +0100
@@ -12,7 +12,7 @@
 %option pointer
 
 fid	[^\"]+
-vid     [A-Za-z_][A-Za-z0-9_]*
+vid     [A-Za-z_][A-Za-z0-9_-]*
 number	(0x[a-zA-Z0-9]+|-?[0-9]+)(KB|k|b)?
 
 %%
@@ -37,6 +37,8 @@
 }
 
 swapsides |
+zerobased |
+zero-based |
 mss      |
 2m	 |
 2M	 |
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/src/msdos_fs.h fdutils/src/msdos_fs.h
--- fdutils-5.5/src/msdos_fs.h	2002-05-02 23:03:31.000000000 +0200
+++ fdutils/src/msdos_fs.h	2008-10-26 09:27:07.000000000 +0100
@@ -6,41 +6,41 @@
 #define p packed
 
 struct msdos_boot_sector {
-	char jump[3] p;               /* 0  - Boot strap short or near jump */
-	char banner[8] p;               /* 3  - Name - can be used to special case
+	char jump[3];                   /* 0  - Boot strap short or near jump */
+	char banner[8];                 /* 3  - Name - can be used to special case
 				                partition manager volumes */
 	unsigned short sector_size p;   /* 11 - bytes per logical sector */
-	unsigned char cluster_size p;   /* 13 - sectors/cluster */
+	unsigned char cluster_size;     /* 13 - sectors/cluster */
 	unsigned short res_sect p;      /* 14 - reserved sectors */
-	unsigned char fats p;	        /* 16 - number of FATs */
+	unsigned char fats;	        /* 16 - number of FATs */
 	unsigned short dir_entries p;   /* 17 - root directory entries */
 	unsigned short sectors p;       /* 19 - number of sectors */
-	unsigned char media p;	        /* 21 - media code (unused) */
+	unsigned char media;	        /* 21 - media code (unused) */
 	unsigned short fat_length p;    /* 22 - sectors/FAT */
 	unsigned short secs_track p;    /* 24 - sectors per track */
 	unsigned short heads p;	        /* 26 - number of heads */
 	unsigned long hidden p;	        /* 28 - hidden sectors (unused) */
 	unsigned long total_sect p;     /* 32 - number of sectors (if sectors == 0) */
-	unsigned char physdrive p;	/* 36 physical drive ? */
-	unsigned char _reserved p;	/* 37 reserved */
-	unsigned char dos4 p;		/* 38 DOS > 4.0 diskette */
+	unsigned char physdrive;	/* 36 physical drive ? */
+	unsigned char _reserved;	/* 37 reserved */
+	unsigned char dos4;		/* 38 DOS > 4.0 diskette */
 	unsigned long serial p;       	/* 39 serial number */
-	unsigned char label[11] p;	/* 43 disk label */
-	unsigned char fat_type[8] p;	/* 54 FAT type */
+	unsigned char label[11];	/* 43 disk label */
+	char fat_type[8];		/* 54 FAT type */
 #ifdef USE_2M
-	unsigned char res_2m p;		/* 62 reserved by 2M */
-	unsigned char CheckSum p;	/* 63 2M checksum (not used) */
-	unsigned char fmt_2mf p;	/* 64 2MF format version */
-	unsigned char wt p;		/* 65 1 if write track after format */
-	unsigned char rate_0 p;		/* 66 data transfer rate on track 0 */
-	unsigned char rate_any p;	/* 67 data transfer rate on track<>0 */
+	unsigned char res_2m;		/* 62 reserved by 2M */
+	unsigned char CheckSum;		/* 63 2M checksum (not used) */
+	unsigned char fmt_2mf;		/* 64 2MF format version */
+	unsigned char wt;		/* 65 1 if write track after format */
+	unsigned char rate_0;		/* 66 data transfer rate on track 0 */
+	unsigned char rate_any;	/* 67 data transfer rate on track<>0 */
 	unsigned short BootP p;		/* 68 offset to boot program */
 	unsigned short Infp0 p;		/* 70 T1: information for track 0 */
 	unsigned short InfpX p;		/* 72 T2: information for track<>0 */
 	unsigned short InfTm p;		/* 74 T3: track sectors size table */
-	unsigned char junk[126 - 76] p;	/* 76 remaining data */
+	unsigned char junk[126 - 76];	/* 76 remaining data */
 #else
-	unsigned char junk[126 - 62] p; /* 76 remaining data */
+	unsigned char junk[126 - 62];	/* 76 remaining data */
 #endif
         unsigned short bootid p;        /* 510 should be 0xAA55 */
 };
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/src/printfdprm.c fdutils/src/printfdprm.c
--- fdutils-5.5/src/printfdprm.c	2004-03-13 11:02:45.000000000 +0100
+++ fdutils/src/printfdprm.c	2008-10-27 00:59:01.000000000 +0100
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include "printfdprm.h"
+#include "fdutils.h"
 
 
 void print_params(drivedesc_t *drivedesc,
@@ -101,9 +102,9 @@
 				print("tpi=48",0);
 			break;
 		default:
-			if(level >= LEV_ALL || ft->stretch)
-				print("stretch=%d", ft->stretch);
-			break;			
+			if(level >= LEV_ALL || (ft->stretch & 1))
+				print("stretch=%d", ft->stretch & 1);
+			break;
 	}
 
 	if(level >= LEV_ALL || ft->size != ft->sect * ft->head * ft->track)
@@ -136,20 +137,20 @@
 	if(level >= LEV_EXPL || (ft->track != 80 && ft->track != 40))
 		print("cyl=%d", ft->track);
 
-#ifdef FD_SWAPSIDES
 	if(ft->stretch & FD_SWAPSIDES)
 		print("swapsides",0);			
-#endif
-
-#ifdef FD_ZEROBASED
-	if(ft->stretch & FD_ZEROBASED)
-		print("zerobased",0);			
-#endif
 
+	if(ft->stretch & FD_SECTBASEMASK) {
+		int firstSectorNumber = ((ft->stretch & FD_SECTBASEMASK)>>2)^1;
+		if(firstSectorNumber > 1)
+			print("first-sector-number=%d",firstSectorNumber);
+		else if(firstSectorNumber==0)
+			print("zero-based",0);
+	}
 
 	if(ft->rate & FD_2M)
 		print("2M",0);
-	
+
 	if(level < LEV_ALL &&
 	   ft->sect * 4 <  (2 << ssize) && ft->sect * 4 % (1 << ssize))
 		print("mss", 0);
@@ -163,7 +164,7 @@
 	}
 
 	/* useless stuff */
-	if(level >= LEV_MOST) {		
+	if(level >= LEV_MOST) {
 		print("gap=0x%02x", (unsigned char) ft->gap);
 		print("fmt_gap=0x%02x", (unsigned char) ft->fmt_gap);
 	}
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/src/superformat.c fdutils/src/superformat.c
--- fdutils-5.5/src/superformat.c	2005-03-03 22:41:05.000000000 +0100
+++ fdutils/src/superformat.c	2008-10-27 20:40:47.000000000 +0100
@@ -296,7 +296,7 @@
 		fd += findex[cylinder][head];
 		skew = fd->min + lskews[cylinder][head] * fd->chunksize;
 		assert(skew >= fd->min);
-		assert(skew <= fd->max);		
+		assert(skew <= fd->max);
 	} else
 		skew = 0;
 
@@ -305,7 +305,8 @@
 	for (i=0; i<fd->dsect; ++i){
 		offset = fd->sequence[i].offset + lskews[cylinder][head];
 		offset = offset % fd->nssect;
-		data[offset].sector = fd->sequence[i].sect - fd->zeroBased;
+		data[offset].sector = 
+			fd->sequence[i].sect + fd->firstSectorNumber;
 		data[offset].size = fd->sequence[i].size;
 		data[offset].cylinder = cylinder;
 		data[offset].head = head;
@@ -339,7 +340,7 @@
 	raw_cmd.cmd[3] = nssect;
 	raw_cmd.cmd[4] = fd->fmt_gap;
 	raw_cmd.cmd[5] = 0;
-	raw_cmd.flags = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN | 
+	raw_cmd.flags = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
 		FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK;
 	raw_cmd.track = cylinder << stretch;
 	raw_cmd.rate = fd->rate & 0x43;
@@ -363,14 +364,16 @@
 static int rw_track(struct params *fd, int cylinder, int head, int mode)
 {
 	int i;
-	int cur_sector;
+	int cur_sector; /* current sector, logical (based on 0) */
 	int retries;
 	struct floppy_raw_cmd raw_cmd;
 
-	cur_sector = 1 - fd->zeroBased;
+	cur_sector = 0;
 
 	for (i=MAX_SIZECODE-1; i>=0; --i) {
-		if ( fd->last_sect[i] <= cur_sector + fd->zeroBased)
+		if ( cur_sector >= fd->last_sect[i] )
+			/* last sector for size reached, move on to next
+			 * sizecode */
 			continue;
 		retries=0;
 	retry:
@@ -383,32 +386,31 @@
 		    (fd->swapSides ? 4 : 0);
 		raw_cmd.cmd[2] = cylinder;
 		raw_cmd.cmd[3] = head;
-		raw_cmd.cmd[4] = cur_sector;
+		raw_cmd.cmd[4] = cur_sector + fd->firstSectorNumber;
 		raw_cmd.cmd[5] = i;
-		raw_cmd.cmd[6] = fd->last_sect[i] - 1 - fd->zeroBased;
+		raw_cmd.cmd[6] = fd->last_sect[i] + fd->firstSectorNumber - 1;
 		raw_cmd.cmd[7] = fd->gap;
 		if ( i )
 			raw_cmd.cmd[8] = 0xff;
 		else
 			raw_cmd.cmd[8] = 0xff;
-		raw_cmd.flags = (mode ? FD_RAW_WRITE : FD_RAW_READ) | 
+		raw_cmd.flags = (mode ? FD_RAW_WRITE : FD_RAW_READ) |
 			FD_RAW_INTR | FD_RAW_SPIN |
 			FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK;
 		raw_cmd.track = cylinder << stretch;
 		raw_cmd.rate = fd->rate & 0x43;
 
-		raw_cmd.length = (fd->last_sect[i] - 
-				  fd->zeroBased - 
-				  cur_sector) * 128 << i;
+		raw_cmd.length = (fd->last_sect[i] - cur_sector) * 128 << i;
 		/* debugging */
 		if (verbosity == 9)
 			printf("%s %ld sectors of size %d starting at %d\n",
 			       mode ? "writing" : "reading",
 			       raw_cmd.length / 512, i, cur_sector);
-		if(send_cmd(fd->fd, & raw_cmd, 
+		if(send_cmd(fd->fd, & raw_cmd,
 			    mode ? "format" : "verify")){
 			if ( !retries && mode && (raw_cmd.reply[1] & ST1_ND) ){
-				cur_sector = raw_cmd.reply[5];
+				cur_sector = 
+					raw_cmd.reply[5] - fd->firstSectorNumber;
 				retries++;
 				goto retry;
 			}
@@ -516,6 +518,7 @@
 
 	short retries;
 	short zeroBased=0;
+	short firstSectorNumber=1;
 	short swapSides=0;
 	int n,rsize;
 	char *verify_buffer = NULL;
@@ -673,6 +676,10 @@
 	  	(void *) &zeroBased,
 	  	"Start numbering sectors from 0 instead of 1 (not readable by normal I/O)" },
 
+	{ '\0', "first-sector-number", 1, EO_TYPE_SHORT, 1, 0,
+	  	(void *) &firstSectorNumber,
+	  	"Number of first sector (by default, 1)" },
+
 	{ '\0', 0 }
 	};
 
@@ -693,6 +700,15 @@
 		exit(1);
 	}
 
+	if(zeroBased) {
+		if(firstSectorNumber == 1)
+			firstSectorNumber = 0;
+		else if(firstSectorNumber > 1) {
+			fprintf(stderr, "Contradiction between zeroBased and firstSectorNumber");
+			exit(1);
+		}
+	}
+
 	/* sanity checking */
 	if (sizecode < 0 || sizecode >= MAX_SIZECODE) {
 		fprintf(stderr,"Bad sizecode %d\n", sizecode);
@@ -730,7 +746,7 @@
 	while(1) {
 		fd[0].fd = open(fd[0].name, O_RDWR | O_NDELAY | O_EXCL);
 		
-		/* we open the disk wronly/rdwr in order to check write 
+		/* we open the disk wronly/rdwr in order to check write
 		 * protect */
 		if (fd[0].fd < 0) {
 			perror("open");
@@ -778,7 +794,7 @@
 
 
 	if(have_geom) {
-		if(mask & (SET_SECTORS | SET_CYLINDERS | 
+		if(mask & (SET_SECTORS | SET_CYLINDERS |
 			   SET_HEADS | SET_SIZECODE | SET_2M | SET_RATE)) {
 			fprintf(stderr,
 				"Cannot mix old style and new style geometry spec\n");
@@ -805,17 +821,14 @@
 				break;
 		}
 		stretch = geometry.stretch & 1;
-#ifdef FD_ZEROBASED
-		if(geometry.stretch & FD_ZEROBASED) {
-			zeroBased = 1;
+		if(geometry.stretch & FD_SECTBASEMASK) {
+			firstSectorNumber =
+				((geometry.stretch & FD_SECTBASEMASK)>>2)^1;
 		}
-#endif
-#ifdef FD_SWAPSIDES
 		if(geometry.stretch & FD_SWAPSIDES) {
 			swapSides = 1;
 		}
-#endif
-		mask |= SET_SECTORS | SET_CYLINDERS | 
+		mask |= SET_SECTORS | SET_CYLINDERS |
 			SET_SIZECODE | SET_2M | SET_RATE;
 	} else {
 		/* density */
@@ -831,7 +844,7 @@
 			density = DRIVE_DEFAULTS.density;
 			if ( mask & SET_RATE ){
 				for (i=0; i< density; ++i) {
-					if(fd[0].rate == 
+					if(fd[0].rate ==
 					   DRIVE_DEFAULTS.fmt[i].rate)
 						density=i;
 				}
@@ -867,13 +880,7 @@
 		}
 	}
 
-	fd[0].zeroBased = zeroBased;
-#ifndef FD_ZEROBASED
-	if(zeroBased) {
-		noverify = 1;
-	}
-#endif
-	
+	fd[0].firstSectorNumber = firstSectorNumber;
 	fd[0].swapSides = swapSides;
 		
 	if (cylinders > fd[0].drvprm.tracks) {
@@ -914,7 +921,7 @@
 		header_size = 62;
 
 	if(! (mask & (SET_DEVIATION | SET_MARGIN)) &&
-	   (drivedesc.mask & (1 << FE__DEVIATION))) {	       
+	   (drivedesc.mask & (1 << FE__DEVIATION))) {	
 		deviation = drivedesc.type.deviation;
 		mask |= SET_DEVIATION;
 	}
@@ -947,14 +954,14 @@
 				"add the following line to " DRIVEPRMFILE ":\n");
 			fprintf(stdout,
 				"drive%d: deviation=%d\n",
-				fd[0].drive, 
+				fd[0].drive,
 				(fd[0].raw_capacity-old_capacity)*1000000/
 				old_capacity);
 			fprintf(stderr,
 				"CAUTION: The line is drive and controller "
-				"specific, so it should be\n" 
+				"specific, so it should be\n"
 				"removed before installing a new "
-				"drive %d or floppy controller.\n\n", 
+				"drive %d or floppy controller.\n\n",
 				fd[0].drive);
 		}
 	}
@@ -981,7 +988,7 @@
 	if (verbosity == 9) {
 		for (i=0; i<fd[0].dsect; ++i)
 			printf("s=%2d S=%2d o=%2d\n",
-				fd[0].sequence[i].sect,
+				fd[0].sequence[i].sect + firstSectorNumber,
 				fd[0].sequence[i].size,
 				fd[0].sequence[i].offset);
 
@@ -1004,9 +1011,10 @@
 		if (verbosity == 9){
 			for (i=0; i< fd0.dsect; i++)
 				printf("s=%2d S=%2d o=%2d\n",
-					fd0.sequence[i].sect,
-					fd0.sequence[i].size,
-					fd0.sequence[i].offset);
+				       fd0.sequence[i].sect +
+				       fd0.firstSectorNumber,
+				       fd0.sequence[i].size,
+				       fd0.sequence[i].offset);
 
 			printf("fd[0].sizecode=%d\n", fd0.sizecode);
 			printf("fd[0].fmt_gap=%d\n", fd0.fmt_gap);
@@ -1019,11 +1027,9 @@
 	parameters.head = heads;
 	parameters.track = cylinders;
 	parameters.size = cylinders * heads * sectors;
-	parameters.stretch = stretch 
-#ifdef FD_ZEROBASED
-		| (zeroBased ? 4 : 0)
-#endif
-		| (swapSides ? 2 : 0);
+	parameters.stretch = stretch
+		| (swapSides ? 2 : 0)
+		| ((1^firstSectorNumber) << 2);
 	parameters.gap = fd[0].gap;
 	if ( !use_2m)
 		fd0.rate = fd[0].rate;
@@ -1109,7 +1115,8 @@
 	ioctl(fd[0].fd, FDFLUSH );
 	close(fd[0].fd);
 
-	if (! (mask & SET_DOSDRIVE ) && fd[0].drive < 2 && !zeroBased)
+	if (! (mask & SET_DOSDRIVE ) && fd[0].drive < 2 &&
+	    firstSectorNumber == 1)
 		dosdrive = fd[0].drive+'a';
 
 	if (dosdrive) {
@@ -1133,14 +1140,14 @@
 		setenv("MTOOLS_RATE_ANY", env_buffer,1);
 		if(system(command_buffer)){
 			fprintf(stderr,"\nwarning: mformat error\n");
-			/*exit(1);*/  
-			/* Do not fail, if mformat happens to not be 
+			/*exit(1);*/
+			/* Do not fail, if mformat happens to not be
 			 * installed. The user might have wanted to make
 			 * an ext2 disk for instance */
 			dosverify = 0;
 		}			
 	} else {
-		if(!zeroBased)
+		if(firstSectorNumber != 1)
 			fprintf(stderr,
 				"\nwarning: mformat not called because DOS drive unknown\n");
 		/*exit(1);*/
@@ -1173,7 +1180,7 @@
 					n = read(fd[0].fd,verify_buffer,rsize);
 					if ( n < 0){
 						perror("read");
-						fprintf(stderr, 
+						fprintf(stderr,
 							"remaining %d\n", n);
 						exit(1);
 					}
diff -ur --new-file --exclude-from=/home/alain/Projects/Fdutils/exclude fdutils-5.5/src/superformat.h fdutils/src/superformat.h
--- fdutils-5.5/src/superformat.h	2002-11-02 14:36:45.000000000 +0100
+++ fdutils/src/superformat.h	2008-10-27 20:17:54.000000000 +0100
@@ -83,7 +83,7 @@
 	int length; /* length of the track */
 	int rotations; /* how many time do we have to go over 0 to read
 			* the track */
-	int zeroBased; /* 1 if sector numbering starts at zero */
+	int firstSectorNumber; /* Number of first sector (1, by default) */
 	int swapSides; /* if logical side 0 is on physical 1 and vice-versa */
 };
 
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin