/* * Attempt to read a disk label from a device * using the indicated strategy routine. * The label must be partly set up before this: * secpercyl and anything required in the strategy routine * (e.g., sector size) must be filled in before calling us. */ int readdisklabel(dev_t dev, void (*strat)(struct buf *), struct disklabel *lp, int spoofonly) { struct buf *bp = NULL; int error; if ((error = initdisklabel(lp))) goto done; /* get a buffer and initialize it */ bp = geteblk((int)lp->d_secsize); bp->b_dev = dev; /* don't read the on-disk label if we are in spoofed-only mode */ if (spoofonly) goto done; bp->b_blkno = LABELSECTOR; bp->b_bcount = lp->d_secsize; CLR(bp->b_flags, B_READ | B_WRITE | B_DONE); SET(bp->b_flags, B_BUSY | B_READ | B_RAW); (*strat)(bp); if (biowait(bp)) { error = bp->b_error; goto done; } error = cputobsdlabel(lp, (struct mvmedisklabel *)bp->b_data); if (error == 0) goto done; #if defined(CD9660) error = iso_disklabelspoof(dev, strat, lp); if (error == 0) goto done; #endif #if defined(UDF) error = udf_disklabelspoof(dev, strat, lp); if (error == 0) goto done; #endif done: if (bp) { bp->b_flags |= B_INVAL; brelse(bp); } disk_change = 1; return (error); }
main(int argc, char *argv[]) { struct cpu_disklabel cpu_label; struct disklabel sdlabel; int i; fread((void *)&cpu_label, sizeof(struct cpu_disklabel), 1, stdin); cputobsdlabel(&sdlabel, (struct cpu_disklabel *)&cpu_label); for (i = 0; i < MAXPARTITIONS; i++) { printf("part %x off %x size %x\n", i, sdlabel.d_partitions[i].p_offset, sdlabel.d_partitions[i].p_size); } }