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

📄 portmap.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <thread.h>#include <sunrpc.h>static voidportMapPrint(Fmt *fmt, PortMap *x){	fmtprint(fmt, "[%ud %ud %ud %ud]", x->prog, x->vers, x->prot, x->port);}static uintportMapSize(PortMap *x){	uint a;	USED(x);	a = 0 + 4 + 4 + 4 + 4;	return a;}static intportMapPack(uchar *a, uchar *ea, uchar **pa, PortMap *x){	if(sunUint32Pack(a, ea, &a, &x->prog) < 0) goto Err;	if(sunUint32Pack(a, ea, &a, &x->vers) < 0) goto Err;	if(sunUint32Pack(a, ea, &a, &x->prot) < 0) goto Err;	if(sunUint32Pack(a, ea, &a, &x->port) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static intportMapUnpack(uchar *a, uchar *ea, uchar **pa, PortMap *x){	if(sunUint32Unpack(a, ea, &a, &x->prog) < 0) goto Err;	if(sunUint32Unpack(a, ea, &a, &x->vers) < 0) goto Err;	if(sunUint32Unpack(a, ea, &a, &x->prot) < 0) goto Err;	if(sunUint32Unpack(a, ea, &a, &x->port) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static voidportTNullPrint(Fmt *fmt, PortTNull *x){	USED(x);	fmtprint(fmt, "%s", "PortTNull");}static uintportTNullSize(PortTNull *x){	uint a;	USED(x);	a = 0;	return a;}static intportTNullPack(uchar *a, uchar *ea, uchar **pa, PortTNull *x){	USED(ea);	USED(x);	*pa = a;	return 0;}static intportTNullUnpack(uchar *a, uchar *ea, uchar **pa, PortTNull *x){	USED(ea);	USED(x);	*pa = a;	return 0;}static voidportRNullPrint(Fmt *fmt, PortRNull *x){	USED(x);	fmtprint(fmt, "%s", "PortRNull");}static uintportRNullSize(PortRNull *x){	uint a;	USED(x);	a = 0;	return a;}static intportRNullPack(uchar *a, uchar *ea, uchar **pa, PortRNull *x){	USED(ea);	USED(x);	*pa = a;	return 0;}static intportRNullUnpack(uchar *a, uchar *ea, uchar **pa, PortRNull *x){	USED(ea);	USED(x);	*pa = a;	return 0;}static voidportTSetPrint(Fmt *fmt, PortTSet *x){	fmtprint(fmt, "PortTSet ");	portMapPrint(fmt, &x->map);}static uintportTSetSize(PortTSet *x){	uint a;	USED(x);	a = 0 + portMapSize(&x->map);	return a;}static intportTSetPack(uchar *a, uchar *ea, uchar **pa, PortTSet *x){	if(portMapPack(a, ea, &a, &x->map) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static intportTSetUnpack(uchar *a, uchar *ea, uchar **pa, PortTSet *x){	if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static voidportRSetPrint(Fmt *fmt, PortRSet *x){	fmtprint(fmt, "PortRSet %ud", x->b);}static uintportRSetSize(PortRSet *x){	uint a;	USED(x);	a = 0 + 4;	return a;}static intportRSetPack(uchar *a, uchar *ea, uchar **pa, PortRSet *x){	if(sunUint1Pack(a, ea, &a, &x->b) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static intportRSetUnpack(uchar *a, uchar *ea, uchar **pa, PortRSet *x){	if(sunUint1Unpack(a, ea, &a, &x->b) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static voidportTUnsetPrint(Fmt *fmt, PortTUnset *x){	fmtprint(fmt, "PortTUnset ");	portMapPrint(fmt, &x->map);}static uintportTUnsetSize(PortTUnset *x){	uint a;	USED(x);	a = 0 + portMapSize(&x->map);	return a;}static intportTUnsetPack(uchar *a, uchar *ea, uchar **pa, PortTUnset *x){	if(portMapPack(a, ea, &a, &x->map) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static intportTUnsetUnpack(uchar *a, uchar *ea, uchar **pa, PortTUnset *x){	if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static voidportRUnsetPrint(Fmt *fmt, PortRUnset *x){	fmtprint(fmt, "PortRUnset %ud", x->b);}static uintportRUnsetSize(PortRUnset *x){	uint a;	USED(x);	a = 0 + 4;	return a;}static intportRUnsetPack(uchar *a, uchar *ea, uchar **pa, PortRUnset *x){	if(sunUint1Pack(a, ea, &a, &x->b) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static intportRUnsetUnpack(uchar *a, uchar *ea, uchar **pa, PortRUnset *x){	if(sunUint1Unpack(a, ea, &a, &x->b) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static voidportTGetportPrint(Fmt *fmt, PortTGetport *x){	fmtprint(fmt, "PortTGetport ");	portMapPrint(fmt, &x->map);}static uintportTGetportSize(PortTGetport *x){	uint a;	USED(x);	a = 0 + portMapSize(&x->map);	return a;}static intportTGetportPack(uchar *a, uchar *ea, uchar **pa, PortTGetport *x){	if(portMapPack(a, ea, &a, &x->map) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static intportTGetportUnpack(uchar *a, uchar *ea, uchar **pa, PortTGetport *x){	if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static voidportRGetportPrint(Fmt *fmt, PortRGetport *x){	fmtprint(fmt, "PortRGetport %ud", x->port);}static uintportRGetportSize(PortRGetport *x){	uint a;	USED(x);	a = 0 + 4;	return a;}static intportRGetportPack(uchar *a, uchar *ea, uchar **pa, PortRGetport *x){	if(sunUint32Pack(a, ea, &a, &x->port) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static intportRGetportUnpack(uchar *a, uchar *ea, uchar **pa, PortRGetport *x){	if(sunUint32Unpack(a, ea, &a, &x->port) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static voidportTDumpPrint(Fmt *fmt, PortTDump *x){	USED(x);	fmtprint(fmt, "PortTDump");}static uintportTDumpSize(PortTDump *x){	uint a;	USED(x);	a = 0;	return a;}static intportTDumpPack(uchar *a, uchar *ea, uchar **pa, PortTDump *x){	USED(ea);	USED(x);	*pa = a;	return 0;}static intportTDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortTDump *x){	USED(ea);	USED(x);	*pa = a;	return 0;}static voidportRDumpPrint(Fmt *fmt, PortRDump *x){	int i;	fmtprint(fmt, "PortRDump");	for(i=0; i<x->nmap; i++){		fmtprint(fmt, " ");		portMapPrint(fmt, &x->map[i]);	}}static uintportRDumpSize(PortRDump *x){	return (5*4*x->nmap) + 4;}static intportRDumpPack(uchar *a, uchar *ea, uchar **pa, PortRDump *x){	int i;	u32int zero, one;	zero = 0;	one = 1;	for(i=0; i<x->nmap; i++){		if(sunUint32Pack(a, ea, &a, &one) < 0		|| portMapPack(a, ea, &a, &x->map[i]) < 0)			goto Err;	}	if(sunUint32Pack(a, ea, &a, &zero) < 0)		goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static intportRDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortRDump *x){	int i;	u1int u1;	PortMap *m;	m = (PortMap*)a;	for(i=0;; i++){		if(sunUint1Unpack(a, ea, &a, &u1) < 0)			goto Err;		if(u1 == 0)			break;		if(portMapUnpack(a, ea, &a, &m[i]) < 0)			goto Err;	}	x->nmap = i;	x->map = m;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static voidportTCallitPrint(Fmt *fmt, PortTCallit *x){	fmtprint(fmt, "PortTCallit [%ud,%ud,%ud] %ud", x->prog, x->vers, x->proc, x->count);}static uintportTCallitSize(PortTCallit *x){	uint a;	USED(x);	a = 0 + 4 + 4 + 4 + sunVarOpaqueSize(x->count);	return a;}static intportTCallitPack(uchar *a, uchar *ea, uchar **pa, PortTCallit *x){	if(sunUint32Pack(a, ea, &a, &x->prog) < 0) goto Err;	if(sunUint32Pack(a, ea, &a, &x->vers) < 0) goto Err;	if(sunUint32Pack(a, ea, &a, &x->proc) < 0) goto Err;	if(sunVarOpaquePack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static intportTCallitUnpack(uchar *a, uchar *ea, uchar **pa, PortTCallit *x){	if(sunUint32Unpack(a, ea, &a, &x->prog) < 0) goto Err;	if(sunUint32Unpack(a, ea, &a, &x->vers) < 0) goto Err;	if(sunUint32Unpack(a, ea, &a, &x->proc) < 0) goto Err;	if(sunVarOpaqueUnpack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static voidportRCallitPrint(Fmt *fmt, PortRCallit *x){	fmtprint(fmt, "PortRCallit %ud %ud", x->port, x->count);}static uintportRCallitSize(PortRCallit *x){	uint a;	USED(x);	a = 0 + 4 + sunVarOpaqueSize(x->count);	return a;}static intportRCallitPack(uchar *a, uchar *ea, uchar **pa, PortRCallit *x){	if(sunUint32Pack(a, ea, &a, &x->port) < 0) goto Err;	if(sunVarOpaquePack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}static intportRCallitUnpack(uchar *a, uchar *ea, uchar **pa, PortRCallit *x){	if(sunUint32Unpack(a, ea, &a, &x->port) < 0) goto Err;	if(sunVarOpaqueUnpack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;	*pa = a;	return 0;Err:	*pa = ea;	return -1;}typedef int (*P)(uchar*, uchar*, uchar**, SunCall*);typedef void (*F)(Fmt*, SunCall*);typedef uint (*S)(SunCall*);static SunProc proc[] = {	(P)portTNullPack, (P)portTNullUnpack, (S)portTNullSize, (F)portTNullPrint, sizeof(PortTNull),	(P)portRNullPack, (P)portRNullUnpack, (S)portRNullSize, (F)portRNullPrint, sizeof(PortRNull),	(P)portTSetPack, (P)portTSetUnpack, (S)portTSetSize, (F)portTSetPrint, sizeof(PortTSet),	(P)portRSetPack, (P)portRSetUnpack, (S)portRSetSize, (F)portRSetPrint, sizeof(PortRSet),	(P)portTUnsetPack, (P)portTUnsetUnpack, (S)portTUnsetSize, (F)portTUnsetPrint, sizeof(PortTUnset),	(P)portRUnsetPack, (P)portRUnsetUnpack, (S)portRUnsetSize, (F)portRUnsetPrint, sizeof(PortRUnset),	(P)portTGetportPack, (P)portTGetportUnpack, (S)portTGetportSize, (F)portTGetportPrint, sizeof(PortTGetport),	(P)portRGetportPack, (P)portRGetportUnpack, (S)portRGetportSize, (F)portRGetportPrint, sizeof(PortRGetport),	(P)portTDumpPack, (P)portTDumpUnpack, (S)portTDumpSize, (F)portTDumpPrint, sizeof(PortTDump),	(P)portRDumpPack, (P)portRDumpUnpack, (S)portRDumpSize, (F)portRDumpPrint, sizeof(PortRDump),	(P)portTCallitPack, (P)portTCallitUnpack, (S)portTCallitSize, (F)portTCallitPrint, sizeof(PortTCallit),	(P)portRCallitPack, (P)portRCallitUnpack, (S)portRCallitSize, (F)portRCallitPrint, sizeof(PortRCallit),};SunProg portProg = {	PortProgram,	PortVersion,	proc,	nelem(proc),};

⌨️ 快捷键说明

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