+ /*
+ * Read in the pack label.
+ */
+ lp->d_nsectors = NRKSECT;
+ lp->d_secpercyl = NRKTRK*NRKSECT;
+ tio = *io;
+ tio.i_bn = LABELSECTOR;
+ tio.i_ma = lbuf;
+ tio.i_cc = SECTSIZ;
+ tio.i_flgs |= F_RDDATA;
+ if (rkstrategy(&tio, READ) != SECTSIZ) {
+ printf("can't read disk label");
+ return (EIO);
+ }
+ *lp = *(struct disklabel *)(lbuf + LABELOFFSET);
+ if (lp->d_magic != DISKMAGIC || lp->d_magic2 != DISKMAGIC) {
+ printf("hk%d: unlabeled\n", io->i_unit);
+#ifdef COMPAT_42
+ rkmaptype(io, lp);
+#else
+ return (ENXIO);
+#endif
+ }
+ if ((unsigned)io->i_boff >= lp->d_npartitions ||
+ (io->i_boff = lp->d_partitions[io->i_boff].p_offset) == -1) {
+ printf("rk: bad partition");
+ return (EUNIT);
+ }
+ return (0);
+}
+
+#ifdef COMPAT_42
+u_long rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 };
+
+rkmaptype(io, lp)
+ register struct iob *io;
+ register struct disklabel *lp;
+{
+ register struct partition *pp;
+ register i;
+ register u_long *off = rk_off;
+
+ lp->d_npartitions = 8;
+ pp = lp->d_partitions;
+ for (i = 0; i < 8; i++, pp++)
+ pp->p_offset = *off++;