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"
10 2277c5d7 2004-03-21 devnull typedef uchar u1int;
12 2277c5d7 2004-03-21 devnull typedef struct SunAuthInfo SunAuthInfo;
13 2277c5d7 2004-03-21 devnull typedef struct SunAuthUnix SunAuthUnix;
14 2277c5d7 2004-03-21 devnull typedef struct SunRpc SunRpc;
15 2277c5d7 2004-03-21 devnull typedef struct SunCall SunCall;
19 2277c5d7 2004-03-21 devnull /* Authinfo.flavor */
20 2277c5d7 2004-03-21 devnull SunAuthNone = 0,
21 2277c5d7 2004-03-21 devnull SunAuthSys,
22 2277c5d7 2004-03-21 devnull SunAuthShort,
23 2277c5d7 2004-03-21 devnull SunAuthDes,
26 2277c5d7 2004-03-21 devnull typedef enum {
27 2277c5d7 2004-03-21 devnull SunAcceptError = 0x10000,
28 2277c5d7 2004-03-21 devnull SunRejectError = 0x20000,
29 2277c5d7 2004-03-21 devnull SunAuthError = 0x40000,
31 2277c5d7 2004-03-21 devnull /* Reply.status */
32 2277c5d7 2004-03-21 devnull SunSuccess = 0,
34 2277c5d7 2004-03-21 devnull SunProgUnavail = SunAcceptError | 1,
35 2277c5d7 2004-03-21 devnull SunProgMismatch,
36 2277c5d7 2004-03-21 devnull SunProcUnavail,
37 2277c5d7 2004-03-21 devnull SunGarbageArgs,
38 2277c5d7 2004-03-21 devnull SunSystemErr,
40 2277c5d7 2004-03-21 devnull SunRpcMismatch = SunRejectError | 0,
42 2277c5d7 2004-03-21 devnull SunAuthBadCred = SunAuthError | 1,
43 2277c5d7 2004-03-21 devnull SunAuthRejectedCred,
44 2277c5d7 2004-03-21 devnull SunAuthBadVerf,
45 2277c5d7 2004-03-21 devnull SunAuthRejectedVerf,
46 2277c5d7 2004-03-21 devnull SunAuthTooWeak,
47 2277c5d7 2004-03-21 devnull SunAuthInvalidResp,
48 2277c5d7 2004-03-21 devnull SunAuthFailed,
49 2277c5d7 2004-03-21 devnull } SunStatus;
51 2277c5d7 2004-03-21 devnull struct SunAuthInfo
53 2277c5d7 2004-03-21 devnull uint flavor;
54 2277c5d7 2004-03-21 devnull uchar *data;
55 2277c5d7 2004-03-21 devnull uint ndata;
58 2277c5d7 2004-03-21 devnull struct SunAuthUnix
60 2277c5d7 2004-03-21 devnull u32int stamp;
61 2277c5d7 2004-03-21 devnull char *sysname;
62 2277c5d7 2004-03-21 devnull u32int uid;
63 2277c5d7 2004-03-21 devnull u32int gid;
64 2277c5d7 2004-03-21 devnull u32int g[16];
65 2277c5d7 2004-03-21 devnull u32int ng;
68 2277c5d7 2004-03-21 devnull struct SunRpc
70 2277c5d7 2004-03-21 devnull u32int xid;
71 2277c5d7 2004-03-21 devnull uint iscall;
74 2277c5d7 2004-03-21 devnull * only sent on wire in call
75 2277c5d7 2004-03-21 devnull * caller fills in for the reply unpackers.
77 2277c5d7 2004-03-21 devnull u32int proc;
79 2277c5d7 2004-03-21 devnull /* call */
80 2277c5d7 2004-03-21 devnull // uint proc;
81 2277c5d7 2004-03-21 devnull u32int prog, vers;
82 2277c5d7 2004-03-21 devnull SunAuthInfo cred;
83 2277c5d7 2004-03-21 devnull SunAuthInfo verf;
84 2277c5d7 2004-03-21 devnull uchar *data;
85 2277c5d7 2004-03-21 devnull uint ndata;
87 2277c5d7 2004-03-21 devnull /* reply */
88 2277c5d7 2004-03-21 devnull u32int status;
89 2277c5d7 2004-03-21 devnull // SunAuthInfo verf;
90 2277c5d7 2004-03-21 devnull u32int low, high;
91 2277c5d7 2004-03-21 devnull // uchar *data;
92 2277c5d7 2004-03-21 devnull // uint ndata;
95 2277c5d7 2004-03-21 devnull typedef enum
97 2277c5d7 2004-03-21 devnull SunCallTypeTNull,
98 2277c5d7 2004-03-21 devnull SunCallTypeRNull,
99 2277c5d7 2004-03-21 devnull } SunCallType;
101 2277c5d7 2004-03-21 devnull struct SunCall
103 2277c5d7 2004-03-21 devnull SunRpc rpc;
104 2277c5d7 2004-03-21 devnull SunCallType type;
107 2277c5d7 2004-03-21 devnull void sunerrstr(SunStatus);
109 2277c5d7 2004-03-21 devnull void sunrpcprint(Fmt*, SunRpc*);
110 2277c5d7 2004-03-21 devnull uint sunrpcsize(SunRpc*);
111 2277c5d7 2004-03-21 devnull SunStatus sunrpcpack(uchar*, uchar*, uchar**, SunRpc*);
112 2277c5d7 2004-03-21 devnull SunStatus sunrpcunpack(uchar*, uchar*, uchar**, SunRpc*);
114 2277c5d7 2004-03-21 devnull void sunauthinfoprint(Fmt*, SunAuthInfo*);
115 2277c5d7 2004-03-21 devnull uint sunauthinfosize(SunAuthInfo*);
116 2277c5d7 2004-03-21 devnull int sunauthinfopack(uchar*, uchar*, uchar**, SunAuthInfo*);
117 2277c5d7 2004-03-21 devnull int sunauthinfounpack(uchar*, uchar*, uchar**, SunAuthInfo*);
119 2277c5d7 2004-03-21 devnull void sunauthunixprint(Fmt*, SunAuthUnix*);
120 2277c5d7 2004-03-21 devnull uint sunauthunixsize(SunAuthUnix*);
121 2277c5d7 2004-03-21 devnull int sunauthunixpack(uchar*, uchar*, uchar**, SunAuthUnix*);
122 2277c5d7 2004-03-21 devnull int sunauthunixunpack(uchar*, uchar*, uchar**, SunAuthUnix*);
124 2277c5d7 2004-03-21 devnull int sunenumpack(uchar*, uchar*, uchar**, int*);
125 2277c5d7 2004-03-21 devnull int sunenumunpack(uchar*, uchar*, uchar**, int*);
126 2277c5d7 2004-03-21 devnull int sunuint1pack(uchar*, uchar*, uchar**, u1int*);
127 2277c5d7 2004-03-21 devnull int sunuint1unpack(uchar*, uchar*, uchar**, u1int*);
129 2277c5d7 2004-03-21 devnull int sunstringpack(uchar*, uchar*, uchar**, char**, u32int);
130 2277c5d7 2004-03-21 devnull int sunstringunpack(uchar*, uchar*, uchar**, char**, u32int);
131 2277c5d7 2004-03-21 devnull uint sunstringsize(char*);
133 2277c5d7 2004-03-21 devnull int sunuint32pack(uchar*, uchar*, uchar**, u32int*);
134 2277c5d7 2004-03-21 devnull int sunuint32unpack(uchar*, uchar*, uchar**, u32int*);
135 2277c5d7 2004-03-21 devnull int sunuint64pack(uchar*, uchar*, uchar**, u64int*);
136 2277c5d7 2004-03-21 devnull int sunuint64unpack(uchar*, uchar*, uchar**, u64int*);
138 2277c5d7 2004-03-21 devnull int sunvaropaquepack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);
139 2277c5d7 2004-03-21 devnull int sunvaropaqueunpack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);
140 2277c5d7 2004-03-21 devnull uint sunvaropaquesize(u32int);
142 2277c5d7 2004-03-21 devnull int sunfixedopaquepack(uchar*, uchar*, uchar**, uchar*, u32int);
143 2277c5d7 2004-03-21 devnull int sunfixedopaqueunpack(uchar*, uchar*, uchar**, uchar*, u32int);
144 2277c5d7 2004-03-21 devnull uint sunfixedopaquesize(u32int);
147 2277c5d7 2004-03-21 devnull * Sun RPC Program
149 2277c5d7 2004-03-21 devnull typedef struct SunProc SunProc;
150 2277c5d7 2004-03-21 devnull typedef struct SunProg SunProg;
151 2277c5d7 2004-03-21 devnull struct SunProg
153 2277c5d7 2004-03-21 devnull uint prog;
154 2277c5d7 2004-03-21 devnull uint vers;
155 2277c5d7 2004-03-21 devnull SunProc *proc;
156 2277c5d7 2004-03-21 devnull int nproc;
159 2277c5d7 2004-03-21 devnull struct SunProc
161 2277c5d7 2004-03-21 devnull int (*pack)(uchar*, uchar*, uchar**, SunCall*);
162 2277c5d7 2004-03-21 devnull int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
163 2277c5d7 2004-03-21 devnull uint (*size)(SunCall*);
164 2277c5d7 2004-03-21 devnull void (*fmt)(Fmt*, SunCall*);
165 2277c5d7 2004-03-21 devnull uint sizeoftype;
168 2277c5d7 2004-03-21 devnull SunStatus suncallpack(SunProg*, uchar*, uchar*, uchar**, SunCall*);
169 2277c5d7 2004-03-21 devnull SunStatus suncallunpack(SunProg*, uchar*, uchar*, uchar**, SunCall*);
170 2277c5d7 2004-03-21 devnull SunStatus suncallunpackalloc(SunProg*, SunCallType, uchar*, uchar*, uchar**, SunCall**);
171 2277c5d7 2004-03-21 devnull void suncallsetup(SunCall*, SunProg*, uint);
172 2277c5d7 2004-03-21 devnull uint suncallsize(SunProg*, SunCall*);
175 2277c5d7 2004-03-21 devnull * Formatting
176 2277c5d7 2004-03-21 devnull #pragma varargck type "B" SunRpc*
177 2277c5d7 2004-03-21 devnull #pragma varargck type "C" SunCall*
180 2277c5d7 2004-03-21 devnull int sunrpcfmt(Fmt*);
181 2277c5d7 2004-03-21 devnull int suncallfmt(Fmt*);
182 2277c5d7 2004-03-21 devnull void sunfmtinstall(SunProg*);
186 2277c5d7 2004-03-21 devnull * Sun RPC Server
188 2277c5d7 2004-03-21 devnull typedef struct SunMsg SunMsg;
189 2277c5d7 2004-03-21 devnull typedef struct SunSrv SunSrv;
193 2277c5d7 2004-03-21 devnull SunStackSize = 32768,
196 2277c5d7 2004-03-21 devnull struct SunMsg
198 2277c5d7 2004-03-21 devnull uchar *data;
199 2277c5d7 2004-03-21 devnull int count;
200 2277c5d7 2004-03-21 devnull SunSrv *srv;
201 2277c5d7 2004-03-21 devnull SunRpc rpc;
202 2277c5d7 2004-03-21 devnull SunProg *pg;
203 2277c5d7 2004-03-21 devnull SunCall *call;
204 2277c5d7 2004-03-21 devnull Channel *creply; /* chan(SunMsg*) */
207 2277c5d7 2004-03-21 devnull struct SunSrv
209 2277c5d7 2004-03-21 devnull int chatty;
210 2277c5d7 2004-03-21 devnull int cachereplies;
211 2277c5d7 2004-03-21 devnull int alwaysreject;
212 2277c5d7 2004-03-21 devnull int localonly;
213 2277c5d7 2004-03-21 devnull int localparanoia;
214 2277c5d7 2004-03-21 devnull SunProg **map;
215 2277c5d7 2004-03-21 devnull Channel *crequest;
217 2277c5d7 2004-03-21 devnull /* implementation use only */
218 2277c5d7 2004-03-21 devnull Channel **cdispatch;
219 2277c5d7 2004-03-21 devnull SunProg **prog;
220 2277c5d7 2004-03-21 devnull int nprog;
221 2277c5d7 2004-03-21 devnull void *cache;
222 2277c5d7 2004-03-21 devnull Channel *creply;
223 2277c5d7 2004-03-21 devnull Channel *cthread;
226 2277c5d7 2004-03-21 devnull SunSrv *sunsrv(void);
228 2277c5d7 2004-03-21 devnull void sunsrvprog(SunSrv *srv, SunProg *prog, Channel *c);
229 2277c5d7 2004-03-21 devnull int sunsrvannounce(SunSrv *srv, char *address);
230 2277c5d7 2004-03-21 devnull int sunsrvudp(SunSrv *srv, char *address);
231 2277c5d7 2004-03-21 devnull int sunsrvnet(SunSrv *srv, char *address);
232 2277c5d7 2004-03-21 devnull int sunsrvfd(SunSrv *srv, int fd);
233 2277c5d7 2004-03-21 devnull void sunsrvthreadcreate(SunSrv *srv, void (*fn)(void*), void*);
234 2277c5d7 2004-03-21 devnull void sunsrvclose(SunSrv*);
236 2277c5d7 2004-03-21 devnull int sunmsgreply(SunMsg*, SunCall*);
237 2277c5d7 2004-03-21 devnull int sunmsgdrop(SunMsg*);
238 2277c5d7 2004-03-21 devnull int sunmsgreplyerror(SunMsg*, SunStatus);
241 2277c5d7 2004-03-21 devnull * Sun RPC Client
243 2277c5d7 2004-03-21 devnull typedef struct SunClient SunClient;
245 2277c5d7 2004-03-21 devnull struct SunClient
248 2277c5d7 2004-03-21 devnull int chatty;
249 2277c5d7 2004-03-21 devnull int needcount;
250 2277c5d7 2004-03-21 devnull ulong maxwait;
251 2277c5d7 2004-03-21 devnull ulong xidgen;
252 2277c5d7 2004-03-21 devnull int nsend;
253 2277c5d7 2004-03-21 devnull int nresend;
254 2277c5d7 2004-03-21 devnull struct {
255 2277c5d7 2004-03-21 devnull ulong min;
256 2277c5d7 2004-03-21 devnull ulong max;
257 2277c5d7 2004-03-21 devnull ulong avg;
259 2277c5d7 2004-03-21 devnull Channel *dying;
260 2277c5d7 2004-03-21 devnull Channel *rpcchan;
261 2277c5d7 2004-03-21 devnull Channel *timerchan;
262 2277c5d7 2004-03-21 devnull Channel *flushchan;
263 2277c5d7 2004-03-21 devnull Channel *readchan;
264 2277c5d7 2004-03-21 devnull SunProg **prog;
265 2277c5d7 2004-03-21 devnull int nprog;
266 2277c5d7 2004-03-21 devnull int timertid;
267 2277c5d7 2004-03-21 devnull int nettid;
270 2277c5d7 2004-03-21 devnull SunClient *sundial(char*);
272 2277c5d7 2004-03-21 devnull int sunclientrpc(SunClient*, ulong, SunCall*, SunCall*, uchar**);
273 2277c5d7 2004-03-21 devnull void sunclientclose(SunClient*);
274 2277c5d7 2004-03-21 devnull void sunclientflushrpc(SunClient*, ulong);
275 2277c5d7 2004-03-21 devnull void sunclientprog(SunClient*, SunProg*);
279 2277c5d7 2004-03-21 devnull * Provided by callers.
280 2277c5d7 2004-03-21 devnull * Should remove dependence on this, but hard.
282 2277c5d7 2004-03-21 devnull void *emalloc(ulong);
283 2277c5d7 2004-03-21 devnull void *erealloc(void*, ulong);
287 2277c5d7 2004-03-21 devnull * Sun RPC port mapper; see RFC 1057 Appendix A
290 2277c5d7 2004-03-21 devnull typedef struct PortMap PortMap;
291 2277c5d7 2004-03-21 devnull typedef struct PortTNull PortTNull;
292 2277c5d7 2004-03-21 devnull typedef struct PortRNull PortRNull;
293 2277c5d7 2004-03-21 devnull typedef struct PortTSet PortTSet;
294 2277c5d7 2004-03-21 devnull typedef struct PortRSet PortRSet;
295 2277c5d7 2004-03-21 devnull typedef struct PortTUnset PortTUnset;
296 2277c5d7 2004-03-21 devnull typedef struct PortRUnset PortRUnset;
297 2277c5d7 2004-03-21 devnull typedef struct PortTGetport PortTGetport;
298 2277c5d7 2004-03-21 devnull typedef struct PortRGetport PortRGetport;
299 2277c5d7 2004-03-21 devnull typedef struct PortTDump PortTDump;
300 2277c5d7 2004-03-21 devnull typedef struct PortRDump PortRDump;
301 2277c5d7 2004-03-21 devnull typedef struct PortTCallit PortTCallit;
302 2277c5d7 2004-03-21 devnull typedef struct PortRCallit PortRCallit;
304 2277c5d7 2004-03-21 devnull typedef enum
306 2277c5d7 2004-03-21 devnull PortCallTNull,
307 2277c5d7 2004-03-21 devnull PortCallRNull,
308 2277c5d7 2004-03-21 devnull PortCallTSet,
309 2277c5d7 2004-03-21 devnull PortCallRSet,
310 2277c5d7 2004-03-21 devnull PortCallTUnset,
311 2277c5d7 2004-03-21 devnull PortCallRUnset,
312 2277c5d7 2004-03-21 devnull PortCallTGetport,
313 2277c5d7 2004-03-21 devnull PortCallRGetport,
314 2277c5d7 2004-03-21 devnull PortCallTDump,
315 2277c5d7 2004-03-21 devnull PortCallRDump,
316 2277c5d7 2004-03-21 devnull PortCallTCallit,
317 2277c5d7 2004-03-21 devnull PortCallRCallit,
318 2277c5d7 2004-03-21 devnull } PortCallType;
322 2277c5d7 2004-03-21 devnull PortProgram = 100000,
323 2277c5d7 2004-03-21 devnull PortVersion = 2,
325 2277c5d7 2004-03-21 devnull PortProtoTcp = 6, /* protocol number for TCP/IP */
326 2277c5d7 2004-03-21 devnull PortProtoUdp = 17 /* protocol number for UDP/IP */
329 2277c5d7 2004-03-21 devnull struct PortMap {
330 2277c5d7 2004-03-21 devnull u32int prog;
331 2277c5d7 2004-03-21 devnull u32int vers;
332 2277c5d7 2004-03-21 devnull u32int prot;
333 2277c5d7 2004-03-21 devnull u32int port;
336 2277c5d7 2004-03-21 devnull struct PortTNull {
337 2277c5d7 2004-03-21 devnull SunCall call;
340 2277c5d7 2004-03-21 devnull struct PortRNull {
341 2277c5d7 2004-03-21 devnull SunCall call;
344 2277c5d7 2004-03-21 devnull struct PortTSet {
345 2277c5d7 2004-03-21 devnull SunCall call;
346 2277c5d7 2004-03-21 devnull PortMap map;
349 2277c5d7 2004-03-21 devnull struct PortRSet {
350 2277c5d7 2004-03-21 devnull SunCall call;
351 2277c5d7 2004-03-21 devnull u1int b;
354 2277c5d7 2004-03-21 devnull struct PortTUnset {
355 2277c5d7 2004-03-21 devnull SunCall call;
356 2277c5d7 2004-03-21 devnull PortMap map;
359 2277c5d7 2004-03-21 devnull struct PortRUnset {
360 2277c5d7 2004-03-21 devnull SunCall call;
361 2277c5d7 2004-03-21 devnull u1int b;
364 2277c5d7 2004-03-21 devnull struct PortTGetport {
365 2277c5d7 2004-03-21 devnull SunCall call;
366 2277c5d7 2004-03-21 devnull PortMap map;
369 2277c5d7 2004-03-21 devnull struct PortRGetport {
370 2277c5d7 2004-03-21 devnull SunCall call;
371 2277c5d7 2004-03-21 devnull u32int port;
374 2277c5d7 2004-03-21 devnull struct PortTDump {
375 2277c5d7 2004-03-21 devnull SunCall call;
378 2277c5d7 2004-03-21 devnull struct PortRDump {
379 2277c5d7 2004-03-21 devnull SunCall call;
380 2277c5d7 2004-03-21 devnull PortMap *map;
381 2277c5d7 2004-03-21 devnull int nmap;
384 2277c5d7 2004-03-21 devnull struct PortTCallit {
385 2277c5d7 2004-03-21 devnull SunCall call;
386 2277c5d7 2004-03-21 devnull u32int prog;
387 2277c5d7 2004-03-21 devnull u32int vers;
388 2277c5d7 2004-03-21 devnull u32int proc;
389 2277c5d7 2004-03-21 devnull uchar *data;
390 2277c5d7 2004-03-21 devnull u32int count;
393 2277c5d7 2004-03-21 devnull struct PortRCallit {
394 2277c5d7 2004-03-21 devnull SunCall call;
395 2277c5d7 2004-03-21 devnull u32int port;
396 2277c5d7 2004-03-21 devnull uchar *data;
397 2277c5d7 2004-03-21 devnull u32int count;
400 2277c5d7 2004-03-21 devnull extern SunProg portprog;