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

📄 portmapper.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -