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

📄 auth_rpc.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <auth.h>#include "authlocal.h"static struct {	char *verb;	int val;} tab[] = {	"ok",			ARok,	"done",		ARdone,	"error",		ARerror,	"needkey",	ARneedkey,	"badkey",		ARbadkey,	"phase",		ARphase,	"toosmall",	ARtoosmall,	"error",		ARerror,};static intclassify(char *buf, uint n, AuthRpc *rpc){	int i, len;	for(i=0; i<nelem(tab); i++){		len = strlen(tab[i].verb);		if(n >= len && memcmp(buf, tab[i].verb, len) == 0 && (n==len || buf[len]==' ')){			if(n==len){				rpc->narg = 0;				rpc->arg = "";			}else{				rpc->narg = n - (len+1);				rpc->arg = (char*)buf+len+1;			}			return tab[i].val;		}	}	werrstr("malformed rpc response: %s", buf);	return ARrpcfailure;}AuthRpc*auth_allocrpc(int afd){	AuthRpc *rpc;	rpc = mallocz(sizeof(*rpc), 1);	if(rpc == nil)		return nil;	rpc->afd = afd;	return rpc;}voidauth_freerpc(AuthRpc *rpc){	free(rpc);}uintauth_rpc(AuthRpc *rpc, char *verb, void *a, int na){	int l, n, type;	char *f[4];	l = strlen(verb);	if(na+l+1 > AuthRpcMax){		werrstr("rpc too big");		return ARtoobig;	}	memmove(rpc->obuf, verb, l);	rpc->obuf[l] = ' ';	memmove(rpc->obuf+l+1, a, na);	if((n=write(rpc->afd, rpc->obuf, l+1+na)) != l+1+na){		if(n >= 0)			werrstr("auth_rpc short write");		return ARrpcfailure;	}	if((n=read(rpc->afd, rpc->ibuf, AuthRpcMax)) < 0)		return ARrpcfailure;	rpc->ibuf[n] = '\0';	/*	 * Set error string for good default behavior.	 */	switch(type = classify(rpc->ibuf, n, rpc)){	default:		werrstr("unknown rpc type %d (bug in auth_rpc.c)", type);		break;	case ARok:		break;	case ARrpcfailure:		break;	case ARerror:		if(rpc->narg == 0)			werrstr("unspecified rpc error");		else			werrstr("%s", rpc->arg);		break;	case ARneedkey:		werrstr("needkey %s", rpc->arg);		break;	case ARbadkey:		if(getfields(rpc->arg, f, nelem(f), 0, "\n") < 2)			werrstr("badkey %s", rpc->arg);		else			werrstr("badkey %s", f[1]);		break;	case ARphase:		werrstr("phase error %s", rpc->arg);		break;	}	return type;}

⌨️ 快捷键说明

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