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