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

📄 _fcall.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include	<string.h>#include	"sys9.h"#include	"lib.h"#include	"dir.h"#include	"fcall.h"typedef unsigned char uchar;#define	CHAR(x)		*p++ = f->x#define	SHORT(x)	p[0] = f->x; p[1] = f->x>>8; p += 2#define	LONG(x)		p[0] = f->x; p[1] = f->x>>8; p[2] = f->x>>16; p[3] = f->x>>24; p += 4#define	VLONG(x)	p[0] = f->x; p[1] = f->x>>8; p[2] = f->x>>16; p[3] = f->x>>24;\				p[4] = 0; p[5] = 0; p[6] = 0; p[7] = 0; p += 8#define	STRING(x,n)	memcpy(p, f->x, n); p += nintconvS2M(Fcall *f, char *ap){	uchar *p;	p = (uchar*)ap;	CHAR(type);	SHORT(tag);	switch(f->type)	{	default:		return 0;	case Tosession:	case Tnop:		break;	case Tsession:		STRING(chal, sizeof(f->chal));		break;	case Tflush:		SHORT(oldtag);		break;	case Tattach:		SHORT(fid);		STRING(uname, sizeof(f->uname));		STRING(aname, sizeof(f->aname));		STRING(ticket, sizeof(f->ticket));		STRING(auth, sizeof(f->auth));		break;	case Toattach:		SHORT(fid);		STRING(uname, sizeof(f->uname));		STRING(aname, sizeof(f->aname));		STRING(ticket, NAMELEN);		break;	case Tauth:		SHORT(fid);		STRING(uname, sizeof(f->uname));		STRING(ticket, 8+NAMELEN);		break;	case Tclone:		SHORT(fid);		SHORT(newfid);		break;	case Twalk:		SHORT(fid);		STRING(name, sizeof(f->name));		break;	case Topen:		SHORT(fid);		CHAR(mode);		break;	case Tcreate:		SHORT(fid);		STRING(name, sizeof(f->name));		LONG(perm);		CHAR(mode);		break;	case Tread:		SHORT(fid);		VLONG(offset);		SHORT(count);		break;	case Twrite:		SHORT(fid);		VLONG(offset);		SHORT(count);		p++;	/* pad(1) */		STRING(data, f->count);		break;	case Tclunk:		SHORT(fid);		break;	case Tremove:		SHORT(fid);		break;	case Tstat:		SHORT(fid);		break;	case Twstat:		SHORT(fid);		STRING(stat, sizeof(f->stat));		break;	case Tclwalk:		SHORT(fid);		SHORT(newfid);		STRING(name, sizeof(f->name));		break;/* */	case Rosession:	case Rnop:		break;	case Rsession:		STRING(chal, sizeof(f->chal));		STRING(authid, sizeof(f->authid));		STRING(authdom, sizeof(f->authdom));		break;	case Rerror:		STRING(ename, sizeof(f->ename));		break;	case Rflush:		break;	case Rattach:		SHORT(fid);		LONG(qid.path);		LONG(qid.vers);		STRING(rauth, sizeof(f->rauth));		break;	case Roattach:		SHORT(fid);		LONG(qid.path);		LONG(qid.vers);		break;	case Rauth:		SHORT(fid);		STRING(ticket, 8+8+7+7);		break;	case Rclone:		SHORT(fid);		break;	case Rwalk:	case Rclwalk:		SHORT(fid);		LONG(qid.path);		LONG(qid.vers);		break;	case Ropen:		SHORT(fid);		LONG(qid.path);		LONG(qid.vers);		break;	case Rcreate:		SHORT(fid);		LONG(qid.path);		LONG(qid.vers);		break;	case Rread:		SHORT(fid);		SHORT(count);		p++;	/* pad(1) */		STRING(data, f->count);		break;	case Rwrite:		SHORT(fid);		SHORT(count);		break;	case Rclunk:		SHORT(fid);		break;	case Rremove:		SHORT(fid);		break;	case Rstat:		SHORT(fid);		STRING(stat, sizeof(f->stat));		break;	case Rwstat:		SHORT(fid);		break;	}	return p - (uchar*)ap;}#undef	CHAR#undef	SHORT#undef	LONG#undef	VLONG#undef	STRING#define	CHAR(x)		f->x = *p++#define	SHORT(x)	f->x = (p[0] | (p[1]<<8)); p += 2#define	LONG(x)		f->x = (p[0] | (p[1]<<8) |\				(p[2]<<16) | (p[3]<<24)); p += 4#define	VLONG(x)	f->x = (p[0] | (p[1]<<8) |\				(p[2]<<16) | (p[3]<<24)); p += 8#define	STRING(x,n)	memcpy(f->x, p, n); p += nintconvM2S(char *ap, Fcall *f, int n){	uchar *p;	p = (uchar*)ap;	CHAR(type);	SHORT(tag);	switch(f->type)	{	default:		return 0;	case Tnop:	case Tosession:		break;	case Tsession:		STRING(chal, sizeof(f->chal));		break;	case Tflush:		SHORT(oldtag);		break;	case Tattach:		SHORT(fid);		STRING(uname, sizeof(f->uname));		STRING(aname, sizeof(f->aname));		STRING(ticket, sizeof(f->ticket));		STRING(auth, sizeof(f->auth));		break;	case Toattach:		SHORT(fid);		STRING(uname, sizeof(f->uname));		STRING(aname, sizeof(f->aname));		STRING(ticket, NAMELEN);		break;	case Tauth:		SHORT(fid);		STRING(uname, sizeof(f->uname));		STRING(ticket, 8+NAMELEN);		break;	case Tclone:		SHORT(fid);		SHORT(newfid);		break;	case Twalk:		SHORT(fid);		STRING(name, sizeof(f->name));		break;	case Topen:		SHORT(fid);		CHAR(mode);		break;	case Tcreate:		SHORT(fid);		STRING(name, sizeof(f->name));		LONG(perm);		CHAR(mode);		break;	case Tread:		SHORT(fid);		VLONG(offset);		SHORT(count);		break;	case Twrite:		SHORT(fid);		VLONG(offset);		SHORT(count);		p++;	/* pad(1) */		f->data = (char*)p; p += f->count;		break;	case Tclunk:		SHORT(fid);		break;	case Tremove:		SHORT(fid);		break;	case Tstat:		SHORT(fid);		break;	case Twstat:		SHORT(fid);		STRING(stat, sizeof(f->stat));		break;	case Tclwalk:		SHORT(fid);		SHORT(newfid);		STRING(name, sizeof(f->name));		break;/* */	case Rnop:	case Rosession:		break;	case Rsession:		STRING(chal, sizeof(f->chal));		STRING(authid, sizeof(f->authid));		STRING(authdom, sizeof(f->authdom));		break;	case Rerror:		STRING(ename, sizeof(f->ename));		break;	case Rflush:		break;	case Rattach:		SHORT(fid);		LONG(qid.path);		LONG(qid.vers);		STRING(rauth, sizeof(f->rauth));		break;	case Roattach:		SHORT(fid);		LONG(qid.path);		LONG(qid.vers);		break;	case Rauth:		SHORT(fid);		STRING(ticket, 8+8+7+7);		break;	case Rclone:		SHORT(fid);		break;	case Rwalk:	case Rclwalk:		SHORT(fid);		LONG(qid.path);		LONG(qid.vers);		break;	case Ropen:		SHORT(fid);		LONG(qid.path);		LONG(qid.vers);		break;	case Rcreate:		SHORT(fid);		LONG(qid.path);		LONG(qid.vers);		break;	case Rread:		SHORT(fid);		SHORT(count);		p++;	/* pad(1) */		f->data = (char*)p; p += f->count;		break;	case Rwrite:		SHORT(fid);		SHORT(count);		break;	case Rclunk:		SHORT(fid);		break;	case Rremove:		SHORT(fid);		break;	case Rstat:		SHORT(fid);		STRING(stat, sizeof(f->stat));		break;	case Rwstat:		SHORT(fid);		break;	}	if((uchar*)ap+n == p)		return n;	return 0;}

⌨️ 快捷键说明

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