Return to BSD 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 [Zak] zak@rmit.edu.au "Nobody dies on the Discworld, they just become dimensionally disadvantaged." Terry Pratchett in alt.fan.pratchett