clnt.h revision 221127
1/* $NetBSD: clnt.h,v 1.14 2000/06/02 22:57:55 fvdl Exp $ */ 2 3/* 4 * The contents of this file are subject to the Sun Standards 5 * License Version 1.0 the (the "License";) You may not use 6 * this file except in compliance with the License. You may 7 * obtain a copy of the License at lib/libc/rpc/LICENSE 8 * 9 * Software distributed under the License is distributed on 10 * an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either 11 * express or implied. See the License for the specific 12 * language governing rights and limitations under the License. 13 * 14 * The Original Code is Copyright 1998 by Sun Microsystems, Inc 15 * 16 * The Initial Developer of the Original Code is: Sun 17 * Microsystems, Inc. 18 * 19 * All Rights Reserved. 20 * 21 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 22 * unrestricted use provided that this legend is included on all tape 23 * media and as a part of the software program in whole or part. Users 24 * may copy or modify Sun RPC without charge, but are not authorized 25 * to license or distribute it to anyone else except as part of a product or 26 * program developed by the user. 27 * 28 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 29 * WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 31 * 32 * Sun RPC is provided with no support and without any obligation on the 33 * part of Sun Microsystems, Inc. to assist in its use, correction, 34 * modification or enhancement. 35 * 36 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 37 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 38 * OR ANY PART THEREOF. 39 * 40 * In no event will Sun Microsystems, Inc. be liable for any lost revenue 41 * or profits or other special, indirect and consequential damages, even if 42 * Sun has been advised of the possibility of such damages. 43 * 44 * Sun Microsystems, Inc. 45 * 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 221127 2011-04-27 18:19:26Z 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#endif 376 377 378/* 379 * void 380 * CLNT_DESTROY(rh); 381 * CLIENT *rh; 382 */ 383#define CLNT_DESTROY(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 384#define clnt_destroy(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) 385 386 387/* 388 * RPCTEST is a test program which is accessible on every rpc 389 * transport/port. It is used for testing, performance evaluation, 390 * and network administration. 391 */ 392 393#define RPCTEST_PROGRAM ((rpcprog_t)1) 394#define RPCTEST_VERSION ((rpcvers_t)1) 395#define RPCTEST_NULL_PROC ((rpcproc_t)2) 396#define RPCTEST_NULL_BATCH_PROC ((rpcproc_t)3) 397 398/* 399 * By convention, procedure 0 takes null arguments and returns them 400 */ 401 402#define NULLPROC ((rpcproc_t)0) 403 404/* 405 * Below are the client handle creation routines for the various 406 * implementations of client side rpc. They can return NULL if a 407 * creation failure occurs. 408 */ 409 410/* 411 * Generic client creation routine. Supported protocols are those that 412 * belong to the nettype namespace (/etc/netconfig). 413 */ 414__BEGIN_DECLS 415#ifdef _KERNEL 416 417/* 418 * struct socket *so; -- socket 419 * struct sockaddr *svcaddr; -- servers address 420 * rpcprog_t prog; -- program number 421 * rpcvers_t vers; -- version number 422 * size_t sendsz; -- buffer recv size 423 * size_t recvsz; -- buffer send size 424 */ 425extern CLIENT *clnt_dg_create(struct socket *so, 426 struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 427 size_t sendsz, size_t recvsz); 428 429/* 430 * struct socket *so; -- socket 431 * struct sockaddr *svcaddr; -- servers address 432 * rpcprog_t prog; -- program number 433 * rpcvers_t vers; -- version number 434 * size_t sendsz; -- buffer recv size 435 * size_t recvsz; -- buffer send size 436 * int intrflag; -- is it interruptible 437 */ 438extern CLIENT *clnt_vc_create(struct socket *so, 439 struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 440 size_t sendsz, size_t recvsz, int intrflag); 441 442/* 443 * struct netconfig *nconf; -- network type 444 * struct sockaddr *svcaddr; -- servers address 445 * rpcprog_t prog; -- program number 446 * rpcvers_t vers; -- version number 447 * size_t sendsz; -- buffer recv size 448 * size_t recvsz; -- buffer send size 449 */ 450extern CLIENT *clnt_reconnect_create(struct netconfig *nconf, 451 struct sockaddr *svcaddr, rpcprog_t program, rpcvers_t version, 452 size_t sendsz, size_t recvsz); 453 454#else 455 456extern CLIENT *clnt_create(const char *, const rpcprog_t, const rpcvers_t, 457 const char *); 458/* 459 * 460 * const char *hostname; -- hostname 461 * const rpcprog_t prog; -- program number 462 * const rpcvers_t vers; -- version number 463 * const char *nettype; -- network type 464 */ 465 466 /* 467 * Generic client creation routine. Just like clnt_create(), except 468 * it takes an additional timeout parameter. 469 */ 470extern CLIENT * clnt_create_timed(const char *, const rpcprog_t, 471 const rpcvers_t, const char *, const struct timeval *); 472/* 473 * 474 * const char *hostname; -- hostname 475 * const rpcprog_t prog; -- program number 476 * const rpcvers_t vers; -- version number 477 * const char *nettype; -- network type 478 * const struct timeval *tp; -- timeout 479 */ 480 481/* 482 * Generic client creation routine. Supported protocols are which belong 483 * to the nettype name space. 484 */ 485extern CLIENT *clnt_create_vers(const char *, const rpcprog_t, rpcvers_t *, 486 const rpcvers_t, const rpcvers_t, 487 const char *); 488/* 489 * const char *host; -- hostname 490 * const rpcprog_t prog; -- program number 491 * rpcvers_t *vers_out; -- servers highest available version 492 * const rpcvers_t vers_low; -- low version number 493 * const rpcvers_t vers_high; -- high version number 494 * const char *nettype; -- network type 495 */ 496 497/* 498 * Generic client creation routine. Supported protocols are which belong 499 * to the nettype name space. 500 */ 501extern CLIENT * clnt_create_vers_timed(const char *, const rpcprog_t, 502 rpcvers_t *, const rpcvers_t, const rpcvers_t, const char *, 503 const struct timeval *); 504/* 505 * const char *host; -- hostname 506 * const rpcprog_t prog; -- program number 507 * rpcvers_t *vers_out; -- servers highest available version 508 * const rpcvers_t vers_low; -- low version number 509 * const rpcvers_t vers_high; -- high version number 510 * const char *nettype; -- network type 511 * const struct timeval *tp -- timeout 512 */ 513 514/* 515 * Generic client creation routine. It takes a netconfig structure 516 * instead of nettype 517 */ 518extern CLIENT *clnt_tp_create(const char *, const rpcprog_t, 519 const rpcvers_t, const struct netconfig *); 520/* 521 * const char *hostname; -- hostname 522 * const rpcprog_t prog; -- program number 523 * const rpcvers_t vers; -- version number 524 * const struct netconfig *netconf; -- network config structure 525 */ 526 527/* 528 * Generic client creation routine. Just like clnt_tp_create(), except 529 * it takes an additional timeout parameter. 530 */ 531extern CLIENT * clnt_tp_create_timed(const char *, const rpcprog_t, 532 const rpcvers_t, const struct netconfig *, const struct timeval *); 533/* 534 * const char *hostname; -- hostname 535 * const rpcprog_t prog; -- program number 536 * const rpcvers_t vers; -- version number 537 * const struct netconfig *netconf; -- network config structure 538 * const struct timeval *tp -- timeout 539 */ 540 541/* 542 * Generic TLI create routine. Only provided for compatibility. 543 */ 544 545extern CLIENT *clnt_tli_create(const int, const struct netconfig *, 546 struct netbuf *, const rpcprog_t, 547 const rpcvers_t, const u_int, const u_int); 548/* 549 * const register int fd; -- fd 550 * const struct netconfig *nconf; -- netconfig structure 551 * struct netbuf *svcaddr; -- servers address 552 * const u_long prog; -- program number 553 * const u_long vers; -- version number 554 * const u_int sendsz; -- send size 555 * const u_int recvsz; -- recv size 556 */ 557 558/* 559 * Low level clnt create routine for connectionful transports, e.g. tcp. 560 */ 561extern CLIENT *clnt_vc_create(const int, const struct netbuf *, 562 const rpcprog_t, const rpcvers_t, 563 u_int, u_int); 564/* 565 * Added for compatibility to old rpc 4.0. Obsoleted by clnt_vc_create(). 566 */ 567extern CLIENT *clntunix_create(struct sockaddr_un *, 568 u_long, u_long, int *, u_int, u_int); 569/* 570 * const int fd; -- open file descriptor 571 * const struct netbuf *svcaddr; -- servers address 572 * const rpcprog_t prog; -- program number 573 * const rpcvers_t vers; -- version number 574 * const u_int sendsz; -- buffer recv size 575 * const u_int recvsz; -- buffer send size 576 */ 577 578/* 579 * Low level clnt create routine for connectionless transports, e.g. udp. 580 */ 581extern CLIENT *clnt_dg_create(const int, const struct netbuf *, 582 const rpcprog_t, const rpcvers_t, 583 const u_int, const u_int); 584/* 585 * const int fd; -- open file descriptor 586 * const struct netbuf *svcaddr; -- servers address 587 * const rpcprog_t program; -- program number 588 * const rpcvers_t version; -- version number 589 * const u_int sendsz; -- buffer recv size 590 * const u_int recvsz; -- buffer send size 591 */ 592 593/* 594 * Memory based rpc (for speed check and testing) 595 * CLIENT * 596 * clnt_raw_create(prog, vers) 597 * u_long prog; 598 * u_long vers; 599 */ 600extern CLIENT *clnt_raw_create(rpcprog_t, rpcvers_t); 601#endif 602 603__END_DECLS 604 605 606/* 607 * Print why creation failed 608 */ 609__BEGIN_DECLS 610extern void clnt_pcreateerror(const char *); /* stderr */ 611extern char *clnt_spcreateerror(const char *); /* string */ 612__END_DECLS 613 614/* 615 * Like clnt_perror(), but is more verbose in its output 616 */ 617__BEGIN_DECLS 618extern void clnt_perrno(enum clnt_stat); /* stderr */ 619extern char *clnt_sperrno(enum clnt_stat); /* string */ 620__END_DECLS 621 622/* 623 * Print an English error message, given the client error code 624 */ 625__BEGIN_DECLS 626extern void clnt_perror(CLIENT *, const char *); /* stderr */ 627extern char *clnt_sperror(CLIENT *, const char *); /* string */ 628__END_DECLS 629 630 631/* 632 * If a creation fails, the following allows the user to figure out why. 633 */ 634struct rpc_createerr { 635 enum clnt_stat cf_stat; 636 struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */ 637}; 638 639#ifdef _KERNEL 640extern struct rpc_createerr rpc_createerr; 641#else 642__BEGIN_DECLS 643extern struct rpc_createerr *__rpc_createerr(void); 644__END_DECLS 645#define rpc_createerr (*(__rpc_createerr())) 646#endif 647 648#ifndef _KERNEL 649/* 650 * The simplified interface: 651 * enum clnt_stat 652 * rpc_call(host, prognum, versnum, procnum, inproc, in, outproc, out, nettype) 653 * const char *host; 654 * const rpcprog_t prognum; 655 * const rpcvers_t versnum; 656 * const rpcproc_t procnum; 657 * const xdrproc_t inproc, outproc; 658 * const char *in; 659 * char *out; 660 * const char *nettype; 661 */ 662__BEGIN_DECLS 663extern enum clnt_stat rpc_call(const char *, const rpcprog_t, 664 const rpcvers_t, const rpcproc_t, 665 const xdrproc_t, const char *, 666 const xdrproc_t, char *, const char *); 667__END_DECLS 668 669/* 670 * RPC broadcast interface 671 * The call is broadcasted to all locally connected nets. 672 * 673 * extern enum clnt_stat 674 * rpc_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, 675 * eachresult, nettype) 676 * const rpcprog_t prog; -- program number 677 * const rpcvers_t vers; -- version number 678 * const rpcproc_t proc; -- procedure number 679 * const xdrproc_t xargs; -- xdr routine for args 680 * caddr_t argsp; -- pointer to args 681 * const xdrproc_t xresults; -- xdr routine for results 682 * caddr_t resultsp; -- pointer to results 683 * const resultproc_t eachresult; -- call with each result 684 * const char *nettype; -- Transport type 685 * 686 * For each valid response received, the procedure eachresult is called. 687 * Its form is: 688 * done = eachresult(resp, raddr, nconf) 689 * bool_t done; 690 * caddr_t resp; 691 * struct netbuf *raddr; 692 * struct netconfig *nconf; 693 * where resp points to the results of the call and raddr is the 694 * address if the responder to the broadcast. nconf is the transport 695 * on which the response was received. 696 * 697 * extern enum clnt_stat 698 * rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp, 699 * eachresult, inittime, waittime, nettype) 700 * const rpcprog_t prog; -- program number 701 * const rpcvers_t vers; -- version number 702 * const rpcproc_t proc; -- procedure number 703 * const xdrproc_t xargs; -- xdr routine for args 704 * caddr_t argsp; -- pointer to args 705 * const xdrproc_t xresults; -- xdr routine for results 706 * caddr_t resultsp; -- pointer to results 707 * const resultproc_t eachresult; -- call with each result 708 * const int inittime; -- how long to wait initially 709 * const int waittime; -- maximum time to wait 710 * const char *nettype; -- Transport type 711 */ 712 713typedef bool_t (*resultproc_t)(caddr_t, ...); 714 715__BEGIN_DECLS 716extern enum clnt_stat rpc_broadcast(const rpcprog_t, const rpcvers_t, 717 const rpcproc_t, const xdrproc_t, 718 caddr_t, const xdrproc_t, caddr_t, 719 const resultproc_t, const char *); 720extern enum clnt_stat rpc_broadcast_exp(const rpcprog_t, const rpcvers_t, 721 const rpcproc_t, const xdrproc_t, 722 caddr_t, const xdrproc_t, caddr_t, 723 const resultproc_t, const int, 724 const int, const char *); 725__END_DECLS 726 727/* For backward compatibility */ 728#include <rpc/clnt_soc.h> 729#endif 730 731#endif /* !_RPC_CLNT_H_ */ 732