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