📄 devroot.c
字号:
#include "u.h"#include "../port/lib.h"#include "mem.h"#include "dat.h"#include "fns.h"#include "../port/error.h"enum{ Qdir= 0, Nfiles=32, /* max root files */};extern ulong bootlen;extern uchar bootcode[];Dirtab rootdir[Nfiles];static uchar *rootdata[Nfiles];static int nroot = 0;typedef struct Recover Recover;struct Recover{ int len; char *req; Recover *next;};struct{ Lock; QLock; Rendez; Recover *q;}reclist;/* * add a root file */static voidaddroot(char *name, uchar *contents, ulong len, int perm){ Dirtab *d; if(nroot >= Nfiles) panic("too many root files"); rootdata[nroot] = contents; d = &rootdir[nroot]; strcpy(d->name, name); d->length = len; d->perm = perm; d->qid.path = nroot+1; if(perm & CHDIR) d->qid.path |= CHDIR; nroot++;}/* * add a root file */voidaddrootfile(char *name, uchar *contents, ulong len){ addroot(name, contents, len, 0555);}/* * add a root file */static voidaddrootdir(char *name){ addroot(name, nil, 0, CHDIR|0555);}static voidrootreset(void){ addrootdir("bin"); addrootdir("dev"); addrootdir("env"); addrootdir("net"); addrootdir("net.alt"); addrootdir("proc"); addrootdir("root"); addrootdir("srv"); addrootfile("boot", bootcode, bootlen); /* always have a boot file */}static Chan*rootattach(char *spec){ return devattach('/', spec);}static introotwalk(Chan *c, char *name){ if(strcmp(name, "..") == 0) { c->qid.path = Qdir|CHDIR; return 1; } if((c->qid.path & ~CHDIR) != Qdir) return 0; return devwalk(c, name, rootdir, nroot, devgen);}static voidrootstat(Chan *c, char *dp){ devstat(c, dp, rootdir, nroot, devgen);}static Chan*rootopen(Chan *c, int omode){ switch(c->qid.path & ~CHDIR) { default: break; } return devopen(c, omode, rootdir, nroot, devgen);}/* * sysremove() knows this is a nop */static voidrootclose(Chan *c){ switch(c->qid.path) { default: break; }}static intrdrdy(void*){ return reclist.q != 0;}static longrootread(Chan *c, void *buf, long n, vlong off){ ulong t; Dirtab *d; uchar *data; ulong offset = off; t = c->qid.path & ~CHDIR; switch(t){ case Qdir: return devdirread(c, buf, n, rootdir, nroot, devgen); } d = &rootdir[t-1]; data = rootdata[t-1]; if(offset >= d->length) return 0; if(offset+n > d->length) n = d->length - offset; memmove(buf, data+offset, n); return n;}static longrootwrite(Chan *c, void*, long, vlong){ switch(c->qid.path & ~CHDIR){ default: error(Egreg); } return 0;}static voidrootcreate(Chan *c, char *name, int mode, ulong perm){ if(!iseve() || c->qid.path != (CHDIR|Qdir) || (perm & CHDIR) == 0 || mode != OREAD) error(Eperm); addrootdir(name); c->flag |= COPEN; c->mode = OREAD;}Dev rootdevtab = { '/', "root", rootreset, devinit, rootattach, devclone, rootwalk, rootstat, rootopen, rootcreate, rootclose, rootread, devbread, rootwrite, devbwrite, devremove, devwstat,};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -