]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libdisk/disk.c
pc64: preserve reserved bits in CR0/CR4 for amd64 in mtrr setstate()
[plan9front.git] / sys / src / libdisk / disk.c
index dadb92cf22745cb4ff224a5f1944a91392c0cbcb..369e79d27afab5e4bd36b380e5b3f2d4973bddef 100644 (file)
@@ -208,15 +208,26 @@ findgeometry(Disk *disk)
        }
 }
 
+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;
@@ -224,6 +235,11 @@ openfile(Disk *disk)
        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);
 }
@@ -247,13 +263,17 @@ opensd(Disk *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, "");
@@ -270,6 +290,7 @@ opendisk(char *disk, int rdonly, int noctl)
 {
        char *p, *q;
        Disk *d;
+       Dir *s;
 
        d = mallocz(sizeof(*d), 1);
        if(d == nil)
@@ -280,10 +301,17 @@ opendisk(char *disk, int rdonly, int noctl)
 
        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);
@@ -295,12 +323,8 @@ opendisk(char *disk, int rdonly, int noctl)
                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 */
@@ -330,12 +354,8 @@ opendisk(char *disk, int rdonly, int noctl)
                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);
        }