portmapper.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 171 行

C
171
字号
#include "all.h"typedef struct Portmap	Portmap;struct Portmap{	int	prog;	int	vers;	int	protocol;	int	port;};Portmap map[] = {	100003, 2, IPPROTO_UDP, 2049,	/* nfs *///	100003, 3, IPPROTO_UDP, 2049,	/* nfs */	100005, 1, IPPROTO_UDP, 2049,	/* mount */	150001, 2, IPPROTO_UDP, 1111,	/* pcnfsd v2 */	150001, 1, IPPROTO_UDP, 1111,	/* pcnfsd v1 */	0, 0, 0, 0,};static void	pmapinit(int, char**);static int	pmapnull(int, Rpccall*, Rpccall*);static int	pmapset(int, Rpccall*, Rpccall*);static int	pmapunset(int, Rpccall*, Rpccall*);static int	pmapgetport(int, Rpccall*, Rpccall*);static int	pmapdump(int, Rpccall*, Rpccall*);static int	pmapcallit(int, Rpccall*, Rpccall*);static Procmap pmapproc[] = {	0, pmapnull,	1, pmapset,	2, pmapunset,	3, pmapgetport,	4, pmapdump,	5, pmapcallit,	0, 0};int	myport = 111;Progmap progmap[] = {	100000, 2, pmapinit, pmapproc,	0, 0, 0,};voidmain(int argc, char *argv[]){	server(argc, argv, myport, progmap);}staticvoidpmapinit(int argc, char **argv){	ARGBEGIN{	default:		if(argopt(ARGC()) < 0)			sysfatal("usage: %s %s", argv0, commonopts);		break;	}ARGEND;	clog("portmapper init\n");}static intpmapnull(int n, Rpccall *cmd, Rpccall *reply){	USED(n, cmd, reply);	return 0;}static intpmapset(int n, Rpccall *cmd, Rpccall *reply){	uchar *dataptr = reply->results;	if(n != 16)		return garbage(reply, "bad count");	USED(cmd);	PLONG(FALSE);	return dataptr - (uchar *)reply->results;}static intpmapunset(int n, Rpccall *cmd, Rpccall *reply){	uchar *dataptr = reply->results;	if(n != 16)		return garbage(reply, "bad count");	USED(cmd);	PLONG(TRUE);	return dataptr - (uchar *)reply->results;}static intpmapgetport(int n, Rpccall *cmd, Rpccall *reply){	int prog, vers, prot;	uchar *argptr = cmd->args;	uchar *dataptr = reply->results;	Portmap *mp;	clog("get port\n");	if(n != 16)		return garbage(reply, "bad count");	prog = GLONG();	vers = GLONG();	prot = GLONG();	chat("host=%I, port=%ld: ", cmd->host, cmd->port);	chat("getport: %d, %d, %d...", prog, vers, prot);	for(mp=map; mp->prog>0; mp++)		if(prog == mp->prog && vers == mp->vers &&		   prot == mp->protocol)			break;	chat("%d\n", mp->port);	PLONG(mp->port);	return dataptr - (uchar *)reply->results;}static intpmapdump(int n, Rpccall *cmd, Rpccall *reply){	uchar *dataptr = reply->results;	Portmap *mp;	if(n != 0)		return garbage(reply, "bad count");	USED(cmd);	for(mp=map; mp->prog>0; mp++){		PLONG(1);		PLONG(mp->prog);		PLONG(mp->vers);		PLONG(mp->protocol);		PLONG(mp->port);	}	PLONG(0);	return dataptr - (uchar *)reply->results;}static intpmapcallit(int n, Rpccall *cmd, Rpccall *reply){	int prog, vers, proc;	uchar *argptr = cmd->args;	uchar *dataptr = reply->results;	Portmap *mp;	if(n < 12)		return garbage(reply, "bad count");	prog = GLONG();	vers = GLONG();	proc = GLONG();	chat("host=%I, port=%ld: ", cmd->host, cmd->port);	chat("callit: %d, %d, %d...", prog, vers, proc);	for(mp=map; mp->prog>0; mp++)		if(prog == mp->prog && vers == mp->vers &&		   proc == 0)			break;	if(mp->port == 0){		chat("ignored\n");		return -1;	}	chat("%d\n", mp->port);	PLONG(mp->port);	PLONG(0);	return dataptr - (uchar *)reply->results;}

⌨️ 快捷键说明

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