*BSD News Article 24960


Return to BSD News archive

Path: sserve!newshost.anu.edu.au!munnari.oz.au!goanna.cs.rmit.oz.au!yallara!lm
From: lm@yallara.cs.rmit.OZ.AU (Luke Mewburn)
Newsgroups: comp.os.386bsd.questions
Subject: Re: How to configure mtools? [soln]
Date: 15 Dec 1993 05:49:30 GMT
Organization: Technical Services Group, Dept. of Computer Science, RMIT
Lines: 448
Message-ID: <2em8ha$t78@goanna.cs.rmit.oz.au>
References: <SWILDNER.93Dec11184139@channelz.GUN.de>
Reply-To: lm@rmit.edu.au
NNTP-Posting-Host: yallara.cs.rmit.oz.au

swildner@channelz.GUN.de (Sascha Wildner) writes:

> I am having problems configuring mtools-2.0 for FreeBSD.  Since there
> was no appropriate entry in devices.c, I added the following:

> #ifdef 386BSD
> struct device devices[] = {
> 	{'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15},
> 	{'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},
> 	{'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18},
> 	{'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9}
> };
> #endif

> 1.44MB (3.5") and 1.2MB (5.25") are recognized, but 720KB (3.5") and
> 360KB (5.25") aren't.


I hacked mtools 2.0.7 a long time ago for this. I actually shoe-horned
someone else's patches for 2.0.5 into 2.0.7, and added some extra
functionality to mtools. Note that this was for 386BSD 0.1, but my
mtools binaries compiled back then still worked when I went to netbsd
0.8... I don't guarantee that it works for newer *BSD revisions, but
give it a go anyway.

Here's my post from a _long_ time ago (just grabbed it from the
minnie.cs.adfa.oz.au news archive)

----
    Received: by minnie.vk1xwt.ampr.org with NNTP
	id AA1485 ; Tue, 23 Feb 93 14:43:48 EST
    Path: sserve!manuel.anu.edu.au!munnari.oz.au!bruce.cs.monash.edu.au!monu6!escargot!minyos.xx.rmit.OZ.AU!s902113
    From: s902113@minyos.xx.rmit.OZ.AU (Luke Mewburn)
    Newsgroups: comp.unix.bsd
    Subject: [386bsd & others] mtools 2.0.7 diffs
    Date: 18 Feb 1993 16:32:59 GMT
    Organization: RMIT Computer Centre
    Lines: 409
    Message-ID: <1m0dnsINNak0@escargot.xx.rmit.OZ.AU>
    NNTP-Posting-Host: minyos.xx.rmit.oz.au

Here's the diffs to get mtools 2.0.7 running off your 386bsd box. Will
recognize your hard disk partitions too. I didn't write some of these
patches, I just cleaned it up, and also fixed some bugs regarding the
use of gets(), and a major prob in the mkmanifest.c stuff (would dump
core if a filename was > than a really small limit).

You can get mtools 2.0.7 from your favourite gnu site, in Australia
that is archie.au, /gnu

Just untar the source, patch in this file, and make it.

diff -c mtools-2.0.7/Makefile mtools/Makefile
*** mtools-2.0.7/Makefile	Thu Sep 10 15:10:46 1992
--- mtools/Makefile	Thu Jan 14 14:54:06 1993
***************
*** 125,131 ****
  	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 \
--- 129,135 ----
  	install -c -m 644 Mkmanifest.1 $(MANDIR)/mkmanifest.$(MANEXT)
  
  clean:
! 	rm -f $(PROGS) *.o core a.out tags TAGS
  
  lint:
  	$(LINT) mattrib.c buf_read.c buf_write.c devices.c dir_read.c \
diff -c mtools-2.0.7/devices.c mtools/devices.c
*** mtools-2.0.7/devices.c	Thu Sep 10 15:11:17 1992
--- mtools/devices.c	Thu Jan 14 14:54:44 1993
***************
*** 173,175 ****
--- 173,198 ----
  	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
  };
  #endif /* XENIX */
+ 
+ 
+ #ifdef __386BSD__
+ struct device devices[] = {
+ 	{'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18}, /* 1.44m */
+ 	{'A', "/dev/rfd0b", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15}, /* 1.2m */
+ 	{'A', "/dev/rfd0c", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},  /* 720k */
+ 	{'A', "/dev/rfd0d", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},  /* 360k */
+ 	{'A', "/dev/rfd0e", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},  /* 360k */
+ 	{'A', "/dev/rfd0f", 0L, 12, 0, (int (*) ()) 0, 40, 2, 8},  /* 320k */
+ 	{'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18}, /* 1.44m */
+ 	{'B', "/dev/rfd1b", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15}, /* 1.2m */
+ 	{'B', "/dev/rfd1c", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},  /* 720k */
+ 	{'B', "/dev/rfd1d", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},  /* 360k */
+ 	{'B', "/dev/rfd1e", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},  /* 360k */
+ 	{'B', "/dev/rfd1f", 0L, 12, 0, (int (*) ()) 0, 40, 2, 8},  /* 320k */
+ 	{'C', "/dev/rwd0d", -1L, 16, 0, (int (*) ()) 0, 0, 0, 0},
+ 	{'C', "/dev/ras0d", -1L, 16, 0, (int (*) ()) 0, 0, 0, 0},
+ 	{'D', "/dev/rwd1d", -1L, 16, 0, (int (*) ()) 0, 0, 0, 0},
+ 	{'D', "/dev/ras1d", -1L, 16, 0, (int (*) ()) 0, 0, 0, 0},
+ 	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
+ };
+ #endif /* __386BSD__ */
diff -c mtools-2.0.7/dir_write.c mtools/dir_write.c
*** mtools-2.0.7/dir_write.c	Thu Sep 10 14:59:15 1992
--- mtools/dir_write.c	Wed Jan 20 16:51:24 1993
***************
*** 68,74 ****
  	int dot, modified, len;
  	register int i;
  
! 	strcpy(buf, filename);
  	name = buf;
  					/* skip drive letter */
  	if (buf[0] && buf[1] == ':')
--- 68,75 ----
  	int dot, modified, len;
  	register int i;
  
! 	strncpy(buf, filename, MAX_PATH);
! 	buf[MAX_PATH-1] = '\0';		/* just in case */
  	name = buf;
  					/* skip drive letter */
  	if (buf[0] && buf[1] == ':')
diff -c mtools-2.0.7/expand.c mtools/expand.c
*** mtools-2.0.7/expand.c	Thu Sep 10 14:59:12 1992
--- mtools/expand.c	Wed Jan 20 16:43:58 1993
***************
*** 57,63 ****
   * Miscellaneous routines probably missing from Bezerkely
   */
  
! #ifdef BSD
  /*
   * Return ptr to first occurrence of any character from `brkset'
   * in the character string `string'; NULL if none exists.
--- 57,63 ----
   * Miscellaneous routines probably missing from Bezerkely
   */
  
! #if defined(BSD) && !defined(__386BSD__)
  /*
   * Return ptr to first occurrence of any character from `brkset'
   * in the character string `string'; NULL if none exists.
***************
*** 111,114 ****
  	bcopy(s2, s1, n);
  	return(s1);
  }
! #endif /* BSD */
--- 111,114 ----
  	bcopy(s2, s1, n);
  	return(s1);
  }
! #endif /* BSD && !__386BSD__ */
diff -c mtools-2.0.7/init.c mtools/init.c
*** mtools-2.0.7/init.c	Thu Sep 10 14:59:47 1992
--- mtools/init.c	Tue Feb 16 13:39:48 1993
***************
*** 26,31 ****
--- 26,33 ----
  extern unsigned char *fat_buf, *disk_buf, *dir_buf;
  extern struct device devices[];
  static struct bootsector *read_boot();
+ static long find_partition ();
+ static int lock_dev ();
  
  int
  init(drive, mode)
***************
*** 61,71 ****
  			break;
  
  		name = expand(dev->name);
! 		if ((fd = open(name, mode | dev->mode)) < 0) {
! 			sprintf(buf, "init: open \"%s\"", name);
! 			perror(buf);
! 			exit(1);
! 		}
  					/* lock the device on writes */
  		if (mode == 2 && lock_dev(fd)) {
  			fprintf(stderr, "Device \"%s\" is busy\n", dev->name);
--- 63,78 ----
  			break;
  
  		name = expand(dev->name);
! #if 0
!  		if ((fd = open(name, mode | dev->mode)) < 0) {
!  			sprintf(buf, "init: open \"%s\"", name);
!  			perror(buf);
!  			exit(1);
!  		}
! #else
! 		if ((fd = open(name, mode | dev->mode)) < 0)
! 			goto try_again;
! #endif
  					/* lock the device on writes */
  		if (mode == 2 && lock_dev(fd)) {
  			fprintf(stderr, "Device \"%s\" is busy\n", dev->name);
***************
*** 77,82 ****
--- 84,94 ----
  				goto try_again;
  		}
  					/* read the boot sector */
+ 		if (dev->offset < 0)
+ 			dev->offset = find_partition (fd);
+ 		if (dev->offset < 0)
+ 			goto try_again;
+ 
  		disk_offset = dev->offset;
  		if ((boot = read_boot()) == NULL)
  			goto try_again;
***************
*** 158,164 ****
  		else
  			break;
  
! try_again:	close(fd);
  		fd = -1;
  		dev++;
  	}
--- 170,177 ----
  		else
  			break;
  
! try_again:      if (fd >= 0)
! 			close(fd);
  		fd = -1;
  		dev++;
  	}
***************
*** 321,326 ****
--- 334,361 ----
  		return(NULL);
  
  	return(&boot);
+ }
+ 
+ static long find_partition (fd)
+ {
+ 	char buf [512];
+ 	int i;
+ 	struct partition {
+ 		unsigned char flag, bhead, bsect, bcyl;
+ 		unsigned char system, ehead, esect, ecyl;
+ 		unsigned long relsect, numsect;
+ 	} *p;
+ 
+ 	if (read (fd, buf, 512) != 512 ||
+ 	    ((unsigned short *) buf) [255] != 0xaa55)
+ 		return (-1);
+ 	p = (struct partition *) (buf + 0x1be);
+ 	for (i=0; i<4; ++i, ++p)
+ 		if (p->flag != 0 && p->flag != 0x80)
+ 			return (-1);
+ 		else if (p->system == 4)        /* find DOS-16 partition */
+ 			return (p->relsect * 512);
+ 	return (-1);
  }
  
  /*
diff -c mtools-2.0.7/mdel.c mtools/mdel.c
*** mtools-2.0.7/mdel.c	Thu Sep 10 14:59:47 1992
--- mtools/mdel.c	Thu Jan 14 15:23:36 1993
***************
*** 103,109 ****
  				if (dir->attr & 0x01) {
  					while (!nogo) {
  						printf("%s: \"%s\" is read only, erase anyway (y/n) ? ", argv[0], newfile);
! 						gets(ans);
  						if (ans[0] == 'y' || ans[0] == 'Y')
  							break;
  						if (ans[0] == 'n' || ans[0] == 'N')
--- 103,109 ----
  				if (dir->attr & 0x01) {
  					while (!nogo) {
  						printf("%s: \"%s\" is read only, erase anyway (y/n) ? ", argv[0], newfile);
! 						fgets(ans, 9, stdin);
  						if (ans[0] == 'y' || ans[0] == 'Y')
  							break;
  						if (ans[0] == 'n' || ans[0] == 'N')
diff -c mtools-2.0.7/mkmanifest.c mtools/mkmanifest.c
*** mtools-2.0.7/mkmanifest.c	Thu Sep 10 14:59:13 1992
--- mtools/mkmanifest.c	Wed Jan 20 16:55:32 1993
***************
*** 12,18 ****
--- 12,24 ----
  
  #include <stdio.h>
  #include <ctype.h>
+ #include <sys/param.h>		/* for MAXPATHLEN */
  
+ #ifndef MAXPATHLEN
+ #define MAXPATHLEN 1024
+ #endif
+ 
+ 
  main(argc, argv)
  int argc;
  char *argv[];
***************
*** 48,54 ****
  	static char *dev[9] = {"con", "aux", "com1", "com2", "lpt1", "prn",
  	"lpt2", "lpt3", "nul"};
  	char *s, *temp, *ext, *strcpy(), *strpbrk(), *strcat();
! 	char buf[15];
  	int i, dot;
  	static char ans[13];
  
--- 54,60 ----
  	static char *dev[9] = {"con", "aux", "com1", "com2", "lpt1", "prn",
  	"lpt2", "lpt3", "nul"};
  	char *s, *temp, *ext, *strcpy(), *strpbrk(), *strcat();
! 	char buf[MAXPATHLEN];
  	int i, dot;
  	static char ans[13];
  
***************
*** 95,101 ****
  	return(ans);
  }
  
! #ifdef BSD
  /*
   * Return ptr to first occurrence of any character from `brkset'
   * in the character string `string'; NULL if none exists.
--- 101,107 ----
  	return(ans);
  }
  
! #if defined(BSD) && ! defined(__386BSD__)
  /*
   * Return ptr to first occurrence of any character from `brkset'
   * in the character string `string'; NULL if none exists.
***************
*** 118,121 ****
  	while (*string++);
  	return(0);
  }
! #endif /* BSD */
--- 124,127 ----
  	while (*string++);
  	return(0);
  }
! #endif /* BSD  && ! __386BSD__ */
diff -c mtools-2.0.7/mlabel.c mtools/mlabel.c
*** mtools-2.0.7/mlabel.c	Thu Sep 10 14:59:16 1992
--- mtools/mlabel.c	Thu Jan 14 15:24:26 1993
***************
*** 98,104 ****
  
  					/* ask for new label */
  	printf("Enter the new volume label (11 characters): ");
! 	gets(filename);
  	if (filename[0] != '\0') {
  		sprintf((char *) fixed, "%-11.11s", filename);
  		if (strlen(filename) > 11 && verbose)
--- 98,104 ----
  
  					/* ask for new label */
  	printf("Enter the new volume label (11 characters): ");
! 	fgets(filename, 29, stdin);
  	if (filename[0] != '\0') {
  		sprintf((char *) fixed, "%-11.11s", filename);
  		if (strlen(filename) > 11 && verbose)
***************
*** 109,115 ****
  			exit(0);
  
  		printf("Delete volume label (y/n): ");
! 		gets(ans);
  		if (ans[0] == 'y' || ans[0] == 'Y') {
  			strcpy((char *) fixed, (char *) vol);
  			fixed[0] = 0xe5;
--- 109,115 ----
  			exit(0);
  
  		printf("Delete volume label (y/n): ");
! 		fgets(ans, 9, stdin);
  		if (ans[0] == 'y' || ans[0] == 'Y') {
  			strcpy((char *) fixed, (char *) vol);
  			fixed[0] = 0xe5;
diff -c mtools-2.0.7/mread.c mtools/mread.c
*** mtools-2.0.7/mread.c	Thu Sep 10 14:59:48 1992
--- mtools/mread.c	Thu Jan 14 15:24:55 1993
***************
*** 230,236 ****
  			/* CONSTCOND */
  			while (1) {
  				printf("File \"%s\" exists, overwrite (y/n) ? ", target);
! 				gets(ans);
  				if (ans[0] == 'n' || ans[0] == 'N')
  					return(NULL);
  				if (ans[0] == 'y' || ans[0] == 'Y')
--- 230,236 ----
  			/* CONSTCOND */
  			while (1) {
  				printf("File \"%s\" exists, overwrite (y/n) ? ", target);
! 				fgets(ans, 9, stdin);
  				if (ans[0] == 'n' || ans[0] == 'N')
  					return(NULL);
  				if (ans[0] == 'y' || ans[0] == 'Y')
diff -c mtools-2.0.7/mren.c mtools/mren.c
*** mtools-2.0.7/mren.c	Thu Sep 10 14:59:16 1992
--- mtools/mren.c	Thu Jan 14 15:25:11 1993
***************
*** 66,72 ****
  	if (strcmp(temp, new) && verbose) {
  		while (!nogo) {
  			printf("Do you accept \"%s\" as the new filename (y/n) ? ", new);
! 			gets(ans);
  			if (ans[0] == 'y' || ans[0] == 'Y')
  				break;
  			if (ans[0] == 'n' || ans[0] == 'N')
--- 66,72 ----
  	if (strcmp(temp, new) && verbose) {
  		while (!nogo) {
  			printf("Do you accept \"%s\" as the new filename (y/n) ? ", new);
! 			fgets(ans, 9, stdin);
  			if (ans[0] == 'y' || ans[0] == 'Y')
  				break;
  			if (ans[0] == 'n' || ans[0] == 'N')
diff -c mtools-2.0.7/mwrite.c mtools/mwrite.c
*** mtools-2.0.7/mwrite.c	Thu Sep 10 14:59:48 1992
--- mtools/mwrite.c	Thu Jan 14 15:25:31 1993
***************
*** 177,183 ****
  					/* CONSTCOND */
  					while (1) {
  						printf("File \"%s\" exists, overwrite (y/n) ? ", target);
! 						gets(ans);
  						if (ans[0] == 'n' || ans[0] == 'N') {
  							nogo = 1;
  							break;
--- 177,183 ----
  					/* CONSTCOND */
  					while (1) {
  						printf("File \"%s\" exists, overwrite (y/n) ? ", target);
! 						fgets(ans, 9, stdin);
  						if (ans[0] == 'n' || ans[0] == 'N') {
  							nogo = 1;
  							break;

--
Luke Mewburn			Programmer, Technical Services Group,
Email: <lm@rmit.edu.au>		Department of Computer Science, RMIT