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

📄 dreq.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <auth.h>#include <fcall.h>#include <thread.h>#include <9p.h>#include "flashfs.h"static	Srv	flashsrv;typedef struct	State	State;struct State{	Entry	*e;	Dirr	*r;};#define	writeable(e)	((e)->mode & 0222)static State *state(Entry *e){	State *s;	s = emalloc9p(sizeof(State));	s->e = e;	s->r = nil;	return s;}static voiddestroy(Fid *f){	State *s;	s = f->aux;	if(s->e)		edestroy(s->e);	if(s->r)		edirclose(s->r);	free(s);}static voidtrace(Req *){	edump();}/** T_ **/static voidflattach(Req *r){	root->ref++;	r->ofcall.qid = eqid(root);	r->fid->aux = state(root);	respond(r, nil);}static voidflopen(Req *r){	int m, p;	Entry *e;	State *s;	s = r->fid->aux;	e = s->e;	m = e->mode;	m = (m | (m >> 3) | (m >> 6)) & 7;	switch(r->ifcall.mode & 3) {	case OREAD:		p = AREAD;		break;	case OWRITE:		p = AWRITE;		break;	case ORDWR:		p = AREAD|AWRITE;		break;	case OEXEC:		p = AEXEC;		break;	default:		p = 0;		break;	}	if((p & m) != p) {		respond(r, Eperm);		return;	}	if(readonly && (p & AWRITE) != 0) {		respond(r, Erofs);		return;	}	r->ofcall.qid = eqid(e);	if(r->ofcall.qid.type & QTDIR)		s->r = ediropen(s->e);	else if(r->ifcall.mode & OTRUNC)		etrunc(e, 0, time(0));	respond(r, nil);}static voidflcreate(Req *r){	State *s;	char *err;	Entry *e, *f;	if(readonly) {		respond(r, Erofs);		return;	}	s = r->fid->aux;	e = s->e;	if(!writeable(e)) {		respond(r, Eperm);		return;	}	f = ecreate(e, r->ifcall.name, 0, r->ifcall.perm, time(0), &err);	if(f == nil) {		respond(r, err);		return;	}	s->e = f;	r->ofcall.qid = eqid(f);	respond(r, nil);}static voidflread(Req *r){	Entry *e;	State *s;	s = r->fid->aux;	e = s->e;	if(e->mode & DMDIR)		r->ofcall.count = edirread(s->r, r->ofcall.data, r->ifcall.count);	else		r->ofcall.count = 0;	respond(r, nil);}static voidflwrite(Req *r){	if(r->ifcall.offset + r->ifcall.count >= MAXFSIZE) {		respond(r, "file too big");		return;	}	r->ofcall.count = r->ifcall.count;	respond(r, nil);}static voidflremove(Req *r){	State *s;	Entry *e;	if(readonly) {		respond(r, Erofs);		return;	}	s = r->fid->aux;	e = s->e;	if(writeable(e->parent))		respond(r, eremove(e));	else		respond(r, Eperm);}static voidflstat(Req *r){	State *s;	s = r->fid->aux;	estat(s->e, &r->d, 1);	respond(r, nil);}static voidflwstat(Req *r){	int m;	State *s;	Entry *e;	s = r->fid->aux;	e = s->e;	m = r->d.mode & 0777;	if(m != (e->mode & 0777))		echmod(e, m, 0);	respond(r, nil);}static voidflwalk(Req *r){	int i;	State *s;	char *err;	Entry *e, *f;	if(readonly) {		respond(r, Erofs);		return;	}	if(r->ifcall.fid != r->ifcall.newfid)		r->newfid->aux = state(nil);	s = r->fid->aux;	e = s->e;	f = e;	e->ref++;	err = nil;	for(i = 0; i < r->ifcall.nwname; i++) {		f = ewalk(e, r->ifcall.wname[i], &err);		if(f) {			r->ofcall.wqid[i] = eqid(f);			e = f;		}		else {			e->ref--;			break;		}	}	r->ofcall.nwqid = i;	if(f) {		if(r->ifcall.fid != r->ifcall.newfid) {			s = r->newfid->aux;			s->e = f;			r->newfid->qid = eqid(f);		}		else {			s = r->fid->aux;			s->e->ref--;			s->e = f;			r->fid->qid = eqid(f);		}	}	respond(r, err);}voidserve(char *mount){	flashsrv.attach = flattach;	flashsrv.open = flopen;	flashsrv.create = flcreate;	flashsrv.read = flread;	flashsrv.write = flwrite;	flashsrv.remove = flremove;	flashsrv.stat = flstat;	flashsrv.wstat = flwstat;	flashsrv.walk = flwalk;	flashsrv.destroyfid = destroy;	flashsrv.destroyreq = trace;	einit();	postmountsrv(&flashsrv, "brzr", mount, MREPL|MCREATE);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -