Small tweaks
Lots of new code imported.
This commit is contained in:
parent
a770daa795
commit
2277c5d7bb
86 changed files with 12444 additions and 91 deletions
400
include/sunrpc.h
Normal file
400
include/sunrpc.h
Normal file
|
|
@ -0,0 +1,400 @@
|
|||
/*
|
||||
* 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**);
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
Loading…
Add table
Add a link
Reference in a new issue