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