|
|
1.1 ! root 1: /* ! 2: * Ported to boot 386BSD by Julian Elischer ([email protected]) Sept 1992 ! 3: * ! 4: * Mach Operating System ! 5: * Copyright (c) 1992, 1991 Carnegie Mellon University ! 6: * All Rights Reserved. ! 7: * ! 8: * Permission to use, copy, modify and distribute this software and its ! 9: * documentation is hereby granted, provided that both the copyright ! 10: * notice and this permission notice appear in all copies of the ! 11: * software, derivative works or modified versions, and any portions ! 12: * thereof, and that both notices appear in supporting documentation. ! 13: * ! 14: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 15: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 16: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 17: * ! 18: * Carnegie Mellon requests users of this software to return to ! 19: * ! 20: * Software Distribution Coordinator or [email protected] ! 21: * School of Computer Science ! 22: * Carnegie Mellon University ! 23: * Pittsburgh PA 15213-3890 ! 24: * ! 25: * any improvements or extensions that they make and grant Carnegie Mellon ! 26: * the rights to redistribute these changes. ! 27: */ ! 28: ! 29: /* ! 30: * HISTORY ! 31: * $Log: sys.c,v $ ! 32: * Revision 1.1 1993/03/21 18:08:45 cgd ! 33: * after 0.2.2 "stable" patches applied ! 34: * ! 35: * Revision 2.2 92/04/04 11:36:34 rpd ! 36: * Fabricated from 3.0 bootstrap and scratch. ! 37: * [92/03/30 mg32] ! 38: * ! 39: */ ! 40: ! 41: #include "boot.h" ! 42: #include <sys/dir.h> ! 43: #include <sys/reboot.h> ! 44: ! 45: /* #define BUFSIZE 4096 */ ! 46: #define BUFSIZE MAXBSIZE ! 47: ! 48: char buf[BUFSIZE], fsbuf[SBSIZE], iobuf[MAXBSIZE]; ! 49: ! 50: int xread(addr, size) ! 51: char * addr; ! 52: int size; ! 53: { ! 54: int count = BUFSIZE; ! 55: while (size > 0) { ! 56: if (BUFSIZE > size) ! 57: count = size; ! 58: read(buf, count); ! 59: pcpy(buf, addr, count); ! 60: size -= count; ! 61: addr += count; ! 62: } ! 63: } ! 64: ! 65: read(buffer, count) ! 66: int count; ! 67: char *buffer; ! 68: { ! 69: int logno, off, size; ! 70: int cnt2, bnum2; ! 71: ! 72: while (count) { ! 73: off = blkoff(fs, poff); ! 74: logno = lblkno(fs, poff); ! 75: cnt2 = size = blksize(fs, &inode, logno); ! 76: bnum2 = fsbtodb(fs, block_map(logno)) + boff; ! 77: cnt = cnt2; ! 78: bnum = bnum2; ! 79: if ( (!off) && (size <= count)) ! 80: { ! 81: iodest = buffer; ! 82: devread(); ! 83: } ! 84: else ! 85: { ! 86: iodest = iobuf; ! 87: size -= off; ! 88: if (size > count) ! 89: size = count; ! 90: devread(); ! 91: bcopy(iodest+off,buffer,size); ! 92: } ! 93: buffer += size; ! 94: count -= size; ! 95: poff += size; ! 96: } ! 97: } ! 98: ! 99: find(path) ! 100: char *path; ! 101: { ! 102: char *rest, ch; ! 103: int block, off, loc, ino = ROOTINO; ! 104: struct direct *dp; ! 105: loop: iodest = iobuf; ! 106: cnt = fs->fs_bsize; ! 107: bnum = fsbtodb(fs,itod(fs,ino)) + boff; ! 108: devread(); ! 109: bcopy(&((struct dinode *)iodest)[ino % fs->fs_inopb], ! 110: &inode.i_din, ! 111: sizeof (struct dinode)); ! 112: if (!*path) ! 113: return 1; ! 114: while (*path == '/') ! 115: path++; ! 116: if (!inode.i_size || ((inode.i_mode&IFMT) != IFDIR)) ! 117: return 0; ! 118: for (rest = path; (ch = *rest) && ch != '/'; rest++) ; ! 119: *rest = 0; ! 120: loc = 0; ! 121: do { ! 122: if (loc >= inode.i_size) ! 123: return 0; ! 124: if (!(off = blkoff(fs, loc))) { ! 125: block = lblkno(fs, loc); ! 126: cnt = blksize(fs, &inode, block); ! 127: bnum = fsbtodb(fs, block_map(block)) + boff; ! 128: iodest = iobuf; ! 129: devread(); ! 130: } ! 131: dp = (struct direct *)(iodest + off); ! 132: loc += dp->d_reclen; ! 133: } while (!dp->d_ino || strcmp(path, dp->d_name)); ! 134: ino = dp->d_ino; ! 135: *(path = rest) = ch; ! 136: goto loop; ! 137: } ! 138: ! 139: char mapbuf[MAXBSIZE]; ! 140: int mapblock = 0; ! 141: ! 142: block_map(file_block) ! 143: int file_block; ! 144: { ! 145: if (file_block < NDADDR) ! 146: return(inode.i_db[file_block]); ! 147: if ((bnum=fsbtodb(fs, inode.i_ib[0])+boff) != mapblock) { ! 148: iodest = mapbuf; ! 149: cnt = fs->fs_bsize; ! 150: devread(); ! 151: mapblock = bnum; ! 152: } ! 153: return (((int *)mapbuf)[(file_block - NDADDR) % NINDIR(fs)]); ! 154: } ! 155: ! 156: openrd() ! 157: { ! 158: char **devp, *cp = name; ! 159: /*******************************************************\ ! 160: * If bracket given look for preceding device name * ! 161: \*******************************************************/ ! 162: while (*cp && *cp!='(') ! 163: cp++; ! 164: if (!*cp) ! 165: { ! 166: cp = name; ! 167: } ! 168: else ! 169: { ! 170: if (cp++ != name) ! 171: { ! 172: for (devp = devs; *devp; devp++) ! 173: if (name[0] == (*devp)[0] && ! 174: name[1] == (*devp)[1]) ! 175: break; ! 176: if (!*devp) ! 177: { ! 178: printf("Unknown device\n"); ! 179: return 1; ! 180: } ! 181: maj = devp-devs; ! 182: } ! 183: /*******************************************************\ ! 184: * Look inside brackets for unit number, and partition * ! 185: \*******************************************************/ ! 186: if (*cp >= '0' && *cp <= '9') ! 187: if ((unit = *cp++ - '0') > 1) ! 188: { ! 189: printf("Bad unit\n"); ! 190: return 1; ! 191: } ! 192: if (!*cp || (*cp == ',' && !*++cp)) ! 193: return 1; ! 194: if (*cp >= 'a' && *cp <= 'p') ! 195: part = *cp++ - 'a'; ! 196: while (*cp && *cp++!=')') ; ! 197: if (!*cp) ! 198: return 1; ! 199: } ! 200: switch(maj) ! 201: { ! 202: case 1: ! 203: dosdev = unit | 0x80; ! 204: unit = 0; ! 205: break; ! 206: case 0: ! 207: case 4: ! 208: dosdev = unit | 0x80; ! 209: break; ! 210: case 2: ! 211: dosdev = unit; ! 212: break; ! 213: case 3: ! 214: printf("Wangtek unsupported\n"); ! 215: return 1; ! 216: break; ! 217: } ! 218: inode.i_dev = dosdev; ! 219: /***********************************************\ ! 220: * Now we know the disk unit and part, * ! 221: * Load disk info, (open the device) * ! 222: \***********************************************/ ! 223: if (devopen()) ! 224: return 1; ! 225: ! 226: /***********************************************\ ! 227: * Load Filesystem info (mount the device) * ! 228: \***********************************************/ ! 229: iodest = (char *)(fs = (struct fs *)fsbuf); ! 230: cnt = SBSIZE; ! 231: bnum = SBLOCK + boff; ! 232: devread(); ! 233: /***********************************************\ ! 234: * Find the actual FILE on the mounted device * ! 235: \***********************************************/ ! 236: if (!find(cp)) ! 237: { ! 238: return 1; ! 239: } ! 240: poff = 0; ! 241: name = cp; ! 242: return 0; ! 243: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.