亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fsys.c

?? 這是一個同樣來自貝爾實驗室的和UNIX有著淵源的操作系統, 其簡潔的設計和實現易于我們學習和理解
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include <u.h>#include <libc.h>#include <bio.h>#include <regexp.h>#include <thread.h>#include <auth.h>#include <fcall.h>#include <plumb.h>#include "plumber.h"enum{	Stack = 8*1024};typedef struct Dirtab Dirtab;typedef struct Fid Fid;typedef struct Holdq Holdq;typedef struct Readreq Readreq;typedef struct Sendreq Sendreq;struct Dirtab{	char		*name;	uchar	type;	uint		qid;	uint		perm;	int		nopen;		/* #fids open on this port */	Fid		*fopen;	Holdq	*holdq;	Readreq	*readq;	Sendreq	*sendq;};struct Fid{	int		fid;	int		busy;	int		open;	int		mode;	Qid		qid;	Dirtab	*dir;	long		offset;		/* zeroed at beginning of each message, read or write */	char		*writebuf;		/* partial message written so far; offset tells how much */	Fid		*next;	Fid		*nextopen;};struct Readreq{	Fid		*fid;	Fcall		*fcall;	uchar	*buf;	Readreq	*next;};struct Sendreq{	int			nfid;		/* number of fids that should receive this message */	int			nleft;		/* number left that haven't received it */	Fid			**fid;	/* fid[nfid] */	Plumbmsg	*msg;	char			*pack;	/* plumbpack()ed message */	int			npack;	/* length of pack */	Sendreq		*next;};struct Holdq{	Plumbmsg	*msg;	Holdq		*next;};struct	/* needed because incref() doesn't return value */{	Lock;	int			ref;} rulesref;enum{	DEBUG	= 0,	NDIR	= 50,	Nhash	= 16,	Qdir		= 0,	Qrules	= 1,	Qsend	= 2,	Qport	= 3,	NQID	= Qport};static Dirtab dir[NDIR] ={	{ ".",			QTDIR,	Qdir,			0500|DMDIR },	{ "rules",		QTFILE,	Qrules,		0600 },	{ "send",		QTFILE,	Qsend,		0200 },};static int	ndir = NQID;static int		srvfd;static int		srvclosefd;			/* rock for end of pipe to close */static int		clockfd;static int		clock;static Fid		*fids[Nhash];static QLock	readlock;static QLock	queue;static char	srvfile[128];static int		messagesize = 8192+IOHDRSZ;	/* good start */static void	fsysproc(void*);static void fsysrespond(Fcall*, uchar*, char*);static Fid*	newfid(int);static Fcall* fsysflush(Fcall*, uchar*, Fid*);static Fcall* fsysversion(Fcall*, uchar*, Fid*);static Fcall* fsysauth(Fcall*, uchar*, Fid*);static Fcall* fsysattach(Fcall*, uchar*, Fid*);static Fcall* fsyswalk(Fcall*, uchar*, Fid*);static Fcall* fsysopen(Fcall*, uchar*, Fid*);static Fcall* fsyscreate(Fcall*, uchar*, Fid*);static Fcall* fsysread(Fcall*, uchar*, Fid*);static Fcall* fsyswrite(Fcall*, uchar*, Fid*);static Fcall* fsysclunk(Fcall*, uchar*, Fid*);static Fcall* fsysremove(Fcall*, uchar*, Fid*);static Fcall* fsysstat(Fcall*, uchar*, Fid*);static Fcall* fsyswstat(Fcall*, uchar*, Fid*);Fcall* 	(*fcall[Tmax])(Fcall*, uchar*, Fid*) ={	[Tflush]	= fsysflush,	[Tversion]	= fsysversion,	[Tauth]	= fsysauth,	[Tattach]	= fsysattach,	[Twalk]	= fsyswalk,	[Topen]	= fsysopen,	[Tcreate]	= fsyscreate,	[Tread]	= fsysread,	[Twrite]	= fsyswrite,	[Tclunk]	= fsysclunk,	[Tremove]= fsysremove,	[Tstat]	= fsysstat,	[Twstat]	= fsyswstat,};char	Ebadfcall[] =	"bad fcall type";char	Eperm[] = 	"permission denied";char	Enomem[] =	"malloc failed for buffer";char	Enotdir[] =	"not a directory";char	Enoexist[] =	"plumb file does not exist";char	Eisdir[] =		"file is a directory";char	Ebadmsg[] =	"bad plumb message format";char Enosuchport[] ="no such plumb port";char Enoport[] =	"couldn't find destination for message";char	Einuse[] = 	"file already open";/* * Add new port.  A no-op if port already exists or is the null string */voidaddport(char *port){	int i;	if(port == nil)		return;	for(i=NQID; i<ndir; i++)		if(strcmp(port, dir[i].name) == 0)			return;	if(i == NDIR){		fprint(2, "plumb: too many ports; max %d\n", NDIR);		return;	}	ndir++;	dir[i].name = estrdup(port);	dir[i].qid = i;	dir[i].perm = 0400;	nports++;	ports = erealloc(ports, nports*sizeof(char*));	ports[nports-1] = dir[i].name;}static ulonggetclock(void){	char buf[32];	seek(clockfd, 0, 0);	read(clockfd, buf, sizeof buf);	return atoi(buf);}voidstartfsys(void){	int p[2], fd;	fmtinstall('F', fcallfmt);	clockfd = open("/dev/time", OREAD|OCEXEC);	clock = getclock();	if(pipe(p) < 0)		error("can't create pipe: %r");	/* 0 will be server end, 1 will be client end */	srvfd = p[0];	srvclosefd = p[1];	sprint(srvfile, "/srv/plumb.%s.%d", user, getpid());	if(putenv("plumbsrv", srvfile) < 0)		error("can't write $plumbsrv: %r");	fd = create(srvfile, OWRITE|OCEXEC|ORCLOSE, 0600);	if(fd < 0)		error("can't create /srv file: %r");	if(fprint(fd, "%d", p[1]) <= 0)		error("can't write /srv/file: %r");	/* leave fd open; ORCLOSE will take care of it */	procrfork(fsysproc, nil, Stack, RFFDG);	close(p[0]);	if(mount(p[1], -1, "/mnt/plumb", MREPL, "") < 0)		error("can't mount /mnt/plumb: %r");	close(p[1]);}static voidfsysproc(void*){	int n;	Fcall *t;	Fid *f;	uchar *buf;	close(srvclosefd);	srvclosefd = -1;	t = nil;	for(;;){		buf = malloc(messagesize);	/* avoid memset of emalloc */		if(buf == nil)			error("malloc failed: %r");		qlock(&readlock);		n = read9pmsg(srvfd, buf, messagesize);		if(n <= 0){			if(n < 0)				error("i/o error on server channel");			threadexitsall("unmounted");		}		if(readlock.head == nil)	/* no other processes waiting to read; start one */			proccreate(fsysproc, nil, Stack);		qunlock(&readlock);		if(t == nil)			t = emalloc(sizeof(Fcall));		if(convM2S(buf, n, t) != n)			error("convert error in convM2S");		if(DEBUG)			fprint(2, "<= %F\n", t);		if(fcall[t->type] == nil)			fsysrespond(t, buf, Ebadfcall);		else{			if(t->type==Tversion || t->type==Tauth)				f = nil;			else				f = newfid(t->fid);			t = (*fcall[t->type])(t, buf, f);		}	}}static voidfsysrespond(Fcall *t, uchar *buf, char *err){	int n;	if(err){		t->type = Rerror;		t->ename = err;	}else		t->type++;	if(buf == nil)		buf = emalloc(messagesize);	n = convS2M(t, buf, messagesize);	if(n < 0)		error("convert error in convS2M");	if(write(srvfd, buf, n) != n)		error("write error in respond");	if(DEBUG)		fprint(2, "=> %F\n", t);	free(buf);}staticFid*newfid(int fid){	Fid *f, *ff, **fh;	qlock(&queue);	ff = nil;	fh = &fids[fid&(Nhash-1)];	for(f=*fh; f; f=f->next)		if(f->fid == fid)			goto Return;		else if(ff==nil && !f->busy)			ff = f;	if(ff){		ff->fid = fid;		f = ff;		goto Return;	}	f = emalloc(sizeof *f);	f->fid = fid;	f->next = *fh;	*fh = f;    Return:	qunlock(&queue);	return f;}static uintdostat(Dirtab *dir, uchar *buf, uint nbuf, uint clock){	Dir d;	d.qid.type = dir->type;	d.qid.path = dir->qid;	d.qid.vers = 0;	d.mode = dir->perm;	d.length = 0;	/* would be nice to do better */	d.name = dir->name;	d.uid = user;	d.gid = user;	d.muid = user;	d.atime = clock;	d.mtime = clock;	return convD2M(&d, buf, nbuf);}static voidqueuesend(Dirtab *d, Plumbmsg *m){	Sendreq *s, *t;	Fid *f;	int i;	s = emalloc(sizeof(Sendreq));	s->nfid = d->nopen;	s->nleft = s->nfid;	s->fid = emalloc(s->nfid*sizeof(Fid*));	i = 0;	/* build array of fids open on this channel */	for(f=d->fopen; f!=nil; f=f->nextopen)		s->fid[i++] = f;	s->msg = m;	s->next = nil;	/* link to end of queue; drainqueue() searches in sender order so this implements a FIFO */	for(t=d->sendq; t!=nil; t=t->next)		if(t->next == nil)			break;	if(t == nil)		d->sendq = s;	else		t->next = s;}static voidqueueread(Dirtab *d, Fcall *t, uchar *buf, Fid *f){	Readreq *r;	r = emalloc(sizeof(Readreq));	r->fcall = t;	r->buf = buf;	r->fid = f;	r->next = d->readq;	d->readq = r;}static voiddrainqueue(Dirtab *d){	Readreq *r, *nextr, *prevr;	Sendreq *s, *nexts, *prevs;	int i, n;	prevs = nil;	for(s=d->sendq; s!=nil; s=nexts){		nexts = s->next;		for(i=0; i<s->nfid; i++){			prevr = nil;			for(r=d->readq; r!=nil; r=nextr){				nextr = r->next;				if(r->fid == s->fid[i]){					/* pack the message if necessary */					if(s->pack == nil)						s->pack = plumbpack(s->msg, &s->npack);					/* exchange the stuff... */					r->fcall->data = s->pack+r->fid->offset;					n = s->npack - r->fid->offset;					if(n > messagesize-IOHDRSZ)						n = messagesize-IOHDRSZ;					if(n > r->fcall->count)						n = r->fcall->count;					r->fcall->count = n;					fsysrespond(r->fcall, r->buf, nil);					r->fid->offset += n;					if(r->fid->offset >= s->npack){						/* message transferred; delete this fid from send queue */						r->fid->offset = 0;						s->fid[i] = nil;						s->nleft--;					}					/* delete read request from queue */					if(prevr)						prevr->next = r->next;					else						d->readq = r->next;					free(r->fcall);					free(r);					break;				}else					prevr = r;			}		}		/* if no fids left, delete this send from queue */		if(s->nleft == 0){			free(s->fid);			plumbfree(s->msg);			free(s->pack);			if(prevs)				prevs->next = s->next;			else				d->sendq = s->next;			free(s);		}else			prevs = s;	}}/* can't flush a send because they are always answered synchronously */static voidflushqueue(Dirtab *d, int oldtag){	Readreq *r, *prevr;	prevr = nil;	for(r=d->readq; r!=nil; r=r->next){		if(oldtag == r->fcall->tag){			/* delete read request from queue */			if(prevr)				prevr->next = r->next;			else				d->readq = r->next;			free(r->fcall);			free(r->buf);			free(r);			return;		}		prevr = r;	}}/* remove messages awaiting delivery to now-closing fid */static voidremovesenders(Dirtab *d, Fid *fid){	Sendreq *s, *nexts, *prevs;	int i;	prevs = nil;	for(s=d->sendq; s!=nil; s=nexts){		nexts = s->next;		for(i=0; i<s->nfid; i++)			if(fid == s->fid[i]){				/* delete this fid from send queue */				s->fid[i] = nil;				s->nleft--;				break;			}		/* if no fids left, delete this send from queue */		if(s->nleft == 0){			free(s->fid);			plumbfree(s->msg);			free(s->pack);			if(prevs)				prevs->next = s->next;			else				d->sendq = s->next;			free(s);		}else			prevs = s;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美大片在线观看| 欧美在线观看视频在线| 亚洲v精品v日韩v欧美v专区| 亚洲色图.com| 一区二区三区在线视频播放| 亚洲美女区一区| 一区二区三区欧美日韩| 一区二区三区丝袜| 天天综合网天天综合色| 日日夜夜免费精品视频| 麻豆精品国产91久久久久久| 蜜桃av噜噜一区| 国产成人免费在线视频| 国产成人高清在线| 色婷婷久久久久swag精品| 在线免费观看日本欧美| 欧美一区在线视频| 久久色视频免费观看| 亚洲国产激情av| 亚洲国产婷婷综合在线精品| 三级欧美在线一区| 国产精品一二三在| 一本一道久久a久久精品| 欧美另类高清zo欧美| www成人在线观看| 亚洲最快最全在线视频| 久久99精品久久久久久动态图 | 8x8x8国产精品| 精品电影一区二区| 中文字幕一区二区在线播放| 亚洲自拍偷拍av| 国产原创一区二区| 91福利国产成人精品照片| 精品国产一区二区亚洲人成毛片 | 久久综合久色欧美综合狠狠| 亚洲欧美在线aaa| 蜜桃视频第一区免费观看| av资源网一区| 精品免费国产一区二区三区四区| 中文字幕中文乱码欧美一区二区 | 一区二区激情小说| 精彩视频一区二区| 欧美性xxxxxxxx| 国产精品色哟哟| 狠狠色丁香久久婷婷综合_中| 91福利视频久久久久| 国产日韩精品一区二区三区| 日韩精品1区2区3区| 色婷婷综合久久久中文一区二区| 精品国产伦一区二区三区免费| 亚洲欧美日韩国产手机在线| 国产不卡免费视频| 久久亚洲一区二区三区四区| 日韩精品午夜视频| 色天使色偷偷av一区二区| 欧美国产成人精品| 国产中文一区二区三区| 欧美电影在哪看比较好| 一个色综合网站| 91热门视频在线观看| 欧美国产丝袜视频| 国产福利一区在线观看| 精品电影一区二区三区| 韩国理伦片一区二区三区在线播放| 在线视频国内一区二区| 《视频一区视频二区| 丁香婷婷综合激情五月色| 亚洲精品一区二区三区在线观看| 日韩在线一二三区| 6080国产精品一区二区| 丝袜美腿亚洲一区二区图片| 欧美女孩性生活视频| 日韩中文字幕亚洲一区二区va在线 | 丝袜美腿高跟呻吟高潮一区| 欧美亚洲图片小说| 亚洲一区二区三区三| 欧美亚洲国产一区二区三区va| 亚洲色图欧洲色图婷婷| 色婷婷av一区二区| 丝袜美腿亚洲色图| 日韩午夜小视频| 韩国精品在线观看| 亚洲国产高清aⅴ视频| 99在线热播精品免费| 亚洲色图20p| 欧美日韩视频在线第一区 | 欧美精品一区二区三区一线天视频 | 亚洲色图制服诱惑| 色乱码一区二区三区88| 夜夜爽夜夜爽精品视频| 欧美一区二区三区在线| 久久激情综合网| 国产日韩欧美电影| 一本大道久久精品懂色aⅴ| 亚洲午夜视频在线观看| 日韩一区二区视频| 国产精品一卡二| 亚洲精品国产一区二区精华液| 欧美日本一区二区| 国产麻豆成人精品| 亚洲日本一区二区三区| 日韩午夜激情电影| 成人免费观看男女羞羞视频| 亚洲人吸女人奶水| 精品久久久久久最新网址| 波多野结衣在线一区| 亚洲一区二区三区四区中文字幕| 欧美一区二区三区四区在线观看| 国产99久久久国产精品潘金| 亚洲综合一区二区精品导航| 欧美xxxxx牲另类人与| 99久久久久免费精品国产| 肉色丝袜一区二区| 亚洲婷婷综合色高清在线| 欧美大黄免费观看| 色香蕉成人二区免费| 久久精品国产秦先生| 伊人开心综合网| 国产欧美日韩精品在线| 欧美日韩国产经典色站一区二区三区 | 亚洲乱码国产乱码精品精的特点 | 欧美xxxxx牲另类人与| 91亚洲国产成人精品一区二区三| 蜜桃传媒麻豆第一区在线观看| 亚洲三级在线免费观看| 26uuu久久天堂性欧美| 欧美性生活大片视频| 国产不卡高清在线观看视频| 蜜桃一区二区三区在线| 国产精品久久一级| 久久免费精品国产久精品久久久久| 欧美中文一区二区三区| 国产成人精品一区二区三区网站观看| 亚洲国产视频在线| 一区二区三区四区激情| 中文字幕永久在线不卡| 久久久久久9999| 久久亚洲精品国产精品紫薇| 91精品国产欧美一区二区18 | 91一区二区三区在线观看| 精品中文av资源站在线观看| 日本中文字幕一区二区有限公司| 亚洲免费在线视频一区 二区| 国产精品入口麻豆原神| 国产亚洲综合在线| 久久夜色精品国产噜噜av| 欧美精品一区二区蜜臀亚洲| 欧美一区二区三区不卡| 91精品国产综合久久久久| 在线免费一区三区| 欧美性生活久久| 欧美少妇一区二区| 欧美男人的天堂一二区| 91精品国产一区二区| 欧美一级在线观看| 精品免费视频一区二区| 久久精品一区蜜桃臀影院| 久久久久久久久岛国免费| 国产日本亚洲高清| 中文字幕乱码亚洲精品一区| 国产精品久久久久久久久久久免费看 | 亚洲精品中文字幕在线观看| 成人免费在线播放视频| 中文字幕在线不卡| 一区二区三区毛片| 免费看日韩精品| 国产高清精品网站| 色94色欧美sute亚洲13| 欧美二区乱c少妇| 久久久久成人黄色影片| 亚洲欧美日韩在线| 亚洲成人福利片| 国产一区二区三区国产| 国产成人丝袜美腿| 色94色欧美sute亚洲线路二| 91精品国产高清一区二区三区蜜臀| 亚洲精品在线观看视频| 国产精品初高中害羞小美女文| 亚洲超碰精品一区二区| 久久精品国产精品青草| 波多野结衣欧美| 3d成人动漫网站| 国产成人免费在线视频| 国产专区综合网| av不卡在线播放| 欧美精品在线一区二区三区| 6080国产精品一区二区| 欧美成人高清电影在线| 亚洲免费高清视频在线| 极品美女销魂一区二区三区| 国产成人午夜99999| 欧美在线三级电影| 国产欧美日韩三级| 偷拍日韩校园综合在线| 成人午夜电影久久影院| 欧美精品丝袜中出| 国产精品毛片高清在线完整版 | 久久婷婷综合激情| 一区二区三区 在线观看视频| 国模一区二区三区白浆|