/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ /* * 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;
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
/*
* 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;