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> 44dfdcada3SDoug Rabson #ifdef _KERNEL 45c675522fSDoug Rabson #include <sys/refcount.h> 46dfdcada3SDoug Rabson #include <rpc/netconfig.h> 47dfdcada3SDoug Rabson #else 48dfdcada3SDoug Rabson #include <netconfig.h> 49dfdcada3SDoug Rabson #endif 50dfdcada3SDoug Rabson #include <sys/un.h> 51dfdcada3SDoug Rabson 52dfdcada3SDoug Rabson /* 53dfdcada3SDoug Rabson * Well-known IPV6 RPC broadcast address. 54dfdcada3SDoug Rabson */ 55dfdcada3SDoug Rabson #define RPCB_MULTICAST_ADDR "ff02::202" 56dfdcada3SDoug Rabson 57dfdcada3SDoug Rabson /* 58dfdcada3SDoug Rabson * the following errors are in general unrecoverable. The caller 59dfdcada3SDoug Rabson * should give up rather than retry. 60dfdcada3SDoug Rabson */ 61dfdcada3SDoug Rabson #define IS_UNRECOVERABLE_RPC(s) (((s) == RPC_AUTHERROR) || \ 62dfdcada3SDoug Rabson ((s) == RPC_CANTENCODEARGS) || \ 63dfdcada3SDoug Rabson ((s) == RPC_CANTDECODERES) || \ 64dfdcada3SDoug Rabson ((s) == RPC_VERSMISMATCH) || \ 65dfdcada3SDoug Rabson ((s) == RPC_PROCUNAVAIL) || \ 66dfdcada3SDoug Rabson ((s) == RPC_PROGUNAVAIL) || \ 67dfdcada3SDoug Rabson ((s) == RPC_PROGVERSMISMATCH) || \ 68dfdcada3SDoug Rabson ((s) == RPC_CANTDECODEARGS)) 69dfdcada3SDoug Rabson 70dfdcada3SDoug Rabson /* 71dfdcada3SDoug Rabson * Error info. 72dfdcada3SDoug Rabson */ 73dfdcada3SDoug Rabson struct rpc_err { 74dfdcada3SDoug Rabson enum clnt_stat re_status; 75dfdcada3SDoug Rabson union { 76dfdcada3SDoug Rabson int RE_errno; /* related system error */ 77dfdcada3SDoug Rabson enum auth_stat RE_why; /* why the auth error occurred */ 78dfdcada3SDoug Rabson struct { 79dfdcada3SDoug Rabson rpcvers_t low; /* lowest version supported */ 80dfdcada3SDoug Rabson rpcvers_t high; /* highest version supported */ 81dfdcada3SDoug Rabson } RE_vers; 82dfdcada3SDoug Rabson struct { /* maybe meaningful if RPC_FAILED */ 83dfdcada3SDoug Rabson int32_t s1; 84dfdcada3SDoug Rabson int32_t s2; 85dfdcada3SDoug Rabson } RE_lb; /* life boot & debugging only */ 86dfdcada3SDoug Rabson } ru; 87dfdcada3SDoug Rabson #define re_errno ru.RE_errno 88dfdcada3SDoug Rabson #define re_why ru.RE_why 89dfdcada3SDoug Rabson #define re_vers ru.RE_vers 90dfdcada3SDoug Rabson #define re_lb ru.RE_lb 91dfdcada3SDoug Rabson }; 92dfdcada3SDoug Rabson 93c675522fSDoug Rabson #ifdef _KERNEL 94c675522fSDoug Rabson /* 95c675522fSDoug Rabson * Functions of this type may be used to receive notification when RPC 96c675522fSDoug Rabson * calls have to be re-transmitted etc. 97c675522fSDoug Rabson */ 98c675522fSDoug Rabson typedef void rpc_feedback(int cmd, int procnum, void *); 99c675522fSDoug Rabson 100c675522fSDoug Rabson /* 101a9148abdSDoug Rabson * Timers used for the pseudo-transport protocol when using datagrams 102a9148abdSDoug Rabson */ 103a9148abdSDoug Rabson struct rpc_timers { 104a9148abdSDoug Rabson u_short rt_srtt; /* smoothed round-trip time */ 105a9148abdSDoug Rabson u_short rt_deviate; /* estimated deviation */ 106a9148abdSDoug Rabson u_long rt_rtxcur; /* current (backed-off) rto */ 107a9148abdSDoug Rabson }; 108a9148abdSDoug Rabson 109a9148abdSDoug Rabson /* 110c675522fSDoug Rabson * A structure used with CLNT_CALL_EXT to pass extra information used 111c675522fSDoug Rabson * while processing an RPC call. 112c675522fSDoug Rabson */ 113c675522fSDoug Rabson struct rpc_callextra { 114c675522fSDoug Rabson AUTH *rc_auth; /* auth handle to use for this call */ 115c675522fSDoug Rabson rpc_feedback *rc_feedback; /* callback for retransmits etc. */ 116c675522fSDoug Rabson void *rc_feedback_arg; /* argument for callback */ 117a9148abdSDoug Rabson struct rpc_timers *rc_timers; /* optional RTT timers */ 118a9148abdSDoug Rabson struct rpc_err rc_err; /* detailed call status */ 119c675522fSDoug Rabson }; 120c675522fSDoug Rabson #endif 121dfdcada3SDoug Rabson 122dfdcada3SDoug Rabson /* 123dfdcada3SDoug Rabson * Client rpc handle. 124dfdcada3SDoug Rabson * Created by individual implementations 125dfdcada3SDoug Rabson * Client is responsible for initializing auth, see e.g. auth_none.c. 126dfdcada3SDoug Rabson */ 127dfdcada3SDoug Rabson typedef struct __rpc_client { 128c675522fSDoug Rabson #ifdef _KERNEL 129c675522fSDoug Rabson volatile u_int cl_refs; /* reference count */ 130c675522fSDoug Rabson AUTH *cl_auth; /* authenticator */ 13120d728b5SMark Johnston const struct clnt_ops { 132c675522fSDoug Rabson /* call remote procedure */ 133c675522fSDoug Rabson enum clnt_stat (*cl_call)(struct __rpc_client *, 134a9148abdSDoug Rabson struct rpc_callextra *, rpcproc_t, 135a9148abdSDoug Rabson struct mbuf *, struct mbuf **, struct timeval); 136c675522fSDoug Rabson /* abort a call */ 137c675522fSDoug Rabson void (*cl_abort)(struct __rpc_client *); 138c675522fSDoug Rabson /* get specific error code */ 139c675522fSDoug Rabson void (*cl_geterr)(struct __rpc_client *, 140c675522fSDoug Rabson struct rpc_err *); 141c675522fSDoug Rabson /* frees results */ 142c675522fSDoug Rabson bool_t (*cl_freeres)(struct __rpc_client *, 143c675522fSDoug Rabson xdrproc_t, void *); 144a9148abdSDoug Rabson /* close the connection and terminate pending RPCs */ 145a9148abdSDoug Rabson void (*cl_close)(struct __rpc_client *); 146c675522fSDoug Rabson /* destroy this structure */ 147c675522fSDoug Rabson void (*cl_destroy)(struct __rpc_client *); 148c675522fSDoug Rabson /* the ioctl() of rpc */ 149c675522fSDoug Rabson bool_t (*cl_control)(struct __rpc_client *, u_int, 150c675522fSDoug Rabson void *); 151c675522fSDoug Rabson } *cl_ops; 152c675522fSDoug Rabson #else 153dfdcada3SDoug Rabson AUTH *cl_auth; /* authenticator */ 154dfdcada3SDoug Rabson struct clnt_ops { 155dfdcada3SDoug Rabson /* call remote procedure */ 156dfdcada3SDoug Rabson enum clnt_stat (*cl_call)(struct __rpc_client *, 157dfdcada3SDoug Rabson rpcproc_t, xdrproc_t, void *, xdrproc_t, 158dfdcada3SDoug Rabson void *, struct timeval); 159dfdcada3SDoug Rabson /* abort a call */ 160dfdcada3SDoug Rabson void (*cl_abort)(struct __rpc_client *); 161dfdcada3SDoug Rabson /* get specific error code */ 162dfdcada3SDoug Rabson void (*cl_geterr)(struct __rpc_client *, 163dfdcada3SDoug Rabson struct rpc_err *); 164dfdcada3SDoug Rabson /* frees results */ 165dfdcada3SDoug Rabson bool_t (*cl_freeres)(struct __rpc_client *, 166dfdcada3SDoug Rabson xdrproc_t, void *); 167dfdcada3SDoug Rabson /* destroy this structure */ 168dfdcada3SDoug Rabson void (*cl_destroy)(struct __rpc_client *); 169dfdcada3SDoug Rabson /* the ioctl() of rpc */ 170dfdcada3SDoug Rabson bool_t (*cl_control)(struct __rpc_client *, u_int, 171dfdcada3SDoug Rabson void *); 172dfdcada3SDoug Rabson } *cl_ops; 173c675522fSDoug Rabson #endif 174dfdcada3SDoug Rabson void *cl_private; /* private stuff */ 175dfdcada3SDoug Rabson char *cl_netid; /* network token */ 176dfdcada3SDoug Rabson char *cl_tp; /* device name */ 177dfdcada3SDoug Rabson } CLIENT; 178dfdcada3SDoug Rabson 179dfdcada3SDoug Rabson /* 180dfdcada3SDoug Rabson * Feedback values used for possible congestion and rate control 181dfdcada3SDoug Rabson */ 182c675522fSDoug Rabson #define FEEDBACK_OK 1 /* no retransmits */ 183c675522fSDoug Rabson #define FEEDBACK_REXMIT1 2 /* first retransmit */ 184c675522fSDoug Rabson #define FEEDBACK_REXMIT2 3 /* second and subsequent retransmit */ 185c675522fSDoug Rabson #define FEEDBACK_RECONNECT 4 /* client reconnect */ 186dfdcada3SDoug Rabson 187dfdcada3SDoug Rabson /* Used to set version of portmapper used in broadcast */ 188dfdcada3SDoug Rabson 189dfdcada3SDoug Rabson #define CLCR_SET_LOWVERS 3 190dfdcada3SDoug Rabson #define CLCR_GET_LOWVERS 4 191dfdcada3SDoug Rabson 192dfdcada3SDoug Rabson #define RPCSMALLMSGSIZE 400 /* a more reasonable packet size */ 193dfdcada3SDoug Rabson 194dfdcada3SDoug Rabson /* 195dfdcada3SDoug Rabson * client side rpc interface ops 196dfdcada3SDoug Rabson * 197dfdcada3SDoug Rabson * Parameter types are: 198dfdcada3SDoug Rabson * 199dfdcada3SDoug Rabson */ 200dfdcada3SDoug Rabson 201c675522fSDoug Rabson #ifdef _KERNEL 202c675522fSDoug Rabson #define CLNT_ACQUIRE(rh) \ 203c675522fSDoug Rabson refcount_acquire(&(rh)->cl_refs) 204c675522fSDoug Rabson #define CLNT_RELEASE(rh) \ 205c675522fSDoug Rabson if (refcount_release(&(rh)->cl_refs)) \ 206c675522fSDoug Rabson CLNT_DESTROY(rh) 207c675522fSDoug Rabson 208c675522fSDoug Rabson /* 209a9148abdSDoug Rabson * void 210a9148abdSDoug Rabson * CLNT_CLOSE(rh); 211a9148abdSDoug Rabson * CLIENT *rh; 212a9148abdSDoug Rabson */ 213a9148abdSDoug Rabson #define CLNT_CLOSE(rh) ((*(rh)->cl_ops->cl_close)(rh)) 214a9148abdSDoug Rabson 215a9148abdSDoug Rabson enum clnt_stat clnt_call_private(CLIENT *, struct rpc_callextra *, rpcproc_t, 216a9148abdSDoug Rabson xdrproc_t, void *, xdrproc_t, void *, struct timeval); 217a9148abdSDoug Rabson 218a9148abdSDoug Rabson /* 219a9148abdSDoug Rabson * enum clnt_stat 220a9148abdSDoug Rabson * CLNT_CALL_MBUF(rh, ext, proc, mreq, mrepp, timeout) 221a9148abdSDoug Rabson * CLIENT *rh; 222a9148abdSDoug Rabson * struct rpc_callextra *ext; 223a9148abdSDoug Rabson * rpcproc_t proc; 224a9148abdSDoug Rabson * struct mbuf *mreq; 225a9148abdSDoug Rabson * struct mbuf **mrepp; 226a9148abdSDoug Rabson * struct timeval timeout; 227a9148abdSDoug Rabson * 228a9148abdSDoug Rabson * Call arguments in mreq which is consumed by the call (even if there 229a9148abdSDoug Rabson * is an error). Results returned in *mrepp. 230a9148abdSDoug Rabson */ 231a9148abdSDoug Rabson #define CLNT_CALL_MBUF(rh, ext, proc, mreq, mrepp, secs) \ 232a9148abdSDoug Rabson ((*(rh)->cl_ops->cl_call)(rh, ext, proc, mreq, mrepp, secs)) 233a9148abdSDoug Rabson 234a9148abdSDoug Rabson /* 235c675522fSDoug Rabson * enum clnt_stat 236c675522fSDoug Rabson * CLNT_CALL_EXT(rh, ext, proc, xargs, argsp, xres, resp, timeout) 237c675522fSDoug Rabson * CLIENT *rh; 238c675522fSDoug Rabson * struct rpc_callextra *ext; 239c675522fSDoug Rabson * rpcproc_t proc; 240c675522fSDoug Rabson * xdrproc_t xargs; 241c675522fSDoug Rabson * void *argsp; 242c675522fSDoug Rabson * xdrproc_t xres; 243c675522fSDoug Rabson * void *resp; 244c675522fSDoug Rabson * struct timeval timeout; 245c675522fSDoug Rabson */ 246c675522fSDoug Rabson #define CLNT_CALL_EXT(rh, ext, proc, xargs, argsp, xres, resp, secs) \ 247a9148abdSDoug Rabson clnt_call_private(rh, ext, proc, xargs, \ 248a9148abdSDoug Rabson argsp, xres, resp, secs) 249c675522fSDoug Rabson #endif 250c675522fSDoug Rabson 251dfdcada3SDoug Rabson /* 252dfdcada3SDoug Rabson * enum clnt_stat 253dfdcada3SDoug Rabson * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout) 254dfdcada3SDoug Rabson * CLIENT *rh; 255dfdcada3SDoug Rabson * rpcproc_t proc; 256dfdcada3SDoug Rabson * xdrproc_t xargs; 257dfdcada3SDoug Rabson * void *argsp; 258dfdcada3SDoug Rabson * xdrproc_t xres; 259dfdcada3SDoug Rabson * void *resp; 260dfdcada3SDoug Rabson * struct timeval timeout; 261dfdcada3SDoug Rabson */ 262c675522fSDoug Rabson #ifdef _KERNEL 263c675522fSDoug Rabson #define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ 264a9148abdSDoug Rabson clnt_call_private(rh, NULL, proc, xargs, \ 265a9148abdSDoug Rabson argsp, xres, resp, secs) 266c675522fSDoug Rabson #define clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \ 267a9148abdSDoug Rabson clnt_call_private(rh, NULL, proc, xargs, \ 268a9148abdSDoug Rabson argsp, xres, resp, secs) 269c675522fSDoug Rabson #else 270dfdcada3SDoug Rabson #define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ 271dfdcada3SDoug Rabson ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, \ 272dfdcada3SDoug Rabson argsp, xres, resp, secs)) 273dfdcada3SDoug Rabson #define clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \ 274dfdcada3SDoug Rabson ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, \ 275dfdcada3SDoug Rabson argsp, xres, resp, secs)) 276c675522fSDoug Rabson #endif 277dfdcada3SDoug Rabson 278dfdcada3SDoug Rabson /* 279dfdcada3SDoug Rabson * void 280dfdcada3SDoug Rabson * CLNT_ABORT(rh); 281dfdcada3SDoug Rabson * CLIENT *rh; 282dfdcada3SDoug Rabson */ 283dfdcada3SDoug Rabson #define CLNT_ABORT(rh) ((*(rh)->cl_ops->cl_abort)(rh)) 284dfdcada3SDoug Rabson #define clnt_abort(rh) ((*(rh)->cl_ops->cl_abort)(rh)) 285dfdcada3SDoug Rabson 286dfdcada3SDoug Rabson /* 287dfdcada3SDoug Rabson * struct rpc_err 288dfdcada3SDoug Rabson * CLNT_GETERR(rh); 289dfdcada3SDoug Rabson * CLIENT *rh; 290dfdcada3SDoug Rabson */ 291dfdcada3SDoug Rabson #define CLNT_GETERR(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) 292dfdcada3SDoug Rabson #define clnt_geterr(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) 293dfdcada3SDoug Rabson 294dfdcada3SDoug Rabson 295dfdcada3SDoug Rabson /* 296dfdcada3SDoug Rabson * bool_t 297dfdcada3SDoug Rabson * CLNT_FREERES(rh, xres, resp); 298dfdcada3SDoug Rabson * CLIENT *rh; 299dfdcada3SDoug Rabson * xdrproc_t xres; 300dfdcada3SDoug Rabson * void *resp; 301dfdcada3SDoug Rabson */ 302dfdcada3SDoug Rabson #define CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) 303dfdcada3SDoug Rabson #define clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) 304dfdcada3SDoug Rabson 305dfdcada3SDoug Rabson /* 306dfdcada3SDoug Rabson * bool_t 307dfdcada3SDoug Rabson * CLNT_CONTROL(cl, request, info) 308dfdcada3SDoug Rabson * CLIENT *cl; 309dfdcada3SDoug Rabson * u_int request; 310dfdcada3SDoug Rabson * char *info; 311dfdcada3SDoug Rabson */ 312dfdcada3SDoug Rabson #define CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) 313dfdcada3SDoug Rabson #define clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) 314dfdcada3SDoug Rabson 315dfdcada3SDoug Rabson /* 316dfdcada3SDoug Rabson * control operations that apply to both udp and tcp transports 317dfdcada3SDoug Rabson */ 318dfdcada3SDoug Rabson #define CLSET_TIMEOUT 1 /* set timeout (timeval) */ 319dfdcada3SDoug Rabson #define CLGET_TIMEOUT 2 /* get timeout (timeval) */ 320dfdcada3SDoug Rabson #define CLGET_SERVER_ADDR 3 /* get server's address (sockaddr) */ 321dfdcada3SDoug Rabson #define CLGET_FD 6 /* get connections file descriptor */ 322dfdcada3SDoug Rabson #define CLGET_SVC_ADDR 7 /* get server's address (netbuf) */ 323dfdcada3SDoug Rabson #define CLSET_FD_CLOSE 8 /* close fd while clnt_destroy */ 324dfdcada3SDoug Rabson #define CLSET_FD_NCLOSE 9 /* Do not close fd while clnt_destroy */ 325dfdcada3SDoug Rabson #define CLGET_XID 10 /* Get xid */ 326dfdcada3SDoug Rabson #define CLSET_XID 11 /* Set xid */ 327dfdcada3SDoug Rabson #define CLGET_VERS 12 /* Get version number */ 328dfdcada3SDoug Rabson #define CLSET_VERS 13 /* Set version number */ 329dfdcada3SDoug Rabson #define CLGET_PROG 14 /* Get program number */ 330dfdcada3SDoug Rabson #define CLSET_PROG 15 /* Set program number */ 331dfdcada3SDoug Rabson #define CLSET_SVC_ADDR 16 /* get server's address (netbuf) */ 332dfdcada3SDoug Rabson #define CLSET_PUSH_TIMOD 17 /* push timod if not already present */ 333dfdcada3SDoug Rabson #define CLSET_POP_TIMOD 18 /* pop timod */ 334dfdcada3SDoug Rabson /* 335dfdcada3SDoug Rabson * Connectionless only control operations 336dfdcada3SDoug Rabson */ 337dfdcada3SDoug Rabson #define CLSET_RETRY_TIMEOUT 4 /* set retry timeout (timeval) */ 338dfdcada3SDoug Rabson #define CLGET_RETRY_TIMEOUT 5 /* get retry timeout (timeval) */ 339dfdcada3SDoug Rabson #define CLSET_ASYNC 19 340dfdcada3SDoug Rabson #define CLSET_CONNECT 20 /* Use connect() for UDP. (int) */ 341dfdcada3SDoug Rabson 342dfdcada3SDoug Rabson #ifdef _KERNEL 343dfdcada3SDoug Rabson /* 344dfdcada3SDoug Rabson * Kernel control operations. The default msleep string is "rpcrecv", 345dfdcada3SDoug Rabson * and sleeps are non-interruptible by default. 346dfdcada3SDoug Rabson */ 347dfdcada3SDoug Rabson #define CLSET_WAITCHAN 21 /* set string to use in msleep call */ 348dfdcada3SDoug Rabson #define CLGET_WAITCHAN 22 /* get string used in msleep call */ 349dfdcada3SDoug Rabson #define CLSET_INTERRUPTIBLE 23 /* set interruptible flag */ 350dfdcada3SDoug Rabson #define CLGET_INTERRUPTIBLE 24 /* set interruptible flag */ 351c675522fSDoug Rabson #define CLSET_RETRIES 25 /* set retry count for reconnect */ 352c675522fSDoug Rabson #define CLGET_RETRIES 26 /* get retry count for reconnect */ 353a9148abdSDoug Rabson #define CLSET_PRIVPORT 27 /* set privileged source port flag */ 354a9148abdSDoug Rabson #define CLGET_PRIVPORT 28 /* get privileged source port flag */ 355e2adc47dSRick Macklem #define CLSET_BACKCHANNEL 29 /* set backchannel for socket */ 35602511d21SRick Macklem #define CLSET_TLS 30 /* set TLS for socket */ 35702511d21SRick Macklem #define CLSET_BLOCKRCV 31 /* Temporarily block reception */ 358665b1365SRick Macklem #define CLSET_TLSCERTNAME 32 /* TLS certificate file name */ 3597763814fSRick Macklem /* Structure used as the argument for CLSET_RECONUPCALL. */ 3607763814fSRick Macklem struct rpc_reconupcall { 3617763814fSRick Macklem void (*call)(CLIENT *, void *, struct ucred *); 3627763814fSRick Macklem void *arg; 3637763814fSRick Macklem }; 3647763814fSRick Macklem #define CLSET_RECONUPCALL 33 /* Reconnect upcall */ 365dfdcada3SDoug Rabson #endif 366dfdcada3SDoug Rabson 367dfdcada3SDoug Rabson 368dfdcada3SDoug Rabson /* 369dfdcada3SDoug Rabson * void 370dfdcada3SDoug Rabson * CLNT_DESTROY(rh); 371dfdcada3SDoug Rabson * CLIENT *rh; 372dfdcada3SDoug Rabson */ 373dfdcada3SDoug Rabson #define CLNT_DESTROY(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 374dfdcada3SDoug Rabson #define clnt_destroy(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 375dfdcada3SDoug Rabson 376dfdcada3SDoug Rabson 377dfdcada3SDoug Rabson /* 378dfdcada3SDoug Rabson * RPCTEST is a test program which is accessible on every rpc 379dfdcada3SDoug Rabson * transport/port. It is used for testing, performance evaluation, 380dfdcada3SDoug Rabson * and network administration. 381dfdcada3SDoug Rabson */ 382dfdcada3SDoug Rabson 383dfdcada3SDoug Rabson #define RPCTEST_PROGRAM ((rpcprog_t)1) 384dfdcada3SDoug Rabson #define RPCTEST_VERSION ((rpcvers_t)1) 385dfdcada3SDoug Rabson #define RPCTEST_NULL_PROC ((rpcproc_t)2) 386dfdcada3SDoug Rabson #define RPCTEST_NULL_BATCH_PROC ((rpcproc_t)3) 387dfdcada3SDoug Rabson 388dfdcada3SDoug Rabson /* 389dfdcada3SDoug Rabson * By convention, procedure 0 takes null arguments and returns them 390dfdcada3SDoug Rabson */ 391dfdcada3SDoug Rabson 392dfdcada3SDoug Rabson #define NULLPROC ((rpcproc_t)0) 393dfdcada3SDoug Rabson 394dfdcada3SDoug Rabson /* 395dfdcada3SDoug Rabson * Below are the client handle creation routines for the various 396dfdcada3SDoug Rabson * implementations of client side rpc. They can return NULL if a 397dfdcada3SDoug Rabson * creation failure occurs. 398dfdcada3SDoug Rabson */ 399dfdcada3SDoug Rabson 400dfdcada3SDoug Rabson /* 401dfdcada3SDoug Rabson * Generic client creation routine. Supported protocols are those that 402dfdcada3SDoug Rabson * belong to the nettype namespace (/etc/netconfig). 403dfdcada3SDoug Rabson */ 404dfdcada3SDoug Rabson __BEGIN_DECLS 405dfdcada3SDoug Rabson #ifdef _KERNEL 406dfdcada3SDoug Rabson 407dfdcada3SDoug Rabson /* 408dfdcada3SDoug Rabson * struct socket *so; -- socket 409dfdcada3SDoug Rabson * struct sockaddr *svcaddr; -- servers address 410dfdcada3SDoug Rabson * rpcprog_t prog; -- program number 411dfdcada3SDoug Rabson * rpcvers_t vers; -- version number 412dfdcada3SDoug Rabson * size_t sendsz; -- buffer recv size 413dfdcada3SDoug Rabson * size_t recvsz; -- buffer send size 414dfdcada3SDoug Rabson */ 415dfdcada3SDoug Rabson extern CLIENT *clnt_dg_create(struct socket *so, 416dfdcada3SDoug Rabson struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 417dfdcada3SDoug Rabson size_t sendsz, size_t recvsz); 418dfdcada3SDoug Rabson 419dfdcada3SDoug Rabson /* 420dfdcada3SDoug Rabson * struct socket *so; -- socket 421dfdcada3SDoug Rabson * struct sockaddr *svcaddr; -- servers address 422dfdcada3SDoug Rabson * rpcprog_t prog; -- program number 423dfdcada3SDoug Rabson * rpcvers_t vers; -- version number 424dfdcada3SDoug Rabson * size_t sendsz; -- buffer recv size 425dfdcada3SDoug Rabson * size_t recvsz; -- buffer send size 4267b67bd9fSRick Macklem * int intrflag; -- is it interruptible 427dfdcada3SDoug Rabson */ 428dfdcada3SDoug Rabson extern CLIENT *clnt_vc_create(struct socket *so, 429dfdcada3SDoug Rabson struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 4307b67bd9fSRick Macklem size_t sendsz, size_t recvsz, int intrflag); 431dfdcada3SDoug Rabson 432dfdcada3SDoug Rabson /* 433dfdcada3SDoug Rabson * struct netconfig *nconf; -- network type 434dfdcada3SDoug Rabson * struct sockaddr *svcaddr; -- servers address 435dfdcada3SDoug Rabson * rpcprog_t prog; -- program number 436dfdcada3SDoug Rabson * rpcvers_t vers; -- version number 437dfdcada3SDoug Rabson * size_t sendsz; -- buffer recv size 438dfdcada3SDoug Rabson * size_t recvsz; -- buffer send size 439dfdcada3SDoug Rabson */ 440dfdcada3SDoug Rabson extern CLIENT *clnt_reconnect_create(struct netconfig *nconf, 441dfdcada3SDoug Rabson struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 442dfdcada3SDoug Rabson size_t sendsz, size_t recvsz); 443dfdcada3SDoug Rabson 444dfdcada3SDoug Rabson #else 445dfdcada3SDoug Rabson 446dfdcada3SDoug Rabson extern CLIENT *clnt_create(const char *, const rpcprog_t, const rpcvers_t, 447dfdcada3SDoug Rabson const char *); 448dfdcada3SDoug Rabson /* 449dfdcada3SDoug Rabson * 450dfdcada3SDoug Rabson * const char *hostname; -- hostname 451dfdcada3SDoug Rabson * const rpcprog_t prog; -- program number 452dfdcada3SDoug Rabson * const rpcvers_t vers; -- version number 453dfdcada3SDoug Rabson * const char *nettype; -- network type 454dfdcada3SDoug Rabson */ 455dfdcada3SDoug Rabson 456dfdcada3SDoug Rabson /* 457dfdcada3SDoug Rabson * Generic client creation routine. Just like clnt_create(), except 458dfdcada3SDoug Rabson * it takes an additional timeout parameter. 459dfdcada3SDoug Rabson */ 460dfdcada3SDoug Rabson extern CLIENT * clnt_create_timed(const char *, const rpcprog_t, 461dfdcada3SDoug Rabson const rpcvers_t, const char *, const struct timeval *); 462dfdcada3SDoug Rabson /* 463dfdcada3SDoug Rabson * 464dfdcada3SDoug Rabson * const char *hostname; -- hostname 465dfdcada3SDoug Rabson * const rpcprog_t prog; -- program number 466dfdcada3SDoug Rabson * const rpcvers_t vers; -- version number 467dfdcada3SDoug Rabson * const char *nettype; -- network type 468dfdcada3SDoug Rabson * const struct timeval *tp; -- timeout 469dfdcada3SDoug Rabson */ 470dfdcada3SDoug Rabson 471dfdcada3SDoug Rabson /* 472dfdcada3SDoug Rabson * Generic client creation routine. Supported protocols are which belong 473dfdcada3SDoug Rabson * to the nettype name space. 474dfdcada3SDoug Rabson */ 475dfdcada3SDoug Rabson extern CLIENT *clnt_create_vers(const char *, const rpcprog_t, rpcvers_t *, 476dfdcada3SDoug Rabson const rpcvers_t, const rpcvers_t, 477dfdcada3SDoug Rabson const char *); 478dfdcada3SDoug Rabson /* 479dfdcada3SDoug Rabson * const char *host; -- hostname 480dfdcada3SDoug Rabson * const rpcprog_t prog; -- program number 481dfdcada3SDoug Rabson * rpcvers_t *vers_out; -- servers highest available version 482dfdcada3SDoug Rabson * const rpcvers_t vers_low; -- low version number 483dfdcada3SDoug Rabson * const rpcvers_t vers_high; -- high version number 484dfdcada3SDoug Rabson * const char *nettype; -- network type 485dfdcada3SDoug Rabson */ 486dfdcada3SDoug Rabson 487dfdcada3SDoug Rabson /* 488dfdcada3SDoug Rabson * Generic client creation routine. Supported protocols are which belong 489dfdcada3SDoug Rabson * to the nettype name space. 490dfdcada3SDoug Rabson */ 491dfdcada3SDoug Rabson extern CLIENT * clnt_create_vers_timed(const char *, const rpcprog_t, 492dfdcada3SDoug Rabson rpcvers_t *, const rpcvers_t, const rpcvers_t, const char *, 493dfdcada3SDoug Rabson const struct timeval *); 494dfdcada3SDoug Rabson /* 495dfdcada3SDoug Rabson * const char *host; -- hostname 496dfdcada3SDoug Rabson * const rpcprog_t prog; -- program number 497dfdcada3SDoug Rabson * rpcvers_t *vers_out; -- servers highest available version 498dfdcada3SDoug Rabson * const rpcvers_t vers_low; -- low version number 499dfdcada3SDoug Rabson * const rpcvers_t vers_high; -- high version number 500dfdcada3SDoug Rabson * const char *nettype; -- network type 501dfdcada3SDoug Rabson * const struct timeval *tp -- timeout 502dfdcada3SDoug Rabson */ 503dfdcada3SDoug Rabson 504dfdcada3SDoug Rabson /* 505dfdcada3SDoug Rabson * Generic client creation routine. It takes a netconfig structure 506dfdcada3SDoug Rabson * instead of nettype 507dfdcada3SDoug Rabson */ 508dfdcada3SDoug Rabson extern CLIENT *clnt_tp_create(const char *, const rpcprog_t, 509dfdcada3SDoug Rabson const rpcvers_t, const struct netconfig *); 510dfdcada3SDoug Rabson /* 511dfdcada3SDoug Rabson * const char *hostname; -- hostname 512dfdcada3SDoug Rabson * const rpcprog_t prog; -- program number 513dfdcada3SDoug Rabson * const rpcvers_t vers; -- version number 514dfdcada3SDoug Rabson * const struct netconfig *netconf; -- network config structure 515dfdcada3SDoug Rabson */ 516dfdcada3SDoug Rabson 517dfdcada3SDoug Rabson /* 518dfdcada3SDoug Rabson * Generic client creation routine. Just like clnt_tp_create(), except 519dfdcada3SDoug Rabson * it takes an additional timeout parameter. 520dfdcada3SDoug Rabson */ 521dfdcada3SDoug Rabson extern CLIENT * clnt_tp_create_timed(const char *, const rpcprog_t, 522dfdcada3SDoug Rabson const rpcvers_t, const struct netconfig *, const struct timeval *); 523dfdcada3SDoug Rabson /* 524dfdcada3SDoug Rabson * const char *hostname; -- hostname 525dfdcada3SDoug Rabson * const rpcprog_t prog; -- program number 526dfdcada3SDoug Rabson * const rpcvers_t vers; -- version number 527dfdcada3SDoug Rabson * const struct netconfig *netconf; -- network config structure 528dfdcada3SDoug Rabson * const struct timeval *tp -- timeout 529dfdcada3SDoug Rabson */ 530dfdcada3SDoug Rabson 531dfdcada3SDoug Rabson /* 532dfdcada3SDoug Rabson * Generic TLI create routine. Only provided for compatibility. 533dfdcada3SDoug Rabson */ 534dfdcada3SDoug Rabson 535dfdcada3SDoug Rabson extern CLIENT *clnt_tli_create(const int, const struct netconfig *, 536dfdcada3SDoug Rabson struct netbuf *, const rpcprog_t, 537dfdcada3SDoug Rabson const rpcvers_t, const u_int, const u_int); 538dfdcada3SDoug Rabson /* 5393e85b721SEd Maste * const int fd; -- fd 540dfdcada3SDoug Rabson * const struct netconfig *nconf; -- netconfig structure 541dfdcada3SDoug Rabson * struct netbuf *svcaddr; -- servers address 542dfdcada3SDoug Rabson * const u_long prog; -- program number 543dfdcada3SDoug Rabson * const u_long vers; -- version number 544dfdcada3SDoug Rabson * const u_int sendsz; -- send size 545dfdcada3SDoug Rabson * const u_int recvsz; -- recv size 546dfdcada3SDoug Rabson */ 547dfdcada3SDoug Rabson 548dfdcada3SDoug Rabson /* 549dfdcada3SDoug Rabson * Low level clnt create routine for connectionful transports, e.g. tcp. 550dfdcada3SDoug Rabson */ 551dfdcada3SDoug Rabson extern CLIENT *clnt_vc_create(const int, const struct netbuf *, 552dfdcada3SDoug Rabson const rpcprog_t, const rpcvers_t, 553dfdcada3SDoug Rabson u_int, u_int); 554dfdcada3SDoug Rabson /* 555dfdcada3SDoug Rabson * Added for compatibility to old rpc 4.0. Obsoleted by clnt_vc_create(). 556dfdcada3SDoug Rabson */ 557dfdcada3SDoug Rabson extern CLIENT *clntunix_create(struct sockaddr_un *, 558dfdcada3SDoug Rabson u_long, u_long, int *, u_int, u_int); 559dfdcada3SDoug Rabson /* 560dfdcada3SDoug Rabson * const int fd; -- open file descriptor 561dfdcada3SDoug Rabson * const struct netbuf *svcaddr; -- servers address 562dfdcada3SDoug Rabson * const rpcprog_t prog; -- program number 563dfdcada3SDoug Rabson * const rpcvers_t vers; -- version number 564dfdcada3SDoug Rabson * const u_int sendsz; -- buffer recv size 565dfdcada3SDoug Rabson * const u_int recvsz; -- buffer send size 566dfdcada3SDoug Rabson */ 567dfdcada3SDoug Rabson 568dfdcada3SDoug Rabson /* 569dfdcada3SDoug Rabson * Low level clnt create routine for connectionless transports, e.g. udp. 570dfdcada3SDoug Rabson */ 571dfdcada3SDoug Rabson extern CLIENT *clnt_dg_create(const int, const struct netbuf *, 572dfdcada3SDoug Rabson const rpcprog_t, const rpcvers_t, 573dfdcada3SDoug Rabson const u_int, const u_int); 574dfdcada3SDoug Rabson /* 575dfdcada3SDoug Rabson * const int fd; -- open file descriptor 576dfdcada3SDoug Rabson * const struct netbuf *svcaddr; -- servers address 577dfdcada3SDoug Rabson * const rpcprog_t program; -- program number 578dfdcada3SDoug Rabson * const rpcvers_t version; -- version number 579dfdcada3SDoug Rabson * const u_int sendsz; -- buffer recv size 580dfdcada3SDoug Rabson * const u_int recvsz; -- buffer send size 581dfdcada3SDoug Rabson */ 582dfdcada3SDoug Rabson 583dfdcada3SDoug Rabson /* 584dfdcada3SDoug Rabson * Memory based rpc (for speed check and testing) 585dfdcada3SDoug Rabson * CLIENT * 586dfdcada3SDoug Rabson * clnt_raw_create(prog, vers) 587dfdcada3SDoug Rabson * u_long prog; 588dfdcada3SDoug Rabson * u_long vers; 589dfdcada3SDoug Rabson */ 590dfdcada3SDoug Rabson extern CLIENT *clnt_raw_create(rpcprog_t, rpcvers_t); 591dfdcada3SDoug Rabson #endif 592dfdcada3SDoug Rabson 593dfdcada3SDoug Rabson __END_DECLS 594dfdcada3SDoug Rabson 595dfdcada3SDoug Rabson 596dfdcada3SDoug Rabson /* 597dfdcada3SDoug Rabson * Print why creation failed 598dfdcada3SDoug Rabson */ 599dfdcada3SDoug Rabson __BEGIN_DECLS 600dfdcada3SDoug Rabson extern void clnt_pcreateerror(const char *); /* stderr */ 601dfdcada3SDoug Rabson extern char *clnt_spcreateerror(const char *); /* string */ 602dfdcada3SDoug Rabson __END_DECLS 603dfdcada3SDoug Rabson 604dfdcada3SDoug Rabson /* 605dfdcada3SDoug Rabson * Like clnt_perror(), but is more verbose in its output 606dfdcada3SDoug Rabson */ 607dfdcada3SDoug Rabson __BEGIN_DECLS 608dfdcada3SDoug Rabson extern void clnt_perrno(enum clnt_stat); /* stderr */ 609dfdcada3SDoug Rabson extern char *clnt_sperrno(enum clnt_stat); /* string */ 610dfdcada3SDoug Rabson __END_DECLS 611dfdcada3SDoug Rabson 612dfdcada3SDoug Rabson /* 613dfdcada3SDoug Rabson * Print an English error message, given the client error code 614dfdcada3SDoug Rabson */ 615dfdcada3SDoug Rabson __BEGIN_DECLS 616dfdcada3SDoug Rabson extern void clnt_perror(CLIENT *, const char *); /* stderr */ 617dfdcada3SDoug Rabson extern char *clnt_sperror(CLIENT *, const char *); /* string */ 618dfdcada3SDoug Rabson __END_DECLS 619dfdcada3SDoug Rabson 620dfdcada3SDoug Rabson 621dfdcada3SDoug Rabson /* 622dfdcada3SDoug Rabson * If a creation fails, the following allows the user to figure out why. 623dfdcada3SDoug Rabson */ 624dfdcada3SDoug Rabson struct rpc_createerr { 625dfdcada3SDoug Rabson enum clnt_stat cf_stat; 626dfdcada3SDoug Rabson struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */ 627dfdcada3SDoug Rabson }; 628dfdcada3SDoug Rabson 629dfdcada3SDoug Rabson #ifdef _KERNEL 630dfdcada3SDoug Rabson extern struct rpc_createerr rpc_createerr; 631dfdcada3SDoug Rabson #else 632dfdcada3SDoug Rabson __BEGIN_DECLS 633dfdcada3SDoug Rabson extern struct rpc_createerr *__rpc_createerr(void); 634dfdcada3SDoug Rabson __END_DECLS 635dfdcada3SDoug Rabson #define rpc_createerr (*(__rpc_createerr())) 636dfdcada3SDoug Rabson #endif 637dfdcada3SDoug Rabson 638c675522fSDoug Rabson #ifndef _KERNEL 639dfdcada3SDoug Rabson /* 640dfdcada3SDoug Rabson * The simplified interface: 641dfdcada3SDoug Rabson * enum clnt_stat 642dfdcada3SDoug Rabson * rpc_call(host, prognum, versnum, procnum, inproc, in, outproc, out, nettype) 643dfdcada3SDoug Rabson * const char *host; 644dfdcada3SDoug Rabson * const rpcprog_t prognum; 645dfdcada3SDoug Rabson * const rpcvers_t versnum; 646dfdcada3SDoug Rabson * const rpcproc_t procnum; 647dfdcada3SDoug Rabson * const xdrproc_t inproc, outproc; 648dfdcada3SDoug Rabson * const char *in; 649dfdcada3SDoug Rabson * char *out; 650dfdcada3SDoug Rabson * const char *nettype; 651dfdcada3SDoug Rabson */ 652dfdcada3SDoug Rabson __BEGIN_DECLS 653dfdcada3SDoug Rabson extern enum clnt_stat rpc_call(const char *, const rpcprog_t, 654dfdcada3SDoug Rabson const rpcvers_t, const rpcproc_t, 655dfdcada3SDoug Rabson const xdrproc_t, const char *, 656dfdcada3SDoug Rabson const xdrproc_t, char *, const char *); 657dfdcada3SDoug Rabson __END_DECLS 658dfdcada3SDoug Rabson 659dfdcada3SDoug Rabson /* 660dfdcada3SDoug Rabson * RPC broadcast interface 661dfdcada3SDoug Rabson * The call is broadcasted to all locally connected nets. 662dfdcada3SDoug Rabson * 663dfdcada3SDoug Rabson * extern enum clnt_stat 664dfdcada3SDoug Rabson * rpc_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, 665dfdcada3SDoug Rabson * eachresult, nettype) 666dfdcada3SDoug Rabson * const rpcprog_t prog; -- program number 667dfdcada3SDoug Rabson * const rpcvers_t vers; -- version number 668dfdcada3SDoug Rabson * const rpcproc_t proc; -- procedure number 669dfdcada3SDoug Rabson * const xdrproc_t xargs; -- xdr routine for args 670dfdcada3SDoug Rabson * caddr_t argsp; -- pointer to args 671dfdcada3SDoug Rabson * const xdrproc_t xresults; -- xdr routine for results 672dfdcada3SDoug Rabson * caddr_t resultsp; -- pointer to results 673dfdcada3SDoug Rabson * const resultproc_t eachresult; -- call with each result 674dfdcada3SDoug Rabson * const char *nettype; -- Transport type 675dfdcada3SDoug Rabson * 676dfdcada3SDoug Rabson * For each valid response received, the procedure eachresult is called. 677dfdcada3SDoug Rabson * Its form is: 678dfdcada3SDoug Rabson * done = eachresult(resp, raddr, nconf) 679dfdcada3SDoug Rabson * bool_t done; 680dfdcada3SDoug Rabson * caddr_t resp; 681dfdcada3SDoug Rabson * struct netbuf *raddr; 682dfdcada3SDoug Rabson * struct netconfig *nconf; 683dfdcada3SDoug Rabson * where resp points to the results of the call and raddr is the 684dfdcada3SDoug Rabson * address if the responder to the broadcast. nconf is the transport 685dfdcada3SDoug Rabson * on which the response was received. 686dfdcada3SDoug Rabson * 687dfdcada3SDoug Rabson * extern enum clnt_stat 688dfdcada3SDoug Rabson * rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp, 689dfdcada3SDoug Rabson * eachresult, inittime, waittime, nettype) 690dfdcada3SDoug Rabson * const rpcprog_t prog; -- program number 691dfdcada3SDoug Rabson * const rpcvers_t vers; -- version number 692dfdcada3SDoug Rabson * const rpcproc_t proc; -- procedure number 693dfdcada3SDoug Rabson * const xdrproc_t xargs; -- xdr routine for args 694dfdcada3SDoug Rabson * caddr_t argsp; -- pointer to args 695dfdcada3SDoug Rabson * const xdrproc_t xresults; -- xdr routine for results 696dfdcada3SDoug Rabson * caddr_t resultsp; -- pointer to results 697dfdcada3SDoug Rabson * const resultproc_t eachresult; -- call with each result 698dfdcada3SDoug Rabson * const int inittime; -- how long to wait initially 699dfdcada3SDoug Rabson * const int waittime; -- maximum time to wait 700dfdcada3SDoug Rabson * const char *nettype; -- Transport type 701dfdcada3SDoug Rabson */ 702dfdcada3SDoug Rabson 703dfdcada3SDoug Rabson typedef bool_t (*resultproc_t)(caddr_t, ...); 704dfdcada3SDoug Rabson 705dfdcada3SDoug Rabson __BEGIN_DECLS 706dfdcada3SDoug Rabson extern enum clnt_stat rpc_broadcast(const rpcprog_t, const rpcvers_t, 707dfdcada3SDoug Rabson const rpcproc_t, const xdrproc_t, 708dfdcada3SDoug Rabson caddr_t, const xdrproc_t, caddr_t, 709dfdcada3SDoug Rabson const resultproc_t, const char *); 710dfdcada3SDoug Rabson extern enum clnt_stat rpc_broadcast_exp(const rpcprog_t, const rpcvers_t, 711dfdcada3SDoug Rabson const rpcproc_t, const xdrproc_t, 712dfdcada3SDoug Rabson caddr_t, const xdrproc_t, caddr_t, 713dfdcada3SDoug Rabson const resultproc_t, const int, 714dfdcada3SDoug Rabson const int, const char *); 715dfdcada3SDoug Rabson __END_DECLS 716dfdcada3SDoug Rabson 717dfdcada3SDoug Rabson /* For backward compatibility */ 718dfdcada3SDoug Rabson #include <rpc/clnt_soc.h> 719dfdcada3SDoug Rabson #endif 720dfdcada3SDoug Rabson 721dfdcada3SDoug Rabson #endif /* !_RPC_CLNT_H_ */ 722