blob: 9dd9aba3054f59b124113082d9c0ffafc7a4afa4 [file] [log] [blame]
/*
* 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;