397 lines
7.0 KiB
C
397 lines
7.0 KiB
C
|
/*
|
||
|
* 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;
|