uchar buf[512];
Table *t;
- if(disk->c == 0 || disk->h == 0 || disk->s == 0)
- return -1;
-
t = (Table*)(buf + Toffset);
/*
}
}
- if(h == -1)
+ if(h < 0 || s <= 0)
return -1;
disk->h = h+1; /* heads count from 0 */
}
}
+static Disk*
+freedisk(Disk *d)
+{
+ if(d->fd >= 0)
+ close(d->fd);
+ if(d->wfd >= 0)
+ close(d->wfd);
+ if(d->ctlfd >= 0)
+ close(d->ctlfd);
+ free(d);
+ return nil;
+}
+
static Disk*
openfile(Disk *disk)
{
Dir *d;
- if((d = dirfstat(disk->fd)) == nil){
- free(disk);
- return nil;
- }
+ if((d = dirfstat(disk->fd)) == nil)
+ return freedisk(disk);
disk->secsize = 512;
disk->size = d->length;
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);
}
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, "");
{
char *p, *q;
Disk *d;
+ Dir *s;
d = mallocz(sizeof(*d), 1);
if(d == nil)
d->fd = open(disk, OREAD);
if(d->fd < 0) {
- werrstr("cannot open disk file");
- free(d);
- return nil;
+ werrstr("cannot open disk file: %r");
+ return freedisk(d);
}
+ if((s = dirfstat(d->fd)) == nil)
+ return freedisk(d);
+ if((s->mode & (DMDIR|DMAPPEND)) != 0){
+ free(s);
+ werrstr("not a disk file: %s", disk);
+ return freedisk(d);
+ }
+ free(s);
if(rdonly == 0) {
d->wfd = open(disk, OWRITE);
return openfile(d);
p = malloc(strlen(disk) + 4); /* 4: slop for "ctl\0" */
- if(p == nil) {
- close(d->wfd);
- close(d->fd);
- free(d);
- return nil;
- }
+ if(p == nil)
+ return freedisk(d);
strcpy(p, disk);
/* check for floppy(3) disk */
d->type = Tsd;
d->part = strdup(disk+(q-p));
if(d->part == nil){
- close(d->ctlfd);
- close(d->wfd);
- close(d->fd);
free(p);
- free(d);
- return nil;
+ return freedisk(d);
}
return opensd(d);
}