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