⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 devroot.c

📁 著名操作系统Plan 9的第三版的部分核心源代码。现在很难找到了。Plan 9是bell实验室开发的Unix后继者。
💻 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 + -