plan9front/sys/include/sunrpc.h

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;