402 lines · 7.1 KB · C
RawDownload
/* * Sun RPC; see RFC 1057 */ /*#pragma lib "libsunrpc.a"#pragma src "/sys/src/libsunrpc"*/AUTOLIB(sunrpc) typedef uchar u1int; typedef struct SunAuthInfo SunAuthInfo;typedef struct SunAuthUnix SunAuthUnix;typedef struct SunRpc SunRpc;typedef struct SunCall SunCall; enum{	/* Authinfo.flavor */	SunAuthNone = 0,	SunAuthSys,	SunAuthShort,	SunAuthDes}; typedef enum {	SunAcceptError = 0x10000,	SunRejectError = 0x20000,	SunAuthError = 0x40000, 	/* Reply.status */	SunSuccess = 0, 	SunProgUnavail = SunAcceptError | 1,	SunProgMismatch,	SunProcUnavail,	SunGarbageArgs,	SunSystemErr, 	SunRpcMismatch = SunRejectError | 0, 	SunAuthBadCred = SunAuthError | 1,	SunAuthRejectedCred,	SunAuthBadVerf,	SunAuthRejectedVerf,	SunAuthTooWeak,	SunAuthInvalidResp,	SunAuthFailed} SunStatus; struct SunAuthInfo{	uint flavor;	uchar *data;	uint ndata;}; struct SunAuthUnix{	u32int stamp;	char *sysname;	u32int uid;	u32int gid;	u32int g[16];	u32int ng;}; struct SunRpc{	u32int xid;	uint iscall; 	/*	 * only sent on wire in call	 * caller fills in for the reply unpackers.	 */	u32int proc; 	/* call */	/* uint proc; */	u32int prog, vers;	SunAuthInfo cred;	SunAuthInfo verf;	uchar *data;	uint ndata; 	/* reply */	u32int status;	/* SunAuthInfo verf; */	u32int low, high;	/* uchar *data; */	/* uint ndata; */}; typedef enum{	SunCallTypeTNull,	SunCallTypeRNull} SunCallType; struct SunCall{	SunRpc rpc;	SunCallType type;}; void sunerrstr(SunStatus); void sunrpcprint(Fmt*, SunRpc*);uint sunrpcsize(SunRpc*);SunStatus sunrpcpack(uchar*, uchar*, uchar**, SunRpc*);SunStatus sunrpcunpack(uchar*, uchar*, uchar**, SunRpc*); void sunauthinfoprint(Fmt*, SunAuthInfo*);uint sunauthinfosize(SunAuthInfo*);int sunauthinfopack(uchar*, uchar*, uchar**, SunAuthInfo*);int sunauthinfounpack(uchar*, uchar*, uchar**, SunAuthInfo*); void sunauthunixprint(Fmt*, SunAuthUnix*);uint sunauthunixsize(SunAuthUnix*);int sunauthunixpack(uchar*, uchar*, uchar**, SunAuthUnix*);int sunauthunixunpack(uchar*, uchar*, uchar**, SunAuthUnix*); int sunenumpack(uchar*, uchar*, uchar**, int*);int sunenumunpack(uchar*, uchar*, uchar**, int*);int sunuint1pack(uchar*, uchar*, uchar**, u1int*);int sunuint1unpack(uchar*, uchar*, uchar**, u1int*); int sunstringpack(uchar*, uchar*, uchar**, char**, u32int);int sunstringunpack(uchar*, uchar*, uchar**, char**, u32int);uint sunstringsize(char*); int sunuint32pack(uchar*, uchar*, uchar**, u32int*);int sunuint32unpack(uchar*, uchar*, uchar**, u32int*);int sunuint64pack(uchar*, uchar*, uchar**, u64int*);int sunuint64unpack(uchar*, uchar*, uchar**, u64int*); int sunvaropaquepack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);int sunvaropaqueunpack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);uint sunvaropaquesize(u32int); int sunfixedopaquepack(uchar*, uchar*, uchar**, uchar*, u32int);int sunfixedopaqueunpack(uchar*, uchar*, uchar**, uchar*, u32int);uint sunfixedopaquesize(u32int); /* * Sun RPC Program */typedef struct SunProc SunProc;typedef struct SunProg SunProg;struct SunProg{	uint prog;	uint vers;	SunProc *proc;	int nproc;}; struct SunProc{	int (*pack)(uchar*, uchar*, uchar**, SunCall*);	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);	uint (*size)(SunCall*);	void (*fmt)(Fmt*, SunCall*);	uint sizeoftype;}; SunStatus suncallpack(SunProg*, uchar*, uchar*, uchar**, SunCall*);SunStatus suncallunpack(SunProg*, uchar*, uchar*, uchar**, SunCall*);SunStatus suncallunpackalloc(SunProg*, SunCallType, uchar*, uchar*, uchar**, SunCall**);void suncallsetup(SunCall*, SunProg*, uint);uint suncallsize(SunProg*, SunCall*); /* * Formatting#pragma varargck type "B" SunRpc*#pragma varargck type "C" SunCall* */ int	sunrpcfmt(Fmt*);int	suncallfmt(Fmt*);void	sunfmtinstall(SunProg*);  /* * Sun RPC Server */typedef struct SunMsg SunMsg;typedef struct SunSrv SunSrv; enum{	SunStackSize = 32768}; struct SunMsg{	uchar *data;	int count;	SunSrv *srv;	SunRpc rpc;	SunProg *pg;	SunCall *call;	Channel *creply;	/* chan(SunMsg*) */}; struct SunSrv{	int chatty;	int cachereplies;	int alwaysreject;	int localonly;	int localparanoia;	SunProg **map;	Channel *crequest;	int (*ipokay)(uchar*, ushort); /* implementation use only */	Channel **cdispatch;	SunProg **prog;	int nprog;	void *cache;	Channel *creply;	Channel *cthread;}; SunSrv *sunsrv(void); void	sunsrvprog(SunSrv *srv, SunProg *prog, Channel *c);int	sunsrvannounce(SunSrv *srv, char *address);int	sunsrvudp(SunSrv *srv, char *address);int	sunsrvnet(SunSrv *srv, char *address);int	sunsrvfd(SunSrv *srv, int fd);void	sunsrvthreadcreate(SunSrv *srv, void (*fn)(void*), void*);void	sunsrvclose(SunSrv*); int	sunmsgreply(SunMsg*, SunCall*);int	sunmsgdrop(SunMsg*);int	sunmsgreplyerror(SunMsg*, SunStatus); /* * Sun RPC Client */typedef struct SunClient SunClient; struct SunClient{	int		fd;	int		chatty;	int		needcount;	ulong	maxwait;	ulong	xidgen;	int		nsend;	int		nresend;	struct {		ulong min;		ulong max;		ulong avg;	} rtt;	Channel	*dying;	Channel	*rpcchan;	Channel	*timerchan;	Channel	*flushchan;	Channel	*readchan;	SunProg	**prog;	int		nprog;	int 		timertid;	int 		nettid;}; SunClient	*sundial(char*); int	sunclientrpc(SunClient*, ulong, SunCall*, SunCall*, uchar**);void	sunclientclose(SunClient*);void	sunclientflushrpc(SunClient*, ulong);void	sunclientprog(SunClient*, SunProg*);  /* * Provided by callers. * Should remove dependence on this, but hard. */void	*emalloc(ulong);void *erealloc(void*, ulong);  /* * Sun RPC port mapper; see RFC 1057 Appendix A */ typedef struct PortMap PortMap;typedef struct PortTNull PortTNull;typedef struct PortRNull PortRNull;typedef struct PortTSet PortTSet;typedef struct PortRSet PortRSet;typedef struct PortTUnset PortTUnset;typedef struct PortRUnset PortRUnset;typedef struct PortTGetport PortTGetport;typedef struct PortRGetport PortRGetport;typedef struct PortTDump PortTDump;typedef struct PortRDump PortRDump;typedef struct PortTCallit PortTCallit;typedef struct PortRCallit PortRCallit; typedef enum{	PortCallTNull,	PortCallRNull,	PortCallTSet,	PortCallRSet,	PortCallTUnset,	PortCallRUnset,	PortCallTGetport,	PortCallRGetport,	PortCallTDump,	PortCallRDump,	PortCallTCallit,	PortCallRCallit} PortCallType; enum{	PortProgram	= 100000,	PortVersion	= 2, 	PortProtoTcp	= 6,	/* protocol number for TCP/IP */	PortProtoUdp	= 17	/* protocol number for UDP/IP */}; struct PortMap {	u32int prog;	u32int vers;	u32int prot;	u32int port;}; struct PortTNull {	SunCall call;}; struct PortRNull {	SunCall call;}; struct PortTSet {	SunCall call;	PortMap map;}; struct PortRSet {	SunCall call;	u1int b;}; struct PortTUnset {	SunCall call;	PortMap map;}; struct PortRUnset {	SunCall call;	u1int b;}; struct PortTGetport {	SunCall call;	PortMap map;}; struct PortRGetport {	SunCall call;	u32int port;}; struct PortTDump {	SunCall call;}; struct PortRDump {	SunCall call;	PortMap *map;	int nmap;}; struct PortTCallit {	SunCall call;	u32int prog;	u32int vers;	u32int proc;	uchar *data;	u32int count;}; struct PortRCallit {	SunCall call;	u32int port;	uchar *data;	u32int count;}; extern SunProg portprog;