1177633Sdfr/* $NetBSD: clnt.h,v 1.14 2000/06/02 22:57:55 fvdl Exp $ */ 2177633Sdfr 3261046Smav/*- 4261046Smav * Copyright (c) 2010, Oracle America, Inc. 5261046Smav * All rights reserved. 6177633Sdfr * 7261046Smav * Redistribution and use in source and binary forms, with or without 8261046Smav * modification, are permitted provided that the following conditions are met: 9261046Smav * - Redistributions of source code must retain the above copyright notice, 10261046Smav * this list of conditions and the following disclaimer. 11261046Smav * - Redistributions in binary form must reproduce the above copyright notice, 12261046Smav * this list of conditions and the following disclaimer in the documentation 13261046Smav * and/or other materials provided with the distribution. 14261046Smav * - Neither the name of the "Oracle America, Inc." nor the names of its 15261046Smav * contributors may be used to endorse or promote products derived 16261046Smav * from this software without specific prior written permission. 17177633Sdfr * 18261046Smav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19261046Smav * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20261046Smav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21261046Smav * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22261046Smav * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23261046Smav * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24261046Smav * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25261046Smav * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26261046Smav * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27261046Smav * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28261046Smav * POSSIBILITY OF SUCH DAMAGE. 29177633Sdfr * 30177633Sdfr * from: @(#)clnt.h 1.31 94/04/29 SMI 31177633Sdfr * from: @(#)clnt.h 2.1 88/07/29 4.0 RPCSRC 32177633Sdfr * $FreeBSD: releng/10.3/sys/rpc/clnt.h 261046 2014-01-22 23:45:27Z mav $ 33177633Sdfr */ 34177633Sdfr 35177633Sdfr/* 36177633Sdfr * clnt.h - Client side remote procedure call interface. 37177633Sdfr * 38177633Sdfr * Copyright (c) 1986-1991,1994-1999 by Sun Microsystems, Inc. 39177633Sdfr * All rights reserved. 40177633Sdfr */ 41177633Sdfr 42177633Sdfr#ifndef _RPC_CLNT_H_ 43177633Sdfr#define _RPC_CLNT_H_ 44177633Sdfr#include <rpc/clnt_stat.h> 45177633Sdfr#include <sys/cdefs.h> 46177633Sdfr#ifdef _KERNEL 47180025Sdfr#include <sys/refcount.h> 48177633Sdfr#include <rpc/netconfig.h> 49177633Sdfr#else 50177633Sdfr#include <netconfig.h> 51177633Sdfr#endif 52177633Sdfr#include <sys/un.h> 53177633Sdfr 54177633Sdfr/* 55177633Sdfr * Well-known IPV6 RPC broadcast address. 56177633Sdfr */ 57177633Sdfr#define RPCB_MULTICAST_ADDR "ff02::202" 58177633Sdfr 59177633Sdfr/* 60177633Sdfr * the following errors are in general unrecoverable. The caller 61177633Sdfr * should give up rather than retry. 62177633Sdfr */ 63177633Sdfr#define IS_UNRECOVERABLE_RPC(s) (((s) == RPC_AUTHERROR) || \ 64177633Sdfr ((s) == RPC_CANTENCODEARGS) || \ 65177633Sdfr ((s) == RPC_CANTDECODERES) || \ 66177633Sdfr ((s) == RPC_VERSMISMATCH) || \ 67177633Sdfr ((s) == RPC_PROCUNAVAIL) || \ 68177633Sdfr ((s) == RPC_PROGUNAVAIL) || \ 69177633Sdfr ((s) == RPC_PROGVERSMISMATCH) || \ 70177633Sdfr ((s) == RPC_CANTDECODEARGS)) 71177633Sdfr 72177633Sdfr/* 73177633Sdfr * Error info. 74177633Sdfr */ 75177633Sdfrstruct rpc_err { 76177633Sdfr enum clnt_stat re_status; 77177633Sdfr union { 78177633Sdfr int RE_errno; /* related system error */ 79177633Sdfr enum auth_stat RE_why; /* why the auth error occurred */ 80177633Sdfr struct { 81177633Sdfr rpcvers_t low; /* lowest version supported */ 82177633Sdfr rpcvers_t high; /* highest version supported */ 83177633Sdfr } RE_vers; 84177633Sdfr struct { /* maybe meaningful if RPC_FAILED */ 85177633Sdfr int32_t s1; 86177633Sdfr int32_t s2; 87177633Sdfr } RE_lb; /* life boot & debugging only */ 88177633Sdfr } ru; 89177633Sdfr#define re_errno ru.RE_errno 90177633Sdfr#define re_why ru.RE_why 91177633Sdfr#define re_vers ru.RE_vers 92177633Sdfr#define re_lb ru.RE_lb 93177633Sdfr}; 94177633Sdfr 95180025Sdfr#ifdef _KERNEL 96180025Sdfr/* 97180025Sdfr * Functions of this type may be used to receive notification when RPC 98180025Sdfr * calls have to be re-transmitted etc. 99180025Sdfr */ 100180025Sdfrtypedef void rpc_feedback(int cmd, int procnum, void *); 101177633Sdfr 102177633Sdfr/* 103184588Sdfr * Timers used for the pseudo-transport protocol when using datagrams 104184588Sdfr */ 105184588Sdfrstruct rpc_timers { 106184588Sdfr u_short rt_srtt; /* smoothed round-trip time */ 107184588Sdfr u_short rt_deviate; /* estimated deviation */ 108184588Sdfr u_long rt_rtxcur; /* current (backed-off) rto */ 109184588Sdfr}; 110184588Sdfr 111184588Sdfr/* 112180025Sdfr * A structure used with CLNT_CALL_EXT to pass extra information used 113180025Sdfr * while processing an RPC call. 114180025Sdfr */ 115180025Sdfrstruct rpc_callextra { 116180025Sdfr AUTH *rc_auth; /* auth handle to use for this call */ 117180025Sdfr rpc_feedback *rc_feedback; /* callback for retransmits etc. */ 118180025Sdfr void *rc_feedback_arg; /* argument for callback */ 119184588Sdfr struct rpc_timers *rc_timers; /* optional RTT timers */ 120184588Sdfr struct rpc_err rc_err; /* detailed call status */ 121180025Sdfr}; 122180025Sdfr#endif 123180025Sdfr 124180025Sdfr/* 125177633Sdfr * Client rpc handle. 126177633Sdfr * Created by individual implementations 127177633Sdfr * Client is responsible for initializing auth, see e.g. auth_none.c. 128177633Sdfr */ 129177633Sdfrtypedef struct __rpc_client { 130180025Sdfr#ifdef _KERNEL 131180025Sdfr volatile u_int cl_refs; /* reference count */ 132177633Sdfr AUTH *cl_auth; /* authenticator */ 133177633Sdfr struct clnt_ops { 134177633Sdfr /* call remote procedure */ 135177633Sdfr enum clnt_stat (*cl_call)(struct __rpc_client *, 136184588Sdfr struct rpc_callextra *, rpcproc_t, 137184588Sdfr struct mbuf *, struct mbuf **, struct timeval); 138177633Sdfr /* abort a call */ 139177633Sdfr void (*cl_abort)(struct __rpc_client *); 140177633Sdfr /* get specific error code */ 141177633Sdfr void (*cl_geterr)(struct __rpc_client *, 142177633Sdfr struct rpc_err *); 143177633Sdfr /* frees results */ 144177633Sdfr bool_t (*cl_freeres)(struct __rpc_client *, 145177633Sdfr xdrproc_t, void *); 146184588Sdfr /* close the connection and terminate pending RPCs */ 147184588Sdfr void (*cl_close)(struct __rpc_client *); 148177633Sdfr /* destroy this structure */ 149177633Sdfr void (*cl_destroy)(struct __rpc_client *); 150177633Sdfr /* the ioctl() of rpc */ 151177633Sdfr bool_t (*cl_control)(struct __rpc_client *, u_int, 152177633Sdfr void *); 153177633Sdfr } *cl_ops; 154180025Sdfr#else 155180025Sdfr AUTH *cl_auth; /* authenticator */ 156180025Sdfr struct clnt_ops { 157180025Sdfr /* call remote procedure */ 158180025Sdfr enum clnt_stat (*cl_call)(struct __rpc_client *, 159180025Sdfr rpcproc_t, xdrproc_t, void *, xdrproc_t, 160180025Sdfr void *, struct timeval); 161180025Sdfr /* abort a call */ 162180025Sdfr void (*cl_abort)(struct __rpc_client *); 163180025Sdfr /* get specific error code */ 164180025Sdfr void (*cl_geterr)(struct __rpc_client *, 165180025Sdfr struct rpc_err *); 166180025Sdfr /* frees results */ 167180025Sdfr bool_t (*cl_freeres)(struct __rpc_client *, 168180025Sdfr xdrproc_t, void *); 169180025Sdfr /* destroy this structure */ 170180025Sdfr void (*cl_destroy)(struct __rpc_client *); 171180025Sdfr /* the ioctl() of rpc */ 172180025Sdfr bool_t (*cl_control)(struct __rpc_client *, u_int, 173180025Sdfr void *); 174180025Sdfr } *cl_ops; 175180025Sdfr#endif 176177633Sdfr void *cl_private; /* private stuff */ 177177633Sdfr char *cl_netid; /* network token */ 178177633Sdfr char *cl_tp; /* device name */ 179177633Sdfr} CLIENT; 180177633Sdfr 181177633Sdfr/* 182177633Sdfr * Feedback values used for possible congestion and rate control 183177633Sdfr */ 184180025Sdfr#define FEEDBACK_OK 1 /* no retransmits */ 185180025Sdfr#define FEEDBACK_REXMIT1 2 /* first retransmit */ 186180025Sdfr#define FEEDBACK_REXMIT2 3 /* second and subsequent retransmit */ 187180025Sdfr#define FEEDBACK_RECONNECT 4 /* client reconnect */ 188177633Sdfr 189177633Sdfr/* Used to set version of portmapper used in broadcast */ 190177633Sdfr 191177633Sdfr#define CLCR_SET_LOWVERS 3 192177633Sdfr#define CLCR_GET_LOWVERS 4 193177633Sdfr 194177633Sdfr#define RPCSMALLMSGSIZE 400 /* a more reasonable packet size */ 195177633Sdfr 196177633Sdfr/* 197177633Sdfr * client side rpc interface ops 198177633Sdfr * 199177633Sdfr * Parameter types are: 200177633Sdfr * 201177633Sdfr */ 202177633Sdfr 203180025Sdfr#ifdef _KERNEL 204180025Sdfr#define CLNT_ACQUIRE(rh) \ 205180025Sdfr refcount_acquire(&(rh)->cl_refs) 206180025Sdfr#define CLNT_RELEASE(rh) \ 207180025Sdfr if (refcount_release(&(rh)->cl_refs)) \ 208180025Sdfr CLNT_DESTROY(rh) 209180025Sdfr 210177633Sdfr/* 211184588Sdfr * void 212184588Sdfr * CLNT_CLOSE(rh); 213184588Sdfr * CLIENT *rh; 214184588Sdfr */ 215184588Sdfr#define CLNT_CLOSE(rh) ((*(rh)->cl_ops->cl_close)(rh)) 216184588Sdfr 217184588Sdfrenum clnt_stat clnt_call_private(CLIENT *, struct rpc_callextra *, rpcproc_t, 218184588Sdfr xdrproc_t, void *, xdrproc_t, void *, struct timeval); 219184588Sdfr 220184588Sdfr/* 221177633Sdfr * enum clnt_stat 222184588Sdfr * CLNT_CALL_MBUF(rh, ext, proc, mreq, mrepp, timeout) 223184588Sdfr * CLIENT *rh; 224184588Sdfr * struct rpc_callextra *ext; 225184588Sdfr * rpcproc_t proc; 226184588Sdfr * struct mbuf *mreq; 227184588Sdfr * struct mbuf **mrepp; 228184588Sdfr * struct timeval timeout; 229184588Sdfr * 230184588Sdfr * Call arguments in mreq which is consumed by the call (even if there 231184588Sdfr * is an error). Results returned in *mrepp. 232184588Sdfr */ 233184588Sdfr#define CLNT_CALL_MBUF(rh, ext, proc, mreq, mrepp, secs) \ 234184588Sdfr ((*(rh)->cl_ops->cl_call)(rh, ext, proc, mreq, mrepp, secs)) 235184588Sdfr 236184588Sdfr/* 237184588Sdfr * enum clnt_stat 238180025Sdfr * CLNT_CALL_EXT(rh, ext, proc, xargs, argsp, xres, resp, timeout) 239180025Sdfr * CLIENT *rh; 240180025Sdfr * struct rpc_callextra *ext; 241180025Sdfr * rpcproc_t proc; 242180025Sdfr * xdrproc_t xargs; 243180025Sdfr * void *argsp; 244180025Sdfr * xdrproc_t xres; 245180025Sdfr * void *resp; 246180025Sdfr * struct timeval timeout; 247180025Sdfr */ 248180025Sdfr#define CLNT_CALL_EXT(rh, ext, proc, xargs, argsp, xres, resp, secs) \ 249184588Sdfr clnt_call_private(rh, ext, proc, xargs, \ 250184588Sdfr argsp, xres, resp, secs) 251180025Sdfr#endif 252180025Sdfr 253180025Sdfr/* 254180025Sdfr * enum clnt_stat 255177633Sdfr * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout) 256177633Sdfr * CLIENT *rh; 257177633Sdfr * rpcproc_t proc; 258177633Sdfr * xdrproc_t xargs; 259177633Sdfr * void *argsp; 260177633Sdfr * xdrproc_t xres; 261177633Sdfr * void *resp; 262177633Sdfr * struct timeval timeout; 263177633Sdfr */ 264180025Sdfr#ifdef _KERNEL 265184588Sdfr#define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ 266184588Sdfr clnt_call_private(rh, NULL, proc, xargs, \ 267184588Sdfr argsp, xres, resp, secs) 268184588Sdfr#define clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \ 269184588Sdfr clnt_call_private(rh, NULL, proc, xargs, \ 270184588Sdfr argsp, xres, resp, secs) 271180025Sdfr#else 272180025Sdfr#define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ 273180025Sdfr ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, \ 274180025Sdfr argsp, xres, resp, secs)) 275180025Sdfr#define clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \ 276180025Sdfr ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, \ 277180025Sdfr argsp, xres, resp, secs)) 278180025Sdfr#endif 279177633Sdfr 280177633Sdfr/* 281177633Sdfr * void 282177633Sdfr * CLNT_ABORT(rh); 283177633Sdfr * CLIENT *rh; 284177633Sdfr */ 285177633Sdfr#define CLNT_ABORT(rh) ((*(rh)->cl_ops->cl_abort)(rh)) 286177633Sdfr#define clnt_abort(rh) ((*(rh)->cl_ops->cl_abort)(rh)) 287177633Sdfr 288177633Sdfr/* 289177633Sdfr * struct rpc_err 290177633Sdfr * CLNT_GETERR(rh); 291177633Sdfr * CLIENT *rh; 292177633Sdfr */ 293177633Sdfr#define CLNT_GETERR(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) 294177633Sdfr#define clnt_geterr(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) 295177633Sdfr 296177633Sdfr 297177633Sdfr/* 298177633Sdfr * bool_t 299177633Sdfr * CLNT_FREERES(rh, xres, resp); 300177633Sdfr * CLIENT *rh; 301177633Sdfr * xdrproc_t xres; 302177633Sdfr * void *resp; 303177633Sdfr */ 304177633Sdfr#define CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) 305177633Sdfr#define clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) 306177633Sdfr 307177633Sdfr/* 308177633Sdfr * bool_t 309177633Sdfr * CLNT_CONTROL(cl, request, info) 310177633Sdfr * CLIENT *cl; 311177633Sdfr * u_int request; 312177633Sdfr * char *info; 313177633Sdfr */ 314177633Sdfr#define CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) 315177633Sdfr#define clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) 316177633Sdfr 317177633Sdfr/* 318177633Sdfr * control operations that apply to both udp and tcp transports 319177633Sdfr */ 320177633Sdfr#define CLSET_TIMEOUT 1 /* set timeout (timeval) */ 321177633Sdfr#define CLGET_TIMEOUT 2 /* get timeout (timeval) */ 322177633Sdfr#define CLGET_SERVER_ADDR 3 /* get server's address (sockaddr) */ 323177633Sdfr#define CLGET_FD 6 /* get connections file descriptor */ 324177633Sdfr#define CLGET_SVC_ADDR 7 /* get server's address (netbuf) */ 325177633Sdfr#define CLSET_FD_CLOSE 8 /* close fd while clnt_destroy */ 326177633Sdfr#define CLSET_FD_NCLOSE 9 /* Do not close fd while clnt_destroy */ 327177633Sdfr#define CLGET_XID 10 /* Get xid */ 328177633Sdfr#define CLSET_XID 11 /* Set xid */ 329177633Sdfr#define CLGET_VERS 12 /* Get version number */ 330177633Sdfr#define CLSET_VERS 13 /* Set version number */ 331177633Sdfr#define CLGET_PROG 14 /* Get program number */ 332177633Sdfr#define CLSET_PROG 15 /* Set program number */ 333177633Sdfr#define CLSET_SVC_ADDR 16 /* get server's address (netbuf) */ 334177633Sdfr#define CLSET_PUSH_TIMOD 17 /* push timod if not already present */ 335177633Sdfr#define CLSET_POP_TIMOD 18 /* pop timod */ 336177633Sdfr/* 337177633Sdfr * Connectionless only control operations 338177633Sdfr */ 339177633Sdfr#define CLSET_RETRY_TIMEOUT 4 /* set retry timeout (timeval) */ 340177633Sdfr#define CLGET_RETRY_TIMEOUT 5 /* get retry timeout (timeval) */ 341177633Sdfr#define CLSET_ASYNC 19 342177633Sdfr#define CLSET_CONNECT 20 /* Use connect() for UDP. (int) */ 343177633Sdfr 344177633Sdfr#ifdef _KERNEL 345177633Sdfr/* 346177633Sdfr * Kernel control operations. The default msleep string is "rpcrecv", 347177633Sdfr * and sleeps are non-interruptible by default. 348177633Sdfr */ 349177633Sdfr#define CLSET_WAITCHAN 21 /* set string to use in msleep call */ 350177633Sdfr#define CLGET_WAITCHAN 22 /* get string used in msleep call */ 351177633Sdfr#define CLSET_INTERRUPTIBLE 23 /* set interruptible flag */ 352177633Sdfr#define CLGET_INTERRUPTIBLE 24 /* set interruptible flag */ 353180025Sdfr#define CLSET_RETRIES 25 /* set retry count for reconnect */ 354180025Sdfr#define CLGET_RETRIES 26 /* get retry count for reconnect */ 355184588Sdfr#define CLSET_PRIVPORT 27 /* set privileged source port flag */ 356184588Sdfr#define CLGET_PRIVPORT 28 /* get privileged source port flag */ 357244008Srmacklem#define CLSET_BACKCHANNEL 29 /* set backchannel for socket */ 358177633Sdfr#endif 359177633Sdfr 360177633Sdfr 361177633Sdfr/* 362177633Sdfr * void 363177633Sdfr * CLNT_DESTROY(rh); 364177633Sdfr * CLIENT *rh; 365177633Sdfr */ 366177633Sdfr#define CLNT_DESTROY(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 367177633Sdfr#define clnt_destroy(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 368177633Sdfr 369177633Sdfr 370177633Sdfr/* 371177633Sdfr * RPCTEST is a test program which is accessible on every rpc 372177633Sdfr * transport/port. It is used for testing, performance evaluation, 373177633Sdfr * and network administration. 374177633Sdfr */ 375177633Sdfr 376177633Sdfr#define RPCTEST_PROGRAM ((rpcprog_t)1) 377177633Sdfr#define RPCTEST_VERSION ((rpcvers_t)1) 378177633Sdfr#define RPCTEST_NULL_PROC ((rpcproc_t)2) 379177633Sdfr#define RPCTEST_NULL_BATCH_PROC ((rpcproc_t)3) 380177633Sdfr 381177633Sdfr/* 382177633Sdfr * By convention, procedure 0 takes null arguments and returns them 383177633Sdfr */ 384177633Sdfr 385177633Sdfr#define NULLPROC ((rpcproc_t)0) 386177633Sdfr 387177633Sdfr/* 388177633Sdfr * Below are the client handle creation routines for the various 389177633Sdfr * implementations of client side rpc. They can return NULL if a 390177633Sdfr * creation failure occurs. 391177633Sdfr */ 392177633Sdfr 393177633Sdfr/* 394177633Sdfr * Generic client creation routine. Supported protocols are those that 395177633Sdfr * belong to the nettype namespace (/etc/netconfig). 396177633Sdfr */ 397177633Sdfr__BEGIN_DECLS 398177633Sdfr#ifdef _KERNEL 399177633Sdfr 400177633Sdfr/* 401177633Sdfr * struct socket *so; -- socket 402177633Sdfr * struct sockaddr *svcaddr; -- servers address 403177633Sdfr * rpcprog_t prog; -- program number 404177633Sdfr * rpcvers_t vers; -- version number 405177633Sdfr * size_t sendsz; -- buffer recv size 406177633Sdfr * size_t recvsz; -- buffer send size 407177633Sdfr */ 408177633Sdfrextern CLIENT *clnt_dg_create(struct socket *so, 409177633Sdfr struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 410177633Sdfr size_t sendsz, size_t recvsz); 411177633Sdfr 412177633Sdfr/* 413177633Sdfr * struct socket *so; -- socket 414177633Sdfr * struct sockaddr *svcaddr; -- servers address 415177633Sdfr * rpcprog_t prog; -- program number 416177633Sdfr * rpcvers_t vers; -- version number 417177633Sdfr * size_t sendsz; -- buffer recv size 418177633Sdfr * size_t recvsz; -- buffer send size 419221127Srmacklem * int intrflag; -- is it interruptible 420177633Sdfr */ 421177633Sdfrextern CLIENT *clnt_vc_create(struct socket *so, 422177633Sdfr struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 423221127Srmacklem size_t sendsz, size_t recvsz, int intrflag); 424177633Sdfr 425177633Sdfr/* 426177633Sdfr * struct netconfig *nconf; -- network type 427177633Sdfr * struct sockaddr *svcaddr; -- servers address 428177633Sdfr * rpcprog_t prog; -- program number 429177633Sdfr * rpcvers_t vers; -- version number 430177633Sdfr * size_t sendsz; -- buffer recv size 431177633Sdfr * size_t recvsz; -- buffer send size 432177633Sdfr */ 433177633Sdfrextern CLIENT *clnt_reconnect_create(struct netconfig *nconf, 434177633Sdfr struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 435177633Sdfr size_t sendsz, size_t recvsz); 436177633Sdfr 437177633Sdfr#else 438177633Sdfr 439177633Sdfrextern CLIENT *clnt_create(const char *, const rpcprog_t, const rpcvers_t, 440177633Sdfr const char *); 441177633Sdfr/* 442177633Sdfr * 443177633Sdfr * const char *hostname; -- hostname 444177633Sdfr * const rpcprog_t prog; -- program number 445177633Sdfr * const rpcvers_t vers; -- version number 446177633Sdfr * const char *nettype; -- network type 447177633Sdfr */ 448177633Sdfr 449177633Sdfr /* 450177633Sdfr * Generic client creation routine. Just like clnt_create(), except 451177633Sdfr * it takes an additional timeout parameter. 452177633Sdfr */ 453177633Sdfrextern CLIENT * clnt_create_timed(const char *, const rpcprog_t, 454177633Sdfr const rpcvers_t, const char *, const struct timeval *); 455177633Sdfr/* 456177633Sdfr * 457177633Sdfr * const char *hostname; -- hostname 458177633Sdfr * const rpcprog_t prog; -- program number 459177633Sdfr * const rpcvers_t vers; -- version number 460177633Sdfr * const char *nettype; -- network type 461177633Sdfr * const struct timeval *tp; -- timeout 462177633Sdfr */ 463177633Sdfr 464177633Sdfr/* 465177633Sdfr * Generic client creation routine. Supported protocols are which belong 466177633Sdfr * to the nettype name space. 467177633Sdfr */ 468177633Sdfrextern CLIENT *clnt_create_vers(const char *, const rpcprog_t, rpcvers_t *, 469177633Sdfr const rpcvers_t, const rpcvers_t, 470177633Sdfr const char *); 471177633Sdfr/* 472177633Sdfr * const char *host; -- hostname 473177633Sdfr * const rpcprog_t prog; -- program number 474177633Sdfr * rpcvers_t *vers_out; -- servers highest available version 475177633Sdfr * const rpcvers_t vers_low; -- low version number 476177633Sdfr * const rpcvers_t vers_high; -- high version number 477177633Sdfr * const char *nettype; -- network type 478177633Sdfr */ 479177633Sdfr 480177633Sdfr/* 481177633Sdfr * Generic client creation routine. Supported protocols are which belong 482177633Sdfr * to the nettype name space. 483177633Sdfr */ 484177633Sdfrextern CLIENT * clnt_create_vers_timed(const char *, const rpcprog_t, 485177633Sdfr rpcvers_t *, const rpcvers_t, const rpcvers_t, const char *, 486177633Sdfr const struct timeval *); 487177633Sdfr/* 488177633Sdfr * const char *host; -- hostname 489177633Sdfr * const rpcprog_t prog; -- program number 490177633Sdfr * rpcvers_t *vers_out; -- servers highest available version 491177633Sdfr * const rpcvers_t vers_low; -- low version number 492177633Sdfr * const rpcvers_t vers_high; -- high version number 493177633Sdfr * const char *nettype; -- network type 494177633Sdfr * const struct timeval *tp -- timeout 495177633Sdfr */ 496177633Sdfr 497177633Sdfr/* 498177633Sdfr * Generic client creation routine. It takes a netconfig structure 499177633Sdfr * instead of nettype 500177633Sdfr */ 501177633Sdfrextern CLIENT *clnt_tp_create(const char *, const rpcprog_t, 502177633Sdfr const rpcvers_t, const struct netconfig *); 503177633Sdfr/* 504177633Sdfr * const char *hostname; -- hostname 505177633Sdfr * const rpcprog_t prog; -- program number 506177633Sdfr * const rpcvers_t vers; -- version number 507177633Sdfr * const struct netconfig *netconf; -- network config structure 508177633Sdfr */ 509177633Sdfr 510177633Sdfr/* 511177633Sdfr * Generic client creation routine. Just like clnt_tp_create(), except 512177633Sdfr * it takes an additional timeout parameter. 513177633Sdfr */ 514177633Sdfrextern CLIENT * clnt_tp_create_timed(const char *, const rpcprog_t, 515177633Sdfr const rpcvers_t, const struct netconfig *, const struct timeval *); 516177633Sdfr/* 517177633Sdfr * const char *hostname; -- hostname 518177633Sdfr * const rpcprog_t prog; -- program number 519177633Sdfr * const rpcvers_t vers; -- version number 520177633Sdfr * const struct netconfig *netconf; -- network config structure 521177633Sdfr * const struct timeval *tp -- timeout 522177633Sdfr */ 523177633Sdfr 524177633Sdfr/* 525177633Sdfr * Generic TLI create routine. Only provided for compatibility. 526177633Sdfr */ 527177633Sdfr 528177633Sdfrextern CLIENT *clnt_tli_create(const int, const struct netconfig *, 529177633Sdfr struct netbuf *, const rpcprog_t, 530177633Sdfr const rpcvers_t, const u_int, const u_int); 531177633Sdfr/* 532177633Sdfr * const register int fd; -- fd 533177633Sdfr * const struct netconfig *nconf; -- netconfig structure 534177633Sdfr * struct netbuf *svcaddr; -- servers address 535177633Sdfr * const u_long prog; -- program number 536177633Sdfr * const u_long vers; -- version number 537177633Sdfr * const u_int sendsz; -- send size 538177633Sdfr * const u_int recvsz; -- recv size 539177633Sdfr */ 540177633Sdfr 541177633Sdfr/* 542177633Sdfr * Low level clnt create routine for connectionful transports, e.g. tcp. 543177633Sdfr */ 544177633Sdfrextern CLIENT *clnt_vc_create(const int, const struct netbuf *, 545177633Sdfr const rpcprog_t, const rpcvers_t, 546177633Sdfr u_int, u_int); 547177633Sdfr/* 548177633Sdfr * Added for compatibility to old rpc 4.0. Obsoleted by clnt_vc_create(). 549177633Sdfr */ 550177633Sdfrextern CLIENT *clntunix_create(struct sockaddr_un *, 551177633Sdfr u_long, u_long, int *, u_int, u_int); 552177633Sdfr/* 553177633Sdfr * const int fd; -- open file descriptor 554177633Sdfr * const struct netbuf *svcaddr; -- servers address 555177633Sdfr * const rpcprog_t prog; -- program number 556177633Sdfr * const rpcvers_t vers; -- version number 557177633Sdfr * const u_int sendsz; -- buffer recv size 558177633Sdfr * const u_int recvsz; -- buffer send size 559177633Sdfr */ 560177633Sdfr 561177633Sdfr/* 562177633Sdfr * Low level clnt create routine for connectionless transports, e.g. udp. 563177633Sdfr */ 564177633Sdfrextern CLIENT *clnt_dg_create(const int, const struct netbuf *, 565177633Sdfr const rpcprog_t, const rpcvers_t, 566177633Sdfr const u_int, const u_int); 567177633Sdfr/* 568177633Sdfr * const int fd; -- open file descriptor 569177633Sdfr * const struct netbuf *svcaddr; -- servers address 570177633Sdfr * const rpcprog_t program; -- program number 571177633Sdfr * const rpcvers_t version; -- version number 572177633Sdfr * const u_int sendsz; -- buffer recv size 573177633Sdfr * const u_int recvsz; -- buffer send size 574177633Sdfr */ 575177633Sdfr 576177633Sdfr/* 577177633Sdfr * Memory based rpc (for speed check and testing) 578177633Sdfr * CLIENT * 579177633Sdfr * clnt_raw_create(prog, vers) 580177633Sdfr * u_long prog; 581177633Sdfr * u_long vers; 582177633Sdfr */ 583177633Sdfrextern CLIENT *clnt_raw_create(rpcprog_t, rpcvers_t); 584177633Sdfr#endif 585177633Sdfr 586177633Sdfr__END_DECLS 587177633Sdfr 588177633Sdfr 589177633Sdfr/* 590177633Sdfr * Print why creation failed 591177633Sdfr */ 592177633Sdfr__BEGIN_DECLS 593177633Sdfrextern void clnt_pcreateerror(const char *); /* stderr */ 594177633Sdfrextern char *clnt_spcreateerror(const char *); /* string */ 595177633Sdfr__END_DECLS 596177633Sdfr 597177633Sdfr/* 598177633Sdfr * Like clnt_perror(), but is more verbose in its output 599177633Sdfr */ 600177633Sdfr__BEGIN_DECLS 601177633Sdfrextern void clnt_perrno(enum clnt_stat); /* stderr */ 602177633Sdfrextern char *clnt_sperrno(enum clnt_stat); /* string */ 603177633Sdfr__END_DECLS 604177633Sdfr 605177633Sdfr/* 606177633Sdfr * Print an English error message, given the client error code 607177633Sdfr */ 608177633Sdfr__BEGIN_DECLS 609177633Sdfrextern void clnt_perror(CLIENT *, const char *); /* stderr */ 610177633Sdfrextern char *clnt_sperror(CLIENT *, const char *); /* string */ 611177633Sdfr__END_DECLS 612177633Sdfr 613177633Sdfr 614177633Sdfr/* 615177633Sdfr * If a creation fails, the following allows the user to figure out why. 616177633Sdfr */ 617177633Sdfrstruct rpc_createerr { 618177633Sdfr enum clnt_stat cf_stat; 619177633Sdfr struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */ 620177633Sdfr}; 621177633Sdfr 622177633Sdfr#ifdef _KERNEL 623177633Sdfrextern struct rpc_createerr rpc_createerr; 624177633Sdfr#else 625177633Sdfr__BEGIN_DECLS 626177633Sdfrextern struct rpc_createerr *__rpc_createerr(void); 627177633Sdfr__END_DECLS 628177633Sdfr#define rpc_createerr (*(__rpc_createerr())) 629177633Sdfr#endif 630177633Sdfr 631180025Sdfr#ifndef _KERNEL 632177633Sdfr/* 633177633Sdfr * The simplified interface: 634177633Sdfr * enum clnt_stat 635177633Sdfr * rpc_call(host, prognum, versnum, procnum, inproc, in, outproc, out, nettype) 636177633Sdfr * const char *host; 637177633Sdfr * const rpcprog_t prognum; 638177633Sdfr * const rpcvers_t versnum; 639177633Sdfr * const rpcproc_t procnum; 640177633Sdfr * const xdrproc_t inproc, outproc; 641177633Sdfr * const char *in; 642177633Sdfr * char *out; 643177633Sdfr * const char *nettype; 644177633Sdfr */ 645177633Sdfr__BEGIN_DECLS 646177633Sdfrextern enum clnt_stat rpc_call(const char *, const rpcprog_t, 647177633Sdfr const rpcvers_t, const rpcproc_t, 648177633Sdfr const xdrproc_t, const char *, 649177633Sdfr const xdrproc_t, char *, const char *); 650177633Sdfr__END_DECLS 651177633Sdfr 652177633Sdfr/* 653177633Sdfr * RPC broadcast interface 654177633Sdfr * The call is broadcasted to all locally connected nets. 655177633Sdfr * 656177633Sdfr * extern enum clnt_stat 657177633Sdfr * rpc_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, 658177633Sdfr * eachresult, nettype) 659177633Sdfr * const rpcprog_t prog; -- program number 660177633Sdfr * const rpcvers_t vers; -- version number 661177633Sdfr * const rpcproc_t proc; -- procedure number 662177633Sdfr * const xdrproc_t xargs; -- xdr routine for args 663177633Sdfr * caddr_t argsp; -- pointer to args 664177633Sdfr * const xdrproc_t xresults; -- xdr routine for results 665177633Sdfr * caddr_t resultsp; -- pointer to results 666177633Sdfr * const resultproc_t eachresult; -- call with each result 667177633Sdfr * const char *nettype; -- Transport type 668177633Sdfr * 669177633Sdfr * For each valid response received, the procedure eachresult is called. 670177633Sdfr * Its form is: 671177633Sdfr * done = eachresult(resp, raddr, nconf) 672177633Sdfr * bool_t done; 673177633Sdfr * caddr_t resp; 674177633Sdfr * struct netbuf *raddr; 675177633Sdfr * struct netconfig *nconf; 676177633Sdfr * where resp points to the results of the call and raddr is the 677177633Sdfr * address if the responder to the broadcast. nconf is the transport 678177633Sdfr * on which the response was received. 679177633Sdfr * 680177633Sdfr * extern enum clnt_stat 681177633Sdfr * rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp, 682177633Sdfr * eachresult, inittime, waittime, nettype) 683177633Sdfr * const rpcprog_t prog; -- program number 684177633Sdfr * const rpcvers_t vers; -- version number 685177633Sdfr * const rpcproc_t proc; -- procedure number 686177633Sdfr * const xdrproc_t xargs; -- xdr routine for args 687177633Sdfr * caddr_t argsp; -- pointer to args 688177633Sdfr * const xdrproc_t xresults; -- xdr routine for results 689177633Sdfr * caddr_t resultsp; -- pointer to results 690177633Sdfr * const resultproc_t eachresult; -- call with each result 691177633Sdfr * const int inittime; -- how long to wait initially 692177633Sdfr * const int waittime; -- maximum time to wait 693177633Sdfr * const char *nettype; -- Transport type 694177633Sdfr */ 695177633Sdfr 696177633Sdfrtypedef bool_t (*resultproc_t)(caddr_t, ...); 697177633Sdfr 698177633Sdfr__BEGIN_DECLS 699177633Sdfrextern enum clnt_stat rpc_broadcast(const rpcprog_t, const rpcvers_t, 700177633Sdfr const rpcproc_t, const xdrproc_t, 701177633Sdfr caddr_t, const xdrproc_t, caddr_t, 702177633Sdfr const resultproc_t, const char *); 703177633Sdfrextern enum clnt_stat rpc_broadcast_exp(const rpcprog_t, const rpcvers_t, 704177633Sdfr const rpcproc_t, const xdrproc_t, 705177633Sdfr caddr_t, const xdrproc_t, caddr_t, 706177633Sdfr const resultproc_t, const int, 707177633Sdfr const int, const char *); 708177633Sdfr__END_DECLS 709177633Sdfr 710177633Sdfr/* For backward compatibility */ 711177633Sdfr#include <rpc/clnt_soc.h> 712177633Sdfr#endif 713177633Sdfr 714177633Sdfr#endif /* !_RPC_CLNT_H_ */ 715