aboutsummaryrefslogtreecommitdiff
path: root/include/sunrpc.h
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-03-21 04:33:13 +0000
committerrsc <devnull@localhost>2004-03-21 04:33:13 +0000
commit2277c5d7bbe1f9595fad512d8f790708473a9bf1 (patch)
tree4d653e13906f1971d3170dba6dbe0fbf92eb48d6 /include/sunrpc.h
parenta770daa795754cb600ad3fab2fdd2961147006c4 (diff)
downloadplan9port-2277c5d7bbe1f9595fad512d8f790708473a9bf1.tar.gz
plan9port-2277c5d7bbe1f9595fad512d8f790708473a9bf1.tar.bz2
plan9port-2277c5d7bbe1f9595fad512d8f790708473a9bf1.zip
Small tweaks
Lots of new code imported.
Diffstat (limited to 'include/sunrpc.h')
-rw-r--r--include/sunrpc.h400
1 files changed, 400 insertions, 0 deletions
diff --git a/include/sunrpc.h b/include/sunrpc.h
new file mode 100644
index 00000000..4f108aa0
--- /dev/null
+++ b/include/sunrpc.h
@@ -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;