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