|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1990 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This product includes software developed by the University of ! 16: * California, Berkeley and its contributors. ! 17: * 4. Neither the name of the University nor the names of its contributors ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 31: * SUCH DAMAGE. ! 32: * ! 33: * @(#)mkboot.c 7.2 (Berkeley) 12/16/90 ! 34: */ ! 35: ! 36: #ifndef lint ! 37: char copyright[] = ! 38: "@(#) Copyright (c) 1990 The Regents of the University of California.\n\ ! 39: All rights reserved.\n"; ! 40: #endif /* not lint */ ! 41: ! 42: #ifndef lint ! 43: static char sccsid[] = "@(#)mkboot.c 7.2 (Berkeley) 12/16/90"; ! 44: #endif /* not lint */ ! 45: ! 46: #include "../include/param.h" ! 47: #include "volhdr.h" ! 48: #include <sys/exec.h> ! 49: #include <sys/file.h> ! 50: #include <stdio.h> ! 51: #include <ctype.h> ! 52: ! 53: int lpflag; ! 54: int loadpoint; ! 55: struct load ld; ! 56: struct lifvol lifv; ! 57: struct lifdir lifd[8]; ! 58: struct exec ex; ! 59: char buf[10240]; ! 60: ! 61: main(argc, argv) ! 62: char **argv; ! 63: { ! 64: int ac; ! 65: char **av; ! 66: int from1, from2, to; ! 67: register int n; ! 68: char *n1, *n2, *lifname(); ! 69: ! 70: ac = --argc; ! 71: av = ++argv; ! 72: if (ac == 0) ! 73: usage(); ! 74: if (!strcmp(av[0], "-l")) { ! 75: av++; ! 76: ac--; ! 77: if (ac == 0) ! 78: usage(); ! 79: sscanf(av[0], "0x%x", &loadpoint); ! 80: lpflag++; ! 81: av++; ! 82: ac--; ! 83: } ! 84: if (ac == 0) ! 85: usage(); ! 86: from1 = open(av[0], O_RDONLY, 0); ! 87: if (from1 < 0) { ! 88: perror("open"); ! 89: exit(1); ! 90: } ! 91: n1 = av[0]; ! 92: av++; ! 93: ac--; ! 94: if (ac == 0) ! 95: usage(); ! 96: if (ac == 2) { ! 97: from2 = open(av[0], O_RDONLY, 0); ! 98: if (from2 < 0) { ! 99: perror("open"); ! 100: exit(1); ! 101: } ! 102: n2 = av[0]; ! 103: av++; ! 104: ac--; ! 105: } else ! 106: from2 = -1; ! 107: to = open(av[0], O_WRONLY | O_TRUNC | O_CREAT, 0644); ! 108: if (to < 0) { ! 109: perror("open"); ! 110: exit(1); ! 111: } ! 112: /* clear possibly unused directory entries */ ! 113: strncpy(lifd[1].dir_name, " ", 10); ! 114: lifd[1].dir_type = -1; ! 115: lifd[1].dir_addr = 0; ! 116: lifd[1].dir_length = 0; ! 117: lifd[1].dir_flag = 0xFF; ! 118: lifd[1].dir_exec = 0; ! 119: lifd[7] = lifd[6] = lifd[5] = lifd[4] = lifd[3] = lifd[2] = lifd[1]; ! 120: /* record volume info */ ! 121: lifv.vol_id = VOL_ID; ! 122: strncpy(lifv.vol_label, "BOOT43", 6); ! 123: lifv.vol_addr = 2; ! 124: lifv.vol_oct = VOL_OCT; ! 125: lifv.vol_dirsize = 1; ! 126: lifv.vol_version = 1; ! 127: /* output bootfile one */ ! 128: lseek(to, 3 * SECTSIZE, 0); ! 129: putfile(from1, to); ! 130: n = (ld.count + sizeof(ld) + (SECTSIZE - 1)) / SECTSIZE; ! 131: strcpy(lifd[0].dir_name, lifname(n1)); ! 132: lifd[0].dir_type = DIR_TYPE; ! 133: lifd[0].dir_addr = 3; ! 134: lifd[0].dir_length = n; ! 135: lifd[0].dir_flag = DIR_FLAG; ! 136: lifd[0].dir_exec = lpflag? loadpoint + ex.a_entry : ex.a_entry; ! 137: lifv.vol_length = lifd[0].dir_addr + lifd[0].dir_length; ! 138: /* if there is an optional second boot program, output it */ ! 139: if (from2 >= 0) { ! 140: lseek(to, (3 + n) * SECTSIZE, 0); ! 141: putfile(from2, to); ! 142: n = (ld.count + sizeof(ld) + (SECTSIZE - 1)) / SECTSIZE; ! 143: strcpy(lifd[1].dir_name, lifname(n2)); ! 144: lifd[1].dir_type = DIR_TYPE; ! 145: lifd[1].dir_addr = 3 + lifd[0].dir_length; ! 146: lifd[1].dir_length = n; ! 147: lifd[1].dir_flag = DIR_FLAG; ! 148: lifd[1].dir_exec = lpflag? loadpoint + ex.a_entry : ex.a_entry; ! 149: lifv.vol_length = lifd[1].dir_addr + lifd[1].dir_length; ! 150: } ! 151: /* output volume/directory header info */ ! 152: lseek(to, 0 * SECTSIZE, 0); ! 153: write(to, &lifv, sizeof(lifv)); ! 154: lseek(to, 2 * SECTSIZE, 0); ! 155: write(to, lifd, sizeof(lifd)); ! 156: exit(0); ! 157: } ! 158: ! 159: putfile(from, to) ! 160: { ! 161: register int n, tcnt, dcnt; ! 162: ! 163: n = read(from, &ex, sizeof(ex)); ! 164: if (n != sizeof(ex)) { ! 165: fprintf(stderr, "error reading file header\n"); ! 166: exit(1); ! 167: } ! 168: if (ex.a_magic == OMAGIC) { ! 169: tcnt = ex.a_text; ! 170: dcnt = ex.a_data; ! 171: } ! 172: else if (ex.a_magic == NMAGIC) { ! 173: tcnt = (ex.a_text + PGOFSET) & ~PGOFSET; ! 174: dcnt = ex.a_data; ! 175: } ! 176: else { ! 177: fprintf(stderr, "bad magic number\n"); ! 178: exit(1); ! 179: } ! 180: ld.address = lpflag ? loadpoint : ex.a_entry; ! 181: ld.count = tcnt + dcnt; ! 182: write(to, &ld, sizeof(ld)); ! 183: while (tcnt) { ! 184: n = sizeof(buf); ! 185: if (n > tcnt) ! 186: n = tcnt; ! 187: n = read(from, buf, n); ! 188: if (n < 0) { ! 189: perror("read"); ! 190: exit(1); ! 191: } ! 192: if (n == 0) { ! 193: fprintf(stderr, "short read\n"); ! 194: exit(1); ! 195: } ! 196: if (write(to, buf, n) < 0) { ! 197: perror("write"); ! 198: exit(1); ! 199: } ! 200: tcnt -= n; ! 201: } ! 202: while (dcnt) { ! 203: n = sizeof(buf); ! 204: if (n > dcnt) ! 205: n = dcnt; ! 206: n = read(from, buf, n); ! 207: if (n < 0) { ! 208: perror("read"); ! 209: exit(1); ! 210: } ! 211: if (n == 0) { ! 212: fprintf(stderr, "short read\n"); ! 213: exit(1); ! 214: } ! 215: if (write(to, buf, n) < 0) { ! 216: perror("write"); ! 217: exit(1); ! 218: } ! 219: dcnt -= n; ! 220: } ! 221: } ! 222: ! 223: usage() ! 224: { ! 225: fprintf(stderr, ! 226: "usage: mkboot [-l loadpoint] prog1 [ prog2 ] outfile\n"); ! 227: exit(1); ! 228: } ! 229: ! 230: char * ! 231: lifname(str) ! 232: char *str; ! 233: { ! 234: static char lname[10] = "SYS_XXXXX"; ! 235: register int i; ! 236: ! 237: for (i = 4; i < 9; i++) { ! 238: if (islower(*str)) ! 239: lname[i] = toupper(*str); ! 240: else if (isalnum(*str) || *str == '_') ! 241: lname[i] = *str; ! 242: else ! 243: break; ! 244: str++; ! 245: } ! 246: for ( ; i < 10; i++) ! 247: lname[i] = '\0'; ! 248: return(lname); ! 249: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.