diff options
author | phk <phk@FreeBSD.org> | 2003-01-26 14:35:53 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2003-01-26 14:35:53 +0000 |
commit | 4865a58cd6760c2a3695e5f7b6b7bf42560ced68 (patch) | |
tree | 05ca104856c345004ad578237dae21946338473c | |
parent | f48c20899ab581d93853c6e18cb43080f58facda (diff) | |
download | FreeBSD-src-4865a58cd6760c2a3695e5f7b6b7bf42560ced68.zip FreeBSD-src-4865a58cd6760c2a3695e5f7b6b7bf42560ced68.tar.gz |
Drop the silly notion that i386 has two bootstrap files now that sys/boot
creates a single file named just "boot".
Apart from the fact that the option "-s" is now gone and that "-b" should
be pointed at /boot/boot instead of /boot/boot1, this patch should be
a no-op.
-rw-r--r-- | sbin/bsdlabel/bsdlabel.8 | 36 | ||||
-rw-r--r-- | sbin/bsdlabel/bsdlabel.c | 162 | ||||
-rw-r--r-- | sbin/disklabel/disklabel.8 | 36 | ||||
-rw-r--r-- | sbin/disklabel/disklabel.c | 162 |
4 files changed, 70 insertions, 326 deletions
diff --git a/sbin/bsdlabel/bsdlabel.8 b/sbin/bsdlabel/bsdlabel.8 index b3df66e..ab18c6f 100644 --- a/sbin/bsdlabel/bsdlabel.8 +++ b/sbin/bsdlabel/bsdlabel.8 @@ -65,8 +65,7 @@ .Nm .Fl B .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk .Oo Ar disktype/auto Oc @@ -75,8 +74,7 @@ .Fl B .Op Fl n .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk Ar disktype/auto .Oo Ar packid Oc @@ -85,8 +83,7 @@ .Fl B .Op Fl n .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk Ar protofile .Oo Ar disktype/auto Oc @@ -330,8 +327,7 @@ bootblocks in the slice. .Nm .Fl B .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk .Oo Ar disktype Oc @@ -349,8 +345,7 @@ This command is typically run on a slice such as .Fl B .Op Fl n .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk Ar disktype .Oo Ar packid Oc @@ -372,8 +367,7 @@ disklabel that would have been written will be printed to stdout. .Fl B .Op Fl n .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk Ar protofile .Oo Ar disktype Oc @@ -423,12 +417,8 @@ parameters of the .Xr disktab 5 entry for the disk if the disktab entry exists and includes those parameters. .It -Otherwise, the default boot image names are used: -.Pa /boot/boot1 -and -.Pa /boot/boot2 -for the standard stage1 and stage2 boot images (details may vary -on architectures like the Alpha, where only a single-stage boot is used). +Otherwise, the default boot image name are used: +.Pa /boot/boot . .El .Ss Initializing/Formatting a bootable disk from scratch .Pp @@ -743,21 +733,17 @@ partition sizes. Install a new bootstrap on .Pa da0s1 . The boot code comes from -.Pa /boot/boot1 -and possibly -.Pa /boot/boot2 . +.Pa /boot/boot . On-disk and in-core labels are unchanged. .Pp -.Dl disklabel -w -B /dev/da0s1 -b newboot1 -s newboot2 da2212 +.Dl disklabel -w -B /dev/da0s1 -b newboot da2212 .Pp Install a new label and bootstrap. The label is derived from disktab information for .Dq da2212 and installed both in-core and on-disk. The bootstrap code comes from the files -.Pa /boot/newboot1 -and -.Pa /boot/newboot2 . +.Pa /boot/newboot .Pp .Dl dd if=/dev/zero of=/dev/da0 bs=512 count=32 .Dl fdisk -BI da0 diff --git a/sbin/bsdlabel/bsdlabel.c b/sbin/bsdlabel/bsdlabel.c index 3805834..b9a8eaa 100644 --- a/sbin/bsdlabel/bsdlabel.c +++ b/sbin/bsdlabel/bsdlabel.c @@ -105,9 +105,7 @@ __FBSDID("$FreeBSD$"); #define BIG_NEWFS_CPG 64U #if defined(__i386__) -#define NUMBOOT 2 #elif defined(__alpha__) -#define NUMBOOT 1 #else #error I do not know about this architecture, and shall probably not be compiled for it. #endif @@ -125,7 +123,6 @@ char *word(char *); int getasciilabel(FILE *, struct disklabel *); int getasciipartspec(char *, struct disklabel *, int, int); int checklabel(struct disklabel *); -void setbootflag(struct disklabel *); void Warning(const char *, ...) __printflike(1, 2); void usage(void); struct disklabel *getvirginlabel(void); @@ -150,12 +147,8 @@ char part_offset_type[MAX_NUM_PARTS]; int part_set[MAX_NUM_PARTS]; int installboot; /* non-zero if we should install a boot program */ -char *bootbuf; /* pointer to buffer with remainder of boot prog */ -int bootsize; /* size of remaining boot program */ char *xxboot; /* primary boot */ -char *bootxx; /* secondary boot */ char boot0[MAXPATHLEN]; -char boot1[MAXPATHLEN]; enum { UNSPEC, EDIT, READ, RESTORE, WRITE, WRITEBOOT @@ -182,11 +175,6 @@ main(int argc, char *argv[]) case 'b': xxboot = optarg; break; -#if NUMBOOT > 1 - case 's': - bootxx = optarg; - break; -#endif case 'n': disable_write = 1; break; @@ -221,7 +209,7 @@ main(int argc, char *argv[]) } else { if (op == UNSPEC) op = READ; - xxboot = bootxx = 0; + xxboot = 0; } if (argc < 1) usage(); @@ -354,7 +342,6 @@ writelabel(int f, const char *boot, struct disklabel *lp) return (0); } - setbootflag(lp); lp->d_magic = DISKMAGIC; lp->d_magic2 = DISKMAGIC; lp->d_checksum = 0; @@ -394,13 +381,6 @@ writelabel(int f, const char *boot, struct disklabel *lp) warn("write"); return (1); } - /* - * Output the remainder of the disklabel - */ - if (bootbuf && write(f, bootbuf, bootsize) != bootsize) { - warn("write"); - return(1); - } return (0); } @@ -483,7 +463,7 @@ makebootarea(char *boot, struct disklabel *dp, int f) #endif #ifdef __i386__ char *tmpbuf; - int i, found; + int i, found, dps; #endif /* XXX */ @@ -511,7 +491,7 @@ makebootarea(char *boot, struct disklabel *dp, int f) * We are installing a boot program. Determine the name(s) and * read them into the appropriate places in the boot area. */ - if (!xxboot || !bootxx) { + if (!xxboot) { dkbasename = np; if ((p = rindex(dkname, '/')) == NULL) p = dkname; @@ -522,36 +502,22 @@ makebootarea(char *boot, struct disklabel *dp, int f) *np++ = '\0'; if (!xxboot) { - (void)sprintf(boot0, "%s/boot1", _PATH_BOOTDIR); + (void)sprintf(boot0, "%s/boot", _PATH_BOOTDIR); xxboot = boot0; } -#if NUMBOOT > 1 - if (!bootxx) { - (void)sprintf(boot1, "%s/boot2", _PATH_BOOTDIR); - bootxx = boot1; - } -#endif } - /* - * Strange rules: - * 1. One-piece bootstrap (hp300/hp800) - * 1. One-piece bootstrap (alpha) - * up to d_bbsize bytes of ``xxboot'' go in bootarea, the rest - * is remembered and written later following the bootarea. - * 2. Two-piece bootstraps (i386) - * up to d_secsize bytes of ``xxboot'' go in first d_secsize - * bytes of bootarea, remaining d_bbsize-d_secsize filled - * from ``bootxx''. - */ b = open(xxboot, O_RDONLY); if (b < 0) err(4, "%s", xxboot); -#if NUMBOOT > 1 + if (fstat(b, &sb) != 0) + err(4, "%s", xxboot); #ifdef __i386__ + if (sb.st_size > BBSIZE) + errx(4, "%s too large", xxboot); /* * XXX Botch alert. - * The i386 has the so-called fdisk table embedded into the + * The i386/PC98 has the so-called fdisk table embedded into the * primary bootstrap. We take care to not clobber it, but * only if it does already contain some data. (Otherwise, * the xxboot provides a template.) @@ -559,75 +525,45 @@ makebootarea(char *boot, struct disklabel *dp, int f) if ((tmpbuf = (char *)malloc((int)dp->d_secsize)) == 0) err(4, "%s", xxboot); memcpy((void *)tmpbuf, (void *)boot, (int)dp->d_secsize); -#endif /* __i386__ */ - if (read(b, boot, (int)dp->d_secsize) < 0) + + if (read(b, boot, BBSIZE) < 0) err(4, "%s", xxboot); - (void)close(b); + + /* XXX: rely on some very precise overlaps in definitions */ #ifdef PC98 + dps = sizeof(struct pc98_partition); +#else + dps = sizeof(struct dos_partition); +#endif for (i = DOSPARTOFF, found = 0; - !found && i < (int)(DOSPARTOFF + NDOSPART * sizeof(struct pc98_partition)); - i++) - found = tmpbuf[i] != 0; - if (found) - memcpy((void *)&boot[DOSPARTOFF], - (void *)&tmpbuf[DOSPARTOFF], - NDOSPART * sizeof(struct pc98_partition)); - free(tmpbuf); -#elif defined(__i386__) - for (i = DOSPARTOFF, found = 0; - !found && i < (int)(DOSPARTOFF + NDOSPART*sizeof(struct dos_partition)); + !found && i < (int)(DOSPARTOFF + NDOSPART * dps); i++) found = tmpbuf[i] != 0; if (found) memcpy((void *)&boot[DOSPARTOFF], (void *)&tmpbuf[DOSPARTOFF], - NDOSPART * sizeof(struct dos_partition)); + NDOSPART * dps); free(tmpbuf); #endif /* __i386__ */ - b = open(bootxx, O_RDONLY); - if (b < 0) - err(4, "%s", bootxx); - if (fstat(b, &sb) != 0) - err(4, "%s", bootxx); - if (dp->d_secsize + sb.st_size > dp->d_bbsize) - errx(4, "%s too large", bootxx); - if (read(b, &boot[dp->d_secsize], - (int)(dp->d_bbsize-dp->d_secsize)) < 0) - err(4, "%s", bootxx); -#else /* !(NUMBOOT > 1) */ + #ifdef __alpha__ + if (sb.st_size > BBSIZE - dp->d_secsize) + errx(4, "%s too large", xxboot); /* * On the alpha, the primary bootstrap starts at the * second sector of the boot area. The first sector * contains the label and must be edited to contain the * size and location of the primary bootstrap. */ - n = read(b, boot + dp->d_secsize, (int)dp->d_bbsize); + n = read(b, boot + dp->d_secsize, BBSIZE - dp->d_secsize); if (n < 0) err(4, "%s", xxboot); bootinfo = (u_long *)(boot + 480); bootinfo[0] = (n + dp->d_secsize - 1) / dp->d_secsize; bootinfo[1] = 1; /* start at sector 1 */ bootinfo[2] = 0; /* flags (must be zero) */ -#else /* !__alpha__ */ - if (read(b, boot, (int)dp->d_bbsize) < 0) - err(4, "%s", xxboot); #endif /* __alpha__ */ - if (fstat(b, &sb) != 0) - err(4, "%s", xxboot); - bootsize = (int)sb.st_size - dp->d_bbsize; - if (bootsize > 0) { - /* XXX assume d_secsize is a power of two */ - bootsize = (bootsize + dp->d_secsize-1) & ~(dp->d_secsize-1); - bootbuf = (char *)malloc((size_t)bootsize); - if (bootbuf == 0) - err(4, "%s", xxboot); - if (read(b, bootbuf, bootsize) < 0) { - free(bootbuf); - err(4, "%s", xxboot); - } - } -#endif /* NUMBOOT > 1 */ + (void)close(b); /* * Make sure no part of the bootstrap is written in the area @@ -1549,47 +1485,6 @@ getvirginlabel(void) return (&loclab); } -/* - * If we are installing a boot program that doesn't fit in d_bbsize - * we need to mark those partitions that the boot overflows into. - * This allows newfs to prevent creation of a file system where it might - * clobber bootstrap code. - */ -void -setbootflag(struct disklabel *lp) -{ - struct partition *pp; - int i, errors = 0; - char part; - u_long boffset; - - if (bootbuf == 0) - return; - boffset = bootsize / lp->d_secsize; - for (i = 0; i < lp->d_npartitions; i++) { - part = 'a' + i; - pp = &lp->d_partitions[i]; - if (pp->p_size == 0) - continue; - if (boffset <= pp->p_offset) { - if (pp->p_fstype == FS_BOOT) - pp->p_fstype = FS_UNUSED; - } else if (pp->p_fstype != FS_BOOT) { - if (pp->p_fstype != FS_UNUSED) { - fprintf(stderr, - "boot overlaps used partition %c\n", - part); - errors++; - } else { - pp->p_fstype = FS_BOOT; - Warning("boot overlaps partition %c, %s", - part, "marked as FS_BOOT"); - } - } - } - if (errors) - errx(4, "cannot install boot program"); -} /*VARARGS1*/ void @@ -1616,21 +1511,12 @@ usage(void) "\t\t(to edit label)", " disklabel -R [-r] [-n] disk protofile", "\t\t(to restore label with existing boot program)", -#if NUMBOOT > 1 - " disklabel -B [-n] [ -b boot1 [ -s boot2 ] ] disk [ type ]", - "\t\t(to install boot program with existing label)", - " disklabel -w -B [-n] [ -b boot1 [ -s boot2 ] ] disk type [ packid ]", - "\t\t(to write label and boot program)", - " disklabel -R -B [-n] [ -b boot1 [ -s boot2 ] ] disk protofile [ type ]", - "\t\t(to restore label and boot program)" -#else " disklabel -B [-n] [ -b bootprog ] disk [ type ]", "\t\t(to install boot program with existing on-disk label)", " disklabel -w -B [-n] [ -b bootprog ] disk type [ packid ]", "\t\t(to write label and install boot program)", " disklabel -R -B [-n] [ -b bootprog ] disk protofile [ type ]", "\t\t(to restore label and install boot program)" -#endif ); exit(1); } diff --git a/sbin/disklabel/disklabel.8 b/sbin/disklabel/disklabel.8 index b3df66e..ab18c6f 100644 --- a/sbin/disklabel/disklabel.8 +++ b/sbin/disklabel/disklabel.8 @@ -65,8 +65,7 @@ .Nm .Fl B .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk .Oo Ar disktype/auto Oc @@ -75,8 +74,7 @@ .Fl B .Op Fl n .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk Ar disktype/auto .Oo Ar packid Oc @@ -85,8 +83,7 @@ .Fl B .Op Fl n .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk Ar protofile .Oo Ar disktype/auto Oc @@ -330,8 +327,7 @@ bootblocks in the slice. .Nm .Fl B .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk .Oo Ar disktype Oc @@ -349,8 +345,7 @@ This command is typically run on a slice such as .Fl B .Op Fl n .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk Ar disktype .Oo Ar packid Oc @@ -372,8 +367,7 @@ disklabel that would have been written will be printed to stdout. .Fl B .Op Fl n .Oo -.Fl b Ar boot1 -.Fl s Ar boot2 +.Fl b Ar boot .Oc .Ar disk Ar protofile .Oo Ar disktype Oc @@ -423,12 +417,8 @@ parameters of the .Xr disktab 5 entry for the disk if the disktab entry exists and includes those parameters. .It -Otherwise, the default boot image names are used: -.Pa /boot/boot1 -and -.Pa /boot/boot2 -for the standard stage1 and stage2 boot images (details may vary -on architectures like the Alpha, where only a single-stage boot is used). +Otherwise, the default boot image name are used: +.Pa /boot/boot . .El .Ss Initializing/Formatting a bootable disk from scratch .Pp @@ -743,21 +733,17 @@ partition sizes. Install a new bootstrap on .Pa da0s1 . The boot code comes from -.Pa /boot/boot1 -and possibly -.Pa /boot/boot2 . +.Pa /boot/boot . On-disk and in-core labels are unchanged. .Pp -.Dl disklabel -w -B /dev/da0s1 -b newboot1 -s newboot2 da2212 +.Dl disklabel -w -B /dev/da0s1 -b newboot da2212 .Pp Install a new label and bootstrap. The label is derived from disktab information for .Dq da2212 and installed both in-core and on-disk. The bootstrap code comes from the files -.Pa /boot/newboot1 -and -.Pa /boot/newboot2 . +.Pa /boot/newboot .Pp .Dl dd if=/dev/zero of=/dev/da0 bs=512 count=32 .Dl fdisk -BI da0 diff --git a/sbin/disklabel/disklabel.c b/sbin/disklabel/disklabel.c index 3805834..b9a8eaa 100644 --- a/sbin/disklabel/disklabel.c +++ b/sbin/disklabel/disklabel.c @@ -105,9 +105,7 @@ __FBSDID("$FreeBSD$"); #define BIG_NEWFS_CPG 64U #if defined(__i386__) -#define NUMBOOT 2 #elif defined(__alpha__) -#define NUMBOOT 1 #else #error I do not know about this architecture, and shall probably not be compiled for it. #endif @@ -125,7 +123,6 @@ char *word(char *); int getasciilabel(FILE *, struct disklabel *); int getasciipartspec(char *, struct disklabel *, int, int); int checklabel(struct disklabel *); -void setbootflag(struct disklabel *); void Warning(const char *, ...) __printflike(1, 2); void usage(void); struct disklabel *getvirginlabel(void); @@ -150,12 +147,8 @@ char part_offset_type[MAX_NUM_PARTS]; int part_set[MAX_NUM_PARTS]; int installboot; /* non-zero if we should install a boot program */ -char *bootbuf; /* pointer to buffer with remainder of boot prog */ -int bootsize; /* size of remaining boot program */ char *xxboot; /* primary boot */ -char *bootxx; /* secondary boot */ char boot0[MAXPATHLEN]; -char boot1[MAXPATHLEN]; enum { UNSPEC, EDIT, READ, RESTORE, WRITE, WRITEBOOT @@ -182,11 +175,6 @@ main(int argc, char *argv[]) case 'b': xxboot = optarg; break; -#if NUMBOOT > 1 - case 's': - bootxx = optarg; - break; -#endif case 'n': disable_write = 1; break; @@ -221,7 +209,7 @@ main(int argc, char *argv[]) } else { if (op == UNSPEC) op = READ; - xxboot = bootxx = 0; + xxboot = 0; } if (argc < 1) usage(); @@ -354,7 +342,6 @@ writelabel(int f, const char *boot, struct disklabel *lp) return (0); } - setbootflag(lp); lp->d_magic = DISKMAGIC; lp->d_magic2 = DISKMAGIC; lp->d_checksum = 0; @@ -394,13 +381,6 @@ writelabel(int f, const char *boot, struct disklabel *lp) warn("write"); return (1); } - /* - * Output the remainder of the disklabel - */ - if (bootbuf && write(f, bootbuf, bootsize) != bootsize) { - warn("write"); - return(1); - } return (0); } @@ -483,7 +463,7 @@ makebootarea(char *boot, struct disklabel *dp, int f) #endif #ifdef __i386__ char *tmpbuf; - int i, found; + int i, found, dps; #endif /* XXX */ @@ -511,7 +491,7 @@ makebootarea(char *boot, struct disklabel *dp, int f) * We are installing a boot program. Determine the name(s) and * read them into the appropriate places in the boot area. */ - if (!xxboot || !bootxx) { + if (!xxboot) { dkbasename = np; if ((p = rindex(dkname, '/')) == NULL) p = dkname; @@ -522,36 +502,22 @@ makebootarea(char *boot, struct disklabel *dp, int f) *np++ = '\0'; if (!xxboot) { - (void)sprintf(boot0, "%s/boot1", _PATH_BOOTDIR); + (void)sprintf(boot0, "%s/boot", _PATH_BOOTDIR); xxboot = boot0; } -#if NUMBOOT > 1 - if (!bootxx) { - (void)sprintf(boot1, "%s/boot2", _PATH_BOOTDIR); - bootxx = boot1; - } -#endif } - /* - * Strange rules: - * 1. One-piece bootstrap (hp300/hp800) - * 1. One-piece bootstrap (alpha) - * up to d_bbsize bytes of ``xxboot'' go in bootarea, the rest - * is remembered and written later following the bootarea. - * 2. Two-piece bootstraps (i386) - * up to d_secsize bytes of ``xxboot'' go in first d_secsize - * bytes of bootarea, remaining d_bbsize-d_secsize filled - * from ``bootxx''. - */ b = open(xxboot, O_RDONLY); if (b < 0) err(4, "%s", xxboot); -#if NUMBOOT > 1 + if (fstat(b, &sb) != 0) + err(4, "%s", xxboot); #ifdef __i386__ + if (sb.st_size > BBSIZE) + errx(4, "%s too large", xxboot); /* * XXX Botch alert. - * The i386 has the so-called fdisk table embedded into the + * The i386/PC98 has the so-called fdisk table embedded into the * primary bootstrap. We take care to not clobber it, but * only if it does already contain some data. (Otherwise, * the xxboot provides a template.) @@ -559,75 +525,45 @@ makebootarea(char *boot, struct disklabel *dp, int f) if ((tmpbuf = (char *)malloc((int)dp->d_secsize)) == 0) err(4, "%s", xxboot); memcpy((void *)tmpbuf, (void *)boot, (int)dp->d_secsize); -#endif /* __i386__ */ - if (read(b, boot, (int)dp->d_secsize) < 0) + + if (read(b, boot, BBSIZE) < 0) err(4, "%s", xxboot); - (void)close(b); + + /* XXX: rely on some very precise overlaps in definitions */ #ifdef PC98 + dps = sizeof(struct pc98_partition); +#else + dps = sizeof(struct dos_partition); +#endif for (i = DOSPARTOFF, found = 0; - !found && i < (int)(DOSPARTOFF + NDOSPART * sizeof(struct pc98_partition)); - i++) - found = tmpbuf[i] != 0; - if (found) - memcpy((void *)&boot[DOSPARTOFF], - (void *)&tmpbuf[DOSPARTOFF], - NDOSPART * sizeof(struct pc98_partition)); - free(tmpbuf); -#elif defined(__i386__) - for (i = DOSPARTOFF, found = 0; - !found && i < (int)(DOSPARTOFF + NDOSPART*sizeof(struct dos_partition)); + !found && i < (int)(DOSPARTOFF + NDOSPART * dps); i++) found = tmpbuf[i] != 0; if (found) memcpy((void *)&boot[DOSPARTOFF], (void *)&tmpbuf[DOSPARTOFF], - NDOSPART * sizeof(struct dos_partition)); + NDOSPART * dps); free(tmpbuf); #endif /* __i386__ */ - b = open(bootxx, O_RDONLY); - if (b < 0) - err(4, "%s", bootxx); - if (fstat(b, &sb) != 0) - err(4, "%s", bootxx); - if (dp->d_secsize + sb.st_size > dp->d_bbsize) - errx(4, "%s too large", bootxx); - if (read(b, &boot[dp->d_secsize], - (int)(dp->d_bbsize-dp->d_secsize)) < 0) - err(4, "%s", bootxx); -#else /* !(NUMBOOT > 1) */ + #ifdef __alpha__ + if (sb.st_size > BBSIZE - dp->d_secsize) + errx(4, "%s too large", xxboot); /* * On the alpha, the primary bootstrap starts at the * second sector of the boot area. The first sector * contains the label and must be edited to contain the * size and location of the primary bootstrap. */ - n = read(b, boot + dp->d_secsize, (int)dp->d_bbsize); + n = read(b, boot + dp->d_secsize, BBSIZE - dp->d_secsize); if (n < 0) err(4, "%s", xxboot); bootinfo = (u_long *)(boot + 480); bootinfo[0] = (n + dp->d_secsize - 1) / dp->d_secsize; bootinfo[1] = 1; /* start at sector 1 */ bootinfo[2] = 0; /* flags (must be zero) */ -#else /* !__alpha__ */ - if (read(b, boot, (int)dp->d_bbsize) < 0) - err(4, "%s", xxboot); #endif /* __alpha__ */ - if (fstat(b, &sb) != 0) - err(4, "%s", xxboot); - bootsize = (int)sb.st_size - dp->d_bbsize; - if (bootsize > 0) { - /* XXX assume d_secsize is a power of two */ - bootsize = (bootsize + dp->d_secsize-1) & ~(dp->d_secsize-1); - bootbuf = (char *)malloc((size_t)bootsize); - if (bootbuf == 0) - err(4, "%s", xxboot); - if (read(b, bootbuf, bootsize) < 0) { - free(bootbuf); - err(4, "%s", xxboot); - } - } -#endif /* NUMBOOT > 1 */ + (void)close(b); /* * Make sure no part of the bootstrap is written in the area @@ -1549,47 +1485,6 @@ getvirginlabel(void) return (&loclab); } -/* - * If we are installing a boot program that doesn't fit in d_bbsize - * we need to mark those partitions that the boot overflows into. - * This allows newfs to prevent creation of a file system where it might - * clobber bootstrap code. - */ -void -setbootflag(struct disklabel *lp) -{ - struct partition *pp; - int i, errors = 0; - char part; - u_long boffset; - - if (bootbuf == 0) - return; - boffset = bootsize / lp->d_secsize; - for (i = 0; i < lp->d_npartitions; i++) { - part = 'a' + i; - pp = &lp->d_partitions[i]; - if (pp->p_size == 0) - continue; - if (boffset <= pp->p_offset) { - if (pp->p_fstype == FS_BOOT) - pp->p_fstype = FS_UNUSED; - } else if (pp->p_fstype != FS_BOOT) { - if (pp->p_fstype != FS_UNUSED) { - fprintf(stderr, - "boot overlaps used partition %c\n", - part); - errors++; - } else { - pp->p_fstype = FS_BOOT; - Warning("boot overlaps partition %c, %s", - part, "marked as FS_BOOT"); - } - } - } - if (errors) - errx(4, "cannot install boot program"); -} /*VARARGS1*/ void @@ -1616,21 +1511,12 @@ usage(void) "\t\t(to edit label)", " disklabel -R [-r] [-n] disk protofile", "\t\t(to restore label with existing boot program)", -#if NUMBOOT > 1 - " disklabel -B [-n] [ -b boot1 [ -s boot2 ] ] disk [ type ]", - "\t\t(to install boot program with existing label)", - " disklabel -w -B [-n] [ -b boot1 [ -s boot2 ] ] disk type [ packid ]", - "\t\t(to write label and boot program)", - " disklabel -R -B [-n] [ -b boot1 [ -s boot2 ] ] disk protofile [ type ]", - "\t\t(to restore label and boot program)" -#else " disklabel -B [-n] [ -b bootprog ] disk [ type ]", "\t\t(to install boot program with existing on-disk label)", " disklabel -w -B [-n] [ -b bootprog ] disk type [ packid ]", "\t\t(to write label and install boot program)", " disklabel -R -B [-n] [ -b bootprog ] disk protofile [ type ]", "\t\t(to restore label and install boot program)" -#endif ); exit(1); } |