1*74a4d8c2SCharles.Forsyth #include "u.h"
2*74a4d8c2SCharles.Forsyth #include "lib.h"
3*74a4d8c2SCharles.Forsyth #include "mem.h"
4*74a4d8c2SCharles.Forsyth #include "dat.h"
5*74a4d8c2SCharles.Forsyth #include "fns.h"
6*74a4d8c2SCharles.Forsyth #include "io.h"
7*74a4d8c2SCharles.Forsyth
8*74a4d8c2SCharles.Forsyth #include "fs.h"
9*74a4d8c2SCharles.Forsyth
10*74a4d8c2SCharles.Forsyth /*
11*74a4d8c2SCharles.Forsyth * grab next element from a path, return the pointer to unprocessed portion of
12*74a4d8c2SCharles.Forsyth * path.
13*74a4d8c2SCharles.Forsyth */
14*74a4d8c2SCharles.Forsyth char *
nextelem(char * path,char * elem)15*74a4d8c2SCharles.Forsyth nextelem(char *path, char *elem)
16*74a4d8c2SCharles.Forsyth {
17*74a4d8c2SCharles.Forsyth int i;
18*74a4d8c2SCharles.Forsyth
19*74a4d8c2SCharles.Forsyth while(*path == '/')
20*74a4d8c2SCharles.Forsyth path++;
21*74a4d8c2SCharles.Forsyth if(*path==0 || *path==' ')
22*74a4d8c2SCharles.Forsyth return 0;
23*74a4d8c2SCharles.Forsyth for(i=0; *path!='\0' && *path!='/' && *path!=' '; i++){
24*74a4d8c2SCharles.Forsyth if(i==NAMELEN){
25*74a4d8c2SCharles.Forsyth print("name component too long\n");
26*74a4d8c2SCharles.Forsyth return 0;
27*74a4d8c2SCharles.Forsyth }
28*74a4d8c2SCharles.Forsyth *elem++ = *path++;
29*74a4d8c2SCharles.Forsyth }
30*74a4d8c2SCharles.Forsyth *elem = '\0';
31*74a4d8c2SCharles.Forsyth return path;
32*74a4d8c2SCharles.Forsyth }
33*74a4d8c2SCharles.Forsyth
34*74a4d8c2SCharles.Forsyth int
fswalk(Fs * fs,char * path,File * f)35*74a4d8c2SCharles.Forsyth fswalk(Fs *fs, char *path, File *f)
36*74a4d8c2SCharles.Forsyth {
37*74a4d8c2SCharles.Forsyth char element[NAMELEN];
38*74a4d8c2SCharles.Forsyth
39*74a4d8c2SCharles.Forsyth *f = fs->root;
40*74a4d8c2SCharles.Forsyth if(BADPTR(fs->walk))
41*74a4d8c2SCharles.Forsyth panic("fswalk bad pointer fs->walk");
42*74a4d8c2SCharles.Forsyth
43*74a4d8c2SCharles.Forsyth f->path = path;
44*74a4d8c2SCharles.Forsyth while(path = nextelem(path, element)){
45*74a4d8c2SCharles.Forsyth switch(fs->walk(f, element)){
46*74a4d8c2SCharles.Forsyth case -1:
47*74a4d8c2SCharles.Forsyth return -1;
48*74a4d8c2SCharles.Forsyth case 0:
49*74a4d8c2SCharles.Forsyth return 0;
50*74a4d8c2SCharles.Forsyth }
51*74a4d8c2SCharles.Forsyth }
52*74a4d8c2SCharles.Forsyth return 1;
53*74a4d8c2SCharles.Forsyth }
54*74a4d8c2SCharles.Forsyth
55*74a4d8c2SCharles.Forsyth /*
56*74a4d8c2SCharles.Forsyth * boot
57*74a4d8c2SCharles.Forsyth */
58*74a4d8c2SCharles.Forsyth int
fsboot(Fs * fs,char * path,Boot * b)59*74a4d8c2SCharles.Forsyth fsboot(Fs *fs, char *path, Boot *b)
60*74a4d8c2SCharles.Forsyth {
61*74a4d8c2SCharles.Forsyth File file;
62*74a4d8c2SCharles.Forsyth long n;
63*74a4d8c2SCharles.Forsyth static char buf[8192];
64*74a4d8c2SCharles.Forsyth
65*74a4d8c2SCharles.Forsyth switch(fswalk(fs, path, &file)){
66*74a4d8c2SCharles.Forsyth case -1:
67*74a4d8c2SCharles.Forsyth print("error walking to %s\n", path);
68*74a4d8c2SCharles.Forsyth return -1;
69*74a4d8c2SCharles.Forsyth case 0:
70*74a4d8c2SCharles.Forsyth print("%s not found\n", path);
71*74a4d8c2SCharles.Forsyth return -1;
72*74a4d8c2SCharles.Forsyth case 1:
73*74a4d8c2SCharles.Forsyth print("found %s\n", path);
74*74a4d8c2SCharles.Forsyth break;
75*74a4d8c2SCharles.Forsyth }
76*74a4d8c2SCharles.Forsyth
77*74a4d8c2SCharles.Forsyth while((n = fsread(&file, buf, sizeof buf)) > 0) {
78*74a4d8c2SCharles.Forsyth if(bootpass(b, buf, n) != MORE)
79*74a4d8c2SCharles.Forsyth break;
80*74a4d8c2SCharles.Forsyth }
81*74a4d8c2SCharles.Forsyth
82*74a4d8c2SCharles.Forsyth bootpass(b, nil, 0); /* tries boot */
83*74a4d8c2SCharles.Forsyth return -1;
84*74a4d8c2SCharles.Forsyth }
85*74a4d8c2SCharles.Forsyth
86*74a4d8c2SCharles.Forsyth int
fsread(File * file,void * a,long n)87*74a4d8c2SCharles.Forsyth fsread(File *file, void *a, long n)
88*74a4d8c2SCharles.Forsyth {
89*74a4d8c2SCharles.Forsyth if(BADPTR(file->fs))
90*74a4d8c2SCharles.Forsyth panic("bad pointer file->fs in fsread");
91*74a4d8c2SCharles.Forsyth if(BADPTR(file->fs->read))
92*74a4d8c2SCharles.Forsyth panic("bad pointer file->fs->read in fsread");
93*74a4d8c2SCharles.Forsyth return file->fs->read(file, a, n);
94*74a4d8c2SCharles.Forsyth }
95