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