diff options
-rw-r--r-- | lib/libdisk/disk.c | 57 | ||||
-rw-r--r-- | lib/libdisk/libdisk.h | 13 | ||||
-rw-r--r-- | lib/libdisk/write_disk.c | 7 | ||||
-rw-r--r-- | release/sysinstall/Makefile | 6 | ||||
-rw-r--r-- | release/sysinstall/disks.c | 132 | ||||
-rw-r--r-- | release/sysinstall/menus.c | 2 | ||||
-rw-r--r-- | usr.sbin/sade/Makefile | 6 | ||||
-rw-r--r-- | usr.sbin/sade/disks.c | 132 | ||||
-rw-r--r-- | usr.sbin/sade/menus.c | 2 | ||||
-rw-r--r-- | usr.sbin/sysinstall/Makefile | 6 | ||||
-rw-r--r-- | usr.sbin/sysinstall/disks.c | 132 | ||||
-rw-r--r-- | usr.sbin/sysinstall/menus.c | 2 |
12 files changed, 435 insertions, 62 deletions
diff --git a/lib/libdisk/disk.c b/lib/libdisk/disk.c index 9a35d45..83617ad 100644 --- a/lib/libdisk/disk.c +++ b/lib/libdisk/disk.c @@ -378,7 +378,10 @@ Debug_Disk(struct disk *d) printf(" bios_geom=%lu/%lu/%lu = %lu\n", d->bios_cyl,d->bios_hd,d->bios_sect, d->bios_cyl*d->bios_hd*d->bios_sect); -#if defined(__i386__) +#if defined(PC98) + printf(" boot1=%p, boot2=%p, bootipl=%p, bootmenu=%p\n", + d->boot1,d->boot2,d->bootipl,d->bootmenu); +#elif defined(__i386__) printf(" boot1=%p, boot2=%p, bootmgr=%p\n", d->boot1,d->boot2,d->bootmgr); #elif defined(__alpha__) @@ -393,7 +396,12 @@ Free_Disk(struct disk *d) { if(d->chunks) Free_Chunk(d->chunks); if(d->name) free(d->name); +#ifdef PC98 + if(d->bootipl) free(d->bootipl); + if(d->bootmenu) free(d->bootmenu); +#else if(d->bootmgr) free(d->bootmgr); +#endif if(d->boot1) free(d->boot1); #if defined(__i386__) if(d->boot2) free(d->boot2); @@ -411,10 +419,21 @@ Clone_Disk(struct disk *d) *d2 = *d; d2->name = strdup(d2->name); d2->chunks = Clone_Chunk(d2->chunks); +#ifdef PC98 + if(d2->bootipl) { + d2->bootipl = malloc(d2->bootipl_size); + memcpy(d2->bootipl,d->bootipl,d2->bootipl_size); + } + if(d2->bootmenu) { + d2->bootmenu = malloc(d2->bootmenu_size); + memcpy(d2->bootmenu,d->bootmenu,d2->bootmenu_size); + } +#else if(d2->bootmgr) { d2->bootmgr = malloc(d2->bootmgr_size); memcpy(d2->bootmgr,d->bootmgr,d2->bootmgr_size); } +#endif #if defined(__i386__) if(d2->boot1) { d2->boot1 = malloc(512); @@ -505,10 +524,44 @@ Disk_Names() return disks; } +#ifdef PC98 +void +Set_Boot_Mgr(struct disk *d, const u_char *bootipl, const size_t bootipl_size, + const u_char *bootmenu, const size_t bootmenu_size) +#else void Set_Boot_Mgr(struct disk *d, const u_char *b, const size_t s) +#endif { -#ifndef PC98 +#ifdef PC98 + /* XXX - assumes sector size of 512 */ + if (bootipl_size % 512 != 0) + return; + if (d->bootipl) + free(d->bootipl); + if (!bootipl) { + d->bootipl = NULL; + } else { + d->bootipl_size = bootipl_size; + d->bootipl = malloc(bootipl_size); + if(!d->bootipl) err(1,"malloc failed"); + memcpy(d->bootipl,bootipl,bootipl_size); + } + + /* XXX - assumes sector size of 512 */ + if (bootmenu_size % 512 != 0) + return; + if (d->bootmenu) + free(d->bootmenu); + if (!bootmenu) { + d->bootmenu = NULL; + } else { + d->bootmenu_size = bootmenu_size; + d->bootmenu = malloc(bootmenu_size); + if(!d->bootmenu) err(1,"malloc failed"); + memcpy(d->bootmenu,bootmenu,bootmenu_size); + } +#else /* XXX - assumes sector size of 512 */ if (s % 512 != 0) return; diff --git a/lib/libdisk/libdisk.h b/lib/libdisk/libdisk.h index bfc3c72..34646dd 100644 --- a/lib/libdisk/libdisk.h +++ b/lib/libdisk/libdisk.h @@ -31,8 +31,15 @@ struct disk { u_long bios_cyl; u_long bios_hd; u_long bios_sect; +#ifdef PC98 + u_char *bootipl; + size_t bootipl_size; + u_char *bootmenu; + size_t bootmenu_size; +#else u_char *bootmgr; size_t bootmgr_size; +#endif u_char *boot1; #if defined(__i386__) /* the alpha only has one boot program */ u_char *boot2; @@ -163,8 +170,14 @@ Disk_Names(); * each pointer, as well as the array by hand */ +#ifdef PC98 +void +Set_Boot_Mgr(struct disk *d, const u_char *bootipl, const size_t bootipl_size, + const u_char *bootmenu, const size_t bootmenu_size); +#else void Set_Boot_Mgr(struct disk *d, const u_char *bootmgr, const size_t bootmgr_size); +#endif /* Use this boot-manager on this disk. Gets written when Write_Disk() * is called */ diff --git a/lib/libdisk/write_disk.c b/lib/libdisk/write_disk.c index 83c17b1..54025b2 100644 --- a/lib/libdisk/write_disk.c +++ b/lib/libdisk/write_disk.c @@ -339,6 +339,9 @@ Write_Disk(struct disk *d1) #endif #ifdef PC98 + if (d1->bootipl) + write_block(fd,WHERE(0,d1),d1->bootipl); + mbr = read_block(fd,WHERE(1,d1)); memcpy(mbr+DOSPARTOFF,dp,sizeof *dp * NDOSPART); /* XXX - for entire FreeBSD(98) */ @@ -348,6 +351,10 @@ Write_Disk(struct disk *d1) PC98_EntireDisk = 1; if (PC98_EntireDisk == 0) write_block(fd,WHERE(1,d1),mbr); + + if (d1->bootmenu) + for (i = 0; i * 512 < d1->bootmenu_size; i++) + write_block(fd,WHERE(2+i,d1),&d1->bootmenu[i * 512]); #else mbr = read_block(fd,WHERE(0,d1)); if (d1->bootmgr) diff --git a/release/sysinstall/Makefile b/release/sysinstall/Makefile index 4195eed..f30ef54 100644 --- a/release/sysinstall/Makefile +++ b/release/sysinstall/Makefile @@ -67,6 +67,12 @@ makedevs.c: Makefile rtermcap keymap.h file2c 'u_char mbr[] = {' '};' < /boot/mbr >> makedevs.tmp echo "size_t mbr_size = sizeof(mbr);" >> makedevs.tmp .endif +.if ${MACHINE} == "pc98" + file2c 'u_char boot0[] = {' '};' < /boot/boot0 >> makedevs.tmp + echo "size_t boot0_size = sizeof(boot0);" >> makedevs.tmp + file2c 'u_char boot05[] = {' '};' < /boot/boot0.5 >> makedevs.tmp + echo "size_t boot05_size = sizeof(boot05);" >> makedevs.tmp +.endif mv makedevs.tmp makedevs.c rtermcap: ${.CURDIR}/rtermcap.c diff --git a/release/sysinstall/disks.c b/release/sysinstall/disks.c index a5c636a..e93ff5a 100644 --- a/release/sysinstall/disks.c +++ b/release/sysinstall/disks.c @@ -163,7 +163,51 @@ print_command_summary() move(0, 0); } -#ifndef PC98 +#ifdef PC98 +static void +getBootMgr(char *dname, u_char **bootipl, size_t *bootipl_size, + u_char **bootmenu, size_t *bootmenu_size) +{ + extern u_char boot0[]; + extern size_t boot0_size; + extern u_char boot05[]; + extern size_t boot05_size; + + char str[80]; + char *cp; + int i = 0; + + cp = variable_get(VAR_BOOTMGR); + if (!cp) { + /* Figure out what kind of MBR the user wants */ + sprintf(str, "Install Boot Manager for drive %s?", dname); + MenuMBRType.title = str; + i = dmenuOpenSimple(&MenuMBRType, FALSE); + } else { + if (!strncmp(cp, "boot", 4)) + BootMgr = 0; + else + BootMgr = 2; + } + if (cp || i) { + switch (BootMgr) { + case 0: + *bootipl = boot0; + *bootipl_size = boot0_size; + *bootmenu = boot05; + *bootmenu_size = boot05_size; + return; + case 2: + default: + break; + } + } + *bootipl = NULL; + *bootipl_size = 0; + *bootmenu = NULL; + *bootmenu_size = 0; +} +#else static void getBootMgr(char *dname, u_char **bootCode, size_t *bootCodeSize) { @@ -236,7 +280,12 @@ diskPartition(Device *dev) int rv, key = 0; Boolean chunking; char *msg = NULL; -#ifndef PC98 +#ifdef PC98 + u_char *bootipl; + size_t bootipl_size; + u_char *bootmenu; + size_t bootmenu_size; +#else u_char *mbrContents; size_t mbrSize; #endif @@ -505,24 +554,41 @@ diskPartition(Device *dev) "from this screen, you should do it from the label editor.\n\n" "Are you absolutely sure you want to do this now?")) { variable_set2(DISK_PARTITIONED, "yes", 0); - -#ifndef PC98 - /* Don't trash the MBR if the first (and therefore only) chunk is marked for a truly dedicated - * disk (i.e., the disklabel starts at sector 0), even in cases where the user has requested - * booteasy or a "standard" MBR -- both would be fatal in this case. + + /* + * Don't trash the MBR if the first (and therefore only) chunk + * is marked for a truly dedicated disk (i.e., the disklabel + * starts at sector 0), even in cases where the user has + * requested booteasy or a "standard" MBR -- both would be + * fatal in this case. */ /* - * Don't offer to update the MBR on this disk if the first "real" chunk looks like - * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. + * Don't offer to update the MBR on this disk if the first + * "real" chunk looks like a FreeBSD "all disk" partition, + * or the disk is entirely FreeBSD. */ - if (((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1))) +#ifdef PC98 + if ((d->chunks->part->type != freebsd) || + (d->chunks->part->offset > 1)) + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + else { + bootipl = NULL; + bootipl_size = 0; + bootmenu = NULL; + bootmenu_size = 0; + } + Set_Boot_Mgr(d, bootipl, bootipl_size, bootmenu, bootmenu_size); +#else + if ((d->chunks->part->type != freebsd) || + (d->chunks->part->offset > 1)) getBootMgr(d->name, &mbrContents, &mbrSize); else { mbrContents = NULL; mbrSize = 0; } Set_Boot_Mgr(d, mbrContents, mbrSize); -#endif /* !PC98 */ +#endif if (DITEM_STATUS(diskPartitionWrite(NULL)) != DITEM_SUCCESS) msgConfirm("Disk partition write returned an error status!"); @@ -549,30 +615,47 @@ diskPartition(Device *dev) case '\033': /* ESC */ case 'Q': chunking = FALSE; -#ifndef PC98 - /* Don't trash the MBR if the first (and therefore only) chunk is marked for a truly dedicated - * disk (i.e., the disklabel starts at sector 0), even in cases where the user has requested + /* + * Don't trash the MBR if the first (and therefore only) chunk + * is marked for a truly dedicated disk (i.e., the disklabel + * starts at sector 0), even in cases where the user has requested * booteasy or a "standard" MBR -- both would be fatal in this case. */ #if 0 if ((d->chunks->part->flags & CHUNK_FORCE_ALL) != CHUNK_FORCE_ALL) { +#ifdef PC98 + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + if (bootipl != NULL && bootmenu != NULL) + Set_Boot_Mgr(d, bootipl, bootipl_size, + bootmenu, bootmenu_size); +#else getBootMgr(d->name, &mbrContents, &mbrSize); if (mbrContents != NULL) Set_Boot_Mgr(d, mbrContents, mbrSize); +#endif } #else /* - * Don't offer to update the MBR on this disk if the first "real" chunk looks like - * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. + * Don't offer to update the MBR on this disk if the first "real" + * chunk looks like a FreeBSD "all disk" partition, or the disk is + * entirely FreeBSD. */ if ((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1)) { +#ifdef PC98 + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + if (bootipl != NULL && bootmenu != NULL) + Set_Boot_Mgr(d, bootipl, bootipl_size, + bootmenu, bootmenu_size); +#else getBootMgr(d->name, &mbrContents, &mbrSize); if (mbrContents != NULL) Set_Boot_Mgr(d, mbrContents, mbrSize); +#endif } #endif -#endif /* !PC98 */ break; case 'Z': @@ -774,7 +857,12 @@ diskPartitionNonInteractive(Device *dev) { char *cp; int i, sz, all_disk = 0; -#ifndef PC98 +#ifdef PC98 + u_char *bootipl; + size_t bootipl_size; + u_char *bootmenu; + size_t bootmenu_size; +#else u_char *mbrContents; size_t mbrSize; #endif @@ -868,12 +956,16 @@ diskPartitionNonInteractive(Device *dev) msgConfirm("`%s' is an invalid value for %s - is config file valid?", cp, VAR_PARTITION); return; } -#ifndef PC98 if (!all_disk) { +#ifdef PC98 + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + Set_Boot_Mgr(d, bootipl, bootipl_size, bootmenu, bootmenu_size); +#else getBootMgr(d->name, &mbrContents, &mbrSize); Set_Boot_Mgr(d, mbrContents, mbrSize); - } #endif + } variable_set2(DISK_PARTITIONED, "yes", 0); } } diff --git a/release/sysinstall/menus.c b/release/sysinstall/menus.c index 6c9b2ed..35958bf 100644 --- a/release/sysinstall/menus.c +++ b/release/sysinstall/menus.c @@ -1209,8 +1209,10 @@ DMenu MenuMBRType = { "drives", { { "BootMgr", "Install the FreeBSD Boot Manager", dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr }, +#ifndef PC98 { "Standard", "Install a standard MBR (no boot manager)", dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, '(', '*', ')', 1 }, +#endif { "None", "Leave the Master Boot Record untouched", dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, '(', '*', ')', 2 }, { NULL } }, diff --git a/usr.sbin/sade/Makefile b/usr.sbin/sade/Makefile index 4195eed..f30ef54 100644 --- a/usr.sbin/sade/Makefile +++ b/usr.sbin/sade/Makefile @@ -67,6 +67,12 @@ makedevs.c: Makefile rtermcap keymap.h file2c 'u_char mbr[] = {' '};' < /boot/mbr >> makedevs.tmp echo "size_t mbr_size = sizeof(mbr);" >> makedevs.tmp .endif +.if ${MACHINE} == "pc98" + file2c 'u_char boot0[] = {' '};' < /boot/boot0 >> makedevs.tmp + echo "size_t boot0_size = sizeof(boot0);" >> makedevs.tmp + file2c 'u_char boot05[] = {' '};' < /boot/boot0.5 >> makedevs.tmp + echo "size_t boot05_size = sizeof(boot05);" >> makedevs.tmp +.endif mv makedevs.tmp makedevs.c rtermcap: ${.CURDIR}/rtermcap.c diff --git a/usr.sbin/sade/disks.c b/usr.sbin/sade/disks.c index a5c636a..e93ff5a 100644 --- a/usr.sbin/sade/disks.c +++ b/usr.sbin/sade/disks.c @@ -163,7 +163,51 @@ print_command_summary() move(0, 0); } -#ifndef PC98 +#ifdef PC98 +static void +getBootMgr(char *dname, u_char **bootipl, size_t *bootipl_size, + u_char **bootmenu, size_t *bootmenu_size) +{ + extern u_char boot0[]; + extern size_t boot0_size; + extern u_char boot05[]; + extern size_t boot05_size; + + char str[80]; + char *cp; + int i = 0; + + cp = variable_get(VAR_BOOTMGR); + if (!cp) { + /* Figure out what kind of MBR the user wants */ + sprintf(str, "Install Boot Manager for drive %s?", dname); + MenuMBRType.title = str; + i = dmenuOpenSimple(&MenuMBRType, FALSE); + } else { + if (!strncmp(cp, "boot", 4)) + BootMgr = 0; + else + BootMgr = 2; + } + if (cp || i) { + switch (BootMgr) { + case 0: + *bootipl = boot0; + *bootipl_size = boot0_size; + *bootmenu = boot05; + *bootmenu_size = boot05_size; + return; + case 2: + default: + break; + } + } + *bootipl = NULL; + *bootipl_size = 0; + *bootmenu = NULL; + *bootmenu_size = 0; +} +#else static void getBootMgr(char *dname, u_char **bootCode, size_t *bootCodeSize) { @@ -236,7 +280,12 @@ diskPartition(Device *dev) int rv, key = 0; Boolean chunking; char *msg = NULL; -#ifndef PC98 +#ifdef PC98 + u_char *bootipl; + size_t bootipl_size; + u_char *bootmenu; + size_t bootmenu_size; +#else u_char *mbrContents; size_t mbrSize; #endif @@ -505,24 +554,41 @@ diskPartition(Device *dev) "from this screen, you should do it from the label editor.\n\n" "Are you absolutely sure you want to do this now?")) { variable_set2(DISK_PARTITIONED, "yes", 0); - -#ifndef PC98 - /* Don't trash the MBR if the first (and therefore only) chunk is marked for a truly dedicated - * disk (i.e., the disklabel starts at sector 0), even in cases where the user has requested - * booteasy or a "standard" MBR -- both would be fatal in this case. + + /* + * Don't trash the MBR if the first (and therefore only) chunk + * is marked for a truly dedicated disk (i.e., the disklabel + * starts at sector 0), even in cases where the user has + * requested booteasy or a "standard" MBR -- both would be + * fatal in this case. */ /* - * Don't offer to update the MBR on this disk if the first "real" chunk looks like - * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. + * Don't offer to update the MBR on this disk if the first + * "real" chunk looks like a FreeBSD "all disk" partition, + * or the disk is entirely FreeBSD. */ - if (((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1))) +#ifdef PC98 + if ((d->chunks->part->type != freebsd) || + (d->chunks->part->offset > 1)) + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + else { + bootipl = NULL; + bootipl_size = 0; + bootmenu = NULL; + bootmenu_size = 0; + } + Set_Boot_Mgr(d, bootipl, bootipl_size, bootmenu, bootmenu_size); +#else + if ((d->chunks->part->type != freebsd) || + (d->chunks->part->offset > 1)) getBootMgr(d->name, &mbrContents, &mbrSize); else { mbrContents = NULL; mbrSize = 0; } Set_Boot_Mgr(d, mbrContents, mbrSize); -#endif /* !PC98 */ +#endif if (DITEM_STATUS(diskPartitionWrite(NULL)) != DITEM_SUCCESS) msgConfirm("Disk partition write returned an error status!"); @@ -549,30 +615,47 @@ diskPartition(Device *dev) case '\033': /* ESC */ case 'Q': chunking = FALSE; -#ifndef PC98 - /* Don't trash the MBR if the first (and therefore only) chunk is marked for a truly dedicated - * disk (i.e., the disklabel starts at sector 0), even in cases where the user has requested + /* + * Don't trash the MBR if the first (and therefore only) chunk + * is marked for a truly dedicated disk (i.e., the disklabel + * starts at sector 0), even in cases where the user has requested * booteasy or a "standard" MBR -- both would be fatal in this case. */ #if 0 if ((d->chunks->part->flags & CHUNK_FORCE_ALL) != CHUNK_FORCE_ALL) { +#ifdef PC98 + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + if (bootipl != NULL && bootmenu != NULL) + Set_Boot_Mgr(d, bootipl, bootipl_size, + bootmenu, bootmenu_size); +#else getBootMgr(d->name, &mbrContents, &mbrSize); if (mbrContents != NULL) Set_Boot_Mgr(d, mbrContents, mbrSize); +#endif } #else /* - * Don't offer to update the MBR on this disk if the first "real" chunk looks like - * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. + * Don't offer to update the MBR on this disk if the first "real" + * chunk looks like a FreeBSD "all disk" partition, or the disk is + * entirely FreeBSD. */ if ((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1)) { +#ifdef PC98 + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + if (bootipl != NULL && bootmenu != NULL) + Set_Boot_Mgr(d, bootipl, bootipl_size, + bootmenu, bootmenu_size); +#else getBootMgr(d->name, &mbrContents, &mbrSize); if (mbrContents != NULL) Set_Boot_Mgr(d, mbrContents, mbrSize); +#endif } #endif -#endif /* !PC98 */ break; case 'Z': @@ -774,7 +857,12 @@ diskPartitionNonInteractive(Device *dev) { char *cp; int i, sz, all_disk = 0; -#ifndef PC98 +#ifdef PC98 + u_char *bootipl; + size_t bootipl_size; + u_char *bootmenu; + size_t bootmenu_size; +#else u_char *mbrContents; size_t mbrSize; #endif @@ -868,12 +956,16 @@ diskPartitionNonInteractive(Device *dev) msgConfirm("`%s' is an invalid value for %s - is config file valid?", cp, VAR_PARTITION); return; } -#ifndef PC98 if (!all_disk) { +#ifdef PC98 + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + Set_Boot_Mgr(d, bootipl, bootipl_size, bootmenu, bootmenu_size); +#else getBootMgr(d->name, &mbrContents, &mbrSize); Set_Boot_Mgr(d, mbrContents, mbrSize); - } #endif + } variable_set2(DISK_PARTITIONED, "yes", 0); } } diff --git a/usr.sbin/sade/menus.c b/usr.sbin/sade/menus.c index 6c9b2ed..35958bf 100644 --- a/usr.sbin/sade/menus.c +++ b/usr.sbin/sade/menus.c @@ -1209,8 +1209,10 @@ DMenu MenuMBRType = { "drives", { { "BootMgr", "Install the FreeBSD Boot Manager", dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr }, +#ifndef PC98 { "Standard", "Install a standard MBR (no boot manager)", dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, '(', '*', ')', 1 }, +#endif { "None", "Leave the Master Boot Record untouched", dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, '(', '*', ')', 2 }, { NULL } }, diff --git a/usr.sbin/sysinstall/Makefile b/usr.sbin/sysinstall/Makefile index 4195eed..f30ef54 100644 --- a/usr.sbin/sysinstall/Makefile +++ b/usr.sbin/sysinstall/Makefile @@ -67,6 +67,12 @@ makedevs.c: Makefile rtermcap keymap.h file2c 'u_char mbr[] = {' '};' < /boot/mbr >> makedevs.tmp echo "size_t mbr_size = sizeof(mbr);" >> makedevs.tmp .endif +.if ${MACHINE} == "pc98" + file2c 'u_char boot0[] = {' '};' < /boot/boot0 >> makedevs.tmp + echo "size_t boot0_size = sizeof(boot0);" >> makedevs.tmp + file2c 'u_char boot05[] = {' '};' < /boot/boot0.5 >> makedevs.tmp + echo "size_t boot05_size = sizeof(boot05);" >> makedevs.tmp +.endif mv makedevs.tmp makedevs.c rtermcap: ${.CURDIR}/rtermcap.c diff --git a/usr.sbin/sysinstall/disks.c b/usr.sbin/sysinstall/disks.c index a5c636a..e93ff5a 100644 --- a/usr.sbin/sysinstall/disks.c +++ b/usr.sbin/sysinstall/disks.c @@ -163,7 +163,51 @@ print_command_summary() move(0, 0); } -#ifndef PC98 +#ifdef PC98 +static void +getBootMgr(char *dname, u_char **bootipl, size_t *bootipl_size, + u_char **bootmenu, size_t *bootmenu_size) +{ + extern u_char boot0[]; + extern size_t boot0_size; + extern u_char boot05[]; + extern size_t boot05_size; + + char str[80]; + char *cp; + int i = 0; + + cp = variable_get(VAR_BOOTMGR); + if (!cp) { + /* Figure out what kind of MBR the user wants */ + sprintf(str, "Install Boot Manager for drive %s?", dname); + MenuMBRType.title = str; + i = dmenuOpenSimple(&MenuMBRType, FALSE); + } else { + if (!strncmp(cp, "boot", 4)) + BootMgr = 0; + else + BootMgr = 2; + } + if (cp || i) { + switch (BootMgr) { + case 0: + *bootipl = boot0; + *bootipl_size = boot0_size; + *bootmenu = boot05; + *bootmenu_size = boot05_size; + return; + case 2: + default: + break; + } + } + *bootipl = NULL; + *bootipl_size = 0; + *bootmenu = NULL; + *bootmenu_size = 0; +} +#else static void getBootMgr(char *dname, u_char **bootCode, size_t *bootCodeSize) { @@ -236,7 +280,12 @@ diskPartition(Device *dev) int rv, key = 0; Boolean chunking; char *msg = NULL; -#ifndef PC98 +#ifdef PC98 + u_char *bootipl; + size_t bootipl_size; + u_char *bootmenu; + size_t bootmenu_size; +#else u_char *mbrContents; size_t mbrSize; #endif @@ -505,24 +554,41 @@ diskPartition(Device *dev) "from this screen, you should do it from the label editor.\n\n" "Are you absolutely sure you want to do this now?")) { variable_set2(DISK_PARTITIONED, "yes", 0); - -#ifndef PC98 - /* Don't trash the MBR if the first (and therefore only) chunk is marked for a truly dedicated - * disk (i.e., the disklabel starts at sector 0), even in cases where the user has requested - * booteasy or a "standard" MBR -- both would be fatal in this case. + + /* + * Don't trash the MBR if the first (and therefore only) chunk + * is marked for a truly dedicated disk (i.e., the disklabel + * starts at sector 0), even in cases where the user has + * requested booteasy or a "standard" MBR -- both would be + * fatal in this case. */ /* - * Don't offer to update the MBR on this disk if the first "real" chunk looks like - * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. + * Don't offer to update the MBR on this disk if the first + * "real" chunk looks like a FreeBSD "all disk" partition, + * or the disk is entirely FreeBSD. */ - if (((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1))) +#ifdef PC98 + if ((d->chunks->part->type != freebsd) || + (d->chunks->part->offset > 1)) + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + else { + bootipl = NULL; + bootipl_size = 0; + bootmenu = NULL; + bootmenu_size = 0; + } + Set_Boot_Mgr(d, bootipl, bootipl_size, bootmenu, bootmenu_size); +#else + if ((d->chunks->part->type != freebsd) || + (d->chunks->part->offset > 1)) getBootMgr(d->name, &mbrContents, &mbrSize); else { mbrContents = NULL; mbrSize = 0; } Set_Boot_Mgr(d, mbrContents, mbrSize); -#endif /* !PC98 */ +#endif if (DITEM_STATUS(diskPartitionWrite(NULL)) != DITEM_SUCCESS) msgConfirm("Disk partition write returned an error status!"); @@ -549,30 +615,47 @@ diskPartition(Device *dev) case '\033': /* ESC */ case 'Q': chunking = FALSE; -#ifndef PC98 - /* Don't trash the MBR if the first (and therefore only) chunk is marked for a truly dedicated - * disk (i.e., the disklabel starts at sector 0), even in cases where the user has requested + /* + * Don't trash the MBR if the first (and therefore only) chunk + * is marked for a truly dedicated disk (i.e., the disklabel + * starts at sector 0), even in cases where the user has requested * booteasy or a "standard" MBR -- both would be fatal in this case. */ #if 0 if ((d->chunks->part->flags & CHUNK_FORCE_ALL) != CHUNK_FORCE_ALL) { +#ifdef PC98 + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + if (bootipl != NULL && bootmenu != NULL) + Set_Boot_Mgr(d, bootipl, bootipl_size, + bootmenu, bootmenu_size); +#else getBootMgr(d->name, &mbrContents, &mbrSize); if (mbrContents != NULL) Set_Boot_Mgr(d, mbrContents, mbrSize); +#endif } #else /* - * Don't offer to update the MBR on this disk if the first "real" chunk looks like - * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. + * Don't offer to update the MBR on this disk if the first "real" + * chunk looks like a FreeBSD "all disk" partition, or the disk is + * entirely FreeBSD. */ if ((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1)) { +#ifdef PC98 + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + if (bootipl != NULL && bootmenu != NULL) + Set_Boot_Mgr(d, bootipl, bootipl_size, + bootmenu, bootmenu_size); +#else getBootMgr(d->name, &mbrContents, &mbrSize); if (mbrContents != NULL) Set_Boot_Mgr(d, mbrContents, mbrSize); +#endif } #endif -#endif /* !PC98 */ break; case 'Z': @@ -774,7 +857,12 @@ diskPartitionNonInteractive(Device *dev) { char *cp; int i, sz, all_disk = 0; -#ifndef PC98 +#ifdef PC98 + u_char *bootipl; + size_t bootipl_size; + u_char *bootmenu; + size_t bootmenu_size; +#else u_char *mbrContents; size_t mbrSize; #endif @@ -868,12 +956,16 @@ diskPartitionNonInteractive(Device *dev) msgConfirm("`%s' is an invalid value for %s - is config file valid?", cp, VAR_PARTITION); return; } -#ifndef PC98 if (!all_disk) { +#ifdef PC98 + getBootMgr(d->name, &bootipl, &bootipl_size, + &bootmenu, &bootmenu_size); + Set_Boot_Mgr(d, bootipl, bootipl_size, bootmenu, bootmenu_size); +#else getBootMgr(d->name, &mbrContents, &mbrSize); Set_Boot_Mgr(d, mbrContents, mbrSize); - } #endif + } variable_set2(DISK_PARTITIONED, "yes", 0); } } diff --git a/usr.sbin/sysinstall/menus.c b/usr.sbin/sysinstall/menus.c index 6c9b2ed..35958bf 100644 --- a/usr.sbin/sysinstall/menus.c +++ b/usr.sbin/sysinstall/menus.c @@ -1209,8 +1209,10 @@ DMenu MenuMBRType = { "drives", { { "BootMgr", "Install the FreeBSD Boot Manager", dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr }, +#ifndef PC98 { "Standard", "Install a standard MBR (no boot manager)", dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, '(', '*', ')', 1 }, +#endif { "None", "Leave the Master Boot Record untouched", dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, '(', '*', ')', 2 }, { NULL } }, |