diff -rc --new-file orig/mtools-2.0.7/Configure mtools-2.0.7/Configure
*** orig/mtools-2.0.7/Configure	Thu Sep 10 16:10:09 1992
--- mtools-2.0.7/Configure	Sun Sep 26 19:24:01 1993
***************
*** 39,51 ****
  		FCNTL	Alternate Berkeley lock method (may not work
  			on devices)
  
  	The folowing are pre-proccessor variables for the default device
  	setups for various flavors of Unix.  Pick one of the these, or
  	create a new entry in the devices.c file.
  
- 		ISC	default devices for ISC's SVR3.2
  
! 		UNIXPC	default devices for AT&T Unix PC 7300/3B1
  
  		SPARC	default devices for SunOS 4.1 on a SPARCstation
  
--- 39,53 ----
  		FCNTL	Alternate Berkeley lock method (may not work
  			on devices)
  
+ 	Puck *none* if you are on Linux -- record locking is still a bit
+ 	
+ 
  	The folowing are pre-proccessor variables for the default device
  	setups for various flavors of Unix.  Pick one of the these, or
  	create a new entry in the devices.c file.
  
  
! 		ISC	default devices for ISC's SVR3.2
  
  		SPARC	default devices for SunOS 4.1 on a SPARCstation
  
***************
*** 59,65 ****
--- 61,75 ----
  
  		RT_ACIS	default devices for IBM's BSD clone.		
  
+ 		UNIXPC	default devices for AT&T Unix PC 7300/3B1
+ 
  		SPARC_ODD for reading odd-ball disks on a Sparc
+ 
+ 	However if you define LOADDEVS instead the configuration information
+ 	will be read from /etc/mtools (the path can be changed by editing
+ 	at devices.c). This should not be done if you would have defined
+ 	otherwise UNIXPC or SPARC_ODD, as these two choices also imply
+ 	OS dependent device initialization routines.
  		
  	There is a variable in msdos.h called SIG_TYPE which should be
  	configured to the "base" return type of signal();
***************
*** 123,128 ****
--- 133,153 ----
  	safely ignored.
  
  4)  Some example devices
+ 
+ 	If you define LOADDEVS, then a sample /etc/mtools file may be:
+ 
+ 		A /dev/fd0 12 0 0 0
+ 		A /dev/fd0 12 40 2 9
+ 		B /dev/fd1 12 0 0 0
+ 		B /dev/fd1 12 40 2 9
+ 		C /dev/hda1 16 0 0 0
+ 		D /dev/hda6 16 0 0 0
+ 
+ 	which is the default one contained in mtools.etc in this directory,
+ 	and that is designed for Linux.
+ 
+ 	If you choose to hardcode the devices in, by not defining LOADDEVS,
+ 	but one of DELL, ..., the following are typical choices:
  
  	for Interactive 386ix 2.0.2 with:
  		1.2m 5.25" as a: (supports 1.2m, 360k, and 320k)
diff -rc --new-file orig/mtools-2.0.7/Makefile mtools-2.0.7/Makefile
*** orig/mtools-2.0.7/Makefile	Thu Sep 10 16:10:46 1992
--- mtools-2.0.7/Makefile	Thu Oct 28 08:58:34 1993
***************
*** 14,177 ****
  #CFLAGS = -O -M2e -DINT16 -DXENIX -DLOCKF
  #LDFLAGS = -s -M2e -i -f 5000
  
! CFLAGS	= -O -DSPARC -DBSD
  LDFLAGS	= -s
  LD	= $(CC)
  LINT	= lint
  SHLIB	=
  SHAR	= shar -a
! BINDIR	= ${DESTDIR}/usr/local/mtools
! MANEXT	= 1
! MANDIR	= ${DESTDIR}/usr/share/local/man/man$(MANEXT)
  #
  # for AT&T Unix PC 7300/3b1 style shared libraries.
  #SHOBJ	= /lib/crt0s.o /lib/shlib.ifile
  #LD	= ld
  
! PROGS	= mattrib mcd mcopy mdel mdir mformat mlabel mmd mrd mread mren \
! 	mtype mwrite mkmanifest
  
! MATTRIB	= mattrib.o buf_read.o buf_write.o devices.o dir_read.o \
! 	dir_write.o expand.o fat_read.o init.o match.o parse.o subdir.o
! MCD	= mcd.o buf_read.o devices.o dir_read.o expand.o fat_read.o \
! 	init.o is_dir.o match.o parse.o subdir.o
! MCOPY	= mcopy.o
! MDEL	= mdel.o buf_read.o buf_write.o devices.o dir_read.o dir_write.o \
! 	expand.o fat_free.o fat_read.o fat_write.o init.o match.o parse.o \
! 	subdir.o 
! MDIR	= mdir.o buf_read.o devices.o dir_read.o expand.o fat_read.o \
! 	init.o is_dir.o match.o parse.o subdir.o
! MFORMAT	= mformat.o devices.o dir_write.o expand.o
! MLABEL	= mlabel.o buf_read.o buf_write.o devices.o dir_read.o \
! 	dir_write.o expand.o fat_read.o init.o 
! MMD	= mmd.o buf_read.o buf_write.o devices.o dir_make.o dir_read.o \
! 	dir_write.o expand.o fat_read.o fat_write.o init.o match.o parse.o \
! 	subdir.o
! MRD	= mrd.o buf_read.o buf_write.o devices.o dir_read.o dir_write.o \
! 	expand.o fat_free.o fat_read.o fat_write.o init.o match.o parse.o \
! 	subdir.o
! MREAD	= mread.o buf_read.o devices.o dir_read.o expand.o fat_read.o \
! 	file_read.o init.o match.o parse.o subdir.o
! MREN	= mren.o buf_read.o buf_write.o devices.o dir_read.o dir_write.o \
! 	expand.o fat_read.o init.o match.o parse.o subdir.o
! MTYPE	= mtype.o buf_read.o devices.o dir_read.o expand.o fat_read.o \
! 	file_read.o init.o match.o parse.o subdir.o
! MWRITE	= mwrite.o buf_read.o buf_write.o devices.o dir_make.o \
! 	dir_read.o dir_write.o expand.o fat_free.o fat_read.o fat_write.o \
! 	file_write.o init.o is_dir.o match.o parse.o subdir.o
! MKMANIFEST = mkmanifest.o
! 
! all:	$(PROGS)
! 
! mattrib: $(MATTRIB)
! 	$(LD) $(LDFLAGS) $(MATTRIB) $(SHOBJ) -o mattrib $(SHLIB)
! 
! mcd:	$(MCD)
! 	$(LD) $(LDFLAGS) $(MCD) $(SHOBJ) -o mcd $(SHLIB)
! 
! mcopy:	$(MCOPY)
! 	$(LD) $(LDFLAGS) $(MCOPY) $(SHOBJ) -o mcopy $(SHLIB)
! 
! mdel:	$(MDEL)
! 	$(LD) $(LDFLAGS) $(MDEL) $(SHOBJ) -o mdel $(SHLIB)
! 
! mdir:	$(MDIR)
! 	$(LD) $(LDFLAGS) $(MDIR) $(SHOBJ) -o mdir $(SHLIB)
! 
! mformat: $(MFORMAT)
! 	$(LD) $(LDFLAGS) $(MFORMAT) $(SHOBJ) -o mformat $(SHLIB)
! 
! mlabel:	$(MLABEL)
! 	$(LD) $(LDFLAGS) $(MLABEL) $(SHOBJ) -o mlabel $(SHLIB)
! 
! mmd:	$(MMD)
! 	$(LD) $(LDFLAGS) $(MMD) $(SHOBJ) -o mmd $(SHLIB)
! 
! mrd:	$(MRD)
! 	$(LD) $(LDFLAGS) $(MRD) $(SHOBJ) -o mrd $(SHLIB)
! 
! mread:	$(MREAD)
! 	$(LD) $(LDFLAGS) $(MREAD) $(SHOBJ) -o mread $(SHLIB)
! 
! mren:	$(MREN)
! 	$(LD) $(LDFLAGS) $(MREN) $(SHOBJ) -o mren $(SHLIB)
! 
! mtype:	$(MTYPE)
! 	$(LD) $(LDFLAGS) $(MTYPE) $(SHOBJ) -o mtype $(SHLIB)
! 
! mwrite:	$(MWRITE)
! 	$(LD) $(LDFLAGS) $(MWRITE) $(SHOBJ) -o mwrite $(SHLIB)
! 
! mkmanifest:	$(MKMANIFEST)
! 	$(LD) $(LDFLAGS) $(MKMANIFEST) $(SHOBJ) -o mkmanifest $(SHLIB)
! 
! install: all
! 	-mkdir $(BINDIR)
! 	for prog in $(PROGS); do install $$prog $(BINDIR)/$$prog; gln -sf ../mtools/$$prog ${DESTDIR}/usr/local/bin; done
! 	install -c -m 644 Mattrib.1 $(MANDIR)/mattrib.$(MANEXT)
! 	install -c -m 644 Mcd.1 $(MANDIR)/mcd.$(MANEXT)
! 	install -c -m 644 Mcopy.1 $(MANDIR)/mcopy.$(MANEXT)
! 	install -c -m 644 Mdel.1 $(MANDIR)/mdel.$(MANEXT)
! 	install -c -m 644 Mdir.1 $(MANDIR)/mdir.$(MANEXT)
! 	install -c -m 644 Mformat.1 $(MANDIR)/mformat.$(MANEXT)
! 	install -c -m 644 Mlabel.1 $(MANDIR)/mlabel.$(MANEXT)
! 	install -c -m 644 Mmd.1 $(MANDIR)/mmd.$(MANEXT)
! 	install -c -m 644 Mrd.1 $(MANDIR)/mrd.$(MANEXT)
! 	install -c -m 644 Mread.1 $(MANDIR)/mread.$(MANEXT)
! 	install -c -m 644 Mren.1 $(MANDIR)/mren.$(MANEXT)
! 	install -c -m 644 Mtools.1 $(MANDIR)/mtools.$(MANEXT)
! 	install -c -m 644 Mtype.1 $(MANDIR)/mtype.$(MANEXT)
! 	install -c -m 644 Mwrite.1 $(MANDIR)/mwrite.$(MANEXT)
! 	install -c -m 644 Mkmanifest.1 $(MANDIR)/mkmanifest.$(MANEXT)
  
  clean:
! 	rm $(PROGS) *.o core a.out tags TAGS
  
! lint:
! 	$(LINT) mattrib.c buf_read.c buf_write.c devices.c dir_read.c \
! 	dir_write.c expand.c fat_read.c init.c match.c parse.c subdir.c
! 	$(LINT) mcd.c buf_read.c devices.c dir_read.c expand.c fat_read.c \
! 	init.c is_dir.c match.c parse.c subdir.c
! 	$(LINT) mcopy.c
! 	$(LINT) mdel.c buf_read.c buf_write.c devices.c dir_read.c dir_write.c \
! 	expand.c fat_free.c fat_read.c fat_write.c init.c match.c parse.c \
! 	subdir.c 
! 	$(LINT) mdir.c buf_read.c devices.c dir_read.c expand.c fat_read.c \
! 	init.c is_dir.c match.c parse.c subdir.c
! 	$(LINT) mformat.c devices.c dir_write.c expand.c
! 	$(LINT) mlabel.c buf_read.c buf_write.c devices.c dir_read.c \
! 	dir_write.c expand.c fat_read.c init.c 
! 	$(LINT) mmd.c buf_read.c buf_write.c devices.c dir_make.c dir_read.c \
! 	dir_write.c expand.c fat_read.c fat_write.c init.c match.c parse.c \
! 	subdir.c
! 	$(LINT) mrd.c buf_read.c buf_write.c devices.c dir_read.c dir_write.c \
! 	expand.c fat_free.c fat_read.c fat_write.c init.c match.c parse.c \
! 	subdir.c
! 	$(LINT) mread.c buf_read.c devices.c dir_read.c expand.c fat_read.c \
! 	file_read.c init.c match.c parse.c subdir.c
! 	$(LINT) mren.c buf_read.c buf_write.c devices.c dir_read.c dir_write.c \
! 	expand.c fat_read.c init.c match.c parse.c subdir.c
! 	$(LINT) mtype.c buf_read.c devices.c dir_read.c expand.c fat_read.c \
! 	file_read.c init.c match.c parse.c subdir.c
! 	$(LINT) mwrite.c buf_read.c buf_write.c devices.c dir_make.c \
! 	dir_read.c dir_write.c expand.c fat_free.c fat_read.c fat_write.c \
! 	file_write.c init.c is_dir.c match.c parse.c subdir.c
! 	$(LINT) mkmanifest.c
! 
! shar:
! 	$(SHAR) Configure Makefile Mattrib.1 Mcd.1 Mcopy.1 Mdel.1 Mdir.1 \
! 	Mformat.1 Mkmanifest.1 Mlabel.1 Mmd.1 Mrd.1 Mread.1 Mren.1 \
! 	Mtools.1 Mtype.1 Mwrite.1 Readme Release.notes buf_read.c \
! 	buf_write.c devices.c dir_make.c dir_read.c dir_write.c expand.c \
! 	fat_free.c > mtools_sh.1
! 	$(SHAR) fat_read.c fat_write.c file_read.c file_write.c init.c \
! 	is_dir.c match.c mattrib.c mcd.c mcopy.c mdel.c mdir.c mformat.c \
! 	mkmanifest.c mlabel.c mmd.c > mtools_sh.2
! 	$(SHAR) mrd.c mread.c mren.c msdos.h mtype.c mwrite.c parse.c \
! 	patchlevel.h subdir.c > mtools_sh.3
! 	$(SHAR) Mattrib.out Mcd.out Mcopy.out Mdel.out Mdir.out Mformat.out \
! 	Mkmanifest.out Mlabel.out Mmd.out Mrd.out Mread.out Mren.out \
! 	Mtools.out Mtype.out Mwrite.out > mtools_sh.4
  
  buf_read.o:	msdos.h
  buf_write.o:	msdos.h
--- 14,95 ----
  #CFLAGS = -O -M2e -DINT16 -DXENIX -DLOCKF
  #LDFLAGS = -s -M2e -i -f 5000
  
! #for Linux (locking device files does not work reliably?)
! CFLAGS	= -O2 -m486 -DLOADDEVS #-DFLOCK
  LDFLAGS	= -s
+ 
  LD	= $(CC)
  LINT	= lint
  SHLIB	=
  SHAR	= shar -a
! BINDIR	= ${DEST}/usr/bin
! ETCDIR	= ${DEST}/etc
! MAN1EXT	= 1
! MAN1DIR	= ${DEST}/usr/man/man$(MAN1EXT)
! MAN5EXT	= 5
! MAN5DIR	= ${DEST}/usr/man/man$(MAN5EXT)
  #
  # for AT&T Unix PC 7300/3b1 style shared libraries.
  #SHOBJ	= /lib/crt0s.o /lib/shlib.ifile
  #LD	= ld
  
! LINKS=mattrib mcd mcopy mdel mdir mformat mlabel mmd mrd mread mren  mtype \
!       mwrite
! MTOOLS = mattrib.o mcd.o mcopy.o mdel.o mdir.o mformat.o mlabel.o mmd.o \
! 	 mrd.o mread.o mren.o mtype.o mwrite.o buf_read.o buf_write.o \
! 	 devices.o dir_make.o dir_read.o dir_write.o expand.o fat_free.o \
! 	 fat_read.o fat_write.o file_read.o file_write.o init.o is_dir.o \
! 	 match.o parse.o subdir.o mtools.o
! 
! MKMAN1IFEST = mkmanifest.o
! 
! all:	mtools $(LINKS)
! 
! mtools:	$(MTOOLS)
! 	$(LD) $(LDFLAGS) $(MTOOLS) $(SHOBJ) -o mtools $(SHLIB)
! 
! $(LINKS):	mtools
! 	for name in $(LINKS); \
! 	do rm -f $$name && ln mtools $$name; done
  
! mkmanifest:	$(MKMAN1IFEST)
! 	$(LD) $(LDFLAGS) $(MKMAN1IFEST) $(SHOBJ) -o mkmanifest $(SHLIB)
  
  clean:
! 	-rm *.o 2>/dev/null
! 
! spotless:	clean
! 	-rm mtools $(LINKS) 2>/dev/null
! 
! install:	$(BINDIR)/mtools ${ETCDIR}/mtools install-man install-links
  
! $(BINDIR)/mtools: mtools
! 	cp mtools $(BINDIR)/mtools
! 
! $(ETCDIR)/mtools: mtools.etc
! 	cp mtools.etc $(ETCDIR)/mtools
! 
! install-links: $(BINDIR)/mtools
! 	cd $(BINDIR) && for name in $(LINKS); \
! 	do rm -f $$name && ln mtools $$name; done
! 
! install-man:
! 	install -c -m 644 mattrib.1 $(MAN1DIR)/mattrib.$(MAN1EXT)
! 	install -c -m 644 mcd.1 $(MAN1DIR)/mcd.$(MAN1EXT)
! 	install -c -m 644 mcopy.1 $(MAN1DIR)/mcopy.$(MAN1EXT)
! 	install -c -m 644 mdel.1 $(MAN1DIR)/mdel.$(MAN1EXT)
! 	install -c -m 644 mdir.1 $(MAN1DIR)/mdir.$(MAN1EXT)
! 	install -c -m 644 mformat.1 $(MAN1DIR)/mformat.$(MAN1EXT)
! 	install -c -m 644 mlabel.1 $(MAN1DIR)/mlabel.$(MAN1EXT)
! 	install -c -m 644 mmd.1 $(MAN1DIR)/mmd.$(MAN1EXT)
! 	install -c -m 644 mrd.1 $(MAN1DIR)/mrd.$(MAN1EXT)
! 	install -c -m 644 mread.1 $(MAN1DIR)/mread.$(MAN1EXT)
! 	install -c -m 644 mren.1 $(MAN1DIR)/mren.$(MAN1EXT)
! 	install -c -m 644 mtools.1 $(MAN1DIR)/mtools.$(MAN1EXT)
! 	install -c -m 644 mtools.5 $(MAN5DIR)/mtools.$(MAN5EXT)
! 	install -c -m 644 mtype.1 $(MAN1DIR)/mtype.$(MAN1EXT)
! 	install -c -m 644 mwrite.1 $(MAN1DIR)/mwrite.$(MAN1EXT)
! 	install -c -m 644 mkmanifest.1 $(MAN1DIR)/mkmanifest.$(MAN1EXT)
  
  buf_read.o:	msdos.h
  buf_write.o:	msdos.h
***************
*** 186,203 ****
  file_write.o:	msdos.h
  init.o:		msdos.h
  is_dir.o:	msdos.h
! mattrib.o:	msdos.h patchlevel.h
! mcd.o:		msdos.h patchlevel.h
! mcopy.o:	patchlevel.h
! mdel.o:		msdos.h patchlevel.h
! mdir.o:		msdos.h patchlevel.h
! mformat.o:	msdos.h patchlevel.h
! mlabel.o:	msdos.h patchlevel.h
! mmd.o:		msdos.h patchlevel.h
! mrd.o:		msdos.h patchlevel.h
! mread.o:	msdos.h patchlevel.h
! mren.o:		msdos.h patchlevel.h
! mtype.o:	msdos.h patchlevel.h
! mwrite.o:	msdos.h patchlevel.h
  parse.o:	msdos.h
  subdir.o:	msdos.h
--- 104,125 ----
  file_write.o:	msdos.h
  init.o:		msdos.h
  is_dir.o:	msdos.h
! 
! mattrib.o:	msdos.h mattrib.c
! mcd.o:		msdos.h mcd.c
! mcopy.o:	msdos.h mcopy.c
! mdel.o:		msdos.h mdel.c
! mdir.o:		msdos.h mdir.c
! mformat.o:	msdos.h mformat.c
! mlabel.o:	msdos.h mlabel.c
! mmd.o:		msdos.h mmd.c
! mrd.o:		msdos.h mrd.c
! mread.o:	msdos.h mread.c
! mren.o:		msdos.h mren.c
! mtype.o:	msdos.h mtype.c
! mwrite.o:	msdos.h mwrite.c
! 
  parse.o:	msdos.h
  subdir.o:	msdos.h
+ 
+ mtools.o:	msdos.h patchlevel.h mtools.c
Only in orig/mtools-2.0.7: Mattrib.1
Only in orig/mtools-2.0.7: Mcd.1
Only in orig/mtools-2.0.7: Mcopy.1
Only in orig/mtools-2.0.7: Mdel.1
Only in orig/mtools-2.0.7: Mdir.1
Only in orig/mtools-2.0.7: Mformat.1
Only in orig/mtools-2.0.7: Mkmanifest.1
Only in orig/mtools-2.0.7: Mlabel.1
Only in orig/mtools-2.0.7: Mmd.1
Only in orig/mtools-2.0.7: Mrd.1
Only in orig/mtools-2.0.7: Mread.1
Only in orig/mtools-2.0.7: Mren.1
Only in orig/mtools-2.0.7: Mtools.1
Only in orig/mtools-2.0.7: Mtype.1
Only in orig/mtools-2.0.7: Mwrite.1
diff -rc --new-file orig/mtools-2.0.7/Release.notes mtools-2.0.7/Release.notes
*** orig/mtools-2.0.7/Release.notes	Thu Sep 10 16:00:31 1992
--- mtools-2.0.7/Release.notes	Sun Sep 26 19:24:06 1993
***************
*** 1,3 ****
--- 1,12 ----
+ Patch #7+, 19 sep 93
+ 
+ This patch merges in the mods against 2.05 under Linux. Two are the main
+ changes: that all commands are linked as a single executable, which can
+ be linked as different name, and that the device specs are no longer
+ hardcompiled but are read dynamically from /etc/mtools (the latter change
+ is conditional on LOADDEVS being defined).
+ 
+ -----------------------------------------------------------------------------
  Patch #7, 6 Sep 92
  
  This patch will change the method of determining if the FAT encoding
diff -rc --new-file orig/mtools-2.0.7/devices.c mtools-2.0.7/devices.c
*** orig/mtools-2.0.7/devices.c	Thu Sep 10 16:11:17 1992
--- mtools-2.0.7/devices.c	Sun Oct 17 21:58:59 1993
***************
*** 3,50 ****
   */
  
  #include <stdio.h>
  #include "msdos.h"
  
  #ifdef DELL
  struct device devices[] = {
! 	{'A', "/dev/rdsk/f0d9dt", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},
! 	{'A', "/dev/rdsk/f0q15dt", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15},
! 	{'A', "/dev/rdsk/f0d8dt", 0L, 12, 0, (int (*) ()) 0, 40, 2, 8},
! 	{'B', "/dev/rdsk/f13ht", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18},
! 	{'B', "/dev/rdsk/f13dt", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},
! 	{'C', "/dev/rdsk/dos", 0L, 16, 0, (int (*) ()) 0, 0, 0, 0},
! 	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
  };
  #endif /* DELL */
  
  #ifdef ISC
  struct device devices[] = {
! 	{'A', "/dev/rdsk/f0d9dt", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},
! 	{'A', "/dev/rdsk/f0q15dt", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15},
! 	{'A', "/dev/rdsk/f0d8dt", 0L, 12, 0, (int (*) ()) 0, 40, 2, 8},
! 	{'B', "/dev/rdsk/f13ht", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18},
! 	{'B', "/dev/rdsk/f13dt", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},
! 	{'C', "/dev/rdsk/0p1", 0L, 16, 0, (int (*) ()) 0, 0, 0, 0},
! 	{'D', "/usr/vpix/defaults/C:", 8704L, 12, 0, (int (*) ()) 0, 0, 0, 0},
! 	{'E', "$HOME/vpix/C:", 8704L, 12, 0, (int (*) ()) 0, 0, 0, 0},
! 	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
  };
  #endif /* ISC */
  
  #ifdef SPARC
  struct device devices[] = {
! 	{'A', "/dev/rfd0c", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18},
! 	{'A', "/dev/rfd0c", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},
! 	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
  };
  #endif /* SPARC */
! #ifdef RT_ACIS
  struct device devices[] = {
!       {'A', "/dev/rfd0", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15},
!       {'A', "/dev/rfd0", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},
!       {'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
  };
! #endif /* RT_ACIS */
  
  
  #ifdef UNIXPC
--- 3,161 ----
   */
  
  #include <stdio.h>
+ #include <string.h>
+ #include <ctype.h>
+ #include <limits.h>
  #include "msdos.h"
  
+ #ifdef LOADDEVS
+ 
+ #define CFG_FILE    "/etc/mtools"
+ 
+ #define MAX_LINE    PATH_MAX+40
+ #define MAX_DEVICES 10
+ 
+ #ifdef __STDC__
+ # define AUX(x) #x
+ # define STR(x) AUX(x)
+ #else
+ # define STR(x) "x"
+ #endif
+ 
+ #define SET(f,t,h,s) \
+   { devices[dev].fat_bits = (f); devices[dev].tracks = (t); \
+   devices[dev].heads = (h); devices[dev].sectors = (s); }
+ 
+ struct device devices[MAX_DEVICES+1];
+ 
+ void load_devices(void)
+ {
+     FILE *cfg;
+     char buffer[MAX_LINE+1],name[PATH_MAX+1];
+     char *here,*start;
+     int items,dev,fat_bits;
+ 
+     if ((cfg = fopen(CFG_FILE,"r")) == NULL) {
+ 	perror(CFG_FILE);
+ 	exit(1);
+     }
+     dev = 0;
+     while (fgets(buffer,MAX_LINE,cfg)) {
+ 	if (here = strchr(buffer,'#')) *here = 0;
+ 	else if (here = strchr(buffer,'\n')) *here = 0;
+ 	for (start = buffer; *start == ' ' || *start == '\t'; start++);
+ 	if (!*start) continue;
+ 	items = sscanf(start,"%c %" STR(PATH_MAX) "s %d %d %d %d",
+ 	  &devices[dev].drive,name,&fat_bits,&devices[dev].tracks,
+ 	  &devices[dev].heads,&devices[dev].sectors);
+ 	if (dev >= MAX_DEVICES) {
+ 	    fprintf(stderr,"Too many devices\n");
+ 	    exit(1);
+ 	}
+ 	if (items == 6) devices[dev].fat_bits = fat_bits;
+ 	else {
+ 	    if (items == 2 || items == 3) {
+ #ifdef oldLINUX
+ 		     if (!strncmp("/dev/at",name,7)) { SET(12,80,2,15) }
+ 		else if (!strncmp("/dev/PS",name,7)) { SET(12,80,2,18) }
+ 		else if (!strncmp("/dev/ps",name,7)) { SET(12,80,2,9) }
+ 		else if (!strncmp("/dev/hd",name,7)) { SET(16,0,0,0) }
+ 		else
+ #endif
+ 		{
+ 		    fprintf(stderr,"Unknown device %s, please specify all "
+ 		      "parameters\n",name);
+ 		    exit(1);
+ 		}
+ 		if (items == 3) devices[dev].fat_bits = fat_bits;
+ 	    }
+ 	    else {
+ 		fprintf(stderr,"Config file syntax: drive device [ fat [ "
+ 		  "tracks heads sectors ] ]\n",items);
+ 		exit(1);
+ 	    }
+ 	}
+ 	if (islower(devices[dev].drive))
+ 	    devices[dev].drive = toupper(devices[dev].drive);
+ 	devices[dev].offset = 0L;
+ 	devices[dev].mode = 0;
+ 	devices[dev].gioctl = NULL;
+ 	if ((devices[dev].name = (char *) malloc(strlen(name)+1)) == NULL) {
+ 	    fprintf(stderr,"Out of memory\n");
+ 	    exit(1);
+ 	}
+ 	strcpy(devices[dev++].name,name);
+     }
+     memset(&devices[dev],0,sizeof(struct device));
+     fclose(cfg);
+ }
+ 
+ #else /* LOADDEVS */
+ 
+ #define INIT_NOOP ((int (*) ()) 0)
+ 
  #ifdef DELL
  struct device devices[] = {
! 	{'B', "/dev/rdsk/f1q15dt", 0L, 12, 0, INIT_NOOP, 80, 2, 15},
! 	{'B', "/dev/rdsk/f1d9dt", 0L, 12, 0, INIT_NOOP, 40, 2, 9},
! 	{'B', "/dev/rdsk/f1d8dt", 0L, 12, 0, INIT_NOOP, 40, 2, 8},
! 	{'A', "/dev/rdsk/f03ht", 0L, 12, 0, INIT_NOOP, 80, 2, 18},
! 	{'A', "/dev/rdsk/f03dt", 0L, 12, 0, INIT_NOOP, 80, 2, 9},
! 	{'C', "/dev/rdsk/dos", 0L, 16, 0, INIT_NOOP, 0, 0, 0},
! 	{'\0', (char *) NULL, 0L, 0, 0, INIT_NOOP, 0, 0, 0}
  };
  #endif /* DELL */
  
  #ifdef ISC
  struct device devices[] = {
! 	{'A', "/dev/rdsk/f0d9dt", 0L, 12, 0, INIT_NOOP, 40, 2, 9},
! 	{'A', "/dev/rdsk/f0q15dt", 0L, 12, 0, INIT_NOOP, 80, 2, 15},
! 	{'A', "/dev/rdsk/f0d8dt", 0L, 12, 0, INIT_NOOP, 40, 2, 8},
! 	{'B', "/dev/rdsk/f13ht", 0L, 12, 0, INIT_NOOP, 80, 2, 18},
! 	{'B', "/dev/rdsk/f13dt", 0L, 12, 0, INIT_NOOP, 80, 2, 9},
! 	{'C', "/dev/rdsk/0p1", 0L, 16, 0, INIT_NOOP, 0, 0, 0},
! 	{'D', "/usr/vpix/defaults/C:", 8704L, 12, 0, INIT_NOOP, 0, 0, 0},
! 	{'E', "$HOME/vpix/C:", 8704L, 12, 0, INIT_NOOP, 0, 0, 0},
! 	{'\0', (char *) NULL, 0L, 0, 0, INIT_NOOP, 0, 0, 0}
  };
  #endif /* ISC */
  
+ #ifdef RT_ACIS
+ struct device devices[] = {
+ 	{'A', "/dev/rfd0", 0L, 12, 0, INIT_NOOP, 80, 2, 15},
+ 	{'A', "/dev/rfd0", 0L, 12, 0, INIT_NOOP, 40, 2, 9},
+ 	{'\0', (char *) NULL, 0L, 0, 0, INIT_NOOP, 0, 0, 0}
+ };
+ #endif /* RT_ACIS */
+ 
  #ifdef SPARC
  struct device devices[] = {
! 	{'A', "/dev/rfd0c", 0L, 12, 0, INIT_NOOP, 80, 2, 18},
! 	{'A', "/dev/rfd0c", 0L, 12, 0, INIT_NOOP, 80, 2, 9},
! 	{'\0', (char *) NULL, 0L, 0, 0, INIT_NOOP, 0, 0, 0}
  };
  #endif /* SPARC */
! 
! #ifdef SUN386
  struct device devices[] = {
! 	{'A', "/dev/rfdl0c", 0L, 12, 0, INIT_NOOP, 80, 2, 9},
! 	{'A', "/dev/rfd0c", 0L, 12, 0, INIT_NOOP, 80, 2, 18},
! 	{'\0', (char *) NULL, 0L, 0, 0, INIT_NOOP, 0, 0, 0}
  };
! #endif /* SUN386 */
! 
! #ifdef XENIX
! struct device devices[] = {
! 	{'A', "/dev/fd096ds15", 0L, 12, 0, INIT_NOOP, 80, 2, 15},
! 	{'A', "/dev/fd048ds9", 0L, 12, 0, INIT_NOOP, 40, 2, 9},
! 	{'B', "/dev/fd1135ds18", 0L, 12, 0, INIT_NOOP, 80, 2, 18},
! 	{'B', "/dev/fd1135ds9", 0L, 12, 0, INIT_NOOP, 80, 2, 9},
! 	{'C', "/dev/hd0d", 0L, 16, 0, INIT_NOOP, 0, 0, 0},
! 	{'\0', (char *) NULL, 0L, 0, 0, INIT_NOOP, 0, 0, 0}
! };
! #endif /* XENIX */
! 
! #endif /* LOADDEVS */
  
  
  #ifdef UNIXPC
***************
*** 55,62 ****
  
  struct device devices[] = {
  	{'A', "/dev/rfp020", 0L, 12, O_NDELAY, init_unixpc, 40, 2, 9},
! 	{'C', "/usr/bin/DOS/dvd000", 0L, 12, 0, (int (*) ()) 0, 0, 0, 0},
! 	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
  };
  
  int
--- 166,173 ----
  
  struct device devices[] = {
  	{'A', "/dev/rfp020", 0L, 12, O_NDELAY, init_unixpc, 40, 2, 9},
! 	{'C', "/usr/bin/DOS/dvd000", 0L, 12, 0, INIT_NOOP, 0, 0, 0},
! 	{'\0', (char *) NULL, 0L, 0, 0, INIT_NOOP, 0, 0, 0}
  };
  
  int
***************
*** 86,108 ****
  	return(0);
  }
  #endif /* UNIXPC */
- 
- #ifdef RT_ACIS
- struct device devices[] = {
- 	{'A', "/dev/rfd0", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15},
- 	{'A', "/dev/rfd0", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},
- 	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
- };
- #endif /* RT_ACIS */
- 
- #ifdef SUN386
- struct device devices[] = {
- 	{'A', "/dev/rfdl0c", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},
- 	{'A', "/dev/rfd0c", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18},
- 	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
- };
- #endif /* SUN386 */
- 
    
  #ifdef SPARC_ODD
  #include <sys/types.h>
--- 197,202 ----
***************
*** 113,119 ****
  
  struct device devices[] = {
  	{'A', "/dev/rfd0c", 0L, 12, 0, init_sparc, 80, 2, 0},
! 	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
  };
  
  /*
--- 207,213 ----
  
  struct device devices[] = {
  	{'A', "/dev/rfd0c", 0L, 12, 0, init_sparc, 80, 2, 0},
! 	{'\0', (char *) NULL, 0L, 0, 0, INIT_NOOP, 0, 0, 0}
  };
  
  /*
***************
*** 162,175 ****
  	return(0);
  }
  #endif /* SPARC_ODD */
-   
- #ifdef XENIX
- struct device devices[] = {
- 	{'A', "/dev/fd096ds15", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15},
- 	{'A', "/dev/fd048ds9", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},
- 	{'B', "/dev/fd1135ds18", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18},
- 	{'B', "/dev/fd1135ds9", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},
- 	{'C', "/dev/hd0d", 0L, 16, 0, (int (*) ()) 0, 0, 0, 0},
- 	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
- };
- #endif /* XENIX */
--- 256,258 ----
diff -rc --new-file orig/mtools-2.0.7/init.c mtools-2.0.7/init.c
*** orig/mtools-2.0.7/init.c	Thu Sep 10 15:59:47 1992
--- mtools-2.0.7/init.c	Sun Sep 26 19:24:09 1993
***************
*** 26,31 ****
--- 26,32 ----
  extern unsigned char *fat_buf, *disk_buf, *dir_buf;
  extern struct device devices[];
  static struct bootsector *read_boot();
+ static int lock_dev();
  
  int
  init(drive, mode)
***************
*** 214,219 ****
--- 215,227 ----
  #else /* FULL_CYL */
  	disk_size = (dev->tracks) ? sectors : 1;
  #endif /* FULL_CYL */
+   
+ #ifdef DELL201
+ 	/*
+ 	 * The driver in Dell's SVR4 v2.01 is unreliable with large writes.
+ 	 */
+         disk_size = 1;
+ #endif /* DELL201 */
  
  	disk_buf = (unsigned char *) malloc((unsigned int) disk_size * MSECTOR_SIZE);
  	if (disk_buf == NULL) {
***************
*** 225,230 ****
--- 233,245 ----
  	disk_dirty = 0;
  	fat_error = 0;
  	fat_bits = dev->fat_bits;
+ 	if (fat_bits < 0) fat_bits = -fat_bits;
+ 	else if (fat_bits == 12 && num_clus > FAT12 || fat_bits == 16 &&
+ 	      num_clus <= FAT12 || (fat_bits != 12 && fat_bits != 16)) {
+ 		fprintf(stderr,"%d bit FAT on %c: sure ? (Use -%d in \
+ the device config file to bypass.)\n",fat_bits,drive,fat_bits);
+ 		exit(1);
+ 	    }
  	fat_read(fat_start);
  					/* set dir_chain[] to root directory */
  	dir_dirty = 0;
diff -rc --new-file orig/mtools-2.0.7/mattrib.1 mtools-2.0.7/mattrib.1
*** orig/mtools-2.0.7/mattrib.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mattrib.1	Thu Sep 10 15:59:46 1992
***************
*** 0 ****
--- 1,59 ----
+ .TH MATTRIB 1 local
+ .SH NAME
+ mattrib \- change MSDOS file attribute flags
+ .SH SYNOPSIS
+ .B mattrib
+ [
+ .B -a|+a
+ ]
+ [
+ .B -h|+h
+ ]
+ [
+ .B -r|+r
+ ]
+ [
+ .B -s|+s
+ ] msdosfile [ msdosfiles... ]
+ .SH DESCRIPTION
+ .I Mattrib
+ will add attribute flags to an MSDOS file (with the '+' operator) or
+ remove attribute flags (with the '-' operator).
+ .PP
+ .I Mattrib
+ will allow the following command line options:
+ .TP
+ .B a
+ Archive bit.  Used by some backup programs to indicate a new file.
+ .TP
+ .B r
+ Read-only bit.  Used to indicate a read-only file.  Files with this bit
+ set cannot be erased by DEL.  However, 
+ .I
+ mdel
+ is more cunning.
+ .TP
+ .B s
+ System bit.  Used by MSDOS to indicate a operating system file.
+ .TP
+ .B h
+ Hidden bit.  Used to make files hidden from DIR.  However,
+ .I
+ mdir
+ is more cunning.
+ .PP
+ MSDOS subdirectory names are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ names to be enclosed in quotes to protect them from the shell.
+ .PP
+ The
+ .I mcd
+ command may be used to establish the device and the current working
+ directory (relative to MSDOS), otherwise the default is A:/.
+ .PP
+ .I Mattrib
+ returns 0 on success, 1 on utter failure, or 2 on partial failure.
+ .SH SEE ALSO
+ mcd(1)
+ .SH BUGS
+ Most MSDOS versions of ATTRIB don't allow this many options.
diff -rc --new-file orig/mtools-2.0.7/mattrib.c mtools-2.0.7/mattrib.c
*** orig/mtools-2.0.7/mattrib.c	Thu Sep 10 15:59:47 1992
--- mtools-2.0.7/mattrib.c	Sun Oct 17 22:13:01 1993
***************
*** 10,30 ****
  
  #include <stdio.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
- int fd = -1;				/* the file descriptor for the device */
- int dir_start;				/* starting sector for directory */
- int dir_len;				/* length of directory (in sectors) */
- int dir_entries;			/* number of directory entries */
- int clus_size;				/* cluster size (in sectors) */
- char *mcwd;				/* the Current Working Directory */
- int fat_error;				/* FAT error detected? */
- 
  #define ADD	1
  #define REMOVE	(-1)
  #define LEAVE	0
  
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 10,21 ----
  
  #include <stdio.h>
  #include "msdos.h"
  
  #define ADD	1
  #define REMOVE	(-1)
  #define LEAVE	0
  
! mattrib(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 84,90 ****
  			break;
  	}
  	if (argc < 3 || argv[fargn][0] == '\0' || oops) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s [-a|+a] [-h|+h] [-r|+r] [-s|+s] msdosfile [msdosfiles...]\n", argv[0]);
  		exit(1);
  	}
--- 75,81 ----
  			break;
  	}
  	if (argc < 3 || argv[fargn][0] == '\0' || oops) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s [-a|+a] [-h|+h] [-r|+r] [-s|+s] msdosfile [msdosfiles...]\n", argv[0]);
  		exit(1);
  	}
diff -rc --new-file orig/mtools-2.0.7/mcd.1 mtools-2.0.7/mcd.1
*** orig/mtools-2.0.7/mcd.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mcd.1	Thu Sep 10 15:59:46 1992
***************
*** 0 ****
--- 1,33 ----
+ .TH MCD 1 local
+ .SH NAME
+ mcd \- change MSDOS directory
+ .SH SYNOPSIS
+ .B mcd
+ [ msdosdirectory ]
+ .SH DESCRIPTION
+ Without arguments,
+ .I mcd
+ will report the current device and working directory.  Otherwise,
+ .I mcd
+ changes the current device and current working directory relative to an
+ MSDOS filesystem.
+ .PP
+ The environmental variable MCWD may be used to locate the file where the
+ device and current working directory information is stored.  The default
+ is '$HOME/.mcwd'.  Information in this file is ignored if the file is
+ more than 6 hours old.
+ .PP
+ MSDOS subdirectory names are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ directory name to be enclosed in quotes to protect it from the shell.
+ .PP
+ .I Mcd
+ returns 0 on success or 1 on failure.
+ .SH SEE ALSO
+ mdir(1)
+ .SH BUGS
+ Unlike MSDOS versions of CD,
+ .I mcd
+ can be used to change to another device.
+ .PP
+ It may be wise to remove old .mcwd files at logout.
diff -rc --new-file orig/mtools-2.0.7/mcd.c mtools-2.0.7/mcd.c
*** orig/mtools-2.0.7/mcd.c	Thu Sep 10 15:59:15 1992
--- mtools-2.0.7/mcd.c	Sun Oct 17 22:13:27 1993
***************
*** 10,26 ****
  
  #include <stdio.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
! int fd = -1;				/* the file descriptor for the device */
! int dir_start;				/* starting sector for directory */
! int dir_len;				/* length of directory (in sectors) */
! int dir_entries;			/* number of directory entries */
! int clus_size;				/* cluster size (in sectors) */
! char *mcwd;				/* the Current Working Directory */
! int fat_error;				/* FAT error detected? */
! 
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 10,17 ----
  
  #include <stdio.h>
  #include "msdos.h"
  
! mcd(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 31,37 ****
  	void exit();
  
  	if (argc > 2) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s: msdosdirectory\n", argv[0]);
  		exit(1);
  	}
--- 22,28 ----
  	void exit();
  
  	if (argc > 2) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s: msdosdirectory\n", argv[0]);
  		exit(1);
  	}
***************
*** 90,115 ****
  	fprintf(fp, "%c:%s\n", drive, newpath);
  	fclose(fp);
  	exit(0);
- }
- 
- /*
-  * stubs for read-only programs
-  */
- 
- void
- disk_flush()
- {
- 	extern int disk_dirty;
- 
- 	disk_dirty = 0;
- 	return;
- }
- 
- void
- dir_flush()
- {
- 	extern int dir_dirty;
- 
- 	dir_dirty = 0;
- 	return;
  }
--- 81,84 ----
diff -rc --new-file orig/mtools-2.0.7/mcopy.1 mtools-2.0.7/mcopy.1
*** orig/mtools-2.0.7/mcopy.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mcopy.1	Thu Sep 10 15:59:46 1992
***************
*** 0 ****
--- 1,74 ----
+ .TH MCOPY 1 local
+ .SH NAME
+ mcopy \- copy MSDOS files to/from Unix
+ .SH SYNOPSIS
+ .B mcopy
+ [
+ .B -tnvm
+ ] sourcefile targetfile
+ .PP
+ .B mcopy
+ [
+ .B -tnvm
+ ] sourcefile [ sourcefiles... ] targetdirectory
+ .SH DESCRIPTION
+ .I Mcopy
+ copies the specified file to the named file, or copies multiple files to
+ the named directory.  The source and target can be either MSDOS or Unix
+ files.
+ .PP
+ The use of a drive letter designation on the MSDOS files, 'a:' for
+ example, determines the direction of the transfer.  A missing drive
+ designation implies a Unix file whose path starts in the current
+ directory
+ .PP
+ .I Mcopy
+ will allow the following command line options:
+ .TP
+ .B t
+ Text file transfer.
+ .I Mcopy
+ will translate incoming carriage return/line feeds to line feeds.
+ .TP
+ .B n
+ No warning.
+ .I Mcopy
+ will not warn the user when overwriting an existing file.
+ .TP
+ .B v
+ Verbose mode.
+ .TP
+ .B m
+ Preserve the file modification time.
+ .PP
+ If the target file already exists, and the
+ .I -n
+ option is not in effect,
+ .I mcopy
+ asks whether or not to overwrite the file.
+ .PP
+ MSDOS subdirectory names are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ names to be enclosed in quotes to protect them from the shell.
+ .PP
+ The
+ .I mcd
+ command may be used to establish the device and the current working
+ directory (relative to MSDOS), otherwise the default is A:/.
+ .PP
+ .I Mcopy
+ returns 0 on success, 1 on utter failure, or 2 on partial failure.
+ .SH SEE ALSO
+ mcd(1), mread(1), mwrite(1)
+ .SH BUGS
+ Unlike MSDOS, the destination directory may
+ .B not
+ be omitted.
+ .PP
+ The '+' operator (append) from MSDOS is not supported.
+ .PP
+ No other
+ .I Mtools
+ command
+ .B requires
+ the use of a drive letter designation on MSDOS files.
diff -rc --new-file orig/mtools-2.0.7/mcopy.c mtools-2.0.7/mcopy.c
*** orig/mtools-2.0.7/mcopy.c	Thu Sep 10 15:59:47 1992
--- mtools-2.0.7/mcopy.c	Sun Oct 17 22:18:13 1993
***************
*** 12,18 ****
  #include <ctype.h>
  #include <sys/types.h>
  #include <sys/wait.h>
! #include "patchlevel.h"
  
  #define NONE	0
  #define MREAD	1
--- 12,18 ----
  #include <ctype.h>
  #include <sys/types.h>
  #include <sys/wait.h>
! #include "msdos.h"
  
  #define NONE	0
  #define MREAD	1
***************
*** 23,29 ****
  #define WEXITSTATUS(x) (((x)>>8)&0xff)
  #endif /* WEXITSTATUS */
  
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 23,29 ----
  #define WEXITSTATUS(x) (((x)>>8)&0xff)
  #endif /* WEXITSTATUS */
  
! mcopy(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 50,56 ****
  	}
  
  	if (oops || (argc - optind) < 2) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s [-tnvm] sourcefile targetfile\n", argv[0]);
  		fprintf(stderr, "       %s [-tnvm] sourcefile [sourcefiles...] targetdirectory\n", argv[0]);
  		exit(1);
--- 50,56 ----
  	}
  
  	if (oops || (argc - optind) < 2) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s [-tnvm] sourcefile targetfile\n", argv[0]);
  		fprintf(stderr, "       %s [-tnvm] sourcefile [sourcefiles...] targetdirectory\n", argv[0]);
  		exit(1);
***************
*** 82,88 ****
  	 * with a null when it passes it to main()
  	 */
  	nargv = (char **) malloc((unsigned int) (argc + 1) * sizeof(*argv));
! 	nargv[0] = "mcopy";
  	for (i = 1; i < argc; i++)
  		nargv[i] = argv[i];
  	nargv[argc] = NULL;
--- 82,88 ----
  	 * with a null when it passes it to main()
  	 */
  	nargv = (char **) malloc((unsigned int) (argc + 1) * sizeof(*argv));
! 	nargv[0] = destination == MWRITE ? "mwrite" : "mread";
  	for (i = 1; i < argc; i++)
  		nargv[i] = argv[i];
  	nargv[argc] = NULL;
diff -rc --new-file orig/mtools-2.0.7/mdel.1 mtools-2.0.7/mdel.1
*** orig/mtools-2.0.7/mdel.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mdel.1	Thu Sep 10 15:59:46 1992
***************
*** 0 ****
--- 1,36 ----
+ .TH MDEL 1 local
+ .SH NAME
+ mdel \- delete an MSDOS file
+ .SH SYNOPSIS
+ .B mdel
+ [
+ .B -v
+ ] msdosfile [ msdosfiles...  ]
+ .SH DESCRIPTION
+ .I Mdel
+ deletes a file on an MSDOS filesystem.
+ .PP
+ .I Mdel
+ will allow the following command line option:
+ .TP
+ .B v
+ Verbose mode.  Echo the filenames as they are processed.
+ .PP
+ .I Mdel
+ will ask for verification prior to removing a read\-only file.
+ .PP
+ MSDOS subdirectory names are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ names to be enclosed in quotes to protect them from the shell.
+ .PP
+ The
+ .I mcd
+ command may be used to establish the device and the current working
+ directory (relative to MSDOS), otherwise the default is A:/.
+ .PP
+ .I Mdel
+ returns 0 on success, 1 on utter failure, or 2 on partial failure.
+ .SH SEE ALSO
+ mcd(1)
+ .SH BUGS
+ Allows multiple arguments, which does not follow the MSDOS convention.
diff -rc --new-file orig/mtools-2.0.7/mdel.c mtools-2.0.7/mdel.c
*** orig/mtools-2.0.7/mdel.c	Thu Sep 10 15:59:47 1992
--- mtools-2.0.7/mdel.c	Sun Oct 17 22:14:00 1993
***************
*** 11,29 ****
  #include <stdio.h>
  #include <signal.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
! int fd = -1;				/* the file descriptor for the device */
! int dir_start;				/* starting sector for directory */
! int dir_len;				/* length of directory (in sectors) */
! int dir_entries;			/* number of directory entries */
! int clus_size;				/* cluster size (in sectors) */
! char *mcwd;				/* the Current Working Directory */
! int fat_error;				/* FAT error detected? */
  
! static int got_signal();
! 
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 11,20 ----
  #include <stdio.h>
  #include <signal.h>
  #include "msdos.h"
  
! extern int got_signal();
  
! mdel(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 50,56 ****
  		fargn = 1;
  	}
  	if (argc < 2 || (argv[1][0] == '-' && !verbose)) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s [-v] msdosfile [msdosfiles...]\n", argv[0]);
  		exit(1);
  	}
--- 41,47 ----
  		fargn = 1;
  	}
  	if (argc < 2 || (argv[1][0] == '-' && !verbose)) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s [-v] msdosfile [msdosfiles...]\n", argv[0]);
  		exit(1);
  	}
***************
*** 103,108 ****
--- 94,100 ----
  				if (dir->attr & 0x01) {
  					while (!nogo) {
  						printf("%s: \"%s\" is read only, erase anyway (y/n) ? ", argv[0], newfile);
+ 						fflush(stdout);
  						gets(ans);
  						if (ans[0] == 'y' || ans[0] == 'Y')
  							break;
***************
*** 140,163 ****
  	if (missed_one)
  		exit(1);
  	exit(0);
- }
- 
- /*
-  * Do a graceful exit if the program is interrupted.  This will reduce
-  * (but not eliminate) the risk of generating a corrupted disk on
-  * a user abort.
-  */
- 
- static int
- got_signal()
- {
- 	void exit(), disk_flush(), fat_write(), dir_flush();
- 
- 	if (fd < 0)
- 		exit(1);
- 	fat_write();
- 	dir_flush();
- 	disk_flush();
- 	close(fd);
- 	exit(1);
  }
--- 132,135 ----
diff -rc --new-file orig/mtools-2.0.7/mdir.1 mtools-2.0.7/mdir.1
*** orig/mtools-2.0.7/mdir.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mdir.1	Thu Sep 10 15:59:46 1992
***************
*** 0 ****
--- 1,43 ----
+ .TH MDIR 1 local
+ .SH NAME
+ mdir \- display an MSDOS directory
+ .SH SYNOPSIS
+ .B mdir
+ [
+ .B -w
+ ] msdosdirectory
+ .PP
+ .B mdir
+ [
+ .B -w
+ ] msdosfile [ msdosfiles...  ] 
+ .SH DESCRIPTION
+ .I Mdir
+ displays the contents of an MSDOS directory.
+ .PP
+ .I Mdir
+ will allow the following command line option:
+ .TP
+ .B w
+ Wide output.  This option will print the filenames across the page
+ without displaying the file size or creation date.
+ .PP
+ An error occurs if a component of the path is not a directory.
+ .PP
+ MSDOS subdirectory names are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ names to be enclosed in quotes to protect them from the shell.
+ .PP
+ The
+ .I mcd
+ command may be used to establish the device and the current working
+ directory (relative to MSDOS), otherwise the default is A:/.
+ .PP
+ .I Mdir
+ returns 0 on success, 1 on utter failure, or 2 on partial failure.
+ .SH SEE ALSO
+ mcd(1)
+ .SH BUGS
+ Allows multiple arguments, which does not follow the MSDOS convention.
+ .PP
+ There is no /P (pause) option.
diff -rc --new-file orig/mtools-2.0.7/mdir.c mtools-2.0.7/mdir.c
*** orig/mtools-2.0.7/mdir.c	Thu Sep 10 15:59:17 1992
--- mtools-2.0.7/mdir.c	Sun Oct 17 22:14:34 1993
***************
*** 10,29 ****
  
  #include <stdio.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
- int fd = -1;				/* the file descriptor for the device */
- int dir_start;				/* starting sector for directory */
- int dir_len;				/* length of directory (in sectors) */
- int dir_entries;			/* number of directory entries */
- int clus_size;				/* cluster size (in sectors) */
- char *mcwd;				/* the Current Working Directory */
- int fat_error;				/* FAT error detected? */
- 
  static long getfree();
  static char *conv_date(), *conv_time();
  
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 10,20 ----
  
  #include <stdio.h>
  #include "msdos.h"
  
  static long getfree();
  static char *conv_date(), *conv_time();
  
! mdir(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 47,53 ****
  		}
  		if (argv[1][0] == '-' && !wide) {
  			fprintf(stderr, "%s: illegal option -- %c\n", argv[0], argv[1][1]);
! 			fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  			fprintf(stderr, "Usage: %s: [-w] msdosdirectory\n", argv[0]);
  			fprintf(stderr, "       %s: [-w] msdosfile [msdosfiles...]\n", argv[0]);
  			exit(1);
--- 38,44 ----
  		}
  		if (argv[1][0] == '-' && !wide) {
  			fprintf(stderr, "%s: illegal option -- %c\n", argv[0], argv[1][1]);
! 			fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  			fprintf(stderr, "Usage: %s: [-w] msdosdirectory\n", argv[0]);
  			fprintf(stderr, "       %s: [-w] msdosfile [msdosfiles...]\n", argv[0]);
  			exit(1);
***************
*** 279,304 ****
  	min_low = time_low >> 5;
  	sprintf(ans, "%2d:%02d%c", hour, min_hi + min_low, am_pm);
  	return(ans);
- }
- 
- /*
-  * stubs for read-only programs
-  */
- 
- void
- disk_flush()
- {
- 	extern int disk_dirty;
- 
- 	disk_dirty = 0;
- 	return;
- }
- 
- void
- dir_flush()
- {
- 	extern int dir_dirty;
- 
- 	dir_dirty = 0;
- 	return;
  }
--- 270,273 ----
diff -rc --new-file orig/mtools-2.0.7/mformat.1 mtools-2.0.7/mformat.1
*** orig/mtools-2.0.7/mformat.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mformat.1	Thu Sep 10 15:59:46 1992
***************
*** 0 ****
--- 1,45 ----
+ .TH MFORMAT 1 local
+ .SH NAME
+ mformat \- add an MSDOS filesystem to a low-level formatted diskette.
+ .SH SYNOPSIS
+ .B mformat
+ [
+ .B -t
+ tracks ] [
+ .B -h
+ heads ] [
+ .B -s
+ sectors ] [
+ .B -l
+ volume label ] drive:
+ .SH DESCRIPTION
+ .I Mformat
+ adds a minimal MSDOS filesystem (boot sector, FAT, and root directory) to
+ a diskette that has already been formatted by a Unix low-level format.
+ .PP
+ The follow options are supported:
+ .TP
+ .B t
+ The number of tracks (not cylinders).
+ .TP
+ .B h
+ The number of heads (sides).
+ .TP
+ .B s
+ The number of sectors per track.
+ .TP
+ .B l
+ An optional volume label.
+ .PP
+ To format a diskette at a density other than the default, you must supply
+ (at least) those command line parameters that are different from the
+ default.
+ .PP
+ .I Mformat
+ returns 0 on success or 1 on failure.
+ .SH SEE ALSO
+ mlabel(1)
+ .SH BUGS
+ Requires a low-level format utility from Unix.
+ .PP
+ Doesn't detect (or record) bad block information.
diff -rc --new-file orig/mtools-2.0.7/mformat.c mtools-2.0.7/mformat.c
*** orig/mtools-2.0.7/mformat.c	Thu Sep 10 15:59:16 1992
--- mtools-2.0.7/mformat.c	Sun Oct 17 22:14:51 1993
***************
*** 11,23 ****
  #include <stdio.h>
  #include <ctype.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
! int fd, dir_dirty, dir_entries;
! long dir_chain[MAX_DIR_SECS];
! unsigned char *dir_buf;
! 
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 11,18 ----
  #include <stdio.h>
  #include <ctype.h>
  #include "msdos.h"
  
! mformat(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 62,68 ****
  	}
  
  	if (oops || (argc - optind) != 1) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s [-t tracks] [-h heads] [-s sectors] [-l label] device\n", argv[0]);
  		exit(1);
  	}
--- 57,63 ----
  	}
  
  	if (oops || (argc - optind) != 1) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s [-t tracks] [-h heads] [-s sectors] [-l label] device\n", argv[0]);
  		exit(1);
  	}
***************
*** 243,248 ****
  	close(fd);
  	exit(0);
  }
- 
- /* hooks for the missing parts */
- void disk_write() {}
--- 238,240 ----
diff -rc --new-file orig/mtools-2.0.7/mkmanifest.1 mtools-2.0.7/mkmanifest.1
*** orig/mtools-2.0.7/mkmanifest.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mkmanifest.1	Thu Sep 10 15:59:09 1992
***************
*** 0 ****
--- 1,74 ----
+ .TH MKMANIFEST 1 local
+ .SH NAME
+ mkmanifest \- create a shell script to restore Unix filenames
+ .SH SYNOPSIS
+ .B mkmanifest
+ [ files ]
+ .SH DESCRIPTION
+ .I Mkmanifest
+ creates a shell script that will aid in the restoration of Unix filenames
+ that got clobbered by the MSDOS filename restrictions.  MSDOS filenames
+ are restricted to 8 character names, 3 character extensions, upper case
+ only, no device names, and no illegal characters.
+ .PP
+ The mkmanifest program is compatible with the methods used in
+ .I pcomm, arc,
+ and
+ .I mtools
+ to change perfectly good Unix filenames to fit the MSDOS restrictions.
+ .SH EXAMPLE
+ I want to copy the following Unix files to a MSDOS diskette (using the
+ .I mcopy
+ command).
+ .PP
+ .in +0.5i
+ .nf
+ very_long_name
+ 2.many.dots
+ illegal:
+ good.c
+ prn.dev
+ Capital
+ .fi
+ .in
+ .PP
+ .I Mcopy
+ will convert the names to:
+ .PP
+ .in +0.5i
+ .nf
+ very_lon
+ 2xmany.dot
+ illegalx
+ good.c
+ xprn.dev
+ capital
+ .fi
+ .in
+ .PP
+ The command:
+ .PP
+ mkmanifest very_long_name 2.many.dots illegal: good.c prn.dev Capital >
+ manifest
+ .PP
+ would produce the following:
+ .PP
+ .in +0.5i
+ .nf
+ mv very_lon very_long_name
+ mv 2xmany.dot 2.many.dots
+ mv illegalx illegal:
+ mv xprn.dev prn.dev
+ mv capital Capital
+ .fi
+ .in
+ .PP
+ Notice that "good.c" did not require any conversion, so it did not appear
+ in the output.
+ .PP
+ Suppose I've copied these files from the diskette to another Unix
+ system, and I now want the files back to their original names.  If the
+ file "manifest" (the output captured above) was sent along with those
+ files, it could be used to convert the filenames.
+ .SH SEE ALSO
+ arc(1), pcomm(1), mtools(1)
diff -rc --new-file orig/mtools-2.0.7/mlabel.1 mtools-2.0.7/mlabel.1
*** orig/mtools-2.0.7/mlabel.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mlabel.1	Thu Sep 10 15:59:46 1992
***************
*** 0 ****
--- 1,31 ----
+ .TH MLABEL 1 local
+ .SH NAME
+ mlabel \- make an MSDOS volume label
+ .SH SYNOPSIS
+ .B mlabel
+ [
+ .B -v
+ ] drive:
+ .SH DESCRIPTION
+ .I Mlabel
+ displays the current volume label, if present, and prompts the user
+ for a new volume label.  To delete an existing volume label, press
+ return at the prompt.
+ .PP
+ .I Mlabel
+ will allow the following command line option:
+ .TP
+ .B v
+ Verbose mode.  Display the new volume label if the label supplied is
+ invalid.
+ .PP
+ Reasonable care is taken to create a valid MSDOS volume label.  If an
+ invalid label is specified,
+ .I mlabel
+ will change the label (and display the new label if the verbose mode is
+ set).
+ .PP
+ .I Mlabel
+ returns 0 on success or 1 on failure.
+ .SH SEE ALSO
+ mformat(1)
diff -rc --new-file orig/mtools-2.0.7/mlabel.c mtools-2.0.7/mlabel.c
*** orig/mtools-2.0.7/mlabel.c	Thu Sep 10 15:59:16 1992
--- mtools-2.0.7/mlabel.c	Sun Oct 17 22:15:17 1993
***************
*** 11,27 ****
  #include <stdio.h>
  #include <ctype.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
! int fd = -1;				/* the file descriptor for the device */
! int dir_start;				/* starting sector for directory */
! int dir_len;				/* length of directory (in sectors) */
! int dir_entries;			/* number of directory entries */
! int clus_size;				/* cluster size (in sectors) */
! char *mcwd;				/* the Current Working Directory */
! int fat_error;				/* FAT error detected? */
! 
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 11,18 ----
  #include <stdio.h>
  #include <ctype.h>
  #include "msdos.h"
  
! mlabel(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 45,51 ****
  			oops++;
  	}
  	if (argc < 2 || argv[fargn][1] != ':' || oops) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s [-v] drive:\n", argv[0]);
  		exit(1);
  	}
--- 36,42 ----
  			oops++;
  	}
  	if (argc < 2 || argv[fargn][1] != ':' || oops) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s [-v] drive:\n", argv[0]);
  		exit(1);
  	}
***************
*** 98,103 ****
--- 89,95 ----
  
  					/* ask for new label */
  	printf("Enter the new volume label (11 characters): ");
+ 	fflush(stdout);
  	gets(filename);
  	if (filename[0] != '\0') {
  		sprintf((char *) fixed, "%-11.11s", filename);
***************
*** 109,114 ****
--- 101,107 ----
  			exit(0);
  
  		printf("Delete volume label (y/n): ");
+ 		fflush(stdout);
  		gets(ans);
  		if (ans[0] == 'y' || ans[0] == 'Y') {
  			strcpy((char *) fixed, (char *) vol);
diff -rc --new-file orig/mtools-2.0.7/mmd.1 mtools-2.0.7/mmd.1
*** orig/mtools-2.0.7/mmd.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mmd.1	Thu Sep 10 15:59:46 1992
***************
*** 0 ****
--- 1,42 ----
+ .TH MMD 1 local
+ .SH NAME
+ mmd \- make an MSDOS subdirectory
+ .SH SYNOPSIS
+ .B mmd
+ [
+ .B -v
+ ] msdosdirectory [ msdosdirectories... ]
+ .SH DESCRIPTION
+ .I Mmd
+ makes a new directory on an MSDOS filesystem.
+ .PP
+ .I Mmd
+ will allow the following command line option:
+ .TP
+ .B v
+ Verbose mode.  Display the new directory name if the name supplied is
+ invalid.
+ .PP
+ Reasonable care is taken to create a valid MSDOS directory name.  If an
+ invalid name is specified,
+ .I mmd
+ will change the name (and display the new name if the verbose mode is
+ set).
+ .PP
+ An error occurs if the directory already exists.
+ .PP
+ MSDOS subdirectory names are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ directory name to be enclosed in quotes to protect it from the shell.
+ .PP
+ The
+ .I mcd
+ command may be used to establish the device and the current working
+ directory (relative to MSDOS), otherwise the default is A:/.
+ .PP
+ .I Mmd
+ returns 0 on success, 1 on utter failure, or 2 on partial failure.
+ .SH SEE ALSO
+ mcd(1), mrd(1)
+ .SH BUGS
+ Allows multiple arguments, which does not follow the MSDOS convention.
diff -rc --new-file orig/mtools-2.0.7/mmd.c mtools-2.0.7/mmd.c
*** orig/mtools-2.0.7/mmd.c	Thu Sep 10 15:59:48 1992
--- mtools-2.0.7/mmd.c	Sun Oct 17 22:15:30 1993
***************
*** 11,30 ****
  #include <stdio.h>
  #include <signal.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
! int fd = -1;				/* the file descriptor for the device */
! int dir_start;				/* starting sector for directory */
! int dir_len;				/* length of directory (in sectors) */
! int dir_entries;			/* number of directory entries */
! int clus_size;				/* cluster size (in sectors) */
! char *mcwd;				/* the Current Working Directory */
! int fat_error;				/* FAT error detected? */
  
- static int got_signal();
  static void empty_dir();
  
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 11,22 ----
  #include <stdio.h>
  #include <signal.h>
  #include "msdos.h"
  
! extern int got_signal();
  
  static void empty_dir();
  
! mmd(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 56,62 ****
  			oops++;
  	}
  	if (argc == 1 || oops) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s [-v] msdosdirectory [msdosdirectories...]\n", argv[0]);
  		exit(1);
  	}
--- 48,54 ----
  			oops++;
  	}
  	if (argc == 1 || oops) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s [-v] msdosdirectory [msdosdirectories...]\n", argv[0]);
  		exit(1);
  	}
***************
*** 201,224 ****
  					/* write the cluster */
  	disk_write(start, (unsigned char *) buf, buflen);
  	return;
- }
- 
- /*
-  * Do a graceful exit if the program is interrupted.  This will reduce
-  * (but not eliminate) the risk of generating a corrupted disk on
-  * a user abort.
-  */
- 
- static int
- got_signal()
- {
- 	void exit(), disk_flush(), fat_write(), dir_flush();
- 
- 	if (fd < 0)
- 		exit(1);
- 	fat_write();
- 	dir_flush();
- 	disk_flush();
- 	close(fd);
- 	exit(1);
  }
--- 193,196 ----
diff -rc --new-file orig/mtools-2.0.7/mrd.1 mtools-2.0.7/mrd.1
*** orig/mtools-2.0.7/mrd.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mrd.1	Thu Sep 10 15:59:47 1992
***************
*** 0 ****
--- 1,27 ----
+ .TH MRD 1 local
+ .SH NAME
+ mrd \- remove an MSDOS subdirectory
+ .SH SYNOPSIS
+ .B mrd
+ msdosdirectory [ msdosdirectories... ]
+ .SH DESCRIPTION
+ .I Mrd
+ removes a directory from an MSDOS filesystem.
+ .PP
+ An error occurs if the directory is not empty.
+ .PP
+ MSDOS subdirectory names are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ directory name to be enclosed in quotes to protect it from the shell.
+ .PP
+ The
+ .I mcd
+ command may be used to establish the device and the current working
+ directory (relative to MSDOS), otherwise the default is A:/.
+ .PP
+ .I Mrd
+ returns 0 on success, 1 on utter failure, or 2 on partial failure.
+ .SH SEE ALSO
+ mcd(1), mmd(1)
+ .SH BUGS
+ Allows multiple arguments, which does not follow the MSDOS convention.
diff -rc --new-file orig/mtools-2.0.7/mrd.c mtools-2.0.7/mrd.c
*** orig/mtools-2.0.7/mrd.c	Thu Sep 10 15:59:48 1992
--- mtools-2.0.7/mrd.c	Sun Oct 17 22:15:43 1993
***************
*** 11,29 ****
  #include <stdio.h>
  #include <signal.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
! int fd = -1;				/* the file descriptor for the device */
! int dir_start;				/* starting sector for directory */
! int dir_len;				/* length of directory (in sectors) */
! int dir_entries;			/* number of directory entries */
! int clus_size;				/* cluster size (in sectors) */
! char *mcwd;				/* the Current Working Directory */
! int fat_error;				/* FAT error detected? */
  
! static int got_signal(), is_empty();
  
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 11,22 ----
  #include <stdio.h>
  #include <signal.h>
  #include "msdos.h"
  
! extern int got_signal();
  
! static int is_empty();
  
! mrd(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 39,45 ****
  	signal(SIGQUIT, (SIG_TYPE(*) ()) got_signal);
  
  	if (argc == 1) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s mdsosdirectory [msdosdirectories...]\n", argv[0]);
  		exit(1);
  	}
--- 32,38 ----
  	signal(SIGQUIT, (SIG_TYPE(*) ()) got_signal);
  
  	if (argc == 1) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s mdsosdirectory [msdosdirectories...]\n", argv[0]);
  		exit(1);
  	}
***************
*** 178,201 ****
  		fat = next;
  	}
  	return(1);
- }
- 
- /*
-  * Do a graceful exit if the program is interrupted.  This will reduce
-  * (but not eliminate) the risk of generating a corrupted disk on
-  * a user abort.
-  */
- 
- static int
- got_signal()
- {
- 	void exit(), disk_flush(), fat_write(), dir_flush();
- 
- 	if (fd < 0)
- 		exit(1);
- 	fat_write();
- 	dir_flush();
- 	disk_flush();
- 	close(fd);
- 	exit(1);
  }
--- 171,174 ----
diff -rc --new-file orig/mtools-2.0.7/mread.1 mtools-2.0.7/mread.1
*** orig/mtools-2.0.7/mread.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mread.1	Thu Sep 10 15:59:47 1992
***************
*** 0 ****
--- 1,58 ----
+ .TH MREAD 1 local
+ .SH NAME
+ mread \- low level read (copy) an MSDOS file to Unix
+ .SH SYNOPSIS
+ .B mread
+ [
+ .B -tnm
+ ] msdosfile unixfile
+ .PP
+ .B mread
+ [
+ .B -tnm
+ ] msdosfile [ msdosfiles... ] unixdirectory
+ .SH DESCRIPTION
+ In the first form,
+ .I mread
+ copies the specified MSDOS file to the named Unix file.  The second form
+ of the command copies multiple MSDOS files to the named Unix directory.
+ .PP
+ .I Mread
+ will allow the following command line options:
+ .TP
+ .B t
+ Text file transfer.
+ .I Mread
+ will translate incoming carriage return/line feeds to line feeds.
+ .TP
+ .B n
+ No warning.
+ .I Mread
+ will not warn the user when overwriting an existing file.
+ .TP
+ .B m
+ Preserve the file modification times.
+ .PP
+ If the target file already exists, and the
+ .I -n
+ option is not in effect,
+ .I mread
+ asks whether or not to overwrite the file.
+ .PP
+ MSDOS subdirectory names are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ names to be enclosed in quotes to protect them from the shell.
+ .PP
+ The
+ .I mcd
+ command may be used to establish the device and the current working
+ directory (relative to MSDOS), otherwise the default is A:/.
+ .PP
+ .I Mread
+ returns 0 on success, 1 on utter failure, or 2 on partial failure.
+ .SH SEE ALSO
+ mcd(1), mcopy(1), mtype(1), mwrite(1)
+ .SH BUGS
+ Unlike MSDOS, the destination directory may
+ .B not
+ be omitted.
diff -rc --new-file orig/mtools-2.0.7/mread.c mtools-2.0.7/mread.c
*** orig/mtools-2.0.7/mread.c	Thu Sep 10 15:59:48 1992
--- mtools-2.0.7/mread.c	Sun Oct 17 22:15:59 1993
***************
*** 20,40 ****
  #include <time.h>
  #endif /* BSD */
  #include "msdos.h"
- #include "patchlevel.h"
  
- int fd = -1;				/* the file descriptor for the device */
- int dir_start;				/* starting sector for directory */
- int dir_len;				/* length of directory (in sectors) */
- int dir_entries;			/* number of directory entries */
- int clus_size;				/* cluster size (in sectors) */
- char *mcwd;				/* the Current Working Directory */
- int fat_error;				/* FAT error detected? */
- 
  static void set_mtime();
  static FILE *open_file();
  static long conv_stamp();
  
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 20,31 ----
  #include <time.h>
  #endif /* BSD */
  #include "msdos.h"
  
  static void set_mtime();
  static FILE *open_file();
  static long conv_stamp();
  
! mread(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 79,85 ****
  	}
  
  	if (oops || (argc - optind) < 2) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s [-tnm] msdosfile unixfile\n", argv[0]);
  		fprintf(stderr, "       %s [-tnm] msdosfile [msdosfiles...] unixdirectory\n", argv[0]);
  		exit(1);
--- 70,76 ----
  	}
  
  	if (oops || (argc - optind) < 2) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s [-tnm] msdosfile unixfile\n", argv[0]);
  		fprintf(stderr, "       %s [-tnm] msdosfile [msdosfiles...] unixdirectory\n", argv[0]);
  		exit(1);
***************
*** 230,235 ****
--- 221,227 ----
  			/* CONSTCOND */
  			while (1) {
  				printf("File \"%s\" exists, overwrite (y/n) ? ", target);
+ 				fflush(stdout);
  				gets(ans);
  				if (ans[0] == 'n' || ans[0] == 'N')
  					return(NULL);
***************
*** 341,367 ****
  		utime(target, &utbuf);
  	}
  #endif /* BSD */
- 	return;
- }
- 
- /*
-  * stubs for read-only programs
-  */
- 
- void
- disk_flush()
- {
- 	extern int disk_dirty;
- 
- 	disk_dirty = 0;
- 	return;
- }
- 
- void
- dir_flush()
- {
- 	extern int dir_dirty;
- 
- 	dir_dirty = 0;
  	return;
  }
--- 333,337 ----
diff -rc --new-file orig/mtools-2.0.7/mren.1 mtools-2.0.7/mren.1
*** orig/mtools-2.0.7/mren.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mren.1	Thu Sep 10 15:59:47 1992
***************
*** 0 ****
--- 1,50 ----
+ .TH MREN 1 local
+ .SH NAME
+ mren \- rename an existing MSDOS file
+ .SH SYNOPSIS
+ .B mren
+ [
+ .B -v
+ ] sourcefile targetfile
+ .SH DESCRIPTION
+ .I Mren
+ renames an existing file on an MSDOS filesystem.
+ .PP
+ .I Mren
+ will allow the following command line option:
+ .TP
+ .B v
+ Verbose mode.  Display the new filename if the name supplied is
+ invalid.
+ .PP
+ Reasonable care is taken to create a valid MSDOS filename.  If an invalid
+ MSDOS target name is specified,
+ .I mren
+ will change the name (and prompt the user to accept or reject the new name
+ if the verbose mode is set).
+ .PP
+ The path component of the target filename (if supplied) is ignored.  In
+ other words, you may not use
+ .I mren
+ to move a file from one subdirectory to another.
+ .PP 
+ .I Mren
+ may be used to rename directories.
+ .PP
+ MSDOS subdirectory names are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ names to be enclosed in quotes to protect them from the shell.
+ .PP
+ The
+ .I mcd
+ command may be used to establish the device and the current working
+ directory (relative to MSDOS), otherwise the default is A:/.
+ .PP
+ .I Mread
+ returns 0 on success or 1 on failure.
+ .SH SEE ALSO
+ mcd(1)
+ .SH BUGS
+ Unlike the MSDOS version of REN,
+ .I mren
+ can be used to rename directories.
diff -rc --new-file orig/mtools-2.0.7/mren.c mtools-2.0.7/mren.c
*** orig/mtools-2.0.7/mren.c	Thu Sep 10 15:59:16 1992
--- mtools-2.0.7/mren.c	Sun Oct 17 22:16:12 1993
***************
*** 10,26 ****
  
  #include <stdio.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
! int fd = -1;				/* the file descriptor for the device */
! int dir_start;				/* starting sector for directory */
! int dir_len;				/* length of directory (in sectors) */
! int dir_entries;			/* number of directory entries */
! int clus_size;				/* cluster size (in sectors) */
! char *mcwd;				/* the Current Working Directory */
! int fat_error;				/* FAT error detected? */
! 
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 10,17 ----
  
  #include <stdio.h>
  #include "msdos.h"
  
! mren(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 41,47 ****
  		}
  	}
  	if (argc != fargn + 2) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s [-v] sourcefile targetfile\n", argv[0]);
  		exit(1);
  	}
--- 32,38 ----
  		}
  	}
  	if (argc != fargn + 2) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s [-v] sourcefile targetfile\n", argv[0]);
  		exit(1);
  	}
***************
*** 66,71 ****
--- 57,63 ----
  	if (strcmp(temp, new) && verbose) {
  		while (!nogo) {
  			printf("Do you accept \"%s\" as the new filename (y/n) ? ", new);
+ 			fflush(stdout);
  			gets(ans);
  			if (ans[0] == 'y' || ans[0] == 'Y')
  				break;
diff -rc --new-file orig/mtools-2.0.7/msdos.h mtools-2.0.7/msdos.h
*** orig/mtools-2.0.7/msdos.h	Thu Sep 10 15:59:13 1992
--- mtools-2.0.7/msdos.h	Sun Oct 17 22:17:20 1993
***************
*** 59,61 ****
--- 59,74 ----
  #define strchr index
  #define strrchr rindex
  #endif /* BSD */
+ 
+ #define FAT12 4086 /* max. number of clusters described by a 12 bit FAT */
+ 
+ extern int fd;				/* the file descriptor for the device */
+ extern int dir_start;			/* starting sector for directory */
+ extern int dir_len;			/* length of directory (in sectors) */
+ extern int dir_entries;			/* number of directory entries */
+ extern int clus_size;			/* cluster size (in sectors) */
+ extern char *mcwd;			/* the Current Working Directory */
+ extern int fat_error;			/* FAT error detected? */
+ 
+ extern char *mversion;
+ extern char *mdate;
diff -rc --new-file orig/mtools-2.0.7/mtools.1 mtools-2.0.7/mtools.1
*** orig/mtools-2.0.7/mtools.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mtools.1	Sun Sep 26 19:24:05 1993
***************
*** 0 ****
--- 1,84 ----
+ .TH MTOOLS 1 local
+ .SH NAME
+ Mtools \- a collection of tools for manipulating MSDOS files
+ .SH SYNOPSIS
+ .nf
+ \fBmattrib\fR \- change MSDOS file attribute flags
+ \fBmcd\fR \- change MSDOS directory
+ \fBmcopy\fR \- copy MSDOS files to/from Unix
+ \fBmdel\fR \- delete an MSDOS file
+ \fBmdir\fR \- display an MSDOS directory
+ \fBmformat\fR \- add an MSDOS filesystem to a low-level formatted diskette
+ \fBmlabel\fR \- make an MSDOS volume label
+ \fBmmd\fR \- make an MSDOS subdirectory
+ \fBmrd\fR \- remove an MSDOS subdirectory
+ \fBmread\fR \- low level read (copy) an MSDOS file to Unix
+ \fBmren\fR \- rename an existing MSDOS file
+ \fBmtype\fR \- display contents of an MSDOS file
+ \fBmwrite\fR \- low level write (copy) a Unix file to MSDOS
+ .fi
+ .SH DESCRIPTION
+ Mtools is a public domain collection of programs to allow Unix systems
+ to read, write, and manipulate files on an MSDOS filesystem (typically a
+ diskette).  Each program attempts to emulate the MSDOS equivalent
+ command as closely as practical.
+ .PP
+ MSDOS filenames are optionally composed of a drive letter followed by a
+ colon, a subdirectory, and a filename.  Subdirectory names can use either
+ the '/' or '\e' separator.  The use of the '\e' separator or wildcards
+ will require the names to be enclosed in quotes to protect them from the
+ shell.
+ .PP
+ The regular expression "pattern matching" routines follow the Unix-style
+ rules.  For example, '*' matches all MSDOS files in lieu of '*.*'.  The
+ archive, hidden, read-only and system attribute bits are ignored during
+ pattern matching.
+ .PP
+ Not all Unix filenames are appropriate in the MSDOS world.  The Mtools
+ commands may have to alter Unix names to fit the MSDOS filename
+ restrictions.  Most commands have a -v (verbose) option that will
+ display the new names if they have been changed.  The following table
+ shows some examples of filename conversions:
+ .PP
+ .in +0.5i
+ .(b L
+ .TS
+ l l l.
+ Unix name	MSDOS name	Reason for the change
+ _	_	_
+ thisisatest	THISISAT	filename too long
+ emmet.gray	EMMET.GRA	extension too long
+ prn.txt	XRN.TXT	PRN is a device name
+ \.abc	X.ABC	null filename
+ hot+cold	HOTXCOLD	illegal character
+ .TE
+ .)b
+ .in
+ .PP
+ All options use the '-' (minus) flag, not '/' as you'd expect in MSDOS.
+ .PP
+ The
+ .I mcd
+ command is used to establish the device and the current working
+ directory (relative to the MSDOS filesystem), otherwise the default is
+ assumed to be A:/.
+ .PP
+ All the Mtools commands return 0 on success, 1 on utter failure, or 2
+ on partial failure.
+ .PP
+ Unless the host operating requires hardwired device setup,
+ the description of the devices on which to operate is loaded from
+ .I /etc/mtools 
+ where each line describes one device. The first word is the device
+ letter name, the second the type of FAT (12 or 16 bits), the third the
+ number of cylinder, the fourth is the number of heads, and the fifth
+ word is the number of sector per track. If zero is specified for any of
+ the last three a guess will be attempted; if using any one line fails,
+ the next lines that apply to that device are tried in turn.
+ .SH SEE ALSO
+ mattrib(1), mcd(1), mdel(1), mformat(1), mrd(1), mren(1), mtype(1),
+ mcopy(1), mdir(1), mlabel(1), mmd(1), mread(1), mwrite(1)
+ .SH BUGS
+ An unfortunate side effect of not guessing the proper device (when
+ multiple disk capacities are supported) is an occasional error message
+ from the device driver.  These can be safely ignored.
diff -rc --new-file orig/mtools-2.0.7/mtools.5 mtools-2.0.7/mtools.5
*** orig/mtools-2.0.7/mtools.5	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mtools.5	Thu Oct 28 08:55:58 1993
***************
*** 0 ****
--- 1,42 ----
+ .TH MTOOLS 5 "Oct 20, 1993" "" "Linux Programmer's Manual"
+ .SH NAME
+ mtools \- table of DOS devices
+ .SH DESCRIPTION
+ .B /etc/mtools
+ is a text file which contains the description of valid DOS
+ drive letters for
+ .IR mtools (1).
+ .PP
+ There are six columns in each line, and each line describes
+ a device.
+ .PP
+ The first is the drive letter, the second the pathname of
+ drive aliased to that letter; the third column is the number of
+ bits, 12 or 16, in the FAT. The last three columns are the
+ geometry of the drive, cuylinders, tracks per cylinder,
+ sectors per track.
+ .PP
+ .B Mtools
+ will attempt to query the drive for its geometry if the files
+ contains zeroes for those three parameters.
+ .PP
+ There can be several lines for the same drice letter; if IO fails
+ with the parameters specified in the first such line, the other
+ lines are tried in sequence.
+ .SH EXAMPLES
+ .B /etc/mtools may contain the following paths:
+ .sp
+ .RS
+ .nf
+ A /dev/fd0 12 80 2 18
+ A /dev/fd0 12 0 0 0
+ A /dev/fd0 12 40 2 9
+ B /dev/fd1 12 0 0 0
+ B /dev/fd1 12 40 2 9
+ C /dev/hda2 16 32 64 300
+ .fi
+ .RE
+ .SH FILES
+ /etc/mtools
+ .SH "SEE ALSO"
+ .IR mtools (1)
diff -rc --new-file orig/mtools-2.0.7/mtools.c mtools-2.0.7/mtools.c
*** orig/mtools-2.0.7/mtools.c	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mtools.c	Sun Oct 17 22:16:36 1993
***************
*** 0 ****
--- 1,71 ----
+ #include <stdio.h>
+ #include <string.h>
+ #include "msdos.h"
+ #include "patchlevel.h"
+ 
+ int fd = -1;				/* the file descriptor for the device */
+ int dir_start;				/* starting sector for directory */
+ int dir_len;				/* length of directory (in sectors) */
+ int dir_entries;			/* number of directory entries */
+ int clus_size;				/* cluster size (in sectors) */
+ char *mcwd;				/* the Current Working Directory */
+ int fat_error;				/* FAT error detected? */
+ 
+ char *mversion = VERSION;
+ char *mdate = DATE;
+ 
+ #define DISPATCH(cmd,fn) if (!strcmp(name,cmd)) { extern fn(); \
+   return fn(argc,argv); }
+ 
+ main(int argc,char **argv)
+ {
+     char *name;
+ 
+ #ifdef LOADDEVS
+     load_devices();
+ #endif
+ 
+     if (name = strrchr(argv[0],'/'))
+          name++;
+     else name = argv[0];
+ 
+     DISPATCH("mattrib",mattrib)
+     DISPATCH("mcd",mcd)
+     DISPATCH("mcopy",mcopy)
+     DISPATCH("mdel",mdel)
+     DISPATCH("mdir",mdir)
+     DISPATCH("mformat",mformat)
+     DISPATCH("mlabel",mlabel)
+     DISPATCH("mmd",mmd)
+     DISPATCH("mrd",mrd)
+     DISPATCH("mread",mread)
+     DISPATCH("mren",mren)
+     DISPATCH("mtype",mtype)
+     DISPATCH("mwrite",mwrite)
+ 
+     fprintf(stderr,"Unknown mtools command '%s'\n",name);
+ 
+     return 1;
+ }
+ 
+ /*
+  * Do a graceful exit if the program is interrupted.  This will reduce
+  * (but not eliminate) the risk of generating a corrupted disk on
+  * a user abort.
+  */
+ 
+ extern int fd;
+ 
+ int
+ got_signal()
+ {
+ 	void exit(), disk_flush(), fat_write(), dir_flush();
+ 
+ 	if (fd < 0)
+ 		exit(1);
+ 	fat_write();
+ 	dir_flush();
+ 	disk_flush();
+ 	close(fd);
+ 	exit(1);
+ }
diff -rc --new-file orig/mtools-2.0.7/mtools.etc mtools-2.0.7/mtools.etc
*** orig/mtools-2.0.7/mtools.etc	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mtools.etc	Thu Oct 28 08:46:42 1993
***************
*** 0 ****
--- 1,6 ----
+ A /dev/fd0 12 80 2 18
+ A /dev/fd0 12 0 0 0
+ A /dev/fd0 12 40 2 9
+ B /dev/fd1 12 0 0 0
+ B /dev/fd1 12 40 2 9
+ C /etc/dosemu/hdimage 16 80 2 18
diff -rc --new-file orig/mtools-2.0.7/mtype.1 mtools-2.0.7/mtype.1
*** orig/mtools-2.0.7/mtype.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mtype.1	Thu Sep 10 15:59:47 1992
***************
*** 0 ****
--- 1,40 ----
+ .TH MTYPE 1 local
+ .SH NAME
+ mtype \- display contents of an MSDOS file
+ .SH SYNOPSIS
+ .B mtype
+ [
+ .B -ts
+ ] msdosfile [ msdosfiles... ]
+ .SH DESCRIPTION
+ .I Mtype
+ displays the specified MSDOS file on the screen.
+ .PP
+ .I Mtype
+ will allow the following command line options:
+ .TP
+ .B t
+ Text file viewing.
+ .I Mtype
+ will translate incoming carriage return/line feeds to line feeds.
+ .TP
+ .B s
+ Strip high bit.
+ .I Mtype
+ will strip the high bit from the data.
+ .PP
+ MSDOS subdirectory names are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ names to be enclosed in quotes to protect them from the shell.
+ .PP
+ The
+ .I mcd
+ command may be used to establish the device and the current working
+ directory (relative to MSDOS), otherwise the default is A:/.
+ .PP
+ .I Mtype
+ returns 0 on success, 1 on utter failure, or 2 on partial failure.
+ .SH SEE ALSO
+ mcd(1), mread(1)
+ .SH BUGS
+ Allows multiple arguments, which does not follow the MSDOS convention.
diff -rc --new-file orig/mtools-2.0.7/mtype.c mtools-2.0.7/mtype.c
*** orig/mtools-2.0.7/mtype.c	Thu Sep 10 15:59:48 1992
--- mtools-2.0.7/mtype.c	Sun Oct 17 22:16:48 1993
***************
*** 10,26 ****
  
  #include <stdio.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
! int fd = -1;				/* the file descriptor for the device */
! int dir_start;				/* starting sector for directory */
! int dir_len;				/* length of directory (in sectors) */
! int dir_entries;			/* number of directory entries */
! int clus_size;				/* cluster size (in sectors) */
! char *mcwd;				/* the Current Working Directory */
! int fat_error;				/* FAT error detected? */
! 
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 10,17 ----
  
  #include <stdio.h>
  #include "msdos.h"
  
! mtype(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 56,62 ****
  	}
  
  	if (oops || (argc - optind) < 1) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s [-st] msdosfile [msdosfiles...]\n", argv[0]);
  		exit(1);
  	}
--- 47,53 ----
  	}
  
  	if (oops || (argc - optind) < 1) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s [-st] msdosfile [msdosfiles...]\n", argv[0]);
  		exit(1);
  	}
***************
*** 121,146 ****
  	if (missed_one)
  		exit(1);
  	exit(0);
- }
- 
- /*
-  * stubs for read-only programs
-  */
- 
- void
- disk_flush()
- {
- 	extern int disk_dirty;
- 
- 	disk_dirty = 0;
- 	return;
- }
- 
- void
- dir_flush()
- {
- 	extern int dir_dirty;
- 
- 	dir_dirty = 0;
- 	return;
  }
--- 112,115 ----
diff -rc --new-file orig/mtools-2.0.7/mwrite.1 mtools-2.0.7/mwrite.1
*** orig/mtools-2.0.7/mwrite.1	Thu Jan  1 01:00:00 1970
--- mtools-2.0.7/mwrite.1	Thu Sep 10 15:59:47 1992
***************
*** 0 ****
--- 1,68 ----
+ .TH MWRITE 1 local
+ .SH NAME
+ mwrite \- low level write (copy) a Unix file to MSDOS
+ .SH SYNOPSIS
+ .B mwrite
+ [
+ .B -tnvm
+ ] unixfile msdosfile
+ .PP
+ .B mwrite
+ [
+ .B -tnvm
+ ] unixfile [ unixfiles... ] msdosdirectory
+ .SH DESCRIPTION
+ In the first form,
+ .I mwrite
+ copies the specified Unix file to the named MSDOS file.  The second form
+ of the command copies multiple Unix files to the named MSDOS directory.
+ .PP
+ .I Mwrite
+ will allow the following command line options:
+ .TP
+ .B t
+ Text file transfer.
+ .I Mwrite
+ will translate incoming line feeds to carriage return/line feeds.
+ .TP
+ .B n
+ No warning.
+ .I Mwrite
+ will not warn the user when overwriting an existing file.
+ .TP
+ .B v
+ Verbose mode.  Display the new filename if the Unix filename requires
+ conversion.
+ .TP
+ .B m
+ Preserve the file modification times.
+ .PP
+ If the target file already exists, and the
+ .I -n
+ option is not in effect,
+ .I mwrite
+ asks whether or not to overwrite the file.
+ .PP
+ Reasonable care is taken to create a valid MSDOS filename.  If an
+ invalid name is specified,
+ .I mwrite
+ will change the name (and display the new name if the verbose mode is
+ set).
+ .PP
+ MSDOS subdirectory names are are supported with either the '/' or '\e'
+ separator.  The use of the '\e' separator or wildcards will require the
+ names to be enclosed in quotes to protect them from the shell.
+ .PP
+ The
+ .I mcd
+ command may be used to establish the device and the current working
+ directory (relative to MSDOS), otherwise the default is A:/.
+ .PP
+ .I Mwrite
+ returns 0 on success, 1 on utter failure, or 2 on partial failure.
+ .SH SEE ALSO
+ mcd(1), mcopy(1), mread(1)
+ .SH BUGS
+ Unlike MSDOS, the destination directory may
+ .B not
+ be omitted.
diff -rc --new-file orig/mtools-2.0.7/mwrite.c mtools-2.0.7/mwrite.c
*** orig/mtools-2.0.7/mwrite.c	Thu Sep 10 15:59:48 1992
--- mtools-2.0.7/mwrite.c	Sun Oct 17 22:17:01 1993
***************
*** 13,36 ****
  #include <sys/types.h>
  #include <sys/stat.h>
  #include "msdos.h"
- #include "patchlevel.h"
  
! int fd = -1;				/* the file descriptor for the device */
! int dir_start;				/* starting sector for directory */
! int dir_len;				/* length of directory (in sectors) */
! int dir_entries;			/* number of directory entries */
! int clus_size;				/* cluster size (in sectors) */
! char *mcwd;				/* the Current Working Directory */
! int fat_error;				/* FAT error detected? */
  
  int full = 0;
  int textmode = 0;
  int nowarn = 0;
- static int got_signal();
  static struct directory *writeit();
  static long free_space();
  
! main(argc, argv)
  int argc;
  char *argv[];
  {
--- 13,28 ----
  #include <sys/types.h>
  #include <sys/stat.h>
  #include "msdos.h"
  
! extern int got_signal();
  
  int full = 0;
  int textmode = 0;
  int nowarn = 0;
  static struct directory *writeit();
  static long free_space();
  
! mwrite(argc, argv)
  int argc;
  char *argv[];
  {
***************
*** 76,82 ****
  	}
  
  	if (oops || (argc - optind) < 2) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  		fprintf(stderr, "Usage: %s [-tnvm] unixfile msdosfile\n", argv[0]);
  		fprintf(stderr, "       %s [-tnvm] unixfile [unixfiles...] msdosdirectory\n", argv[0]);
  		exit(1);
--- 68,74 ----
  	}
  
  	if (oops || (argc - optind) < 2) {
! 		fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  		fprintf(stderr, "Usage: %s [-tnvm] unixfile msdosfile\n", argv[0]);
  		fprintf(stderr, "       %s [-tnvm] unixfile [unixfiles...] msdosdirectory\n", argv[0]);
  		exit(1);
***************
*** 177,182 ****
--- 169,175 ----
  					/* CONSTCOND */
  					while (1) {
  						printf("File \"%s\" exists, overwrite (y/n) ? ", target);
+ 						fflush(stdout);
  						gets(ans);
  						if (ans[0] == 'n' || ans[0] == 'N') {
  							nogo = 1;
***************
*** 322,348 ****
  	dir = mk_entry(fixed, 0x20, fat, size, now);
  	return(dir);
  }
- 
- /*
-  * Do a graceful exit if the program is interrupted.  This will reduce
-  * (but not eliminate) the risk of generating a corrupted disk on
-  * a user abort.
-  */
- 
- static int
- got_signal()
- {
- 	void exit(), disk_flush(), fat_write(), dir_flush();
- 
- 	if (fd < 0)
- 		exit(1);
- 	fat_write();
- 	dir_flush();
- 	disk_flush();
- 	close(fd);
- 	exit(1);
- }
- 
  
  /*
   * Get the amount of remaining free space
--- 315,320 ----
diff -rc --new-file orig/mtools-2.0.7/patchlevel.h mtools-2.0.7/patchlevel.h
*** orig/mtools-2.0.7/patchlevel.h	Thu Sep 10 16:00:31 1992
--- mtools-2.0.7/patchlevel.h	Fri Nov  5 19:41:30 1993
***************
*** 1,2 ****
  #define VERSION	"2.0.7"
! #define DATE	"6 Sep 92"
--- 1,2 ----
  #define VERSION	"2.0.7"
! #define DATE	"17 Oct 93"
