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