clnt.h revision 177633
1177633Sdfr/* $NetBSD: clnt.h,v 1.14 2000/06/02 22:57:55 fvdl Exp $ */ 2177633Sdfr 3177633Sdfr/* 4177633Sdfr * The contents of this file are subject to the Sun Standards 5177633Sdfr * License Version 1.0 the (the "License";) You may not use 6177633Sdfr * this file except in compliance with the License. You may 7177633Sdfr * obtain a copy of the License at lib/libc/rpc/LICENSE 8177633Sdfr * 9177633Sdfr * Software distributed under the License is distributed on 10177633Sdfr * an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either 11177633Sdfr * express or implied. See the License for the specific 12177633Sdfr * language governing rights and limitations under the License. 13177633Sdfr * 14177633Sdfr * The Original Code is Copyright 1998 by Sun Microsystems, Inc 15177633Sdfr * 16177633Sdfr * The Initial Developer of the Original Code is: Sun 17177633Sdfr * Microsystems, Inc. 18177633Sdfr * 19177633Sdfr * All Rights Reserved. 20177633Sdfr * 21177633Sdfr * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 22177633Sdfr * unrestricted use provided that this legend is included on all tape 23177633Sdfr * media and as a part of the software program in whole or part. Users 24177633Sdfr * may copy or modify Sun RPC without charge, but are not authorized 25177633Sdfr * to license or distribute it to anyone else except as part of a product or 26177633Sdfr * program developed by the user. 27177633Sdfr * 28177633Sdfr * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 29177633Sdfr * WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30177633Sdfr * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 31177633Sdfr * 32177633Sdfr * Sun RPC is provided with no support and without any obligation on the 33177633Sdfr * part of Sun Microsystems, Inc. to assist in its use, correction, 34177633Sdfr * modification or enhancement. 35177633Sdfr * 36177633Sdfr * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 37177633Sdfr * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 38177633Sdfr * OR ANY PART THEREOF. 39177633Sdfr * 40177633Sdfr * In no event will Sun Microsystems, Inc. be liable for any lost revenue 41177633Sdfr * or profits or other special, indirect and consequential damages, even if 42177633Sdfr * Sun has been advised of the possibility of such damages. 43177633Sdfr * 44177633Sdfr * Sun Microsystems, Inc. 45177633Sdfr * 2550 Garcia Avenue 46177633Sdfr * Mountain View, California 94043 47177633Sdfr * 48177633Sdfr * from: @(#)clnt.h 1.31 94/04/29 SMI 49177633Sdfr * from: @(#)clnt.h 2.1 88/07/29 4.0 RPCSRC 50177633Sdfr * $FreeBSD: head/sys/rpc/clnt.h 177633 2008-03-26 15:23:12Z dfr $ 51177633Sdfr */ 52177633Sdfr 53177633Sdfr/* 54177633Sdfr * clnt.h - Client side remote procedure call interface. 55177633Sdfr * 56177633Sdfr * Copyright (c) 1986-1991,1994-1999 by Sun Microsystems, Inc. 57177633Sdfr * All rights reserved. 58177633Sdfr */ 59177633Sdfr 60177633Sdfr#ifndef _RPC_CLNT_H_ 61177633Sdfr#define _RPC_CLNT_H_ 62177633Sdfr#include <rpc/clnt_stat.h> 63177633Sdfr#include <sys/cdefs.h> 64177633Sdfr#ifdef _KERNEL 65177633Sdfr#include <rpc/netconfig.h> 66177633Sdfr#else 67177633Sdfr#include <netconfig.h> 68177633Sdfr#endif 69177633Sdfr#include <sys/un.h> 70177633Sdfr 71177633Sdfr/* 72177633Sdfr * Well-known IPV6 RPC broadcast address. 73177633Sdfr */ 74177633Sdfr#define RPCB_MULTICAST_ADDR "ff02::202" 75177633Sdfr 76177633Sdfr/* 77177633Sdfr * the following errors are in general unrecoverable. The caller 78177633Sdfr * should give up rather than retry. 79177633Sdfr */ 80177633Sdfr#define IS_UNRECOVERABLE_RPC(s) (((s) == RPC_AUTHERROR) || \ 81177633Sdfr ((s) == RPC_CANTENCODEARGS) || \ 82177633Sdfr ((s) == RPC_CANTDECODERES) || \ 83177633Sdfr ((s) == RPC_VERSMISMATCH) || \ 84177633Sdfr ((s) == RPC_PROCUNAVAIL) || \ 85177633Sdfr ((s) == RPC_PROGUNAVAIL) || \ 86177633Sdfr ((s) == RPC_PROGVERSMISMATCH) || \ 87177633Sdfr ((s) == RPC_CANTDECODEARGS)) 88177633Sdfr 89177633Sdfr/* 90177633Sdfr * Error info. 91177633Sdfr */ 92177633Sdfrstruct rpc_err { 93177633Sdfr enum clnt_stat re_status; 94177633Sdfr union { 95177633Sdfr int RE_errno; /* related system error */ 96177633Sdfr enum auth_stat RE_why; /* why the auth error occurred */ 97177633Sdfr struct { 98177633Sdfr rpcvers_t low; /* lowest version supported */ 99177633Sdfr rpcvers_t high; /* highest version supported */ 100177633Sdfr } RE_vers; 101177633Sdfr struct { /* maybe meaningful if RPC_FAILED */ 102177633Sdfr int32_t s1; 103177633Sdfr int32_t s2; 104177633Sdfr } RE_lb; /* life boot & debugging only */ 105177633Sdfr } ru; 106177633Sdfr#define re_errno ru.RE_errno 107177633Sdfr#define re_why ru.RE_why 108177633Sdfr#define re_vers ru.RE_vers 109177633Sdfr#define re_lb ru.RE_lb 110177633Sdfr}; 111177633Sdfr 112177633Sdfr 113177633Sdfr/* 114177633Sdfr * Client rpc handle. 115177633Sdfr * Created by individual implementations 116177633Sdfr * Client is responsible for initializing auth, see e.g. auth_none.c. 117177633Sdfr */ 118177633Sdfrtypedef struct __rpc_client { 119177633Sdfr AUTH *cl_auth; /* authenticator */ 120177633Sdfr struct clnt_ops { 121177633Sdfr /* call remote procedure */ 122177633Sdfr enum clnt_stat (*cl_call)(struct __rpc_client *, 123177633Sdfr rpcproc_t, xdrproc_t, void *, xdrproc_t, 124177633Sdfr void *, struct timeval); 125177633Sdfr /* abort a call */ 126177633Sdfr void (*cl_abort)(struct __rpc_client *); 127177633Sdfr /* get specific error code */ 128177633Sdfr void (*cl_geterr)(struct __rpc_client *, 129177633Sdfr struct rpc_err *); 130177633Sdfr /* frees results */ 131177633Sdfr bool_t (*cl_freeres)(struct __rpc_client *, 132177633Sdfr xdrproc_t, void *); 133177633Sdfr /* destroy this structure */ 134177633Sdfr void (*cl_destroy)(struct __rpc_client *); 135177633Sdfr /* the ioctl() of rpc */ 136177633Sdfr bool_t (*cl_control)(struct __rpc_client *, u_int, 137177633Sdfr void *); 138177633Sdfr } *cl_ops; 139177633Sdfr void *cl_private; /* private stuff */ 140177633Sdfr char *cl_netid; /* network token */ 141177633Sdfr char *cl_tp; /* device name */ 142177633Sdfr} CLIENT; 143177633Sdfr 144177633Sdfr 145177633Sdfr/* 146177633Sdfr * Timers used for the pseudo-transport protocol when using datagrams 147177633Sdfr */ 148177633Sdfrstruct rpc_timers { 149177633Sdfr u_short rt_srtt; /* smoothed round-trip time */ 150177633Sdfr u_short rt_deviate; /* estimated deviation */ 151177633Sdfr u_long rt_rtxcur; /* current (backed-off) rto */ 152177633Sdfr}; 153177633Sdfr 154177633Sdfr/* 155177633Sdfr * Feedback values used for possible congestion and rate control 156177633Sdfr */ 157177633Sdfr#define FEEDBACK_REXMIT1 1 /* first retransmit */ 158177633Sdfr#define FEEDBACK_OK 2 /* no retransmits */ 159177633Sdfr 160177633Sdfr/* Used to set version of portmapper used in broadcast */ 161177633Sdfr 162177633Sdfr#define CLCR_SET_LOWVERS 3 163177633Sdfr#define CLCR_GET_LOWVERS 4 164177633Sdfr 165177633Sdfr#define RPCSMALLMSGSIZE 400 /* a more reasonable packet size */ 166177633Sdfr 167177633Sdfr/* 168177633Sdfr * client side rpc interface ops 169177633Sdfr * 170177633Sdfr * Parameter types are: 171177633Sdfr * 172177633Sdfr */ 173177633Sdfr 174177633Sdfr/* 175177633Sdfr * enum clnt_stat 176177633Sdfr * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout) 177177633Sdfr * CLIENT *rh; 178177633Sdfr * rpcproc_t proc; 179177633Sdfr * xdrproc_t xargs; 180177633Sdfr * void *argsp; 181177633Sdfr * xdrproc_t xres; 182177633Sdfr * void *resp; 183177633Sdfr * struct timeval timeout; 184177633Sdfr */ 185177633Sdfr#define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ 186177633Sdfr ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, \ 187177633Sdfr argsp, xres, resp, secs)) 188177633Sdfr#define clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \ 189177633Sdfr ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, \ 190177633Sdfr argsp, xres, resp, secs)) 191177633Sdfr 192177633Sdfr/* 193177633Sdfr * void 194177633Sdfr * CLNT_ABORT(rh); 195177633Sdfr * CLIENT *rh; 196177633Sdfr */ 197177633Sdfr#define CLNT_ABORT(rh) ((*(rh)->cl_ops->cl_abort)(rh)) 198177633Sdfr#define clnt_abort(rh) ((*(rh)->cl_ops->cl_abort)(rh)) 199177633Sdfr 200177633Sdfr/* 201177633Sdfr * struct rpc_err 202177633Sdfr * CLNT_GETERR(rh); 203177633Sdfr * CLIENT *rh; 204177633Sdfr */ 205177633Sdfr#define CLNT_GETERR(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) 206177633Sdfr#define clnt_geterr(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) 207177633Sdfr 208177633Sdfr 209177633Sdfr/* 210177633Sdfr * bool_t 211177633Sdfr * CLNT_FREERES(rh, xres, resp); 212177633Sdfr * CLIENT *rh; 213177633Sdfr * xdrproc_t xres; 214177633Sdfr * void *resp; 215177633Sdfr */ 216177633Sdfr#define CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) 217177633Sdfr#define clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) 218177633Sdfr 219177633Sdfr/* 220177633Sdfr * bool_t 221177633Sdfr * CLNT_CONTROL(cl, request, info) 222177633Sdfr * CLIENT *cl; 223177633Sdfr * u_int request; 224177633Sdfr * char *info; 225177633Sdfr */ 226177633Sdfr#define CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) 227177633Sdfr#define clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) 228177633Sdfr 229177633Sdfr/* 230177633Sdfr * control operations that apply to both udp and tcp transports 231177633Sdfr */ 232177633Sdfr#define CLSET_TIMEOUT 1 /* set timeout (timeval) */ 233177633Sdfr#define CLGET_TIMEOUT 2 /* get timeout (timeval) */ 234177633Sdfr#define CLGET_SERVER_ADDR 3 /* get server's address (sockaddr) */ 235177633Sdfr#define CLGET_FD 6 /* get connections file descriptor */ 236177633Sdfr#define CLGET_SVC_ADDR 7 /* get server's address (netbuf) */ 237177633Sdfr#define CLSET_FD_CLOSE 8 /* close fd while clnt_destroy */ 238177633Sdfr#define CLSET_FD_NCLOSE 9 /* Do not close fd while clnt_destroy */ 239177633Sdfr#define CLGET_XID 10 /* Get xid */ 240177633Sdfr#define CLSET_XID 11 /* Set xid */ 241177633Sdfr#define CLGET_VERS 12 /* Get version number */ 242177633Sdfr#define CLSET_VERS 13 /* Set version number */ 243177633Sdfr#define CLGET_PROG 14 /* Get program number */ 244177633Sdfr#define CLSET_PROG 15 /* Set program number */ 245177633Sdfr#define CLSET_SVC_ADDR 16 /* get server's address (netbuf) */ 246177633Sdfr#define CLSET_PUSH_TIMOD 17 /* push timod if not already present */ 247177633Sdfr#define CLSET_POP_TIMOD 18 /* pop timod */ 248177633Sdfr/* 249177633Sdfr * Connectionless only control operations 250177633Sdfr */ 251177633Sdfr#define CLSET_RETRY_TIMEOUT 4 /* set retry timeout (timeval) */ 252177633Sdfr#define CLGET_RETRY_TIMEOUT 5 /* get retry timeout (timeval) */ 253177633Sdfr#define CLSET_ASYNC 19 254177633Sdfr#define CLSET_CONNECT 20 /* Use connect() for UDP. (int) */ 255177633Sdfr 256177633Sdfr#ifdef _KERNEL 257177633Sdfr/* 258177633Sdfr * Kernel control operations. The default msleep string is "rpcrecv", 259177633Sdfr * and sleeps are non-interruptible by default. 260177633Sdfr */ 261177633Sdfr#define CLSET_WAITCHAN 21 /* set string to use in msleep call */ 262177633Sdfr#define CLGET_WAITCHAN 22 /* get string used in msleep call */ 263177633Sdfr#define CLSET_INTERRUPTIBLE 23 /* set interruptible flag */ 264177633Sdfr#define CLGET_INTERRUPTIBLE 24 /* set interruptible flag */ 265177633Sdfr#endif 266177633Sdfr 267177633Sdfr 268177633Sdfr/* 269177633Sdfr * void 270177633Sdfr * CLNT_DESTROY(rh); 271177633Sdfr * CLIENT *rh; 272177633Sdfr */ 273177633Sdfr#define CLNT_DESTROY(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 274177633Sdfr#define clnt_destroy(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 275177633Sdfr 276177633Sdfr 277177633Sdfr/* 278177633Sdfr * RPCTEST is a test program which is accessible on every rpc 279177633Sdfr * transport/port. It is used for testing, performance evaluation, 280177633Sdfr * and network administration. 281177633Sdfr */ 282177633Sdfr 283177633Sdfr#define RPCTEST_PROGRAM ((rpcprog_t)1) 284177633Sdfr#define RPCTEST_VERSION ((rpcvers_t)1) 285177633Sdfr#define RPCTEST_NULL_PROC ((rpcproc_t)2) 286177633Sdfr#define RPCTEST_NULL_BATCH_PROC ((rpcproc_t)3) 287177633Sdfr 288177633Sdfr/* 289177633Sdfr * By convention, procedure 0 takes null arguments and returns them 290177633Sdfr */ 291177633Sdfr 292177633Sdfr#define NULLPROC ((rpcproc_t)0) 293177633Sdfr 294177633Sdfr/* 295177633Sdfr * Below are the client handle creation routines for the various 296177633Sdfr * implementations of client side rpc. They can return NULL if a 297177633Sdfr * creation failure occurs. 298177633Sdfr */ 299177633Sdfr 300177633Sdfr/* 301177633Sdfr * Generic client creation routine. Supported protocols are those that 302177633Sdfr * belong to the nettype namespace (/etc/netconfig). 303177633Sdfr */ 304177633Sdfr__BEGIN_DECLS 305177633Sdfr#ifdef _KERNEL 306177633Sdfr 307177633Sdfr/* 308177633Sdfr * struct socket *so; -- socket 309177633Sdfr * struct sockaddr *svcaddr; -- servers address 310177633Sdfr * rpcprog_t prog; -- program number 311177633Sdfr * rpcvers_t vers; -- version number 312177633Sdfr * size_t sendsz; -- buffer recv size 313177633Sdfr * size_t recvsz; -- buffer send size 314177633Sdfr */ 315177633Sdfrextern CLIENT *clnt_dg_create(struct socket *so, 316177633Sdfr struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 317177633Sdfr size_t sendsz, size_t recvsz); 318177633Sdfr 319177633Sdfr/* 320177633Sdfr * struct socket *so; -- socket 321177633Sdfr * struct sockaddr *svcaddr; -- servers address 322177633Sdfr * rpcprog_t prog; -- program number 323177633Sdfr * rpcvers_t vers; -- version number 324177633Sdfr * size_t sendsz; -- buffer recv size 325177633Sdfr * size_t recvsz; -- buffer send size 326177633Sdfr */ 327177633Sdfrextern CLIENT *clnt_vc_create(struct socket *so, 328177633Sdfr struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 329177633Sdfr size_t sendsz, size_t recvsz); 330177633Sdfr 331177633Sdfr/* 332177633Sdfr * struct netconfig *nconf; -- network type 333177633Sdfr * struct sockaddr *svcaddr; -- servers address 334177633Sdfr * rpcprog_t prog; -- program number 335177633Sdfr * rpcvers_t vers; -- version number 336177633Sdfr * size_t sendsz; -- buffer recv size 337177633Sdfr * size_t recvsz; -- buffer send size 338177633Sdfr */ 339177633Sdfrextern CLIENT *clnt_reconnect_create(struct netconfig *nconf, 340177633Sdfr struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 341177633Sdfr size_t sendsz, size_t recvsz); 342177633Sdfr 343177633Sdfr#else 344177633Sdfr 345177633Sdfrextern CLIENT *clnt_create(const char *, const rpcprog_t, const rpcvers_t, 346177633Sdfr const char *); 347177633Sdfr/* 348177633Sdfr * 349177633Sdfr * const char *hostname; -- hostname 350177633Sdfr * const rpcprog_t prog; -- program number 351177633Sdfr * const rpcvers_t vers; -- version number 352177633Sdfr * const char *nettype; -- network type 353177633Sdfr */ 354177633Sdfr 355177633Sdfr /* 356177633Sdfr * Generic client creation routine. Just like clnt_create(), except 357177633Sdfr * it takes an additional timeout parameter. 358177633Sdfr */ 359177633Sdfrextern CLIENT * clnt_create_timed(const char *, const rpcprog_t, 360177633Sdfr const rpcvers_t, const char *, const struct timeval *); 361177633Sdfr/* 362177633Sdfr * 363177633Sdfr * const char *hostname; -- hostname 364177633Sdfr * const rpcprog_t prog; -- program number 365177633Sdfr * const rpcvers_t vers; -- version number 366177633Sdfr * const char *nettype; -- network type 367177633Sdfr * const struct timeval *tp; -- timeout 368177633Sdfr */ 369177633Sdfr 370177633Sdfr/* 371177633Sdfr * Generic client creation routine. Supported protocols are which belong 372177633Sdfr * to the nettype name space. 373177633Sdfr */ 374177633Sdfrextern CLIENT *clnt_create_vers(const char *, const rpcprog_t, rpcvers_t *, 375177633Sdfr const rpcvers_t, const rpcvers_t, 376177633Sdfr const char *); 377177633Sdfr/* 378177633Sdfr * const char *host; -- hostname 379177633Sdfr * const rpcprog_t prog; -- program number 380177633Sdfr * rpcvers_t *vers_out; -- servers highest available version 381177633Sdfr * const rpcvers_t vers_low; -- low version number 382177633Sdfr * const rpcvers_t vers_high; -- high version number 383177633Sdfr * const char *nettype; -- network type 384177633Sdfr */ 385177633Sdfr 386177633Sdfr/* 387177633Sdfr * Generic client creation routine. Supported protocols are which belong 388177633Sdfr * to the nettype name space. 389177633Sdfr */ 390177633Sdfrextern CLIENT * clnt_create_vers_timed(const char *, const rpcprog_t, 391177633Sdfr rpcvers_t *, const rpcvers_t, const rpcvers_t, const char *, 392177633Sdfr const struct timeval *); 393177633Sdfr/* 394177633Sdfr * const char *host; -- hostname 395177633Sdfr * const rpcprog_t prog; -- program number 396177633Sdfr * rpcvers_t *vers_out; -- servers highest available version 397177633Sdfr * const rpcvers_t vers_low; -- low version number 398177633Sdfr * const rpcvers_t vers_high; -- high version number 399177633Sdfr * const char *nettype; -- network type 400177633Sdfr * const struct timeval *tp -- timeout 401177633Sdfr */ 402177633Sdfr 403177633Sdfr/* 404177633Sdfr * Generic client creation routine. It takes a netconfig structure 405177633Sdfr * instead of nettype 406177633Sdfr */ 407177633Sdfrextern CLIENT *clnt_tp_create(const char *, const rpcprog_t, 408177633Sdfr const rpcvers_t, const struct netconfig *); 409177633Sdfr/* 410177633Sdfr * const char *hostname; -- hostname 411177633Sdfr * const rpcprog_t prog; -- program number 412177633Sdfr * const rpcvers_t vers; -- version number 413177633Sdfr * const struct netconfig *netconf; -- network config structure 414177633Sdfr */ 415177633Sdfr 416177633Sdfr/* 417177633Sdfr * Generic client creation routine. Just like clnt_tp_create(), except 418177633Sdfr * it takes an additional timeout parameter. 419177633Sdfr */ 420177633Sdfrextern CLIENT * clnt_tp_create_timed(const char *, const rpcprog_t, 421177633Sdfr const rpcvers_t, const struct netconfig *, const struct timeval *); 422177633Sdfr/* 423177633Sdfr * const char *hostname; -- hostname 424177633Sdfr * const rpcprog_t prog; -- program number 425177633Sdfr * const rpcvers_t vers; -- version number 426177633Sdfr * const struct netconfig *netconf; -- network config structure 427177633Sdfr * const struct timeval *tp -- timeout 428177633Sdfr */ 429177633Sdfr 430177633Sdfr/* 431177633Sdfr * Generic TLI create routine. Only provided for compatibility. 432177633Sdfr */ 433177633Sdfr 434177633Sdfrextern CLIENT *clnt_tli_create(const int, const struct netconfig *, 435177633Sdfr struct netbuf *, const rpcprog_t, 436177633Sdfr const rpcvers_t, const u_int, const u_int); 437177633Sdfr/* 438177633Sdfr * const register int fd; -- fd 439177633Sdfr * const struct netconfig *nconf; -- netconfig structure 440177633Sdfr * struct netbuf *svcaddr; -- servers address 441177633Sdfr * const u_long prog; -- program number 442177633Sdfr * const u_long vers; -- version number 443177633Sdfr * const u_int sendsz; -- send size 444177633Sdfr * const u_int recvsz; -- recv size 445177633Sdfr */ 446177633Sdfr 447177633Sdfr/* 448177633Sdfr * Low level clnt create routine for connectionful transports, e.g. tcp. 449177633Sdfr */ 450177633Sdfrextern CLIENT *clnt_vc_create(const int, const struct netbuf *, 451177633Sdfr const rpcprog_t, const rpcvers_t, 452177633Sdfr u_int, u_int); 453177633Sdfr/* 454177633Sdfr * Added for compatibility to old rpc 4.0. Obsoleted by clnt_vc_create(). 455177633Sdfr */ 456177633Sdfrextern CLIENT *clntunix_create(struct sockaddr_un *, 457177633Sdfr u_long, u_long, int *, u_int, u_int); 458177633Sdfr/* 459177633Sdfr * const int fd; -- open file descriptor 460177633Sdfr * const struct netbuf *svcaddr; -- servers address 461177633Sdfr * const rpcprog_t prog; -- program number 462177633Sdfr * const rpcvers_t vers; -- version number 463177633Sdfr * const u_int sendsz; -- buffer recv size 464177633Sdfr * const u_int recvsz; -- buffer send size 465177633Sdfr */ 466177633Sdfr 467177633Sdfr/* 468177633Sdfr * Low level clnt create routine for connectionless transports, e.g. udp. 469177633Sdfr */ 470177633Sdfrextern CLIENT *clnt_dg_create(const int, const struct netbuf *, 471177633Sdfr const rpcprog_t, const rpcvers_t, 472177633Sdfr const u_int, const u_int); 473177633Sdfr/* 474177633Sdfr * const int fd; -- open file descriptor 475177633Sdfr * const struct netbuf *svcaddr; -- servers address 476177633Sdfr * const rpcprog_t program; -- program number 477177633Sdfr * const rpcvers_t version; -- version number 478177633Sdfr * const u_int sendsz; -- buffer recv size 479177633Sdfr * const u_int recvsz; -- buffer send size 480177633Sdfr */ 481177633Sdfr 482177633Sdfr/* 483177633Sdfr * Memory based rpc (for speed check and testing) 484177633Sdfr * CLIENT * 485177633Sdfr * clnt_raw_create(prog, vers) 486177633Sdfr * u_long prog; 487177633Sdfr * u_long vers; 488177633Sdfr */ 489177633Sdfrextern CLIENT *clnt_raw_create(rpcprog_t, rpcvers_t); 490177633Sdfr#endif 491177633Sdfr 492177633Sdfr__END_DECLS 493177633Sdfr 494177633Sdfr 495177633Sdfr/* 496177633Sdfr * Print why creation failed 497177633Sdfr */ 498177633Sdfr__BEGIN_DECLS 499177633Sdfrextern void clnt_pcreateerror(const char *); /* stderr */ 500177633Sdfrextern char *clnt_spcreateerror(const char *); /* string */ 501177633Sdfr__END_DECLS 502177633Sdfr 503177633Sdfr/* 504177633Sdfr * Like clnt_perror(), but is more verbose in its output 505177633Sdfr */ 506177633Sdfr__BEGIN_DECLS 507177633Sdfrextern void clnt_perrno(enum clnt_stat); /* stderr */ 508177633Sdfrextern char *clnt_sperrno(enum clnt_stat); /* string */ 509177633Sdfr__END_DECLS 510177633Sdfr 511177633Sdfr/* 512177633Sdfr * Print an English error message, given the client error code 513177633Sdfr */ 514177633Sdfr__BEGIN_DECLS 515177633Sdfrextern void clnt_perror(CLIENT *, const char *); /* stderr */ 516177633Sdfrextern char *clnt_sperror(CLIENT *, const char *); /* string */ 517177633Sdfr__END_DECLS 518177633Sdfr 519177633Sdfr 520177633Sdfr/* 521177633Sdfr * If a creation fails, the following allows the user to figure out why. 522177633Sdfr */ 523177633Sdfrstruct rpc_createerr { 524177633Sdfr enum clnt_stat cf_stat; 525177633Sdfr struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */ 526177633Sdfr}; 527177633Sdfr 528177633Sdfr#ifdef _KERNEL 529177633Sdfrextern struct rpc_createerr rpc_createerr; 530177633Sdfr#else 531177633Sdfr__BEGIN_DECLS 532177633Sdfrextern struct rpc_createerr *__rpc_createerr(void); 533177633Sdfr__END_DECLS 534177633Sdfr#define rpc_createerr (*(__rpc_createerr())) 535177633Sdfr#endif 536177633Sdfr 537177633Sdfr/* 538177633Sdfr * The simplified interface: 539177633Sdfr * enum clnt_stat 540177633Sdfr * rpc_call(host, prognum, versnum, procnum, inproc, in, outproc, out, nettype) 541177633Sdfr * const char *host; 542177633Sdfr * const rpcprog_t prognum; 543177633Sdfr * const rpcvers_t versnum; 544177633Sdfr * const rpcproc_t procnum; 545177633Sdfr * const xdrproc_t inproc, outproc; 546177633Sdfr * const char *in; 547177633Sdfr * char *out; 548177633Sdfr * const char *nettype; 549177633Sdfr */ 550177633Sdfr__BEGIN_DECLS 551177633Sdfrextern enum clnt_stat rpc_call(const char *, const rpcprog_t, 552177633Sdfr const rpcvers_t, const rpcproc_t, 553177633Sdfr const xdrproc_t, const char *, 554177633Sdfr const xdrproc_t, char *, const char *); 555177633Sdfr__END_DECLS 556177633Sdfr 557177633Sdfr/* 558177633Sdfr * RPC broadcast interface 559177633Sdfr * The call is broadcasted to all locally connected nets. 560177633Sdfr * 561177633Sdfr * extern enum clnt_stat 562177633Sdfr * rpc_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, 563177633Sdfr * eachresult, nettype) 564177633Sdfr * const rpcprog_t prog; -- program number 565177633Sdfr * const rpcvers_t vers; -- version number 566177633Sdfr * const rpcproc_t proc; -- procedure number 567177633Sdfr * const xdrproc_t xargs; -- xdr routine for args 568177633Sdfr * caddr_t argsp; -- pointer to args 569177633Sdfr * const xdrproc_t xresults; -- xdr routine for results 570177633Sdfr * caddr_t resultsp; -- pointer to results 571177633Sdfr * const resultproc_t eachresult; -- call with each result 572177633Sdfr * const char *nettype; -- Transport type 573177633Sdfr * 574177633Sdfr * For each valid response received, the procedure eachresult is called. 575177633Sdfr * Its form is: 576177633Sdfr * done = eachresult(resp, raddr, nconf) 577177633Sdfr * bool_t done; 578177633Sdfr * caddr_t resp; 579177633Sdfr * struct netbuf *raddr; 580177633Sdfr * struct netconfig *nconf; 581177633Sdfr * where resp points to the results of the call and raddr is the 582177633Sdfr * address if the responder to the broadcast. nconf is the transport 583177633Sdfr * on which the response was received. 584177633Sdfr * 585177633Sdfr * extern enum clnt_stat 586177633Sdfr * rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp, 587177633Sdfr * eachresult, inittime, waittime, nettype) 588177633Sdfr * const rpcprog_t prog; -- program number 589177633Sdfr * const rpcvers_t vers; -- version number 590177633Sdfr * const rpcproc_t proc; -- procedure number 591177633Sdfr * const xdrproc_t xargs; -- xdr routine for args 592177633Sdfr * caddr_t argsp; -- pointer to args 593177633Sdfr * const xdrproc_t xresults; -- xdr routine for results 594177633Sdfr * caddr_t resultsp; -- pointer to results 595177633Sdfr * const resultproc_t eachresult; -- call with each result 596177633Sdfr * const int inittime; -- how long to wait initially 597177633Sdfr * const int waittime; -- maximum time to wait 598177633Sdfr * const char *nettype; -- Transport type 599177633Sdfr */ 600177633Sdfr 601177633Sdfrtypedef bool_t (*resultproc_t)(caddr_t, ...); 602177633Sdfr 603177633Sdfr__BEGIN_DECLS 604177633Sdfrextern enum clnt_stat rpc_broadcast(const rpcprog_t, const rpcvers_t, 605177633Sdfr const rpcproc_t, const xdrproc_t, 606177633Sdfr caddr_t, const xdrproc_t, caddr_t, 607177633Sdfr const resultproc_t, const char *); 608177633Sdfrextern enum clnt_stat rpc_broadcast_exp(const rpcprog_t, const rpcvers_t, 609177633Sdfr const rpcproc_t, const xdrproc_t, 610177633Sdfr caddr_t, const xdrproc_t, caddr_t, 611177633Sdfr const resultproc_t, const int, 612177633Sdfr const int, const char *); 613177633Sdfr__END_DECLS 614177633Sdfr 615177633Sdfr#ifndef _KERNEL 616177633Sdfr/* For backward compatibility */ 617177633Sdfr#include <rpc/clnt_soc.h> 618177633Sdfr#endif 619177633Sdfr 620177633Sdfr#endif /* !_RPC_CLNT_H_ */ 621