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