1 | /* $NetBSD: clnt.h,v 1.24 2016/01/23 02:34:09 dholland Exp $ */ |
2 | |
3 | /* |
4 | * Sun RPC is a product of Sun Microsystems, Inc. and is provided for |
5 | * unrestricted use provided that this legend is included on all tape |
6 | * media and as a part of the software program in whole or part. Users |
7 | * may copy or modify Sun RPC without charge, but are not authorized |
8 | * to license or distribute it to anyone else except as part of a product or |
9 | * program developed by the user. |
10 | * |
11 | * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE |
12 | * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR |
13 | * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. |
14 | * |
15 | * Sun RPC is provided with no support and without any obligation on the |
16 | * part of Sun Microsystems, Inc. to assist in its use, correction, |
17 | * modification or enhancement. |
18 | * |
19 | * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE |
20 | * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC |
21 | * OR ANY PART THEREOF. |
22 | * |
23 | * In no event will Sun Microsystems, Inc. be liable for any lost revenue |
24 | * or profits or other special, indirect and consequential damages, even if |
25 | * Sun has been advised of the possibility of such damages. |
26 | * |
27 | * Sun Microsystems, Inc. |
28 | * 2550 Garcia Avenue |
29 | * Mountain View, California 94043 |
30 | * |
31 | * from: @(#)clnt.h 1.31 94/04/29 SMI |
32 | * @(#)clnt.h 2.1 88/07/29 4.0 RPCSRC |
33 | */ |
34 | |
35 | /* |
36 | * clnt.h - Client side remote procedure call interface. |
37 | * |
38 | * Copyright (C) 1984, Sun Microsystems, Inc. |
39 | */ |
40 | |
41 | #ifndef _RPC_CLNT_H_ |
42 | #define _RPC_CLNT_H_ |
43 | #include <sys/cdefs.h> |
44 | |
45 | #include <rpc/rpc_com.h> |
46 | |
47 | /* |
48 | * Well-known IPV6 RPC broadcast address. |
49 | */ |
50 | #define RPCB_MULTICAST_ADDR "ff02::202" |
51 | |
52 | /* |
53 | * Rpc calls return an enum clnt_stat. This should be looked at more, |
54 | * since each implementation is required to live with this (implementation |
55 | * independent) list of errors. |
56 | */ |
57 | enum clnt_stat { |
58 | RPC_SUCCESS=0, /* call succeeded */ |
59 | /* |
60 | * local errors |
61 | */ |
62 | RPC_CANTENCODEARGS=1, /* can't encode arguments */ |
63 | RPC_CANTDECODERES=2, /* can't decode results */ |
64 | RPC_CANTSEND=3, /* failure in sending call */ |
65 | RPC_CANTRECV=4, /* failure in receiving result */ |
66 | RPC_TIMEDOUT=5, /* call timed out */ |
67 | /* |
68 | * remote errors |
69 | */ |
70 | RPC_VERSMISMATCH=6, /* rpc versions not compatible */ |
71 | RPC_AUTHERROR=7, /* authentication error */ |
72 | RPC_PROGUNAVAIL=8, /* program not available */ |
73 | RPC_PROGVERSMISMATCH=9, /* program version mismatched */ |
74 | RPC_PROCUNAVAIL=10, /* procedure unavailable */ |
75 | RPC_CANTDECODEARGS=11, /* decode arguments error */ |
76 | RPC_SYSTEMERROR=12, /* generic "other problem" */ |
77 | |
78 | /* |
79 | * rpc_call & clnt_create errors |
80 | */ |
81 | RPC_UNKNOWNHOST=13, /* unknown host name */ |
82 | RPC_UNKNOWNPROTO=17, /* unknown protocol */ |
83 | RPC_UNKNOWNADDR = 19, /* Remote address unknown */ |
84 | RPC_NOBROADCAST = 21, /* Broadcasting not supported */ |
85 | |
86 | /* |
87 | * rpcbind errors |
88 | */ |
89 | RPC_RPCBFAILURE=14, /* the pmapper failed in its call */ |
90 | #define RPC_PMAPFAILURE RPC_RPCBFAILURE |
91 | RPC_PROGNOTREGISTERED=15, /* remote program is not registered */ |
92 | RPC_N2AXLATEFAILURE = 22, /* name -> addr translation failed */ |
93 | |
94 | /* |
95 | * Misc error in the TLI library (provided for compatibility) |
96 | */ |
97 | RPC_TLIERROR = 20, |
98 | |
99 | /* |
100 | * unspecified error |
101 | */ |
102 | RPC_FAILED=16, |
103 | |
104 | /* |
105 | * asynchronous errors |
106 | */ |
107 | RPC_INPROGRESS = 24, |
108 | RPC_STALERACHANDLE = 25 |
109 | }; |
110 | |
111 | |
112 | /* |
113 | * Error info. |
114 | */ |
115 | struct rpc_err { |
116 | enum clnt_stat re_status; |
117 | union { |
118 | int RE_errno; /* related system error */ |
119 | enum auth_stat RE_why; /* why the auth error occurred */ |
120 | struct { |
121 | rpcvers_t low; /* lowest version supported */ |
122 | rpcvers_t high; /* highest version supported */ |
123 | } RE_vers; |
124 | struct { /* maybe meaningful if RPC_FAILED */ |
125 | int32_t s1; |
126 | int32_t s2; |
127 | } RE_lb; /* life boot & debugging only */ |
128 | } ru; |
129 | #define re_errno ru.RE_errno |
130 | #define re_why ru.RE_why |
131 | #define re_vers ru.RE_vers |
132 | #define re_lb ru.RE_lb |
133 | }; |
134 | |
135 | |
136 | /* |
137 | * Client rpc handle. |
138 | * Created by individual implementations |
139 | * Client is responsible for initializing auth, see e.g. auth_none.c. |
140 | */ |
141 | typedef struct __rpc_client { |
142 | AUTH *cl_auth; /* authenticator */ |
143 | const struct clnt_ops { |
144 | /* call remote procedure */ |
145 | enum clnt_stat (*cl_call)(struct __rpc_client *, |
146 | rpcproc_t, xdrproc_t, const char *, |
147 | xdrproc_t, caddr_t, struct timeval); |
148 | /* abort a call */ |
149 | void (*cl_abort)(struct __rpc_client *); |
150 | /* get specific error code */ |
151 | void (*cl_geterr)(struct __rpc_client *, |
152 | struct rpc_err *); |
153 | /* frees results */ |
154 | bool_t (*cl_freeres)(struct __rpc_client *, |
155 | xdrproc_t, caddr_t); |
156 | /* destroy this structure */ |
157 | void (*cl_destroy)(struct __rpc_client *); |
158 | /* the ioctl() of rpc */ |
159 | bool_t (*cl_control)(struct __rpc_client *, |
160 | unsigned int, char *); |
161 | } *cl_ops; |
162 | void *cl_private; /* private stuff */ |
163 | char *cl_netid; /* network token */ |
164 | char *cl_tp; /* device name */ |
165 | } CLIENT; |
166 | |
167 | |
168 | /* |
169 | * Timers used for the pseudo-transport protocol when using datagrams |
170 | */ |
171 | struct rpc_timers { |
172 | unsigned short rt_srtt; /* smoothed round-trip time */ |
173 | unsigned short rt_deviate; /* estimated deviation */ |
174 | unsigned long rt_rtxcur; /* current (backed-off) rto */ |
175 | }; |
176 | |
177 | /* |
178 | * Feedback values used for possible congestion and rate control |
179 | */ |
180 | #define FEEDBACK_REXMIT1 1 /* first retransmit */ |
181 | #define FEEDBACK_OK 2 /* no retransmits */ |
182 | |
183 | /* Used to set version of portmapper used in broadcast */ |
184 | |
185 | #define CLCR_SET_LOWVERS 3 |
186 | #define CLCR_GET_LOWVERS 4 |
187 | |
188 | #define RPCSMALLMSGSIZE 400 /* a more reasonable packet size */ |
189 | |
190 | /* |
191 | * client side rpc interface ops |
192 | * |
193 | * Parameter types are: |
194 | * |
195 | */ |
196 | |
197 | /* |
198 | * enum clnt_stat |
199 | * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout) |
200 | * CLIENT *rh; |
201 | * rpcproc_t proc; |
202 | * xdrproc_t xargs; |
203 | * caddr_t argsp; |
204 | * xdrproc_t xres; |
205 | * caddr_t resp; |
206 | * struct timeval timeout; |
207 | */ |
208 | #define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ |
209 | ((*(rh)->cl_ops->cl_call)(rh, proc, (xdrproc_t)xargs, \ |
210 | (const char *)(const void *)(argsp), (xdrproc_t)xres, \ |
211 | (caddr_t)(void *)resp, secs)) |
212 | #define clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \ |
213 | ((*(rh)->cl_ops->cl_call)(rh, proc, (xdrproc_t)xargs, \ |
214 | (const char *)(const void *)(argsp), (xdrproc_t)xres, \ |
215 | (caddr_t)(void *)resp, secs)) |
216 | |
217 | /* |
218 | * void |
219 | * CLNT_ABORT(rh); |
220 | * CLIENT *rh; |
221 | */ |
222 | #define CLNT_ABORT(rh) ((*(rh)->cl_ops->cl_abort)(rh)) |
223 | #define clnt_abort(rh) ((*(rh)->cl_ops->cl_abort)(rh)) |
224 | |
225 | /* |
226 | * struct rpc_err |
227 | * CLNT_GETERR(rh); |
228 | * CLIENT *rh; |
229 | */ |
230 | #define CLNT_GETERR(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) |
231 | #define clnt_geterr(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) |
232 | |
233 | |
234 | /* |
235 | * bool_t |
236 | * CLNT_FREERES(rh, xres, resp); |
237 | * CLIENT *rh; |
238 | * xdrproc_t xres; |
239 | * caddr_t resp; |
240 | */ |
241 | #define CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) |
242 | #define clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) |
243 | |
244 | /* |
245 | * bool_t |
246 | * CLNT_CONTROL(cl, request, info) |
247 | * CLIENT *cl; |
248 | * unsigned request; |
249 | * char *info; |
250 | */ |
251 | #define CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) |
252 | #define clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) |
253 | |
254 | /* |
255 | * control operations that apply to both udp and tcp transports |
256 | */ |
257 | #define CLSET_TIMEOUT 1 /* set timeout (timeval) */ |
258 | #define CLGET_TIMEOUT 2 /* get timeout (timeval) */ |
259 | #define CLGET_SERVER_ADDR 3 /* get server's address (sockaddr) */ |
260 | #define CLGET_FD 6 /* get connections file descriptor */ |
261 | #define CLGET_SVC_ADDR 7 /* get server's address (netbuf) */ |
262 | #define CLSET_FD_CLOSE 8 /* close fd while clnt_destroy */ |
263 | #define CLSET_FD_NCLOSE 9 /* Do not close fd while clnt_destroy */ |
264 | #define CLGET_XID 10 /* Get xid */ |
265 | #define CLSET_XID 11 /* Set xid */ |
266 | #define CLGET_VERS 12 /* Get version number */ |
267 | #define CLSET_VERS 13 /* Set version number */ |
268 | #define CLGET_PROG 14 /* Get program number */ |
269 | #define CLSET_PROG 15 /* Set program number */ |
270 | #define CLSET_SVC_ADDR 16 /* get server's address (netbuf) */ |
271 | #define CLSET_PUSH_TIMOD 17 /* push timod if not already present */ |
272 | #define CLSET_POP_TIMOD 18 /* pop timod */ |
273 | /* |
274 | * Connectionless only control operations |
275 | */ |
276 | #define CLSET_RETRY_TIMEOUT 4 /* set retry timeout (timeval) */ |
277 | #define CLGET_RETRY_TIMEOUT 5 /* get retry timeout (timeval) */ |
278 | |
279 | /* |
280 | * void |
281 | * CLNT_DESTROY(rh); |
282 | * CLIENT *rh; |
283 | */ |
284 | #define CLNT_DESTROY(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) |
285 | #define clnt_destroy(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) |
286 | |
287 | |
288 | /* |
289 | * RPCTEST is a test program which is accessible on every rpc |
290 | * transport/port. It is used for testing, performance evaluation, |
291 | * and network administration. |
292 | */ |
293 | |
294 | #define RPCTEST_PROGRAM ((rpcprog_t)1) |
295 | #define RPCTEST_VERSION ((rpcvers_t)1) |
296 | #define RPCTEST_NULL_PROC ((rpcproc_t)2) |
297 | #define RPCTEST_NULL_BATCH_PROC ((rpcproc_t)3) |
298 | |
299 | /* |
300 | * By convention, procedure 0 takes null arguments and returns them |
301 | */ |
302 | |
303 | #define NULLPROC ((rpcproc_t)0) |
304 | |
305 | /* |
306 | * Below are the client handle creation routines for the various |
307 | * implementations of client side rpc. They can return NULL if a |
308 | * creation failure occurs. |
309 | */ |
310 | |
311 | /* |
312 | * Generic client creation routine. Supported protocols are those that |
313 | * belong to the nettype namespace (/etc/netconfig). |
314 | * CLIENT * |
315 | * clnt_create(host, prog, vers, prot); |
316 | * const char *host; -- hostname |
317 | * const rpcprog_t prog; -- program number |
318 | * const rpcvers_t vers; -- version number |
319 | * const char *prot; -- protocol |
320 | */ |
321 | __BEGIN_DECLS |
322 | extern CLIENT *clnt_create(const char *, const rpcprog_t, const rpcvers_t, |
323 | const char *); |
324 | /* |
325 | * |
326 | * const char *hostname; -- hostname |
327 | * const rpcprog_t prog; -- program number |
328 | * const rpcvers_t vers; -- version number |
329 | * const char *nettype; -- network type |
330 | */ |
331 | |
332 | /* |
333 | * Generic client creation routine. Supported protocols are which belong |
334 | * to the nettype name space. |
335 | */ |
336 | extern CLIENT *clnt_create_vers(const char *, const rpcprog_t, rpcvers_t *, |
337 | const rpcvers_t, const rpcvers_t, |
338 | const char *); |
339 | /* |
340 | * const char *host; -- hostname |
341 | * const rpcprog_t prog; -- program number |
342 | * rpcvers_t *vers_out; -- servers highest available version |
343 | * const rpcvers_t vers_low; -- low version number |
344 | * const rpcvers_t vers_high; -- high version number |
345 | * const char *nettype; -- network type |
346 | */ |
347 | |
348 | |
349 | /* |
350 | * Generic client creation routine. It takes a netconfig structure |
351 | * instead of nettype |
352 | */ |
353 | extern CLIENT *clnt_tp_create(const char *, const rpcprog_t, |
354 | const rpcvers_t, const struct netconfig *); |
355 | /* |
356 | * const char *hostname; -- hostname |
357 | * const rpcprog_t prog; -- program number |
358 | * const rpcvers_t vers; -- version number |
359 | * const struct netconfig *netconf; -- network config structure |
360 | */ |
361 | |
362 | /* |
363 | * Generic TLI create routine. Only provided for compatibility. |
364 | */ |
365 | |
366 | extern CLIENT *clnt_tli_create(const int, const struct netconfig *, |
367 | const struct netbuf *, const rpcprog_t, |
368 | const rpcvers_t, const unsigned int, |
369 | const unsigned int); |
370 | /* |
371 | * const register int fd; -- fd |
372 | * const struct netconfig *nconf; -- netconfig structure |
373 | * const struct netbuf *svcaddr; -- servers address |
374 | * const unsigned long prog; -- program number |
375 | * const unsigned long vers; -- version number |
376 | * const unsigned sendsz; -- send size |
377 | * const unsigned recvsz; -- recv size |
378 | */ |
379 | |
380 | /* |
381 | * Low level clnt create routine for connectionful transports, e.g. tcp. |
382 | */ |
383 | extern CLIENT *clnt_vc_create(const int, const struct netbuf *, |
384 | const rpcprog_t, const rpcvers_t, |
385 | const unsigned int, const unsigned int); |
386 | /* |
387 | * const int fd; -- open file descriptor |
388 | * const struct netbuf *svcaddr; -- servers address |
389 | * const rpcprog_t prog; -- program number |
390 | * const rpcvers_t vers; -- version number |
391 | * const unsigned sendsz; -- buffer recv size |
392 | * const unsigned recvsz; -- buffer send size |
393 | */ |
394 | |
395 | /* |
396 | * Low level clnt create routine for connectionless transports, e.g. udp. |
397 | */ |
398 | extern CLIENT *clnt_dg_create(const int, const struct netbuf *, |
399 | const rpcprog_t, const rpcvers_t, |
400 | const unsigned int, const unsigned int); |
401 | /* |
402 | * const int fd; -- open file descriptor |
403 | * const struct netbuf *svcaddr; -- servers address |
404 | * const rpcprog_t program; -- program number |
405 | * const rpcvers_t version; -- version number |
406 | * const unsigned sendsz; -- buffer recv size |
407 | * const unsigned recvsz; -- buffer send size |
408 | */ |
409 | |
410 | /* |
411 | * Memory based rpc (for speed check and testing) |
412 | * CLIENT * |
413 | * clnt_raw_create(prog, vers) |
414 | * unsigned long prog; |
415 | * unsigned long vers; |
416 | */ |
417 | extern CLIENT *clnt_raw_create (rpcprog_t, rpcvers_t); |
418 | |
419 | __END_DECLS |
420 | |
421 | |
422 | /* |
423 | * Print why creation failed |
424 | */ |
425 | __BEGIN_DECLS |
426 | extern void clnt_pcreateerror (const char *); /* stderr */ |
427 | extern char *clnt_spcreateerror (const char *); /* string */ |
428 | __END_DECLS |
429 | |
430 | /* |
431 | * Like clnt_perror(), but is more verbose in its output |
432 | */ |
433 | __BEGIN_DECLS |
434 | extern void clnt_perrno (enum clnt_stat); /* stderr */ |
435 | extern char *clnt_sperrno (enum clnt_stat); /* string */ |
436 | __END_DECLS |
437 | |
438 | /* |
439 | * Print an English error message, given the client error code |
440 | */ |
441 | __BEGIN_DECLS |
442 | extern void clnt_perror (CLIENT *, const char *); /* stderr */ |
443 | extern char *clnt_sperror (CLIENT *, const char *); /* string */ |
444 | __END_DECLS |
445 | |
446 | |
447 | /* |
448 | * If a creation fails, the following allows the user to figure out why. |
449 | */ |
450 | struct rpc_createerr { |
451 | enum clnt_stat cf_stat; |
452 | struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */ |
453 | }; |
454 | |
455 | __BEGIN_DECLS |
456 | extern struct rpc_createerr *__rpc_createerr(void); |
457 | __END_DECLS |
458 | #define rpc_createerr (*(__rpc_createerr())) |
459 | |
460 | /* |
461 | * The simplified interface: |
462 | * enum clnt_stat |
463 | * rpc_call(host, prognum, versnum, procnum, inproc, in, outproc, out, nettype) |
464 | * const char *host; |
465 | * const rpcprog_t prognum; |
466 | * const rpcvers_t versnum; |
467 | * const rpcproc_t procnum; |
468 | * const xdrproc_t inproc, outproc; |
469 | * const char *in; |
470 | * char *out; |
471 | * const char *nettype; |
472 | */ |
473 | __BEGIN_DECLS |
474 | extern enum clnt_stat rpc_call(const char *, const rpcprog_t, |
475 | const rpcvers_t, const rpcproc_t, |
476 | const xdrproc_t, const char *, |
477 | const xdrproc_t, char *, const char *); |
478 | __END_DECLS |
479 | |
480 | /* |
481 | * RPC broadcast interface |
482 | * The call is broadcasted to all locally connected nets. |
483 | * |
484 | * extern enum clnt_stat |
485 | * rpc_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, |
486 | * eachresult, nettype) |
487 | * const rpcprog_t prog; -- program number |
488 | * const rpcvers_t vers; -- version number |
489 | * const rpcproc_t proc; -- procedure number |
490 | * const xdrproc_t xargs; -- xdr routine for args |
491 | * caddr_t argsp; -- pointer to args |
492 | * const xdrproc_t xresults; -- xdr routine for results |
493 | * caddr_t resultsp; -- pointer to results |
494 | * const resultproc_t eachresult; -- call with each result |
495 | * const char *nettype; -- Transport type |
496 | * |
497 | * For each valid response received, the procedure eachresult is called. |
498 | * Its form is: |
499 | * done = eachresult(resp, raddr, nconf) |
500 | * bool_t done; |
501 | * caddr_t resp; |
502 | * struct netbuf *raddr; |
503 | * struct netconfig *nconf; |
504 | * where resp points to the results of the call and raddr is the |
505 | * address if the responder to the broadcast. nconf is the transport |
506 | * on which the response was received. |
507 | * |
508 | * extern enum clnt_stat |
509 | * rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp, |
510 | * eachresult, inittime, waittime, nettype) |
511 | * const rpcprog_t prog; -- program number |
512 | * const rpcvers_t vers; -- version number |
513 | * const rpcproc_t proc; -- procedure number |
514 | * const xdrproc_t xargs; -- xdr routine for args |
515 | * caddr_t argsp; -- pointer to args |
516 | * const xdrproc_t xresults; -- xdr routine for results |
517 | * caddr_t resultsp; -- pointer to results |
518 | * const resultproc_t eachresult; -- call with each result |
519 | * const int inittime; -- how long to wait initially |
520 | * const int waittime; -- maximum time to wait |
521 | * const char *nettype; -- Transport type |
522 | */ |
523 | |
524 | typedef bool_t (*resultproc_t)(caddr_t, ...); |
525 | |
526 | __BEGIN_DECLS |
527 | extern enum clnt_stat rpc_broadcast(const rpcprog_t, const rpcvers_t, |
528 | const rpcproc_t, const xdrproc_t, const char *, const xdrproc_t, caddr_t, |
529 | const resultproc_t, const char *); |
530 | extern enum clnt_stat rpc_broadcast_exp(const rpcprog_t, const rpcvers_t, |
531 | const rpcproc_t, const xdrproc_t, const char *, const xdrproc_t, caddr_t, |
532 | const resultproc_t, const int, const int, const char *); |
533 | __END_DECLS |
534 | |
535 | /* For backward compatibility */ |
536 | #include <rpc/clnt_soc.h> |
537 | |
538 | #endif /* !_RPC_CLNT_H_ */ |
539 | |