Exemple #1
0
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);
}
Exemple #2
0
/* 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;
}