static Disk* openfile(Disk *disk) { Dir *d; if((d = dirfstat(disk->fd)) == nil){ free(disk); return nil; } disk->secsize = 512; disk->size = d->length; disk->secs = disk->size / disk->secsize; disk->offset = 0; free(d); findgeometry(disk); return mkwidth(disk); }
static Disk* opensd(Disk *disk) { Biobuf b; char *p, *f[10]; int nf; Binit(&b, disk->ctlfd, OREAD); while(p = Brdline(&b, '\n')) { p[Blinelen(&b)-1] = '\0'; nf = tokenize(p, f, nelem(f)); if(nf >= 3 && strcmp(f[0], "geometry") == 0) { disk->secsize = strtoll(f[2], 0, 0); if(nf >= 6) { disk->c = strtol(f[3], 0, 0); disk->h = strtol(f[4], 0, 0); disk->s = strtol(f[5], 0, 0); } } if(nf >= 3 && strcmp(f[0], "alignment") == 0) { disk->psecsize = strtol(f[1], 0, 0); disk->physalign = strtol(f[2], 0, 0); } if(nf >= 4 && strcmp(f[0], "part") == 0 && strcmp(f[1], disk->part) == 0) { disk->offset = strtoll(f[2], 0, 0); disk->secs = strtoll(f[3], 0, 0) - disk->offset; } } if (!disk->psecsize) disk->psecsize = disk->secsize; disk->size = disk->secs * disk->secsize; if(disk->size <= 0) { strcpy(disk->part, ""); disk->type = Tfile; return openfile(disk); } findgeometry(disk); return mkwidth(disk); }
static Disk* openfile(Disk *disk) { Dir *d; if((d = dirfstat(disk->fd)) == nil) return freedisk(disk); disk->secsize = 512; disk->size = d->length; disk->secs = disk->size / disk->secsize; disk->offset = 0; free(d); if(disk->secs == 0){ werrstr("file too small to be a disk"); return freedisk(disk); } findgeometry(disk); return mkwidth(disk); }