Blob


1 /*
2 * Sun RPC; see RFC 1057
3 */
5 /*
6 #pragma lib "libsunrpc.a"
7 #pragma src "/sys/src/libsunrpc"
8 */
9 AUTOLIB(sunrpc)
11 typedef uchar u1int;
13 typedef struct SunAuthInfo SunAuthInfo;
14 typedef struct SunAuthUnix SunAuthUnix;
15 typedef struct SunRpc SunRpc;
16 typedef struct SunCall SunCall;
18 enum
19 {
20 /* Authinfo.flavor */
21 SunAuthNone = 0,
22 SunAuthSys,
23 SunAuthShort,
24 SunAuthDes
25 };
27 typedef enum {
28 SunAcceptError = 0x10000,
29 SunRejectError = 0x20000,
30 SunAuthError = 0x40000,
32 /* Reply.status */
33 SunSuccess = 0,
35 SunProgUnavail = SunAcceptError | 1,
36 SunProgMismatch,
37 SunProcUnavail,
38 SunGarbageArgs,
39 SunSystemErr,
41 SunRpcMismatch = SunRejectError | 0,
43 SunAuthBadCred = SunAuthError | 1,
44 SunAuthRejectedCred,
45 SunAuthBadVerf,
46 SunAuthRejectedVerf,
47 SunAuthTooWeak,
48 SunAuthInvalidResp,
49 SunAuthFailed
50 } SunStatus;
52 struct SunAuthInfo
53 {
54 uint flavor;
55 uchar *data;
56 uint ndata;
57 };
59 struct SunAuthUnix
60 {
61 u32int stamp;
62 char *sysname;
63 u32int uid;
64 u32int gid;
65 u32int g[16];
66 u32int ng;
67 };
69 struct SunRpc
70 {
71 u32int xid;
72 uint iscall;
74 /*
75 * only sent on wire in call
76 * caller fills in for the reply unpackers.
77 */
78 u32int proc;
80 /* call */
81 /* uint proc; */
82 u32int prog, vers;
83 SunAuthInfo cred;
84 SunAuthInfo verf;
85 uchar *data;
86 uint ndata;
88 /* reply */
89 u32int status;
90 /* SunAuthInfo verf; */
91 u32int low, high;
92 /* uchar *data; */
93 /* uint ndata; */
94 };
96 typedef enum
97 {
98 SunCallTypeTNull,
99 SunCallTypeRNull
100 } SunCallType;
102 struct SunCall
104 SunRpc rpc;
105 SunCallType type;
106 };
108 void sunerrstr(SunStatus);
110 void sunrpcprint(Fmt*, SunRpc*);
111 uint sunrpcsize(SunRpc*);
112 SunStatus sunrpcpack(uchar*, uchar*, uchar**, SunRpc*);
113 SunStatus sunrpcunpack(uchar*, uchar*, uchar**, SunRpc*);
115 void sunauthinfoprint(Fmt*, SunAuthInfo*);
116 uint sunauthinfosize(SunAuthInfo*);
117 int sunauthinfopack(uchar*, uchar*, uchar**, SunAuthInfo*);
118 int sunauthinfounpack(uchar*, uchar*, uchar**, SunAuthInfo*);
120 void sunauthunixprint(Fmt*, SunAuthUnix*);
121 uint sunauthunixsize(SunAuthUnix*);
122 int sunauthunixpack(uchar*, uchar*, uchar**, SunAuthUnix*);
123 int sunauthunixunpack(uchar*, uchar*, uchar**, SunAuthUnix*);
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*);
130 int sunstringpack(uchar*, uchar*, uchar**, char**, u32int);
131 int sunstringunpack(uchar*, uchar*, uchar**, char**, u32int);
132 uint sunstringsize(char*);
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*);
139 int sunvaropaquepack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);
140 int sunvaropaqueunpack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);
141 uint sunvaropaquesize(u32int);
143 int sunfixedopaquepack(uchar*, uchar*, uchar**, uchar*, u32int);
144 int sunfixedopaqueunpack(uchar*, uchar*, uchar**, uchar*, u32int);
145 uint sunfixedopaquesize(u32int);
147 /*
148 * Sun RPC Program
149 */
150 typedef struct SunProc SunProc;
151 typedef struct SunProg SunProg;
152 struct SunProg
154 uint prog;
155 uint vers;
156 SunProc *proc;
157 int nproc;
158 };
160 struct SunProc
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 };
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*);
175 /*
176 * Formatting
177 #pragma varargck type "B" SunRpc*
178 #pragma varargck type "C" SunCall*
179 */
181 int sunrpcfmt(Fmt*);
182 int suncallfmt(Fmt*);
183 void sunfmtinstall(SunProg*);
186 /*
187 * Sun RPC Server
188 */
189 typedef struct SunMsg SunMsg;
190 typedef struct SunSrv SunSrv;
192 enum
194 SunStackSize = 32768
195 };
197 struct SunMsg
199 uchar *data;
200 int count;
201 SunSrv *srv;
202 SunRpc rpc;
203 SunProg *pg;
204 SunCall *call;
205 Channel *creply; /* chan(SunMsg*) */
206 };
208 struct SunSrv
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);
219 /* implementation use only */
220 Channel **cdispatch;
221 SunProg **prog;
222 int nprog;
223 void *cache;
224 Channel *creply;
225 Channel *cthread;
226 };
228 SunSrv *sunsrv(void);
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*);
238 int sunmsgreply(SunMsg*, SunCall*);
239 int sunmsgdrop(SunMsg*);
240 int sunmsgreplyerror(SunMsg*, SunStatus);
242 /*
243 * Sun RPC Client
244 */
245 typedef struct SunClient SunClient;
247 struct SunClient
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 };
272 SunClient *sundial(char*);
274 int sunclientrpc(SunClient*, ulong, SunCall*, SunCall*, uchar**);
275 void sunclientclose(SunClient*);
276 void sunclientflushrpc(SunClient*, ulong);
277 void sunclientprog(SunClient*, SunProg*);
280 /*
281 * Provided by callers.
282 * Should remove dependence on this, but hard.
283 */
284 void *emalloc(ulong);
285 void *erealloc(void*, ulong);
288 /*
289 * Sun RPC port mapper; see RFC 1057 Appendix A
290 */
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;
306 typedef enum
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;
322 enum
324 PortProgram = 100000,
325 PortVersion = 2,
327 PortProtoTcp = 6, /* protocol number for TCP/IP */
328 PortProtoUdp = 17 /* protocol number for UDP/IP */
329 };
331 struct PortMap {
332 u32int prog;
333 u32int vers;
334 u32int prot;
335 u32int port;
336 };
338 struct PortTNull {
339 SunCall call;
340 };
342 struct PortRNull {
343 SunCall call;
344 };
346 struct PortTSet {
347 SunCall call;
348 PortMap map;
349 };
351 struct PortRSet {
352 SunCall call;
353 u1int b;
354 };
356 struct PortTUnset {
357 SunCall call;
358 PortMap map;
359 };
361 struct PortRUnset {
362 SunCall call;
363 u1int b;
364 };
366 struct PortTGetport {
367 SunCall call;
368 PortMap map;
369 };
371 struct PortRGetport {
372 SunCall call;
373 u32int port;
374 };
376 struct PortTDump {
377 SunCall call;
378 };
380 struct PortRDump {
381 SunCall call;
382 PortMap *map;
383 int nmap;
384 };
386 struct PortTCallit {
387 SunCall call;
388 u32int prog;
389 u32int vers;
390 u32int proc;
391 uchar *data;
392 u32int count;
393 };
395 struct PortRCallit {
396 SunCall call;
397 u32int port;
398 uchar *data;
399 u32int count;
400 };
402 extern SunProg portprog;