summaryrefslogtreecommitdiff
path: root/os/boot/pc/fs.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 21:39:35 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 21:39:35 +0000
commit74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch)
treec6e220ba61db3a6ea4052e6841296d829654e664 /os/boot/pc/fs.c
parent46439007cf417cbd9ac8049bb4122c890097a0fa (diff)
20060303
Diffstat (limited to 'os/boot/pc/fs.c')
-rw-r--r--os/boot/pc/fs.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/os/boot/pc/fs.c b/os/boot/pc/fs.c
new file mode 100644
index 00000000..24b33c09
--- /dev/null
+++ b/os/boot/pc/fs.c
@@ -0,0 +1,94 @@
+#include "u.h"
+#include "lib.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "io.h"
+
+#include "fs.h"
+
+/*
+ * grab next element from a path, return the pointer to unprocessed portion of
+ * path.
+ */
+char *
+nextelem(char *path, char *elem)
+{
+ int i;
+
+ while(*path == '/')
+ path++;
+ if(*path==0 || *path==' ')
+ return 0;
+ for(i=0; *path!='\0' && *path!='/' && *path!=' '; i++){
+ if(i==NAMELEN){
+ print("name component too long\n");
+ return 0;
+ }
+ *elem++ = *path++;
+ }
+ *elem = '\0';
+ return path;
+}
+
+int
+fswalk(Fs *fs, char *path, File *f)
+{
+ char element[NAMELEN];
+
+ *f = fs->root;
+ if(BADPTR(fs->walk))
+ panic("fswalk bad pointer fs->walk");
+
+ f->path = path;
+ while(path = nextelem(path, element)){
+ switch(fs->walk(f, element)){
+ case -1:
+ return -1;
+ case 0:
+ return 0;
+ }
+ }
+ return 1;
+}
+
+/*
+ * boot
+ */
+int
+fsboot(Fs *fs, char *path, Boot *b)
+{
+ File file;
+ long n;
+ static char buf[8192];
+
+ switch(fswalk(fs, path, &file)){
+ case -1:
+ print("error walking to %s\n", path);
+ return -1;
+ case 0:
+ print("%s not found\n", path);
+ return -1;
+ case 1:
+ print("found %s\n", path);
+ break;
+ }
+
+ while((n = fsread(&file, buf, sizeof buf)) > 0) {
+ if(bootpass(b, buf, n) != MORE)
+ break;
+ }
+
+ bootpass(b, nil, 0); /* tries boot */
+ return -1;
+}
+
+int
+fsread(File *file, void *a, long n)
+{
+ if(BADPTR(file->fs))
+ panic("bad pointer file->fs in fsread");
+ if(BADPTR(file->fs->read))
+ panic("bad pointer file->fs->read in fsread");
+ return file->fs->read(file, a, n);
+}