xref: /plan9/sys/include/sunrpc.h (revision 6ff5e9135082ce281d25c68a5544eef8249d480c)
134e04225SDavid du Colombier /*
234e04225SDavid du Colombier  * Sun RPC; see RFC 1057
334e04225SDavid du Colombier  */
434e04225SDavid du Colombier 
534e04225SDavid du Colombier #pragma lib "libsunrpc.a"
634e04225SDavid du Colombier #pragma src "/sys/src/libsunrpc"
734e04225SDavid du Colombier 
834e04225SDavid du Colombier typedef uchar u1int;
934e04225SDavid du Colombier 
1034e04225SDavid du Colombier typedef struct SunAuthInfo SunAuthInfo;
1134e04225SDavid du Colombier typedef struct SunAuthUnix SunAuthUnix;
1234e04225SDavid du Colombier typedef struct SunRpc SunRpc;
1334e04225SDavid du Colombier typedef struct SunCall SunCall;
1434e04225SDavid du Colombier 
1534e04225SDavid du Colombier enum
1634e04225SDavid du Colombier {
1734e04225SDavid du Colombier 	/* Authinfo.flavor */
1834e04225SDavid du Colombier 	SunAuthNone = 0,
1934e04225SDavid du Colombier 	SunAuthSys,
2034e04225SDavid du Colombier 	SunAuthShort,
2134e04225SDavid du Colombier 	SunAuthDes,
2234e04225SDavid du Colombier };
2334e04225SDavid du Colombier 
2434e04225SDavid du Colombier typedef enum {
2534e04225SDavid du Colombier 	SunAcceptError = 0x10000,
2634e04225SDavid du Colombier 	SunRejectError = 0x20000,
2734e04225SDavid du Colombier 	SunAuthError = 0x40000,
2834e04225SDavid du Colombier 
2934e04225SDavid du Colombier 	/* Reply.status */
3034e04225SDavid du Colombier 	SunSuccess = 0,
3134e04225SDavid du Colombier 
3234e04225SDavid du Colombier 	SunProgUnavail = SunAcceptError | 1,
3334e04225SDavid du Colombier 	SunProgMismatch,
3434e04225SDavid du Colombier 	SunProcUnavail,
3534e04225SDavid du Colombier 	SunGarbageArgs,
3634e04225SDavid du Colombier 	SunSystemErr,
3734e04225SDavid du Colombier 
3834e04225SDavid du Colombier 	SunRpcMismatch = SunRejectError | 0,
3934e04225SDavid du Colombier 
4034e04225SDavid du Colombier 	SunAuthBadCred = SunAuthError | 1,
4134e04225SDavid du Colombier 	SunAuthRejectedCred,
4234e04225SDavid du Colombier 	SunAuthBadVerf,
4334e04225SDavid du Colombier 	SunAuthRejectedVerf,
4434e04225SDavid du Colombier 	SunAuthTooWeak,
4534e04225SDavid du Colombier 	SunAuthInvalidResp,
4634e04225SDavid du Colombier 	SunAuthFailed,
4734e04225SDavid du Colombier } SunStatus;
4834e04225SDavid du Colombier 
4934e04225SDavid du Colombier struct SunAuthInfo
5034e04225SDavid du Colombier {
5134e04225SDavid du Colombier 	uint flavor;
5234e04225SDavid du Colombier 	uchar *data;
5334e04225SDavid du Colombier 	uint ndata;
5434e04225SDavid du Colombier };
5534e04225SDavid du Colombier 
5634e04225SDavid du Colombier struct SunAuthUnix
5734e04225SDavid du Colombier {
5834e04225SDavid du Colombier 	u32int stamp;
5934e04225SDavid du Colombier 	char *sysname;
6034e04225SDavid du Colombier 	u32int uid;
6134e04225SDavid du Colombier 	u32int gid;
6234e04225SDavid du Colombier 	u32int g[16];
6334e04225SDavid du Colombier 	u32int ng;
6434e04225SDavid du Colombier };
6534e04225SDavid du Colombier 
6634e04225SDavid du Colombier struct SunRpc
6734e04225SDavid du Colombier {
6834e04225SDavid du Colombier 	u32int xid;
6934e04225SDavid du Colombier 	uint iscall;
7034e04225SDavid du Colombier 
7134e04225SDavid du Colombier 	/*
7234e04225SDavid du Colombier 	 * only sent on wire in call
7334e04225SDavid du Colombier 	 * caller fills in for the reply unpackers.
7434e04225SDavid du Colombier 	 */
7534e04225SDavid du Colombier 	u32int proc;
7634e04225SDavid du Colombier 
7734e04225SDavid du Colombier 	/* call */
7834e04225SDavid du Colombier 	// uint proc;
7934e04225SDavid du Colombier 	u32int prog, vers;
8034e04225SDavid du Colombier 	SunAuthInfo cred;
8134e04225SDavid du Colombier 	SunAuthInfo verf;
8234e04225SDavid du Colombier 	uchar *data;
8334e04225SDavid du Colombier 	uint ndata;
8434e04225SDavid du Colombier 
8534e04225SDavid du Colombier 	/* reply */
8634e04225SDavid du Colombier 	u32int status;
8734e04225SDavid du Colombier 	// SunAuthInfo verf;
8834e04225SDavid du Colombier 	u32int low, high;
8934e04225SDavid du Colombier 	// uchar *data;
9034e04225SDavid du Colombier 	// uint ndata;
9134e04225SDavid du Colombier };
9234e04225SDavid du Colombier 
9334e04225SDavid du Colombier typedef enum
9434e04225SDavid du Colombier {
9534e04225SDavid du Colombier 	SunCallTypeTNull,
9634e04225SDavid du Colombier 	SunCallTypeRNull,
9734e04225SDavid du Colombier } SunCallType;
9834e04225SDavid du Colombier 
9934e04225SDavid du Colombier struct SunCall
10034e04225SDavid du Colombier {
10134e04225SDavid du Colombier 	SunRpc rpc;
10234e04225SDavid du Colombier 	SunCallType type;
10334e04225SDavid du Colombier };
10434e04225SDavid du Colombier 
10534e04225SDavid du Colombier void sunErrstr(SunStatus);
10634e04225SDavid du Colombier 
10734e04225SDavid du Colombier void sunRpcPrint(Fmt*, SunRpc*);
10834e04225SDavid du Colombier uint sunRpcSize(SunRpc*);
10934e04225SDavid du Colombier SunStatus sunRpcPack(uchar*, uchar*, uchar**, SunRpc*);
11034e04225SDavid du Colombier SunStatus sunRpcUnpack(uchar*, uchar*, uchar**, SunRpc*);
11134e04225SDavid du Colombier 
11234e04225SDavid du Colombier void sunAuthInfoPrint(Fmt*, SunAuthInfo*);
11334e04225SDavid du Colombier uint sunAuthInfoSize(SunAuthInfo*);
11434e04225SDavid du Colombier int sunAuthInfoPack(uchar*, uchar*, uchar**, SunAuthInfo*);
11534e04225SDavid du Colombier int sunAuthInfoUnpack(uchar*, uchar*, uchar**, SunAuthInfo*);
11634e04225SDavid du Colombier 
11734e04225SDavid du Colombier void sunAuthUnixPrint(Fmt*, SunAuthUnix*);
11834e04225SDavid du Colombier uint sunAuthUnixSize(SunAuthUnix*);
11934e04225SDavid du Colombier int sunAuthUnixPack(uchar*, uchar*, uchar**, SunAuthUnix*);
12034e04225SDavid du Colombier int sunAuthUnixUnpack(uchar*, uchar*, uchar**, SunAuthUnix*);
12134e04225SDavid du Colombier 
12234e04225SDavid du Colombier int sunEnumPack(uchar*, uchar*, uchar**, int*);
12334e04225SDavid du Colombier int sunEnumUnpack(uchar*, uchar*, uchar**, int*);
12434e04225SDavid du Colombier int sunUint1Pack(uchar*, uchar*, uchar**, u1int*);
12534e04225SDavid du Colombier int sunUint1Unpack(uchar*, uchar*, uchar**, u1int*);
12634e04225SDavid du Colombier 
12734e04225SDavid du Colombier int sunStringPack(uchar*, uchar*, uchar**, char**, u32int);
12834e04225SDavid du Colombier int sunStringUnpack(uchar*, uchar*, uchar**, char**, u32int);
12934e04225SDavid du Colombier uint sunStringSize(char*);
13034e04225SDavid du Colombier 
13134e04225SDavid du Colombier int sunUint32Pack(uchar*, uchar*, uchar**, u32int*);
13234e04225SDavid du Colombier int sunUint32Unpack(uchar*, uchar*, uchar**, u32int*);
13334e04225SDavid du Colombier int sunUint64Pack(uchar*, uchar*, uchar**, u64int*);
13434e04225SDavid du Colombier int sunUint64Unpack(uchar*, uchar*, uchar**, u64int*);
13534e04225SDavid du Colombier 
13634e04225SDavid du Colombier int sunVarOpaquePack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);
13734e04225SDavid du Colombier int sunVarOpaqueUnpack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);
13834e04225SDavid du Colombier uint sunVarOpaqueSize(u32int);
13934e04225SDavid du Colombier 
14034e04225SDavid du Colombier int sunFixedOpaquePack(uchar*, uchar*, uchar**, uchar*, u32int);
14134e04225SDavid du Colombier int sunFixedOpaqueUnpack(uchar*, uchar*, uchar**, uchar*, u32int);
14234e04225SDavid du Colombier uint sunFixedOpaqueSize(u32int);
14334e04225SDavid du Colombier 
14434e04225SDavid du Colombier /*
14534e04225SDavid du Colombier  * Sun RPC Program
14634e04225SDavid du Colombier  */
14734e04225SDavid du Colombier typedef struct SunProc SunProc;
14834e04225SDavid du Colombier typedef struct SunProg SunProg;
14934e04225SDavid du Colombier struct SunProg
15034e04225SDavid du Colombier {
15134e04225SDavid du Colombier 	uint prog;
15234e04225SDavid du Colombier 	uint vers;
15334e04225SDavid du Colombier 	SunProc *proc;
15434e04225SDavid du Colombier 	int nproc;
15534e04225SDavid du Colombier };
15634e04225SDavid du Colombier 
15734e04225SDavid du Colombier struct SunProc
15834e04225SDavid du Colombier {
15934e04225SDavid du Colombier 	int (*pack)(uchar*, uchar*, uchar**, SunCall*);
16034e04225SDavid du Colombier 	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
16134e04225SDavid du Colombier 	uint (*size)(SunCall*);
16234e04225SDavid du Colombier 	void (*fmt)(Fmt*, SunCall*);
16334e04225SDavid du Colombier 	uint sizeoftype;
16434e04225SDavid du Colombier };
16534e04225SDavid du Colombier 
16634e04225SDavid du Colombier SunStatus sunCallPack(SunProg*, uchar*, uchar*, uchar**, SunCall*);
16734e04225SDavid du Colombier SunStatus sunCallUnpack(SunProg*, uchar*, uchar*, uchar**, SunCall*);
16834e04225SDavid du Colombier SunStatus sunCallUnpackAlloc(SunProg*, SunCallType, uchar*, uchar*, uchar**, SunCall**);
16934e04225SDavid du Colombier uint sunCallSize(SunProg*, SunCall*);
170*6ff5e913SDavid du Colombier void sunCallSetup(SunCall*, SunProg*, uint);
17134e04225SDavid du Colombier 
17234e04225SDavid du Colombier /*
17334e04225SDavid du Colombier  * Formatting
17434e04225SDavid du Colombier  */
17534e04225SDavid du Colombier #pragma varargck type "B" SunRpc*
17634e04225SDavid du Colombier #pragma varargck type "C" SunCall*
17734e04225SDavid du Colombier 
17834e04225SDavid du Colombier int	sunRpcFmt(Fmt*);
17934e04225SDavid du Colombier int	sunCallFmt(Fmt*);
18034e04225SDavid du Colombier void	sunFmtInstall(SunProg*);
18134e04225SDavid du Colombier 
18234e04225SDavid du Colombier 
18334e04225SDavid du Colombier /*
18434e04225SDavid du Colombier  * Sun RPC Server
18534e04225SDavid du Colombier  */
18634e04225SDavid du Colombier typedef struct SunMsg SunMsg;
18734e04225SDavid du Colombier typedef struct SunSrv SunSrv;
18834e04225SDavid du Colombier 
18934e04225SDavid du Colombier enum
19034e04225SDavid du Colombier {
19134e04225SDavid du Colombier 	SunStackSize = 8192,
19234e04225SDavid du Colombier };
19334e04225SDavid du Colombier 
19434e04225SDavid du Colombier struct SunMsg
19534e04225SDavid du Colombier {
19634e04225SDavid du Colombier 	uchar *data;
19734e04225SDavid du Colombier 	int count;
19834e04225SDavid du Colombier 	SunSrv *srv;
19934e04225SDavid du Colombier 	SunRpc rpc;
20034e04225SDavid du Colombier 	SunProg *pg;
20134e04225SDavid du Colombier 	SunCall *call;
20234e04225SDavid du Colombier 	Channel *creply;	/* chan(SunMsg*) */
20334e04225SDavid du Colombier };
20434e04225SDavid du Colombier 
20534e04225SDavid du Colombier struct SunSrv
20634e04225SDavid du Colombier {
20734e04225SDavid du Colombier 	int chatty;
20834e04225SDavid du Colombier 	int cacheReplies;
20934e04225SDavid du Colombier 	int alwaysReject;
21034e04225SDavid du Colombier 	SunProg **map;
21134e04225SDavid du Colombier 	Channel *crequest;
21234e04225SDavid du Colombier 
21334e04225SDavid du Colombier /* implementation use only */
21434e04225SDavid du Colombier 	Channel **cdispatch;
21534e04225SDavid du Colombier 	SunProg **prog;
21634e04225SDavid du Colombier 	int nprog;
21734e04225SDavid du Colombier 	void *cache;
21834e04225SDavid du Colombier 	Channel *creply;
21934e04225SDavid du Colombier 	Channel *cthread;
22034e04225SDavid du Colombier };
22134e04225SDavid du Colombier 
22234e04225SDavid du Colombier SunSrv *sunSrv(void);
22334e04225SDavid du Colombier 
22434e04225SDavid du Colombier void	sunSrvProg(SunSrv *srv, SunProg *prog, Channel *c);
22534e04225SDavid du Colombier int	sunSrvAnnounce(SunSrv *srv, char *address);
22634e04225SDavid du Colombier int	sunSrvUdp(SunSrv *srv, char *address);
22734e04225SDavid du Colombier int	sunSrvNet(SunSrv *srv, char *address);
22834e04225SDavid du Colombier int	sunSrvFd(SunSrv *srv, int fd);
22934e04225SDavid du Colombier void	sunSrvThreadCreate(SunSrv *srv, void (*fn)(void*), void*);
23034e04225SDavid du Colombier void	sunSrvClose(SunSrv*);
23134e04225SDavid du Colombier 
23234e04225SDavid du Colombier int	sunMsgReply(SunMsg*, SunCall*);
23334e04225SDavid du Colombier int	sunMsgDrop(SunMsg*);
23434e04225SDavid du Colombier int	sunMsgReplyError(SunMsg*, SunStatus);
23534e04225SDavid du Colombier 
23634e04225SDavid du Colombier /*
23734e04225SDavid du Colombier  * Sun RPC Client
23834e04225SDavid du Colombier  */
23934e04225SDavid du Colombier typedef struct SunClient SunClient;
24034e04225SDavid du Colombier 
24134e04225SDavid du Colombier struct SunClient
24234e04225SDavid du Colombier {
24334e04225SDavid du Colombier 	int		fd;
24434e04225SDavid du Colombier 	int		chatty;
24534e04225SDavid du Colombier 	int		needcount;
24634e04225SDavid du Colombier 	ulong	maxwait;
24734e04225SDavid du Colombier 	ulong	xidgen;
24834e04225SDavid du Colombier 	int		nsend;
24934e04225SDavid du Colombier 	int		nresend;
25034e04225SDavid du Colombier 	struct {
25134e04225SDavid du Colombier 		ulong min;
25234e04225SDavid du Colombier 		ulong max;
25334e04225SDavid du Colombier 		ulong avg;
25434e04225SDavid du Colombier 	} rtt;
25534e04225SDavid du Colombier 	Channel	*dying;
25634e04225SDavid du Colombier 	Channel	*rpcchan;
25734e04225SDavid du Colombier 	Channel	*timerchan;
25834e04225SDavid du Colombier 	Channel	*flushchan;
25934e04225SDavid du Colombier 	Channel	*readchan;
26034e04225SDavid du Colombier 	SunProg	**prog;
26134e04225SDavid du Colombier 	int		nprog;
26234e04225SDavid du Colombier 	int 		timertid;
26334e04225SDavid du Colombier 	int 		nettid;
26434e04225SDavid du Colombier };
26534e04225SDavid du Colombier 
26634e04225SDavid du Colombier SunClient	*sunDial(char*);
26734e04225SDavid du Colombier 
26834e04225SDavid du Colombier int	sunClientRpc(SunClient*, ulong, SunCall*, SunCall*, uchar**);
26934e04225SDavid du Colombier void	sunClientClose(SunClient*);
27034e04225SDavid du Colombier void	sunClientFlushRpc(SunClient*, ulong);
27134e04225SDavid du Colombier void	sunClientProg(SunClient*, SunProg*);
27234e04225SDavid du Colombier 
27334e04225SDavid du Colombier 
27434e04225SDavid du Colombier /*
27534e04225SDavid du Colombier  * Provided by callers.
27634e04225SDavid du Colombier  * Should remove dependence on this, but hard.
27734e04225SDavid du Colombier  */
27834e04225SDavid du Colombier void	*emalloc(ulong);
27934e04225SDavid du Colombier void *erealloc(void*, ulong);
28034e04225SDavid du Colombier 
28134e04225SDavid du Colombier 
28234e04225SDavid du Colombier /*
28334e04225SDavid du Colombier  * Sun RPC port mapper; see RFC 1057 Appendix A
28434e04225SDavid du Colombier  */
28534e04225SDavid du Colombier 
28634e04225SDavid du Colombier typedef struct PortMap PortMap;
28734e04225SDavid du Colombier typedef struct PortTNull PortTNull;
28834e04225SDavid du Colombier typedef struct PortRNull PortRNull;
28934e04225SDavid du Colombier typedef struct PortTSet PortTSet;
29034e04225SDavid du Colombier typedef struct PortRSet PortRSet;
29134e04225SDavid du Colombier typedef struct PortTUnset PortTUnset;
29234e04225SDavid du Colombier typedef struct PortRUnset PortRUnset;
29334e04225SDavid du Colombier typedef struct PortTGetport PortTGetport;
29434e04225SDavid du Colombier typedef struct PortRGetport PortRGetport;
29534e04225SDavid du Colombier typedef struct PortTDump PortTDump;
29634e04225SDavid du Colombier typedef struct PortRDump PortRDump;
29734e04225SDavid du Colombier typedef struct PortTCallit PortTCallit;
29834e04225SDavid du Colombier typedef struct PortRCallit PortRCallit;
29934e04225SDavid du Colombier 
30034e04225SDavid du Colombier typedef enum
30134e04225SDavid du Colombier {
30234e04225SDavid du Colombier 	PortCallTNull,
30334e04225SDavid du Colombier 	PortCallRNull,
30434e04225SDavid du Colombier 	PortCallTSet,
30534e04225SDavid du Colombier 	PortCallRSet,
30634e04225SDavid du Colombier 	PortCallTUnset,
30734e04225SDavid du Colombier 	PortCallRUnset,
30834e04225SDavid du Colombier 	PortCallTGetport,
30934e04225SDavid du Colombier 	PortCallRGetport,
31034e04225SDavid du Colombier 	PortCallTDump,
31134e04225SDavid du Colombier 	PortCallRDump,
31234e04225SDavid du Colombier 	PortCallTCallit,
31334e04225SDavid du Colombier 	PortCallRCallit,
31434e04225SDavid du Colombier } PortCallType;
31534e04225SDavid du Colombier 
31634e04225SDavid du Colombier enum
31734e04225SDavid du Colombier {
31834e04225SDavid du Colombier 	PortProgram	= 100000,
31934e04225SDavid du Colombier 	PortVersion	= 2,
32034e04225SDavid du Colombier 
32134e04225SDavid du Colombier 	PortProtoTcp	= 6,	/* protocol number for TCP/IP */
32234e04225SDavid du Colombier 	PortProtoUdp	= 17	/* protocol number for UDP/IP */
32334e04225SDavid du Colombier };
32434e04225SDavid du Colombier 
32534e04225SDavid du Colombier struct PortMap {
32634e04225SDavid du Colombier 	u32int prog;
32734e04225SDavid du Colombier 	u32int vers;
32834e04225SDavid du Colombier 	u32int prot;
32934e04225SDavid du Colombier 	u32int port;
33034e04225SDavid du Colombier };
33134e04225SDavid du Colombier 
33234e04225SDavid du Colombier struct PortTNull {
33334e04225SDavid du Colombier 	SunCall call;
33434e04225SDavid du Colombier };
33534e04225SDavid du Colombier 
33634e04225SDavid du Colombier struct PortRNull {
33734e04225SDavid du Colombier 	SunCall call;
33834e04225SDavid du Colombier };
33934e04225SDavid du Colombier 
34034e04225SDavid du Colombier struct PortTSet {
34134e04225SDavid du Colombier 	SunCall call;
34234e04225SDavid du Colombier 	PortMap map;
34334e04225SDavid du Colombier };
34434e04225SDavid du Colombier 
34534e04225SDavid du Colombier struct PortRSet {
34634e04225SDavid du Colombier 	SunCall call;
34734e04225SDavid du Colombier 	u1int b;
34834e04225SDavid du Colombier };
34934e04225SDavid du Colombier 
35034e04225SDavid du Colombier struct PortTUnset {
35134e04225SDavid du Colombier 	SunCall call;
35234e04225SDavid du Colombier 	PortMap map;
35334e04225SDavid du Colombier };
35434e04225SDavid du Colombier 
35534e04225SDavid du Colombier struct PortRUnset {
35634e04225SDavid du Colombier 	SunCall call;
35734e04225SDavid du Colombier 	u1int b;
35834e04225SDavid du Colombier };
35934e04225SDavid du Colombier 
36034e04225SDavid du Colombier struct PortTGetport {
36134e04225SDavid du Colombier 	SunCall call;
36234e04225SDavid du Colombier 	PortMap map;
36334e04225SDavid du Colombier };
36434e04225SDavid du Colombier 
36534e04225SDavid du Colombier struct PortRGetport {
36634e04225SDavid du Colombier 	SunCall call;
36734e04225SDavid du Colombier 	u32int port;
36834e04225SDavid du Colombier };
36934e04225SDavid du Colombier 
37034e04225SDavid du Colombier struct PortTDump {
37134e04225SDavid du Colombier 	SunCall call;
37234e04225SDavid du Colombier };
37334e04225SDavid du Colombier 
37434e04225SDavid du Colombier struct PortRDump {
37534e04225SDavid du Colombier 	SunCall call;
37634e04225SDavid du Colombier 	PortMap *map;
37734e04225SDavid du Colombier 	int nmap;
37834e04225SDavid du Colombier };
37934e04225SDavid du Colombier 
38034e04225SDavid du Colombier struct PortTCallit {
38134e04225SDavid du Colombier 	SunCall call;
38234e04225SDavid du Colombier 	u32int prog;
38334e04225SDavid du Colombier 	u32int vers;
38434e04225SDavid du Colombier 	u32int proc;
38534e04225SDavid du Colombier 	uchar *data;
38634e04225SDavid du Colombier 	u32int count;
38734e04225SDavid du Colombier };
38834e04225SDavid du Colombier 
38934e04225SDavid du Colombier struct PortRCallit {
39034e04225SDavid du Colombier 	SunCall call;
39134e04225SDavid du Colombier 	u32int port;
39234e04225SDavid du Colombier 	uchar *data;
39334e04225SDavid du Colombier 	u32int count;
39434e04225SDavid du Colombier };
39534e04225SDavid du Colombier 
39634e04225SDavid du Colombier extern SunProg portProg;
397