2 #include "../port/lib.h"
6 #include "../port/error.h"
16 typedef long Rdwrfn(Chan*, void*, long, vlong);
18 static Rdwrfn *readfn[Qmax];
19 static Rdwrfn *writefn[Qmax];
21 static Dirtab archdir[Qmax] = {
22 ".", { Qdir, 0, QTDIR }, 0, 0555,
25 Lock archwlock; /* the lock is only for changing archdir */
29 * Add a file to the #P listing. Once added, you can't delete it.
30 * You can't add a file with the same name as one already there,
31 * and you get a pointer to the Dirtab entry so you can do things
32 * like change the Qid version. Changing the Qid path is disallowed.
35 addarchfile(char *name, int perm, Rdwrfn *rdfn, Rdwrfn *wrfn)
41 memset(&d, 0, sizeof d);
51 for(i=0; i<narchdir; i++)
52 if(strcmp(archdir[i].name, name) == 0){
57 d.qid.path = narchdir;
58 archdir[narchdir] = d;
59 readfn[narchdir] = rdfn;
60 writefn[narchdir] = wrfn;
61 dp = &archdir[narchdir++];
68 archattach(char* spec)
70 return devattach('P', spec);
74 archwalk(Chan* c, Chan *nc, char** name, int nname)
76 return devwalk(c, nc, name, nname, archdir, narchdir, devgen);
80 archstat(Chan* c, uchar* dp, int n)
82 return devstat(c, dp, n, archdir, narchdir, devgen);
86 archopen(Chan* c, int omode)
88 return devopen(c, omode, archdir, narchdir, devgen);
97 archread(Chan *c, void *a, long n, vlong offset)
101 switch((ulong)c->qid.path){
103 return devdirread(c, a, n, archdir, narchdir, devgen);
106 if(c->qid.path < narchdir && (fn = readfn[c->qid.path]))
107 return fn(c, a, n, offset);
116 archwrite(Chan *c, void *a, long n, vlong offset)
120 if(c->qid.path < narchdir && (fn = writefn[c->qid.path]))
121 return fn(c, a, n, offset);
151 cputyperead(Chan*, void *a, long n, vlong offset)
155 snprint(str, sizeof str, "ARM11 %d\n", m->cpumhz);
156 return readstr(offset, a, n, str);
162 addarchfile("cputype", 0444, cputyperead, nil);