[unix-pc.sources] Patch #3 to Mtools v2.0

egray@osiris.cso.uiuc.edu (Emmet P. Gray) (11/28/90)

This is patch #3 to the Mtools v2.0 distribution package.  This patch
will fix a bug where Mtools sometimes bypasses the disk "cache" and
reads/writes to the disk directly.  Many thanks to Mike Pearlman
for pointing this out to me.

Mtools was posted to the unix-pc.sources news group (and mailed to the
moderator of comp.sources.unix) on the 17th of September 1990.  Since
then, patch #1 and #2 have been posted to unix-pc.sources,
comp.sources.bugs, and emailed to Rich Salz.

In addition, the current version of Mtools and all the patch are
available via anonymous ftp from cerl.cecer.army.mil (129.229.1.101).

Emmet P. Gray				US Army, HQ III Corps & Fort Hood
...!uunet!uiucuxc!fthood!egray		Attn: AFZF-DE-ENV
fthood!egray@uxc.cso.uiuc.edu		Directorate of Engineering & Housing
					Environmental Management Office
					Fort Hood, TX 76544-5057

-------------------------------------------------------------------------------
Prereq: 2.0.2
*** old/patchlevel.h	Thu Nov 22 04:53:31 1990
--- patchlevel.h	Mon Nov 26 09:52:26 1990
***************
*** 1
! #define VERSION 2.0.2

--- 1 -----
! #define VERSION 2.0.3
*** old/Configure	Thu Nov 22 04:53:16 1990
--- Configure	Thu Nov 22 18:31:15 1990
***************
*** 99,103
  		{'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, 12, 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},

--- 99,103 -----
  		{'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},
*** old/buf_read.c	Thu Nov 22 04:53:22 1990
--- buf_read.c	Mon Nov 26 09:24:25 1990
***************
*** 16,20
  
  void
! disk_read(start, buf, len, cache)
  long start;
  unsigned char *buf;

--- 16,20 -----
  
  void
! disk_read(start, buf, len)
  long start;
  unsigned char *buf;
***************
*** 19,23
  long start;
  unsigned char *buf;
! int len, cache;
  {
  	register long i;

--- 19,23 -----
  long start;
  unsigned char *buf;
! int len;
  {
  	register long i;
***************
*** 29,33
  
  					/* don't use cache? */
! 	if (disk_size == 1 || !cache) {
  		where = (start * MSECTOR_SIZE) + disk_offset;
  		if (lseek(fd, where, 0) < 0) {

--- 29,33 -----
  
  					/* don't use cache? */
! 	if (disk_size == 1) {
  		where = (start * MSECTOR_SIZE) + disk_offset;
  		if (lseek(fd, where, 0) < 0) {
*** old/buf_write.c	Thu Nov 22 04:53:22 1990
--- buf_write.c	Tue Nov 27 09:28:09 1990
***************
*** 13,17
  
  void
! disk_write(start, buf, len, cache)
  long start;
  unsigned char *buf;

--- 13,17 -----
  
  void
! disk_write(start, buf, len)
  long start;
  unsigned char *buf;
***************
*** 16,20
  long start;
  unsigned char *buf;
! int len, cache;
  {
  	register long i;

--- 16,20 -----
  long start;
  unsigned char *buf;
! int len;
  {
  	register long i;
***************
*** 26,30
  
  					/* don't use cache? */
! 	if (disk_size == 1 || !cache) {
  		where = (start * MSECTOR_SIZE) + disk_offset;
  		if (lseek(fd, where, 0) < 0) {

--- 26,30 -----
  
  					/* don't use cache? */
! 	if (disk_size == 1) {
  		where = (start * MSECTOR_SIZE) + disk_offset;
  		if (lseek(fd, where, 0) < 0) {
*** old/devices.c	Thu Nov 22 04:53:22 1990
--- devices.c	Tue Nov 27 09:16:54 1990
***************
*** 13,17
  	{'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, 12, 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},

--- 13,17 -----
  	{'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},
***************
*** 22,26
  #ifdef MASSCOMP
  struct device devices[] = {
! 	{'A', "/dev/flp", 0L, 12, 0, (int (*) ()) 0, 80, 2, 8},
  	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
  };

--- 22,26 -----
  #ifdef MASSCOMP
  struct device devices[] = {
! 	{'A', "/dev/rflp", 0L, 12, 0, (int (*) ()) 0, 80, 2, 8},
  	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
  };
*** old/dir_make.c	Thu Nov 22 04:53:22 1990
--- dir_make.c	Mon Nov 26 09:23:20 1990
***************
*** 50,54
  					/* write the cluster */
  	sector = (long) (last - 2) * clus_size + dir_start + dir_len;
! 	disk_write(sector, tbuf, buflen, DIRECT);
  
  					/* fix up the globals.... */

--- 50,54 -----
  					/* write the cluster */
  	sector = (long) (last - 2) * clus_size + dir_start + dir_len;
! 	disk_write(sector, tbuf, buflen);
  
  					/* fix up the globals.... */
***************
*** 66,70
  	}
  	offset = dir_buf + (num * MSECTOR_SIZE);
! 	disk_read(dir_chain[num], offset, clus_size * MSECTOR_SIZE, DIRECT);
  	return(0);
  }

--- 66,70 -----
  	}
  	offset = dir_buf + (num * MSECTOR_SIZE);
! 	disk_read(dir_chain[num], offset, clus_size * MSECTOR_SIZE);
  	return(0);
  }
*** old/dir_read.c	Thu Nov 22 04:53:23 1990
--- dir_read.c	Mon Nov 26 09:25:25 1990
***************
*** 79,83
  	for (i = 0; i < length; i++) {
  		offset = dir_buf + (i * MSECTOR_SIZE);
! 		disk_read(dir_chain[i], offset, MSECTOR_SIZE, DIRECT);
  	}
  

--- 79,83 -----
  	for (i = 0; i < length; i++) {
  		offset = dir_buf + (i * MSECTOR_SIZE);
! 		disk_read(dir_chain[i], offset, MSECTOR_SIZE);
  	}
  
***************
*** 112,116
  		exit(1);
  	}
! 	disk_read((long) dir_start, dir_buf, dir_len * MSECTOR_SIZE, DIRECT);
  
  	dir_entries = dir_len * 16;

--- 112,116 -----
  		exit(1);
  	}
! 	disk_read((long) dir_start, dir_buf, dir_len * MSECTOR_SIZE);
  
  	dir_entries = dir_len * 16;
*** old/dir_write.c	Thu Nov 22 04:53:23 1990
--- dir_write.c	Mon Nov 26 11:37:39 1990
***************
*** 45,49
  	for (i = 0; i < length; i++) {
  		offset = dir_buf + (i * MSECTOR_SIZE);
! 		disk_write(dir_chain[i], offset, MSECTOR_SIZE, DIRECT);
  	}
  	dir_dirty = 0;

--- 45,49 -----
  	for (i = 0; i < length; i++) {
  		offset = dir_buf + (i * MSECTOR_SIZE);
! 		disk_write(dir_chain[i], offset, MSECTOR_SIZE);
  	}
  	dir_dirty = 0;
*** old/fat_read.c	Thu Nov 22 04:53:23 1990
--- fat_read.c	Mon Nov 26 09:25:49 1990
***************
*** 60,64
  		 */
  					/* which bytes contain the entry */
! 		start = num / 2;
  		if (start <= 3 || start + 1 > (fat_len * MSECTOR_SIZE))
  			return(1);

--- 60,64 -----
  		 */
  					/* which bytes contain the entry */
! 		start = num * 2;
  		if (start <= 3 || start + 1 > (fat_len * MSECTOR_SIZE))
  			return(1);
***************
*** 88,92
  	}
  					/* read the FAT sectors */
! 	disk_read((long) start, fat_buf, buflen, DIRECT);
  
  					/* the encoding scheme */

--- 88,92 -----
  	}
  					/* read the FAT sectors */
! 	disk_read((long) start, fat_buf, buflen);
  
  					/* the encoding scheme */
*** old/fat_write.c	Thu Nov 22 04:53:24 1990
--- fat_write.c	Mon Nov 26 12:15:12 1990
***************
*** 52,56
  		 */
  					/* which bytes contain the entry */
! 		start = num / 2;
  		if (start <= 3 || start + 1 > (fat_len * MSECTOR_SIZE))
  			return(1);

--- 52,56 -----
  		 */
  					/* which bytes contain the entry */
! 		start = num * 2;
  		if (start <= 3 || start + 1 > (fat_len * MSECTOR_SIZE))
  			return(1);
***************
*** 80,84
  	buflen = fat_len * MSECTOR_SIZE;
  
! 	disk_write((long) fat_start, fat_buf, buflen, DIRECT);
  
  	/*

--- 80,84 -----
  	buflen = fat_len * MSECTOR_SIZE;
  
! 	disk_write((long) fat_start, fat_buf, buflen);
  
  	/*
***************
*** 89,93
  		while (dups--) {
  			fat_start += fat_len;
! 			disk_write((long) fat_start, fat_buf, buflen, DIRECT);
  		}
  	}

--- 89,93 -----
  		while (dups--) {
  			fat_start += fat_len;
! 			disk_write((long) fat_start, fat_buf, buflen);
  		}
  	}
*** old/file_read.c	Thu Nov 22 04:53:24 1990
--- file_read.c	Mon Nov 26 09:26:20 1990
***************
*** 28,32
  	while (1) {
  		start = (long) (fat - 2) * clus_size + dir_start + dir_len;
! 		disk_read(start, in_buf, in_len, CACHE);
  
  					/* do the translations */

--- 28,32 -----
  	while (1) {
  		start = (long) (fat - 2) * clus_size + dir_start + dir_len;
! 		disk_read(start, in_buf, in_len);
  
  					/* do the translations */
*** old/file_write.c	Thu Nov 22 04:53:24 1990
--- file_write.c	Mon Nov 26 09:26:31 1990
***************
*** 115,119
  	}
  
! 	disk_write(start, tbuf, buflen, CACHE);
  	return(i);
  }

--- 115,119 -----
  	}
  
! 	disk_write(start, tbuf, buflen);
  	return(i);
  }
*** old/mattrib.c	Thu Nov 22 04:53:25 1990
--- mattrib.c	Mon Nov 26 09:28:54 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
*** old/mcd.c	Thu Nov 22 04:53:26 1990
--- mcd.c	Mon Nov 26 08:01:34 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
*** old/mcopy.c	Thu Nov 22 04:53:27 1990
--- mcopy.c	Mon Nov 26 08:01:41 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
*** old/mdel.c	Thu Nov 22 04:53:27 1990
--- mdel.c	Mon Nov 26 09:29:26 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
*** old/mdir.c	Thu Nov 22 04:53:27 1990
--- mdir.c	Mon Nov 26 08:01:54 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
*** old/mformat.c	Thu Nov 22 04:53:28 1990
--- mformat.c	Mon Nov 26 08:02:00 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
*** old/mlabel.c	Thu Nov 22 04:53:28 1990
--- mlabel.c	Mon Nov 26 09:29:36 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
*** old/mmd.c	Thu Nov 22 04:53:28 1990
--- mmd.c	Mon Nov 26 09:29:53 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
***************
*** 184,188
  
  					/* write the cluster */
! 	disk_write(start, (unsigned char *) buf, buflen, DIRECT);
  	return;
  }

--- 185,189 -----
  
  					/* write the cluster */
! 	disk_write(start, (unsigned char *) buf, buflen);
  	return;
  }
*** old/mrd.c	Thu Nov 22 04:53:28 1990
--- mrd.c	Mon Nov 26 09:30:09 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
***************
*** 140,144
  		sector = (long) (fat - 2) * clus_size + dir_start + dir_len;
  		buflen = clus_size * MSECTOR_SIZE;
! 		disk_read(sector, tbuf, buflen, DIRECT);
  
  					/* check first character of name */

--- 141,145 -----
  		sector = (long) (fat - 2) * clus_size + dir_start + dir_len;
  		buflen = clus_size * MSECTOR_SIZE;
! 		disk_read(sector, tbuf, buflen);
  
  					/* check first character of name */
*** old/mread.c	Thu Nov 22 04:53:29 1990
--- mread.c	Mon Nov 26 08:02:28 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
*** old/mren.c	Thu Nov 22 04:53:29 1990
--- mren.c	Mon Nov 26 09:30:20 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
*** old/msdos.h	Thu Nov 22 04:53:29 1990
--- msdos.h	Mon Nov 26 15:08:43 1990
***************
*** 9,14
  #define MAX_DIR_SECS	64		/* largest directory (in sectors) */
  
- #define CACHE		1
- #define DIRECT		0
  #define NEW		1
  #define OLD		0

--- 9,12 -----
  #define MAX_DIR_SECS	64		/* largest directory (in sectors) */
  
  #define NEW		1
  #define OLD		0
*** old/mtype.c	Thu Nov 22 04:53:30 1990
--- mtype.c	Mon Nov 26 08:02:42 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
*** old/mwrite.c	Thu Nov 22 04:53:30 1990
--- mwrite.c	Mon Nov 26 13:09:15 1990
***************
*** 10,13
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
   */
  

--- 10,14 -----
   *  patch #1		12 Oct 90
   *  patch #2		21 Nov 90
+  *  patch #3		28 Nov 90
   */
  
***************
*** 247,251
  	FILE *fp;
  	unsigned int fat, next_fat();
! 	long filesize, file_write(), size, time(), now;
  	struct directory *dir, *mk_entry();
  	struct stat stbuf;

--- 248,252 -----
  	FILE *fp;
  	unsigned int fat, next_fat();
! 	long filesize, file_write(), size, time(), now, free_space();
  	struct directory *dir, *mk_entry();
  	struct stat stbuf;
***************
*** 266,269
  		return(NULL);
  	}
  	filesize = stbuf.st_size;
  					/* preserve mod time? */

--- 267,271 -----
  		return(NULL);
  	}
+ 					/* will it fit? */
  	filesize = stbuf.st_size;
  	if (filesize > free_space()) {
***************
*** 267,270
  	}
  	filesize = stbuf.st_size;
  					/* preserve mod time? */
  	if (mod_time)

--- 269,276 -----
  					/* will it fit? */
  	filesize = stbuf.st_size;
+ 	if (filesize > free_space()) {
+ 		full = 1;
+ 		return(NULL);
+ 	}
  					/* preserve mod time? */
  	if (mod_time)
***************
*** 310,312
  	close(fd);
  	exit(1);
  }

--- 316,341 -----
  	close(fd);
  	exit(1);
+ }
+ 
+ 
+ /*
+  * Get the amount of remaining free space
+  */
+ 
+ static long
+ free_space()
+ {
+ 	register unsigned int i;
+ 	long total;
+ 	extern unsigned int num_clus;
+ 	unsigned int fat_decode();
+ 
+ 	total = 0L;
+ 	for (i = 2; i < num_clus + 2; i++) {
+ 					/* if fat_decode returns zero */
+ 		if (!fat_decode(i))
+ 			total += clus_size;
+ 	}
+ 	total *= MSECTOR_SIZE;
+ 	return(total);
  }
End of Patch