|  | /* | 
|  | * 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; |