1dfdcada3SDoug Rabson /* $NetBSD: clnt.h,v 1.14 2000/06/02 22:57:55 fvdl Exp $ */ 2dfdcada3SDoug Rabson 344443e42SHiroki Sato /*- 451369649SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 551369649SPedro F. Giffuni * 644443e42SHiroki Sato * Copyright (c) 2010, Oracle America, Inc. 744443e42SHiroki Sato * All rights reserved. 8dfdcada3SDoug Rabson * 944443e42SHiroki Sato * Redistribution and use in source and binary forms, with or without 1044443e42SHiroki Sato * modification, are permitted provided that the following conditions are met: 1144443e42SHiroki Sato * - Redistributions of source code must retain the above copyright notice, 1244443e42SHiroki Sato * this list of conditions and the following disclaimer. 1344443e42SHiroki Sato * - Redistributions in binary form must reproduce the above copyright notice, 1444443e42SHiroki Sato * this list of conditions and the following disclaimer in the documentation 1544443e42SHiroki Sato * and/or other materials provided with the distribution. 1644443e42SHiroki Sato * - Neither the name of the "Oracle America, Inc." nor the names of its 1744443e42SHiroki Sato * contributors may be used to endorse or promote products derived 1844443e42SHiroki Sato * from this software without specific prior written permission. 19dfdcada3SDoug Rabson * 2044443e42SHiroki Sato * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2144443e42SHiroki Sato * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2244443e42SHiroki Sato * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2344443e42SHiroki Sato * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2444443e42SHiroki Sato * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2544443e42SHiroki Sato * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2644443e42SHiroki Sato * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2744443e42SHiroki Sato * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2844443e42SHiroki Sato * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2944443e42SHiroki Sato * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3044443e42SHiroki Sato * POSSIBILITY OF SUCH DAMAGE. 31dfdcada3SDoug Rabson */ 32dfdcada3SDoug Rabson 33dfdcada3SDoug Rabson /* 34dfdcada3SDoug Rabson * clnt.h - Client side remote procedure call interface. 35dfdcada3SDoug Rabson * 36dfdcada3SDoug Rabson * Copyright (c) 1986-1991,1994-1999 by Sun Microsystems, Inc. 37dfdcada3SDoug Rabson * All rights reserved. 38dfdcada3SDoug Rabson */ 39dfdcada3SDoug Rabson 40dfdcada3SDoug Rabson #ifndef _RPC_CLNT_H_ 41dfdcada3SDoug Rabson #define _RPC_CLNT_H_ 42dfdcada3SDoug Rabson #include <rpc/clnt_stat.h> 43dfdcada3SDoug Rabson #include <sys/cdefs.h> 44c675522fSDoug Rabson #include <sys/refcount.h> 45dfdcada3SDoug Rabson #include <rpc/netconfig.h> 46dfdcada3SDoug Rabson #include <sys/un.h> 47dfdcada3SDoug Rabson 48dfdcada3SDoug Rabson /* 49dfdcada3SDoug Rabson * Well-known IPV6 RPC broadcast address. 50dfdcada3SDoug Rabson */ 51dfdcada3SDoug Rabson #define RPCB_MULTICAST_ADDR "ff02::202" 52dfdcada3SDoug Rabson 53dfdcada3SDoug Rabson /* 54dfdcada3SDoug Rabson * the following errors are in general unrecoverable. The caller 55dfdcada3SDoug Rabson * should give up rather than retry. 56dfdcada3SDoug Rabson */ 57dfdcada3SDoug Rabson #define IS_UNRECOVERABLE_RPC(s) (((s) == RPC_AUTHERROR) || \ 58dfdcada3SDoug Rabson ((s) == RPC_CANTENCODEARGS) || \ 59dfdcada3SDoug Rabson ((s) == RPC_CANTDECODERES) || \ 60dfdcada3SDoug Rabson ((s) == RPC_VERSMISMATCH) || \ 61dfdcada3SDoug Rabson ((s) == RPC_PROCUNAVAIL) || \ 62dfdcada3SDoug Rabson ((s) == RPC_PROGUNAVAIL) || \ 63dfdcada3SDoug Rabson ((s) == RPC_PROGVERSMISMATCH) || \ 64dfdcada3SDoug Rabson ((s) == RPC_CANTDECODEARGS)) 65dfdcada3SDoug Rabson 66dfdcada3SDoug Rabson /* 67dfdcada3SDoug Rabson * Error info. 68dfdcada3SDoug Rabson */ 69dfdcada3SDoug Rabson struct rpc_err { 70dfdcada3SDoug Rabson enum clnt_stat re_status; 71dfdcada3SDoug Rabson union { 72dfdcada3SDoug Rabson int RE_errno; /* related system error */ 73dfdcada3SDoug Rabson enum auth_stat RE_why; /* why the auth error occurred */ 74dfdcada3SDoug Rabson struct { 75dfdcada3SDoug Rabson rpcvers_t low; /* lowest version supported */ 76dfdcada3SDoug Rabson rpcvers_t high; /* highest version supported */ 77dfdcada3SDoug Rabson } RE_vers; 78dfdcada3SDoug Rabson struct { /* maybe meaningful if RPC_FAILED */ 79dfdcada3SDoug Rabson int32_t s1; 80dfdcada3SDoug Rabson int32_t s2; 81dfdcada3SDoug Rabson } RE_lb; /* life boot & debugging only */ 82dfdcada3SDoug Rabson } ru; 83dfdcada3SDoug Rabson #define re_errno ru.RE_errno 84dfdcada3SDoug Rabson #define re_why ru.RE_why 85dfdcada3SDoug Rabson #define re_vers ru.RE_vers 86dfdcada3SDoug Rabson #define re_lb ru.RE_lb 87dfdcada3SDoug Rabson }; 88dfdcada3SDoug Rabson 89c675522fSDoug Rabson /* 90c675522fSDoug Rabson * Functions of this type may be used to receive notification when RPC 91c675522fSDoug Rabson * calls have to be re-transmitted etc. 92c675522fSDoug Rabson */ 93c675522fSDoug Rabson typedef void rpc_feedback(int cmd, int procnum, void *); 94c675522fSDoug Rabson 95c675522fSDoug Rabson /* 96a9148abdSDoug Rabson * Timers used for the pseudo-transport protocol when using datagrams 97a9148abdSDoug Rabson */ 98a9148abdSDoug Rabson struct rpc_timers { 99a9148abdSDoug Rabson u_short rt_srtt; /* smoothed round-trip time */ 100a9148abdSDoug Rabson u_short rt_deviate; /* estimated deviation */ 101a9148abdSDoug Rabson u_long rt_rtxcur; /* current (backed-off) rto */ 102a9148abdSDoug Rabson }; 103a9148abdSDoug Rabson 104a9148abdSDoug Rabson /* 105c675522fSDoug Rabson * A structure used with CLNT_CALL_EXT to pass extra information used 106c675522fSDoug Rabson * while processing an RPC call. 107c675522fSDoug Rabson */ 108c675522fSDoug Rabson struct rpc_callextra { 109c675522fSDoug Rabson AUTH *rc_auth; /* auth handle to use for this call */ 110c675522fSDoug Rabson rpc_feedback *rc_feedback; /* callback for retransmits etc. */ 111c675522fSDoug Rabson void *rc_feedback_arg; /* argument for callback */ 112a9148abdSDoug Rabson struct rpc_timers *rc_timers; /* optional RTT timers */ 113a9148abdSDoug Rabson struct rpc_err rc_err; /* detailed call status */ 114c675522fSDoug Rabson }; 115dfdcada3SDoug Rabson 116dfdcada3SDoug Rabson /* 117dfdcada3SDoug Rabson * Client rpc handle. 118dfdcada3SDoug Rabson * Created by individual implementations 119dfdcada3SDoug Rabson * Client is responsible for initializing auth, see e.g. auth_none.c. 120dfdcada3SDoug Rabson */ 121dfdcada3SDoug Rabson typedef struct __rpc_client { 122c675522fSDoug Rabson volatile u_int cl_refs; /* reference count */ 123c675522fSDoug Rabson AUTH *cl_auth; /* authenticator */ 12420d728b5SMark Johnston const struct clnt_ops { 125c675522fSDoug Rabson /* call remote procedure */ 126c675522fSDoug Rabson enum clnt_stat (*cl_call)(struct __rpc_client *, 127a9148abdSDoug Rabson struct rpc_callextra *, rpcproc_t, 128a9148abdSDoug Rabson struct mbuf *, struct mbuf **, struct timeval); 129c675522fSDoug Rabson /* abort a call */ 130c675522fSDoug Rabson void (*cl_abort)(struct __rpc_client *); 131c675522fSDoug Rabson /* get specific error code */ 132c675522fSDoug Rabson void (*cl_geterr)(struct __rpc_client *, 133c675522fSDoug Rabson struct rpc_err *); 134c675522fSDoug Rabson /* frees results */ 135c675522fSDoug Rabson bool_t (*cl_freeres)(struct __rpc_client *, 136c675522fSDoug Rabson xdrproc_t, void *); 137a9148abdSDoug Rabson /* close the connection and terminate pending RPCs */ 138a9148abdSDoug Rabson void (*cl_close)(struct __rpc_client *); 139c675522fSDoug Rabson /* destroy this structure */ 140c675522fSDoug Rabson void (*cl_destroy)(struct __rpc_client *); 141c675522fSDoug Rabson /* the ioctl() of rpc */ 142c675522fSDoug Rabson bool_t (*cl_control)(struct __rpc_client *, u_int, 143c675522fSDoug Rabson void *); 144c675522fSDoug Rabson } *cl_ops; 145dfdcada3SDoug Rabson void *cl_private; /* private stuff */ 146dfdcada3SDoug Rabson char *cl_netid; /* network token */ 147dfdcada3SDoug Rabson char *cl_tp; /* device name */ 148dfdcada3SDoug Rabson } CLIENT; 149dfdcada3SDoug Rabson 150dfdcada3SDoug Rabson /* 151dfdcada3SDoug Rabson * Feedback values used for possible congestion and rate control 152dfdcada3SDoug Rabson */ 153c675522fSDoug Rabson #define FEEDBACK_OK 1 /* no retransmits */ 154c675522fSDoug Rabson #define FEEDBACK_REXMIT1 2 /* first retransmit */ 155c675522fSDoug Rabson #define FEEDBACK_REXMIT2 3 /* second and subsequent retransmit */ 156c675522fSDoug Rabson #define FEEDBACK_RECONNECT 4 /* client reconnect */ 157dfdcada3SDoug Rabson 158dfdcada3SDoug Rabson /* Used to set version of portmapper used in broadcast */ 159dfdcada3SDoug Rabson 160dfdcada3SDoug Rabson #define CLCR_SET_LOWVERS 3 161dfdcada3SDoug Rabson #define CLCR_GET_LOWVERS 4 162dfdcada3SDoug Rabson 163dfdcada3SDoug Rabson #define RPCSMALLMSGSIZE 400 /* a more reasonable packet size */ 164dfdcada3SDoug Rabson 165dfdcada3SDoug Rabson /* 166dfdcada3SDoug Rabson * client side rpc interface ops 167dfdcada3SDoug Rabson * 168dfdcada3SDoug Rabson * Parameter types are: 169dfdcada3SDoug Rabson * 170dfdcada3SDoug Rabson */ 171dfdcada3SDoug Rabson 172c675522fSDoug Rabson #define CLNT_ACQUIRE(rh) \ 173c675522fSDoug Rabson refcount_acquire(&(rh)->cl_refs) 174c675522fSDoug Rabson #define CLNT_RELEASE(rh) \ 175c675522fSDoug Rabson if (refcount_release(&(rh)->cl_refs)) \ 176c675522fSDoug Rabson CLNT_DESTROY(rh) 177c675522fSDoug Rabson 178c675522fSDoug Rabson /* 179a9148abdSDoug Rabson * void 180a9148abdSDoug Rabson * CLNT_CLOSE(rh); 181a9148abdSDoug Rabson * CLIENT *rh; 182a9148abdSDoug Rabson */ 183a9148abdSDoug Rabson #define CLNT_CLOSE(rh) ((*(rh)->cl_ops->cl_close)(rh)) 184a9148abdSDoug Rabson 185a9148abdSDoug Rabson enum clnt_stat clnt_call_private(CLIENT *, struct rpc_callextra *, rpcproc_t, 186a9148abdSDoug Rabson xdrproc_t, void *, xdrproc_t, void *, struct timeval); 187a9148abdSDoug Rabson 188a9148abdSDoug Rabson /* 189a9148abdSDoug Rabson * enum clnt_stat 190a9148abdSDoug Rabson * CLNT_CALL_MBUF(rh, ext, proc, mreq, mrepp, timeout) 191a9148abdSDoug Rabson * CLIENT *rh; 192a9148abdSDoug Rabson * struct rpc_callextra *ext; 193a9148abdSDoug Rabson * rpcproc_t proc; 194a9148abdSDoug Rabson * struct mbuf *mreq; 195a9148abdSDoug Rabson * struct mbuf **mrepp; 196a9148abdSDoug Rabson * struct timeval timeout; 197a9148abdSDoug Rabson * 198a9148abdSDoug Rabson * Call arguments in mreq which is consumed by the call (even if there 199a9148abdSDoug Rabson * is an error). Results returned in *mrepp. 200a9148abdSDoug Rabson */ 201a9148abdSDoug Rabson #define CLNT_CALL_MBUF(rh, ext, proc, mreq, mrepp, secs) \ 202a9148abdSDoug Rabson ((*(rh)->cl_ops->cl_call)(rh, ext, proc, mreq, mrepp, secs)) 203a9148abdSDoug Rabson 204a9148abdSDoug Rabson /* 205c675522fSDoug Rabson * enum clnt_stat 206c675522fSDoug Rabson * CLNT_CALL_EXT(rh, ext, proc, xargs, argsp, xres, resp, timeout) 207c675522fSDoug Rabson * CLIENT *rh; 208c675522fSDoug Rabson * struct rpc_callextra *ext; 209c675522fSDoug Rabson * rpcproc_t proc; 210c675522fSDoug Rabson * xdrproc_t xargs; 211c675522fSDoug Rabson * void *argsp; 212c675522fSDoug Rabson * xdrproc_t xres; 213c675522fSDoug Rabson * void *resp; 214c675522fSDoug Rabson * struct timeval timeout; 215c675522fSDoug Rabson */ 216c675522fSDoug Rabson #define CLNT_CALL_EXT(rh, ext, proc, xargs, argsp, xres, resp, secs) \ 217a9148abdSDoug Rabson clnt_call_private(rh, ext, proc, xargs, \ 218a9148abdSDoug Rabson argsp, xres, resp, secs) 219c675522fSDoug Rabson 220dfdcada3SDoug Rabson /* 221dfdcada3SDoug Rabson * enum clnt_stat 222dfdcada3SDoug Rabson * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout) 223dfdcada3SDoug Rabson * CLIENT *rh; 224dfdcada3SDoug Rabson * rpcproc_t proc; 225dfdcada3SDoug Rabson * xdrproc_t xargs; 226dfdcada3SDoug Rabson * void *argsp; 227dfdcada3SDoug Rabson * xdrproc_t xres; 228dfdcada3SDoug Rabson * void *resp; 229dfdcada3SDoug Rabson * struct timeval timeout; 230dfdcada3SDoug Rabson */ 231c675522fSDoug Rabson #define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ 232a9148abdSDoug Rabson clnt_call_private(rh, NULL, proc, xargs, \ 233a9148abdSDoug Rabson argsp, xres, resp, secs) 234c675522fSDoug Rabson #define clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \ 235a9148abdSDoug Rabson clnt_call_private(rh, NULL, proc, xargs, \ 236a9148abdSDoug Rabson argsp, xres, resp, secs) 237dfdcada3SDoug Rabson 238dfdcada3SDoug Rabson /* 239dfdcada3SDoug Rabson * void 240dfdcada3SDoug Rabson * CLNT_ABORT(rh); 241dfdcada3SDoug Rabson * CLIENT *rh; 242dfdcada3SDoug Rabson */ 243dfdcada3SDoug Rabson #define CLNT_ABORT(rh) ((*(rh)->cl_ops->cl_abort)(rh)) 244dfdcada3SDoug Rabson #define clnt_abort(rh) ((*(rh)->cl_ops->cl_abort)(rh)) 245dfdcada3SDoug Rabson 246dfdcada3SDoug Rabson /* 247dfdcada3SDoug Rabson * struct rpc_err 248dfdcada3SDoug Rabson * CLNT_GETERR(rh); 249dfdcada3SDoug Rabson * CLIENT *rh; 250dfdcada3SDoug Rabson */ 251dfdcada3SDoug Rabson #define CLNT_GETERR(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) 252dfdcada3SDoug Rabson #define clnt_geterr(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) 253dfdcada3SDoug Rabson 254dfdcada3SDoug Rabson 255dfdcada3SDoug Rabson /* 256dfdcada3SDoug Rabson * bool_t 257dfdcada3SDoug Rabson * CLNT_FREERES(rh, xres, resp); 258dfdcada3SDoug Rabson * CLIENT *rh; 259dfdcada3SDoug Rabson * xdrproc_t xres; 260dfdcada3SDoug Rabson * void *resp; 261dfdcada3SDoug Rabson */ 262dfdcada3SDoug Rabson #define CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) 263dfdcada3SDoug Rabson #define clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) 264dfdcada3SDoug Rabson 265dfdcada3SDoug Rabson /* 266dfdcada3SDoug Rabson * bool_t 267dfdcada3SDoug Rabson * CLNT_CONTROL(cl, request, info) 268dfdcada3SDoug Rabson * CLIENT *cl; 269dfdcada3SDoug Rabson * u_int request; 270dfdcada3SDoug Rabson * char *info; 271dfdcada3SDoug Rabson */ 272dfdcada3SDoug Rabson #define CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) 273dfdcada3SDoug Rabson #define clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) 274dfdcada3SDoug Rabson 275dfdcada3SDoug Rabson /* 276dfdcada3SDoug Rabson * control operations that apply to both udp and tcp transports 277dfdcada3SDoug Rabson */ 278dfdcada3SDoug Rabson #define CLSET_TIMEOUT 1 /* set timeout (timeval) */ 279dfdcada3SDoug Rabson #define CLGET_TIMEOUT 2 /* get timeout (timeval) */ 280dfdcada3SDoug Rabson #define CLGET_SERVER_ADDR 3 /* get server's address (sockaddr) */ 281dfdcada3SDoug Rabson #define CLGET_FD 6 /* get connections file descriptor */ 282dfdcada3SDoug Rabson #define CLGET_SVC_ADDR 7 /* get server's address (netbuf) */ 283dfdcada3SDoug Rabson #define CLSET_FD_CLOSE 8 /* close fd while clnt_destroy */ 284dfdcada3SDoug Rabson #define CLSET_FD_NCLOSE 9 /* Do not close fd while clnt_destroy */ 285dfdcada3SDoug Rabson #define CLGET_XID 10 /* Get xid */ 286dfdcada3SDoug Rabson #define CLSET_XID 11 /* Set xid */ 287dfdcada3SDoug Rabson #define CLGET_VERS 12 /* Get version number */ 288dfdcada3SDoug Rabson #define CLSET_VERS 13 /* Set version number */ 289dfdcada3SDoug Rabson #define CLGET_PROG 14 /* Get program number */ 290dfdcada3SDoug Rabson #define CLSET_PROG 15 /* Set program number */ 291dfdcada3SDoug Rabson #define CLSET_SVC_ADDR 16 /* get server's address (netbuf) */ 292dfdcada3SDoug Rabson #define CLSET_PUSH_TIMOD 17 /* push timod if not already present */ 293dfdcada3SDoug Rabson #define CLSET_POP_TIMOD 18 /* pop timod */ 294dfdcada3SDoug Rabson /* 295dfdcada3SDoug Rabson * Connectionless only control operations 296dfdcada3SDoug Rabson */ 297dfdcada3SDoug Rabson #define CLSET_RETRY_TIMEOUT 4 /* set retry timeout (timeval) */ 298dfdcada3SDoug Rabson #define CLGET_RETRY_TIMEOUT 5 /* get retry timeout (timeval) */ 299dfdcada3SDoug Rabson #define CLSET_ASYNC 19 300dfdcada3SDoug Rabson #define CLSET_CONNECT 20 /* Use connect() for UDP. (int) */ 301dfdcada3SDoug Rabson 302dfdcada3SDoug Rabson /* 303dfdcada3SDoug Rabson * Kernel control operations. The default msleep string is "rpcrecv", 304dfdcada3SDoug Rabson * and sleeps are non-interruptible by default. 305dfdcada3SDoug Rabson */ 306dfdcada3SDoug Rabson #define CLSET_WAITCHAN 21 /* set string to use in msleep call */ 307dfdcada3SDoug Rabson #define CLGET_WAITCHAN 22 /* get string used in msleep call */ 308dfdcada3SDoug Rabson #define CLSET_INTERRUPTIBLE 23 /* set interruptible flag */ 309dfdcada3SDoug Rabson #define CLGET_INTERRUPTIBLE 24 /* set interruptible flag */ 310c675522fSDoug Rabson #define CLSET_RETRIES 25 /* set retry count for reconnect */ 311c675522fSDoug Rabson #define CLGET_RETRIES 26 /* get retry count for reconnect */ 312a9148abdSDoug Rabson #define CLSET_PRIVPORT 27 /* set privileged source port flag */ 313a9148abdSDoug Rabson #define CLGET_PRIVPORT 28 /* get privileged source port flag */ 314e2adc47dSRick Macklem #define CLSET_BACKCHANNEL 29 /* set backchannel for socket */ 31502511d21SRick Macklem #define CLSET_TLS 30 /* set TLS for socket */ 31602511d21SRick Macklem #define CLSET_BLOCKRCV 31 /* Temporarily block reception */ 317665b1365SRick Macklem #define CLSET_TLSCERTNAME 32 /* TLS certificate file name */ 3187763814fSRick Macklem /* Structure used as the argument for CLSET_RECONUPCALL. */ 3197763814fSRick Macklem struct rpc_reconupcall { 3207763814fSRick Macklem void (*call)(CLIENT *, void *, struct ucred *); 3217763814fSRick Macklem void *arg; 3227763814fSRick Macklem }; 3237763814fSRick Macklem #define CLSET_RECONUPCALL 33 /* Reconnect upcall */ 324dfdcada3SDoug Rabson 325dfdcada3SDoug Rabson /* 326dfdcada3SDoug Rabson * void 327dfdcada3SDoug Rabson * CLNT_DESTROY(rh); 328dfdcada3SDoug Rabson * CLIENT *rh; 329dfdcada3SDoug Rabson */ 330dfdcada3SDoug Rabson #define CLNT_DESTROY(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 331dfdcada3SDoug Rabson #define clnt_destroy(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 332dfdcada3SDoug Rabson 333dfdcada3SDoug Rabson 334dfdcada3SDoug Rabson /* 335dfdcada3SDoug Rabson * RPCTEST is a test program which is accessible on every rpc 336dfdcada3SDoug Rabson * transport/port. It is used for testing, performance evaluation, 337dfdcada3SDoug Rabson * and network administration. 338dfdcada3SDoug Rabson */ 339dfdcada3SDoug Rabson 340dfdcada3SDoug Rabson #define RPCTEST_PROGRAM ((rpcprog_t)1) 341dfdcada3SDoug Rabson #define RPCTEST_VERSION ((rpcvers_t)1) 342dfdcada3SDoug Rabson #define RPCTEST_NULL_PROC ((rpcproc_t)2) 343dfdcada3SDoug Rabson #define RPCTEST_NULL_BATCH_PROC ((rpcproc_t)3) 344dfdcada3SDoug Rabson 345dfdcada3SDoug Rabson /* 346dfdcada3SDoug Rabson * By convention, procedure 0 takes null arguments and returns them 347dfdcada3SDoug Rabson */ 348dfdcada3SDoug Rabson 349dfdcada3SDoug Rabson #define NULLPROC ((rpcproc_t)0) 350dfdcada3SDoug Rabson 351dfdcada3SDoug Rabson /* 352dfdcada3SDoug Rabson * Below are the client handle creation routines for the various 353dfdcada3SDoug Rabson * implementations of client side rpc. They can return NULL if a 354dfdcada3SDoug Rabson * creation failure occurs. 355dfdcada3SDoug Rabson */ 356dfdcada3SDoug Rabson 357dfdcada3SDoug Rabson /* 358dfdcada3SDoug Rabson * Generic client creation routine. Supported protocols are those that 359dfdcada3SDoug Rabson * belong to the nettype namespace (/etc/netconfig). 360dfdcada3SDoug Rabson */ 361dfdcada3SDoug Rabson __BEGIN_DECLS 362dfdcada3SDoug Rabson /* 363dfdcada3SDoug Rabson * struct socket *so; -- socket 364dfdcada3SDoug Rabson * struct sockaddr *svcaddr; -- servers address 365dfdcada3SDoug Rabson * rpcprog_t prog; -- program number 366dfdcada3SDoug Rabson * rpcvers_t vers; -- version number 367dfdcada3SDoug Rabson * size_t sendsz; -- buffer recv size 368dfdcada3SDoug Rabson * size_t recvsz; -- buffer send size 369dfdcada3SDoug Rabson */ 370dfdcada3SDoug Rabson extern CLIENT *clnt_dg_create(struct socket *so, 371dfdcada3SDoug Rabson struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 372dfdcada3SDoug Rabson size_t sendsz, size_t recvsz); 373dfdcada3SDoug Rabson 374dfdcada3SDoug Rabson /* 375*fa1b9612SGleb Smirnoff * netlink(4) client that would multicast calls on genetlink(4) family 376*fa1b9612SGleb Smirnoff * named "rpcnl" (with dynamic id). The server counterpart of this 377*fa1b9612SGleb Smirnoff * client is a userland application that uses libc/rpc/svc_nl.c to 378*fa1b9612SGleb Smirnoff * receive the calls and send replies. 379*fa1b9612SGleb Smirnoff * 380*fa1b9612SGleb Smirnoff * const char *name -- multicast group name 381*fa1b9612SGleb Smirnoff */ 382*fa1b9612SGleb Smirnoff extern CLIENT *client_nl_create(const char *name, const rpcprog_t prog, 383*fa1b9612SGleb Smirnoff const rpcvers_t version); 384*fa1b9612SGleb Smirnoff 385*fa1b9612SGleb Smirnoff /* 386dfdcada3SDoug Rabson * struct socket *so; -- socket 387dfdcada3SDoug Rabson * struct sockaddr *svcaddr; -- servers address 388dfdcada3SDoug Rabson * rpcprog_t prog; -- program number 389dfdcada3SDoug Rabson * rpcvers_t vers; -- version number 390dfdcada3SDoug Rabson * size_t sendsz; -- buffer recv size 391dfdcada3SDoug Rabson * size_t recvsz; -- buffer send size 3927b67bd9fSRick Macklem * int intrflag; -- is it interruptible 393dfdcada3SDoug Rabson */ 394dfdcada3SDoug Rabson extern CLIENT *clnt_vc_create(struct socket *so, 395dfdcada3SDoug Rabson struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 3967b67bd9fSRick Macklem size_t sendsz, size_t recvsz, int intrflag); 397dfdcada3SDoug Rabson 398dfdcada3SDoug Rabson /* 399dfdcada3SDoug Rabson * struct netconfig *nconf; -- network type 400dfdcada3SDoug Rabson * struct sockaddr *svcaddr; -- servers address 401dfdcada3SDoug Rabson * rpcprog_t prog; -- program number 402dfdcada3SDoug Rabson * rpcvers_t vers; -- version number 403dfdcada3SDoug Rabson * size_t sendsz; -- buffer recv size 404dfdcada3SDoug Rabson * size_t recvsz; -- buffer send size 405dfdcada3SDoug Rabson */ 406dfdcada3SDoug Rabson extern CLIENT *clnt_reconnect_create(struct netconfig *nconf, 407dfdcada3SDoug Rabson struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 408dfdcada3SDoug Rabson size_t sendsz, size_t recvsz); 409dfdcada3SDoug Rabson __END_DECLS 410dfdcada3SDoug Rabson 411dfdcada3SDoug Rabson 412dfdcada3SDoug Rabson /* 413dfdcada3SDoug Rabson * Print why creation failed 414dfdcada3SDoug Rabson */ 415dfdcada3SDoug Rabson __BEGIN_DECLS 416dfdcada3SDoug Rabson extern void clnt_pcreateerror(const char *); /* stderr */ 417dfdcada3SDoug Rabson extern char *clnt_spcreateerror(const char *); /* string */ 418dfdcada3SDoug Rabson __END_DECLS 419dfdcada3SDoug Rabson 420dfdcada3SDoug Rabson /* 421dfdcada3SDoug Rabson * Like clnt_perror(), but is more verbose in its output 422dfdcada3SDoug Rabson */ 423dfdcada3SDoug Rabson __BEGIN_DECLS 424dfdcada3SDoug Rabson extern void clnt_perrno(enum clnt_stat); /* stderr */ 425dfdcada3SDoug Rabson extern char *clnt_sperrno(enum clnt_stat); /* string */ 426dfdcada3SDoug Rabson __END_DECLS 427dfdcada3SDoug Rabson 428dfdcada3SDoug Rabson /* 429dfdcada3SDoug Rabson * Print an English error message, given the client error code 430dfdcada3SDoug Rabson */ 431dfdcada3SDoug Rabson __BEGIN_DECLS 432dfdcada3SDoug Rabson extern void clnt_perror(CLIENT *, const char *); /* stderr */ 433dfdcada3SDoug Rabson extern char *clnt_sperror(CLIENT *, const char *); /* string */ 434dfdcada3SDoug Rabson __END_DECLS 435dfdcada3SDoug Rabson 436dfdcada3SDoug Rabson 437dfdcada3SDoug Rabson /* 438dfdcada3SDoug Rabson * If a creation fails, the following allows the user to figure out why. 439dfdcada3SDoug Rabson */ 440dfdcada3SDoug Rabson struct rpc_createerr { 441dfdcada3SDoug Rabson enum clnt_stat cf_stat; 442dfdcada3SDoug Rabson struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */ 443dfdcada3SDoug Rabson }; 444dfdcada3SDoug Rabson 445dfdcada3SDoug Rabson extern struct rpc_createerr rpc_createerr; 446dfdcada3SDoug Rabson 447dfdcada3SDoug Rabson #endif /* !_RPC_CLNT_H_ */ 448