Fat32 = 4,
};
-typedef struct Extend Extend;
+typedef struct File File;
typedef struct Dir Dir;
typedef struct Pbs Pbs;
typedef struct Fat Fat;
ulong datalba;
};
-struct Extend
+struct File
{
Fat *fat;
ulong lba;
}
static ulong
-readnext(Extend *ex, ulong clust)
+readnext(File *fp, ulong clust)
{
- Fat *fat = ex->fat;
+ Fat *fat = fp->fat;
uint b = fat->ver;
ulong sect, off;
sect = clust * b / Sectsz;
off = clust * b % Sectsz;
- if(readsect(fat->drive, fat->fatlba + sect, ex->buf))
- memset(ex->buf, 0xff, 4);
+ if(readsect(fat->drive, fat->fatlba + sect, fp->buf))
+ memset(fp->buf, 0xff, 4);
switch(fat->ver){
case Fat16:
- return GETSHORT(&ex->buf[off]);
+ return GETSHORT(&fp->buf[off]);
case Fat32:
- return GETLONG(&ex->buf[off])& 0x0fffffff;
+ return GETLONG(&fp->buf[off])& 0x0fffffff;
}
return 0;
}
int
read(void *f, void *data, int len)
{
- Extend *ex = f;
- Fat *fat = ex->fat;
+ File *fp = f;
+ Fat *fat = fp->fat;
- if(ex->len > 0 && ex->rp >= ex->ep){
- if(ex->clust != ~0U){
- if(ex->lbaoff % fat->clustsize == 0){
- if((ex->clust >> 4) == fat->eofmark)
+ if(fp->len > 0 && fp->rp >= fp->ep){
+ if(fp->clust != ~0U){
+ if(fp->lbaoff % fat->clustsize == 0){
+ if((fp->clust >> 4) == fat->eofmark)
return -1;
- ex->lbaoff = (ex->clust - 2) * fat->clustsize;
- putc('.');
- ex->clust = readnext(ex, ex->clust);
- ex->lba = ex->lbaoff + fat->datalba;
+ fp->lbaoff = (fp->clust - 2) * fat->clustsize;
+ fp->clust = readnext(fp, fp->clust);
+ fp->lba = fp->lbaoff + fat->datalba;
}
- ex->lbaoff++;
+ fp->lbaoff++;
}
- if(readsect(fat->drive, ex->lba++, ex->rp = ex->buf))
+ if(readsect(fat->drive, fp->lba++, fp->rp = fp->buf))
return -1;
}
- if(ex->len < len)
- len = ex->len;
- if(len > (ex->ep - ex->rp))
- len = ex->ep - ex->rp;
- memmove(data, ex->rp, len);
- ex->rp += len;
- ex->len -= len;
+ if(fp->len < len)
+ len = fp->len;
+ if(len > (fp->ep - fp->rp))
+ len = fp->ep - fp->rp;
+ memmove(data, fp->rp, len);
+ fp->rp += len;
+ fp->len -= len;
return len;
}
-void
-open(Fat *fat, void *f, ulong lba)
-{
- Extend *ex = f;
-
- ex->fat = fat;
- ex->lba = lba;
- ex->len = 0;
- ex->lbaoff = 0;
- ex->clust = ~0U;
- ex->rp = ex->ep = ex->buf + Sectsz;
-}
-
void
close(void *)
{
return *((ushort*)d->starthi)<<16 | *((ushort*)d->startlo);
}
+static void
+fileinit(File *fp, Fat *fat, ulong lba)
+{
+ fp->fat = fat;
+ fp->lba = lba;
+ fp->len = 0;
+ fp->lbaoff = 0;
+ fp->clust = ~0U;
+ fp->rp = fp->ep = fp->buf + Sectsz;
+}
+
static int
-fatwalk(Extend *ex, Fat *fat, char *path)
+fatwalk(File *fp, Fat *fat, char *path)
{
char name[Maxpath], *end;
int i, j;
Dir d;
if(fat->ver == Fat32){
- open(fat, ex, 0);
- ex->clust = fat->dirstart;
- ex->len = ~0U;
+ fileinit(fp, fat, 0);
+ fp->clust = fat->dirstart;
+ fp->len = ~0U;
}else{
- open(fat, ex, fat->dirstart);
- ex->len = fat->dirents * Dirsz;
+ fileinit(fp, fat, fat->dirstart);
+ fp->len = fat->dirents * Dirsz;
}
for(;;){
- if(readn(ex, &d, Dirsz) != Dirsz)
+ if(readn(fp, &d, Dirsz) != Dirsz)
break;
if((i = dirname(&d, name)) <= 0)
continue;
end = path + strlen(path);
j = end - path;
if(i == j && memcmp(name, path, j) == 0){
- open(fat, ex, 0);
- ex->clust = dirclust(&d);
- ex->len = *((ulong*)d.len);
+ fileinit(fp, fat, 0);
+ fp->clust = dirclust(&d);
+ fp->len = *((ulong*)d.len);
if(*end == 0)
return 0;
else if(d.attr & 0x10){
- ex->len = fat->clustsize * Sectsz;
+ fp->len = fat->clustsize * Sectsz;
path = end;
continue;
}
{
char path[Maxpath], *kern;
int drive;
- Extend ex;
+ File fi;
Fat fat;
void *f;
print("no fat\r\n");
halt();
}
- if(fatwalk(f = &ex, &fat, "plan9.ini")){
+ if(fatwalk(f = &fi, &fat, "plan9.ini")){
print("no config\r\n");
f = 0;
}
for(;;){
kern = configure(f, path); f = 0;
- if(fatwalk(&ex, &fat, kern)){
+ if(fatwalk(&fi, &fat, kern)){
print("not found\r\n");
continue;
}
- print(bootkern(&ex));
+ print(bootkern(&fi));
print(crnl);
}
}