LDPUBLIC32 dsk_err_t LDPUBLIC16 dsk_getgeom(DSK_DRIVER *self, DSK_GEOMETRY *geom) { DRV_CLASS *dc; dsk_err_t e; if (!self || !geom || !self->dr_class) return DSK_ERR_BADPTR; /* Check if the driver has overridden this function. If it has, * then use its geometry probe, which is probably more limited. */ dc = self->dr_class; memset(geom, 0, sizeof(*geom)); if (dc->dc_getgeom) { e = (dc->dc_getgeom)(self, geom); if (e != DSK_ERR_NOTME && e != DSK_ERR_NOTIMPL) return e; } return dsk_defgetgeom(self, geom); }
/* Get drive geometry */ dsk_err_t ldbsdisk_getgeom(DSK_DRIVER *pdriver, DSK_GEOMETRY *geom) { dsk_err_t err, err2; LDBSDISK_DSK_DRIVER *self; GETGEOM_STATS stats; int n, count = -1; DC_CHECK(pdriver) self = (LDBSDISK_DSK_DRIVER *)pdriver; /* Firstly try the default LibDsk geometry probe */ err = dsk_defgetgeom(pdriver, geom); if (!err) return DSK_ERR_OK; /* If that fails, see if the LDBS file describes its own geometry */ err2 = ldbs_get_geometry(self->ld_store, geom); if (err2) return err2; /* If it populated 'geom', it does. Otherwise no dice. */ if (geom->dg_cylinders && geom->dg_heads && geom->dg_sectors && geom->dg_secsize) { return DSK_ERR_OK; } /* This was in imd_geom() in previous versions. Basically, a * fully-populated LDBS file contains enough information to * give us a decent chance at determining the drive geometry * ourselves. */ memset(&stats, 0, sizeof(stats)); dg_stdformat(&stats.dg, FMT_180K, NULL, NULL); stats.minsec[0] = stats.minsec[1] = 256; stats.maxsec[0] = stats.maxsec[1] = 0; err = ldbs_all_sectors(self->ld_store, getgeom_callback, SIDES_ALT, &stats); if (err) return DSK_ERR_BADFMT; /* Report the most frequent sector size */ for (n = 0; n < 8; n++) { if (stats.secsizes[n] > count) { count = stats.secsizes[n]; stats.dg.dg_secsize = 128 << n; } } stats.dg.dg_secbase = stats.minsec[0]; /* Check for an 'extended surface' format: 2 heads, the * sector ranges on each side are disjoint, and sectors on head 1 * are labelled as head 0 */ if (stats.dg.dg_heads == 2 && (stats.maxsec[0] + 1 == stats.minsec[1]) && stats.extsurface) { stats.dg.dg_sidedness = SIDES_EXTSURFACE; } if (stats.dg.dg_cylinders == 0 || stats.dg.dg_sectors == 0) { return DSK_ERR_BADFMT; } memcpy(geom, &stats.dg, sizeof(*geom)); return DSK_ERR_OK; }