diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 16:47:56 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 16:47:56 +0300 |
commit | c558a99e0be506a9abdf677f0ca4490644e05fc1 (patch) | |
tree | 17aef678ad05a32ef96ce8385703cb3fe089a5c7 /sys/include/sunrpc.h | |
parent | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (diff) |
Import sources from 2011-03-30 iso image - sys/include
Diffstat (limited to 'sys/include/sunrpc.h')
-rwxr-xr-x | sys/include/sunrpc.h | 396 |
1 files changed, 396 insertions, 0 deletions
diff --git a/sys/include/sunrpc.h b/sys/include/sunrpc.h new file mode 100755 index 000000000..6d8b08852 --- /dev/null +++ b/sys/include/sunrpc.h @@ -0,0 +1,396 @@ +/* + * Sun RPC; see RFC 1057 + */ + +#pragma lib "libsunrpc.a" +#pragma src "/sys/src/libsunrpc" + +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**); +uint sunCallSize(SunProg*, SunCall*); +void sunCallSetup(SunCall*, SunProg*, uint); + +/* + * 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 = 8192, +}; + +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; + SunProg **map; + Channel *crequest; + +/* 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; |