/* * Old Format: * sector 0: LIF volume header (40 bytes) * sector 1: <unused> * sector 2: LIF directory (8 x 32 == 256 bytes) * sector 3-: LIF file 0, LIF file 1, etc. * where sectors are 256 bytes. * * New Format: * sector 0: LIF volume header (40 bytes) * sector 1: <unused> * sector 2: LIF directory (8 x 32 == 256 bytes) * sector 3: <unused> * sector 4-31: disklabel (~300 bytes right now) * sector 32-: LIF file 0, LIF file 1, etc. */ int main(int argc, char **argv) { char *n1, *n2, *n3; int n, to; int count; --argc; ++argv; if (argc == 0) usage(); if (!strcmp(argv[0], "-l")) { argv++; argc--; if (argc == 0) usage(); sscanf(argv[0], "0x%x", &loadpoint); lpflag++; argv++; argc--; } if (!lpflag || argc == 0) usage(); n1 = argv[0]; argv++; argc--; if (argc == 0) usage(); if (argc > 1) { n2 = argv[0]; argv++; argc--; if (argc > 1) { n3 = argv[0]; argv++; argc--; } else n3 = NULL; } else n2 = n3 = NULL; to = open(argv[0], O_WRONLY | O_TRUNC | O_CREAT, 0644); if (to < 0) { perror("open"); exit(1); } /* clear possibly unused directory entries */ strncpy(lifd[1].dir_name, " ", 10); lifd[1].dir_type = htobe16(-1); lifd[1].dir_addr = htobe32(0); lifd[1].dir_length = htobe32(0); lifd[1].dir_flag = htobe16(0xFF); lifd[1].dir_exec = htobe32(0); lifd[7] = lifd[6] = lifd[5] = lifd[4] = lifd[3] = lifd[2] = lifd[1]; /* record volume info */ lifv.vol_id = htobe16(VOL_ID); strncpy(lifv.vol_label, "BOOT43", 6); lifv.vol_addr = htobe32(btolifs(LIF_DIRSTART)); lifv.vol_oct = htobe16(VOL_OCT); lifv.vol_dirsize = htobe32(btolifs(LIF_DIRSIZE)); lifv.vol_version = htobe16(1); /* output bootfile one */ lseek(to, LIF_FILESTART, SEEK_SET); count = putfile(n1, to); n = btolifs(count); strcpy(lifd[0].dir_name, lifname(n1)); lifd[0].dir_type = htobe16(DIR_TYPE); lifd[0].dir_addr = htobe32(btolifs(LIF_FILESTART)); lifd[0].dir_length = htobe32(n); bcddate(n1, lifd[0].dir_toc); lifd[0].dir_flag = htobe16(DIR_FLAG); lifd[0].dir_exec = htobe32(loadpoint); lifv.vol_length = htobe32(be32toh(lifd[0].dir_addr) + be32toh(lifd[0].dir_length)); /* if there is an optional second boot program, output it */ if (n2) { lseek(to, LIF_FILESTART+lifstob(n), SEEK_SET); count = putfile(n2, to); n = btolifs(count); strcpy(lifd[1].dir_name, lifname(n2)); lifd[1].dir_type = htobe16(DIR_TYPE); lifd[1].dir_addr = htobe32(lifv.vol_length); lifd[1].dir_length = htobe32(n); bcddate(n2, lifd[1].dir_toc); lifd[1].dir_flag = htobe16(DIR_FLAG); lifd[1].dir_exec = htobe32(loadpoint); lifv.vol_length = htobe32(be32toh(lifd[1].dir_addr) + be32toh(lifd[1].dir_length)); } /* ditto for three */ if (n3) { lseek(to, LIF_FILESTART+lifstob(lifd[0].dir_length+n), SEEK_SET); count = putfile(n3, to); n = btolifs(count); strcpy(lifd[2].dir_name, lifname(n3)); lifd[2].dir_type = htobe16(DIR_TYPE); lifd[2].dir_addr = htobe32(lifv.vol_length); lifd[2].dir_length = htobe32(n); bcddate(n3, lifd[2].dir_toc); lifd[2].dir_flag = htobe16(DIR_FLAG); lifd[2].dir_exec = htobe32(loadpoint); lifv.vol_length = htobe32(be32toh(lifd[2].dir_addr) + be32toh(lifd[2].dir_length)); } /* output volume/directory header info */ lseek(to, LIF_VOLSTART, SEEK_SET); write(to, &lifv, LIF_VOLSIZE); lseek(to, LIF_DIRSTART, SEEK_SET); write(to, lifd, LIF_DIRSIZE); exit(0); }
/* * Old Format: * sector 0: LIF volume header (40 bytes) * sector 1: <unused> * sector 2: LIF directory (8 x 32 == 256 bytes) * sector 3-: LIF file 0, LIF file 1, etc. * where sectors are 256 bytes. * * New Format: * sector 0: LIF volume header (40 bytes) * sector 1: <unused> * sector 2: LIF directory (8 x 32 == 256 bytes) * sector 3: <unused> * sector 4-31: disklabel (~300 bytes right now) * sector 32-: LIF file 0, LIF file 1, etc. */ int main(int argc, char **argv) { int to, n, pos, c; char buf[HPPA_LIF_FILESTART]; struct hppa_lifvol *lifv = (struct hppa_lifvol *)buf; struct hppa_lifdir *lifd = (struct hppa_lifdir *)(buf + HPPA_LIF_DIRSTART); while ((c = getopt(argc, argv, "vl:")) != -1) { switch (c) { case 'v': verbose++; break; case 'l': sscanf(optarg, "0x%x", &loadpoint); break; default: usage(); } } if (argc - optind < 2) usage(); else if (argc - optind > 8) errx(1, "too many boot programs (max 8 supported)"); to_file = argv[--argc]; if ((to = open(to_file, O_RDWR | O_TRUNC | O_CREAT, 0644)) < 0) err(1, "%s: open", to_file); memset(buf, 0, sizeof(buf)); /* record volume info */ lifv->vol_id = htobe16(HPPA_LIF_VOL_ID); strncpy(lifv->vol_label, "MKBOOT", 6); lifv->vol_addr = htobe32(hppa_btolifs(HPPA_LIF_DIRSTART)); lifv->vol_oct = htobe16(HPPA_LIF_VOL_OCT); lifv->vol_dirsize = htobe32(hppa_btolifs(HPPA_LIF_DIRSIZE)); lifv->vol_version = htobe16(1); lifv->vol_number = htobe32(1); lifv->vol_lastvol = htobe32(1); lifv->vol_length = HPPA_LIF_FILESTART; /* ... so far. */ bcddate(to_file, lifv->vol_toc); lifv->ipl_addr = htobe32(HPPA_LIF_FILESTART); argv += optind; argc -= optind; optind = 0; for (pos = HPPA_LIF_FILESTART; optind < argc; optind++) { /* output bootfile */ if (lseek(to, pos, SEEK_SET) < 0) err(1, "%s: lseek", to_file); lifd[optind].dir_addr = htobe32(hppa_btolifs(pos)); n = hppa_btolifs(putfile(argv[optind], to)); if (lifv->ipl_entry == 0) { lifv->ipl_entry = htobe32(loadpoint + entry); lifv->ipl_size = htobe32(hppa_lifstob(n)); lifd[optind].dir_type = htobe16(HPPA_LIF_DIR_ISL); lifd[optind].dir_implement = 0; } else { lifd[optind].dir_type = htobe16(HPPA_LIF_DIR_TYPE); lifd[optind].dir_implement = htobe32(loadpoint + entry); } memcpy(lifd[optind].dir_name, lifname(argv[optind]), sizeof(lifd[optind].dir_name)); lifd[optind].dir_length = htobe32(n); bcddate(argv[optind], lifd[optind].dir_toc); lifd[optind].dir_flag = htobe16(HPPA_LIF_DIR_FLAG); lifv->vol_length += n; pos += hppa_lifstob(n); } /* terminate the directory */ lifd[optind].dir_type = htobe16(0xffff); /* byte-swap the length now that we're done computing it */ lifv->vol_length = htobe32(lifv->vol_length); /* output volume/directory header info */ if (lseek(to, HPPA_LIF_VOLSTART, SEEK_SET) < 0) err(1, "%s: lseek", to_file); if (write(to, buf, sizeof(buf)) != sizeof(buf)) err(1, "%s: write LIF volume", to_file); lseek(to, 0, SEEK_END); if (close(to) < 0) err(1, "%s", to_file); return(0); }
/* * Old Format: * sector 0: LIF volume header (40 bytes) * sector 1: <unused> * sector 2: LIF directory (8 x 32 == 256 bytes) * sector 3-: LIF file 0, LIF file 1, etc. * where sectors are 256 bytes. * * New Format: * sector 0: LIF volume header (40 bytes) * sector 1: <unused> * sector 2: LIF directory (8 x 32 == 256 bytes) * sector 3: <unused> * sector 4-31: disklabel (~300 bytes right now) * sector 32-: LIF file 0, LIF file 1, etc. */ int main(int argc, char **argv) { int to; register int n, pos, c; char buf[LIF_FILESTART]; struct lifvol *lifv = (struct lifvol *)buf; struct lifdir *lifd = (struct lifdir *)(buf + LIF_DIRSTART); while ((c = getopt(argc, argv, "vl:")) != -1) { switch (c) { case 'v': verbose++; break; case 'l': sscanf(optarg, "0x%x", &loadpoint); break; default: usage(); } } if (argc - optind < 2) usage(); else if (argc - optind > 8) errx(1, "too many boot programs (max 8 supported)"); to_file = argv[--argc]; if ((to = open(to_file, O_RDWR | O_TRUNC | O_CREAT, 0644)) < 0) err(1, "%s: open", to_file); bzero(buf, sizeof(buf)); /* clear possibly unused directory entries */ memset(lifd[1].dir_name, ' ', sizeof lifd[1].dir_name); lifd[1].dir_type = -1; lifd[1].dir_addr = 0; lifd[1].dir_length = 0; lifd[1].dir_flag = 0xFF; lifd[1].dir_implement = 0; lifd[7] = lifd[6] = lifd[5] = lifd[4] = lifd[3] = lifd[2] = lifd[1]; /* record volume info */ lifv->vol_id = htobe16(LIF_VOL_ID); strncpy(lifv->vol_label, "BOOT44", 6); lifv->vol_addr = htobe32(btolifs(LIF_DIRSTART)); lifv->vol_oct = htobe16(LIF_VOL_OCT); lifv->vol_dirsize = htobe32(btolifs(LIF_DIRSIZE)); lifv->vol_version = htobe16(1); lifv->vol_lastvol = lifv->vol_number = htobe16(1); lifv->vol_length = LIF_FILESTART; bcddate(to_file, lifv->vol_toc); lifv->ipl_addr = htobe32(LIF_FILESTART); lifv->ipl_size = 0; lifv->ipl_entry = 0; argv += optind; argc -= optind; optind = 0; for (pos = LIF_FILESTART; optind < argc; optind++) { /* output bootfile */ lseek(to, pos, 0); lifd[optind].dir_addr = htobe32(btolifs(pos)); n = btolifs(putfile(argv[optind], to)); if (lifv->ipl_entry == 0) { lifv->ipl_entry = htobe32(loadpoint + entry); lifv->ipl_size = htobe32(lifstob(n)); lifd[optind].dir_type = htobe16(LIF_DIR_ISL); lifd[optind].dir_implement = 0; } else { lifd[optind].dir_type = htobe16(LIF_DIR_TYPE); lifd[1].dir_implement = htobe32(loadpoint + entry); } strlcpy(lifd[optind].dir_name, lifname(argv[optind]), sizeof lifd[optind].dir_name); lifd[optind].dir_length = htobe32(n); bcddate(argv[optind], lifd[optind].dir_toc); lifd[optind].dir_flag = htobe16(LIF_DIR_FLAG); lifv->vol_length += n; pos += lifstob(n); } lifv->vol_length = htobe32(lifv->vol_length); /* output volume/directory header info */ lseek(to, LIF_VOLSTART, 0); if (write(to, buf, sizeof(buf)) != sizeof(buf)) err(1, "%s: write LIF volume", to_file); lseek(to, 0, SEEK_END); if (close(to) < 0) err(1, "%s", to_file); return(0); }