|
|
1.1 ! root 1: #include "u.h" ! 2: #include "../port/lib.h" ! 3: #include "mem.h" ! 4: #include "dat.h" ! 5: #include "fns.h" ! 6: #include "../port/error.h" ! 7: #include "devtab.h" ! 8: ! 9: enum{ ! 10: Qdir= 0, ! 11: Qbin, ! 12: Qdev, ! 13: Qenv, ! 14: Qproc, ! 15: Qnet, ! 16: Qboot, /* readable files */ ! 17: ! 18: Nfiles=13, /* max root files */ ! 19: }; ! 20: ! 21: extern ulong bootlen; ! 22: extern uchar bootcode[]; ! 23: ! 24: Dirtab rootdir[Nfiles]={ ! 25: "bin", {Qbin|CHDIR}, 0, 0777, ! 26: "dev", {Qdev|CHDIR}, 0, 0777, ! 27: "env", {Qenv|CHDIR}, 0, 0777, ! 28: "proc", {Qproc|CHDIR}, 0, 0777, ! 29: "net", {Qnet|CHDIR}, 0, 0777, ! 30: }; ! 31: ! 32: static uchar *rootdata[Nfiles]; ! 33: static int nroot = Qboot - 1; ! 34: ! 35: /* ! 36: * add a root file ! 37: */ ! 38: void ! 39: addrootfile(char *name, uchar *contents, ulong len) ! 40: { ! 41: Dirtab *d; ! 42: ! 43: ! 44: if(nroot >= Nfiles) ! 45: panic("too many root files"); ! 46: rootdata[nroot] = contents; ! 47: d = &rootdir[nroot]; ! 48: strcpy(d->name, name); ! 49: d->length = len; ! 50: d->perm = 0555; ! 51: d->qid.path = nroot+1; ! 52: nroot++; ! 53: } ! 54: ! 55: void ! 56: rootreset(void) ! 57: { ! 58: addrootfile("boot", bootcode, bootlen); /* always have a boot file */ ! 59: } ! 60: ! 61: void ! 62: rootinit(void) ! 63: { ! 64: } ! 65: ! 66: Chan* ! 67: rootattach(char *spec) ! 68: { ! 69: return devattach('/', spec); ! 70: } ! 71: ! 72: Chan* ! 73: rootclone(Chan *c, Chan *nc) ! 74: { ! 75: return devclone(c, nc); ! 76: } ! 77: ! 78: int ! 79: rootwalk(Chan *c, char *name) ! 80: { ! 81: if(strcmp(name, "..") == 0) { ! 82: c->qid.path = Qdir|CHDIR; ! 83: return 1; ! 84: } ! 85: if((c->qid.path & ~CHDIR) != Qdir) ! 86: return 0; ! 87: return devwalk(c, name, rootdir, nroot, devgen); ! 88: } ! 89: ! 90: void ! 91: rootstat(Chan *c, char *dp) ! 92: { ! 93: devstat(c, dp, rootdir, nroot, devgen); ! 94: } ! 95: ! 96: Chan* ! 97: rootopen(Chan *c, int omode) ! 98: { ! 99: return devopen(c, omode, rootdir, nroot, devgen); ! 100: } ! 101: ! 102: void ! 103: rootcreate(Chan *c, char *name, int omode, ulong perm) ! 104: { ! 105: USED(c, name, omode, perm); ! 106: error(Eperm); ! 107: } ! 108: ! 109: /* ! 110: * sysremove() knows this is a nop ! 111: */ ! 112: void ! 113: rootclose(Chan *c) ! 114: { ! 115: USED(c); ! 116: } ! 117: ! 118: long ! 119: rootread(Chan *c, void *buf, long n, ulong offset) ! 120: { ! 121: ulong t; ! 122: Dirtab *d; ! 123: uchar *data; ! 124: ! 125: t = c->qid.path & ~CHDIR; ! 126: if(t == Qdir) ! 127: return devdirread(c, buf, n, rootdir, nroot, devgen); ! 128: if(t < Qboot) ! 129: return 0; ! 130: ! 131: d = &rootdir[t-1]; ! 132: data = rootdata[t-1]; ! 133: if(offset >= d->length) ! 134: return 0; ! 135: if(offset+n > d->length) ! 136: n = d->length - offset; ! 137: memmove(buf, data+offset, n); ! 138: return n; ! 139: } ! 140: ! 141: long ! 142: rootwrite(Chan *c, void *buf, long n, ulong offset) ! 143: { ! 144: USED(c, buf, n, offset); ! 145: error(Egreg); ! 146: return 0; /* not reached */ ! 147: } ! 148: ! 149: void ! 150: rootremove(Chan *c) ! 151: { ! 152: USED(c); ! 153: error(Eperm); ! 154: } ! 155: ! 156: void ! 157: rootwstat(Chan *c, char *dp) ! 158: { ! 159: USED(c, dp); ! 160: error(Eperm); ! 161: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.