plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

sunrpc.h (7317B)


      1 /*
      2  * Sun RPC; see RFC 1057
      3  */
      4 
      5 /*
      6 #pragma lib "libsunrpc.a"
      7 #pragma src "/sys/src/libsunrpc"
      8 */
      9 AUTOLIB(sunrpc)
     10 
     11 typedef uchar u1int;
     12 
     13 typedef struct SunAuthInfo SunAuthInfo;
     14 typedef struct SunAuthUnix SunAuthUnix;
     15 typedef struct SunRpc SunRpc;
     16 typedef struct SunCall SunCall;
     17 
     18 enum
     19 {
     20 	/* Authinfo.flavor */
     21 	SunAuthNone = 0,
     22 	SunAuthSys,
     23 	SunAuthShort,
     24 	SunAuthDes
     25 };
     26 
     27 typedef enum {
     28 	SunAcceptError = 0x10000,
     29 	SunRejectError = 0x20000,
     30 	SunAuthError = 0x40000,
     31 
     32 	/* Reply.status */
     33 	SunSuccess = 0,
     34 
     35 	SunProgUnavail = SunAcceptError | 1,
     36 	SunProgMismatch,
     37 	SunProcUnavail,
     38 	SunGarbageArgs,
     39 	SunSystemErr,
     40 
     41 	SunRpcMismatch = SunRejectError | 0,
     42 
     43 	SunAuthBadCred = SunAuthError | 1,
     44 	SunAuthRejectedCred,
     45 	SunAuthBadVerf,
     46 	SunAuthRejectedVerf,
     47 	SunAuthTooWeak,
     48 	SunAuthInvalidResp,
     49 	SunAuthFailed
     50 } SunStatus;
     51 
     52 struct SunAuthInfo
     53 {
     54 	uint flavor;
     55 	uchar *data;
     56 	uint ndata;
     57 };
     58 
     59 struct SunAuthUnix
     60 {
     61 	u32int stamp;
     62 	char *sysname;
     63 	u32int uid;
     64 	u32int gid;
     65 	u32int g[16];
     66 	u32int ng;
     67 };
     68 
     69 struct SunRpc
     70 {
     71 	u32int xid;
     72 	uint iscall;
     73 
     74 	/*
     75 	 * only sent on wire in call
     76 	 * caller fills in for the reply unpackers.
     77 	 */
     78 	u32int proc;
     79 
     80 	/* call */
     81 	/* uint proc; */
     82 	u32int prog, vers;
     83 	SunAuthInfo cred;
     84 	SunAuthInfo verf;
     85 	uchar *data;
     86 	uint ndata;
     87 
     88 	/* reply */
     89 	u32int status;
     90 	/* SunAuthInfo verf; */
     91 	u32int low, high;
     92 	/* uchar *data; */
     93 	/* uint ndata; */
     94 };
     95 
     96 typedef enum
     97 {
     98 	SunCallTypeTNull,
     99 	SunCallTypeRNull
    100 } SunCallType;
    101 
    102 struct SunCall
    103 {
    104 	SunRpc rpc;
    105 	SunCallType type;
    106 };
    107 
    108 void sunerrstr(SunStatus);
    109 
    110 void sunrpcprint(Fmt*, SunRpc*);
    111 uint sunrpcsize(SunRpc*);
    112 SunStatus sunrpcpack(uchar*, uchar*, uchar**, SunRpc*);
    113 SunStatus sunrpcunpack(uchar*, uchar*, uchar**, SunRpc*);
    114 
    115 void sunauthinfoprint(Fmt*, SunAuthInfo*);
    116 uint sunauthinfosize(SunAuthInfo*);
    117 int sunauthinfopack(uchar*, uchar*, uchar**, SunAuthInfo*);
    118 int sunauthinfounpack(uchar*, uchar*, uchar**, SunAuthInfo*);
    119 
    120 void sunauthunixprint(Fmt*, SunAuthUnix*);
    121 uint sunauthunixsize(SunAuthUnix*);
    122 int sunauthunixpack(uchar*, uchar*, uchar**, SunAuthUnix*);
    123 int sunauthunixunpack(uchar*, uchar*, uchar**, SunAuthUnix*);
    124 
    125 int sunenumpack(uchar*, uchar*, uchar**, int*);
    126 int sunenumunpack(uchar*, uchar*, uchar**, int*);
    127 int sunuint1pack(uchar*, uchar*, uchar**, u1int*);
    128 int sunuint1unpack(uchar*, uchar*, uchar**, u1int*);
    129 
    130 int sunstringpack(uchar*, uchar*, uchar**, char**, u32int);
    131 int sunstringunpack(uchar*, uchar*, uchar**, char**, u32int);
    132 uint sunstringsize(char*);
    133 
    134 int sunuint32pack(uchar*, uchar*, uchar**, u32int*);
    135 int sunuint32unpack(uchar*, uchar*, uchar**, u32int*);
    136 int sunuint64pack(uchar*, uchar*, uchar**, u64int*);
    137 int sunuint64unpack(uchar*, uchar*, uchar**, u64int*);
    138 
    139 int sunvaropaquepack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);
    140 int sunvaropaqueunpack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);
    141 uint sunvaropaquesize(u32int);
    142 
    143 int sunfixedopaquepack(uchar*, uchar*, uchar**, uchar*, u32int);
    144 int sunfixedopaqueunpack(uchar*, uchar*, uchar**, uchar*, u32int);
    145 uint sunfixedopaquesize(u32int);
    146 
    147 /*
    148  * Sun RPC Program
    149  */
    150 typedef struct SunProc SunProc;
    151 typedef struct SunProg SunProg;
    152 struct SunProg
    153 {
    154 	uint prog;
    155 	uint vers;
    156 	SunProc *proc;
    157 	int nproc;
    158 };
    159 
    160 struct SunProc
    161 {
    162 	int (*pack)(uchar*, uchar*, uchar**, SunCall*);
    163 	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
    164 	uint (*size)(SunCall*);
    165 	void (*fmt)(Fmt*, SunCall*);
    166 	uint sizeoftype;
    167 };
    168 
    169 SunStatus suncallpack(SunProg*, uchar*, uchar*, uchar**, SunCall*);
    170 SunStatus suncallunpack(SunProg*, uchar*, uchar*, uchar**, SunCall*);
    171 SunStatus suncallunpackalloc(SunProg*, SunCallType, uchar*, uchar*, uchar**, SunCall**);
    172 void suncallsetup(SunCall*, SunProg*, uint);
    173 uint suncallsize(SunProg*, SunCall*);
    174 
    175 /*
    176  * Formatting
    177 #pragma varargck type "B" SunRpc*
    178 #pragma varargck type "C" SunCall*
    179  */
    180 
    181 int	sunrpcfmt(Fmt*);
    182 int	suncallfmt(Fmt*);
    183 void	sunfmtinstall(SunProg*);
    184 
    185 
    186 /*
    187  * Sun RPC Server
    188  */
    189 typedef struct SunMsg SunMsg;
    190 typedef struct SunSrv SunSrv;
    191 
    192 enum
    193 {
    194 	SunStackSize = 32768
    195 };
    196 
    197 struct SunMsg
    198 {
    199 	uchar *data;
    200 	int count;
    201 	SunSrv *srv;
    202 	SunRpc rpc;
    203 	SunProg *pg;
    204 	SunCall *call;
    205 	Channel *creply;	/* chan(SunMsg*) */
    206 };
    207 
    208 struct SunSrv
    209 {
    210 	int chatty;
    211 	int cachereplies;
    212 	int alwaysreject;
    213 	int localonly;
    214 	int localparanoia;
    215 	SunProg **map;
    216 	Channel *crequest;
    217 	int (*ipokay)(uchar*, ushort);
    218 
    219 /* implementation use only */
    220 	Channel **cdispatch;
    221 	SunProg **prog;
    222 	int nprog;
    223 	void *cache;
    224 	Channel *creply;
    225 	Channel *cthread;
    226 };
    227 
    228 SunSrv *sunsrv(void);
    229 
    230 void	sunsrvprog(SunSrv *srv, SunProg *prog, Channel *c);
    231 int	sunsrvannounce(SunSrv *srv, char *address);
    232 int	sunsrvudp(SunSrv *srv, char *address);
    233 int	sunsrvnet(SunSrv *srv, char *address);
    234 int	sunsrvfd(SunSrv *srv, int fd);
    235 void	sunsrvthreadcreate(SunSrv *srv, void (*fn)(void*), void*);
    236 void	sunsrvclose(SunSrv*);
    237 
    238 int	sunmsgreply(SunMsg*, SunCall*);
    239 int	sunmsgdrop(SunMsg*);
    240 int	sunmsgreplyerror(SunMsg*, SunStatus);
    241 
    242 /*
    243  * Sun RPC Client
    244  */
    245 typedef struct SunClient SunClient;
    246 
    247 struct SunClient
    248 {
    249 	int		fd;
    250 	int		chatty;
    251 	int		needcount;
    252 	ulong	maxwait;
    253 	ulong	xidgen;
    254 	int		nsend;
    255 	int		nresend;
    256 	struct {
    257 		ulong min;
    258 		ulong max;
    259 		ulong avg;
    260 	} rtt;
    261 	Channel	*dying;
    262 	Channel	*rpcchan;
    263 	Channel	*timerchan;
    264 	Channel	*flushchan;
    265 	Channel	*readchan;
    266 	SunProg	**prog;
    267 	int		nprog;
    268 	int 		timertid;
    269 	int 		nettid;
    270 };
    271 
    272 SunClient	*sundial(char*);
    273 
    274 int	sunclientrpc(SunClient*, ulong, SunCall*, SunCall*, uchar**);
    275 void	sunclientclose(SunClient*);
    276 void	sunclientflushrpc(SunClient*, ulong);
    277 void	sunclientprog(SunClient*, SunProg*);
    278 
    279 
    280 /*
    281  * Provided by callers.
    282  * Should remove dependence on this, but hard.
    283  */
    284 void	*emalloc(ulong);
    285 void *erealloc(void*, ulong);
    286 
    287 
    288 /*
    289  * Sun RPC port mapper; see RFC 1057 Appendix A
    290  */
    291 
    292 typedef struct PortMap PortMap;
    293 typedef struct PortTNull PortTNull;
    294 typedef struct PortRNull PortRNull;
    295 typedef struct PortTSet PortTSet;
    296 typedef struct PortRSet PortRSet;
    297 typedef struct PortTUnset PortTUnset;
    298 typedef struct PortRUnset PortRUnset;
    299 typedef struct PortTGetport PortTGetport;
    300 typedef struct PortRGetport PortRGetport;
    301 typedef struct PortTDump PortTDump;
    302 typedef struct PortRDump PortRDump;
    303 typedef struct PortTCallit PortTCallit;
    304 typedef struct PortRCallit PortRCallit;
    305 
    306 typedef enum
    307 {
    308 	PortCallTNull,
    309 	PortCallRNull,
    310 	PortCallTSet,
    311 	PortCallRSet,
    312 	PortCallTUnset,
    313 	PortCallRUnset,
    314 	PortCallTGetport,
    315 	PortCallRGetport,
    316 	PortCallTDump,
    317 	PortCallRDump,
    318 	PortCallTCallit,
    319 	PortCallRCallit
    320 } PortCallType;
    321 
    322 enum
    323 {
    324 	PortProgram	= 100000,
    325 	PortVersion	= 2,
    326 
    327 	PortProtoTcp	= 6,	/* protocol number for TCP/IP */
    328 	PortProtoUdp	= 17	/* protocol number for UDP/IP */
    329 };
    330 
    331 struct PortMap {
    332 	u32int prog;
    333 	u32int vers;
    334 	u32int prot;
    335 	u32int port;
    336 };
    337 
    338 struct PortTNull {
    339 	SunCall call;
    340 };
    341 
    342 struct PortRNull {
    343 	SunCall call;
    344 };
    345 
    346 struct PortTSet {
    347 	SunCall call;
    348 	PortMap map;
    349 };
    350 
    351 struct PortRSet {
    352 	SunCall call;
    353 	u1int b;
    354 };
    355 
    356 struct PortTUnset {
    357 	SunCall call;
    358 	PortMap map;
    359 };
    360 
    361 struct PortRUnset {
    362 	SunCall call;
    363 	u1int b;
    364 };
    365 
    366 struct PortTGetport {
    367 	SunCall call;
    368 	PortMap map;
    369 };
    370 
    371 struct PortRGetport {
    372 	SunCall call;
    373 	u32int port;
    374 };
    375 
    376 struct PortTDump {
    377 	SunCall call;
    378 };
    379 
    380 struct PortRDump {
    381 	SunCall call;
    382 	PortMap *map;
    383 	int nmap;
    384 };
    385 
    386 struct PortTCallit {
    387 	SunCall call;
    388 	u32int prog;
    389 	u32int vers;
    390 	u32int proc;
    391 	uchar *data;
    392 	u32int count;
    393 };
    394 
    395 struct PortRCallit {
    396 	SunCall call;
    397 	u32int port;
    398 	uchar *data;
    399 	u32int count;
    400 };
    401 
    402 extern SunProg portprog;