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