diff options
Diffstat (limited to 'sbin/bsdlabel')
-rw-r--r-- | sbin/bsdlabel/bsdlabel.c | 57 |
1 files changed, 20 insertions, 37 deletions
diff --git a/sbin/bsdlabel/bsdlabel.c b/sbin/bsdlabel/bsdlabel.c index 92e78d2..60d6caa 100644 --- a/sbin/bsdlabel/bsdlabel.c +++ b/sbin/bsdlabel/bsdlabel.c @@ -168,6 +168,10 @@ int installboot; /* non-zero if we should install a boot program */ char *xxboot; /* primary boot */ char boot0[MAXPATHLEN]; +static int labeloffset; +static int bbsize; +static int alphacksum; + enum { UNSPEC, EDIT, READ, RESTORE, WRITE, WRITEBOOT } op = UNSPEC; @@ -210,6 +214,14 @@ main(int argc, char *argv[]) xxboot = optarg; break; case 'm': + if (!strcmp(optarg, "i386")) { + labeloffset = 512; + bbsize = 8192; + } else if (!strcmp(optarg, "alpha")) { + labeloffset = 64; + bbsize = 8192; + alphacksum = 1; + } for (i = 0; i < NARCHES && strcmp(arches[i].name, optarg) != 0; i++); @@ -409,19 +421,8 @@ writelabel(int f, void *boot, struct disklabel *lp) return (0); } - /* - * First set the kernel disk label, - * then write a label to the raw disk. - * If the SDINFO ioctl fails because it is unimplemented, - * keep going; otherwise, the kernel consistency checks - * may prevent us from changing the current (in-core) - * label. - */ - if (ioctl(f, DIOCSDINFO, lp) < 0 && - errno != ENODEV && errno != ENOTTY) { - l_perror("ioctl DIOCSDINFO"); - return (1); - } + bsd_disklabel_le_enc((u_char *)boot + labeloffset, lp); + (void)lseek(f, (off_t)0, SEEK_SET); if (arch->arch == ARCH_ALPHA) { @@ -434,7 +435,7 @@ writelabel(int f, void *boot, struct disklabel *lp) } if (ioctl(f, DIOCBSDBB, &boot) == 0) return (0); - if (write(f, boot, lp->d_bbsize) != (int)lp->d_bbsize) { + if (write(f, boot, bbsize) != bbsize) { warn("write"); return (1); } @@ -478,30 +479,12 @@ l_perror(const char *s) struct disklabel * readlabel(int f) { - struct disklabel *lp; - if (rflag) { - if (read(f, bootarea, BBSIZE) < BBSIZE) - err(4, "%s", specname); - for (lp = (struct disklabel *)bootarea; - lp <= (struct disklabel *) - ((char *)bootarea + BBSIZE - sizeof(*lp)); - lp = (struct disklabel *)((char *)lp + 16)) - if (lp->d_magic == DISKMAGIC && - lp->d_magic2 == DISKMAGIC) - break; - if (lp > (struct disklabel *) - ((char *)bootarea + BBSIZE - sizeof(*lp)) || - lp->d_magic != DISKMAGIC || lp->d_magic2 != DISKMAGIC || - dkcksum(lp) != 0) - errx(1, - "bad pack magic number (label is damaged, or pack is unlabeled)"); - } else { - lp = &lab; - if (ioctl(f, DIOCGDINFO, lp) < 0) - err(4, "ioctl DIOCGDINFO"); - } - return (lp); + (void)lseek(f, (off_t)0, SEEK_SET); + if (read(f, bootarea, BBSIZE) < BBSIZE) + err(4, "%s", specname); + bsd_disklabel_le_dec((u_char *)bootarea + labeloffset, &lab); + return (&lab); } /* |