|
|
1.1 ! root 1: .H A "Synopsis of RPC Routines" ! 2: .SH ! 3: auth_destroy() ! 4: .LP ! 5: .LS ! 6: void ! 7: auth_destroy(auth) ! 8: AUTH *auth; ! 9: .LE ! 10: A macro that destroys the authentication information associated with ! 11: .L auth . ! 12: Destruction usually involves deallocation ! 13: of private data structures. The use of ! 14: .L auth ! 15: is undefined after calling ! 16: .L auth_destroy() . ! 17: .SH ! 18: authnone_create() ! 19: .LP ! 20: .LS ! 21: AUTH * ! 22: authnone_create() ! 23: .LE ! 24: Creates and returns an RPC authentication handle that passes no ! 25: usable authentication information with each remote procedure call. ! 26: .SH ! 27: authunix_create() ! 28: .LP ! 29: .LS ! 30: AUTH * ! 31: authunix_create(host, uid, gid, len, aup_gids) ! 32: char *host; ! 33: int uid, gid, len, *aup_gids; ! 34: .LE ! 35: Creates and returns an RPC authentication handle that contains ! 36: .UX ! 37: authentication information. ! 38: The parameter ! 39: .L host ! 40: is the name of the machine on which the information was created; ! 41: .L uid ! 42: is the user's user ID; ! 43: .L gid ! 44: is the user's current group ID; ! 45: .L len ! 46: and ! 47: .L aup_gids ! 48: refer to a counted array of groups to which the user belongs. ! 49: It is easy to impersonate a user. ! 50: .SH ! 51: authunix_create_default() ! 52: .LP ! 53: .LS ! 54: AUTH * ! 55: authunix_create_default() ! 56: .LE ! 57: Calls ! 58: .L authunix_create() ! 59: with the appropriate parameters. ! 60: .SH ! 61: callrpc() ! 62: .LP ! 63: .LS ! 64: callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out) ! 65: char *host; ! 66: u_long prognum, versnum, procnum; ! 67: char *in, *out; ! 68: xdrproc_t inproc, outproc; ! 69: .LE ! 70: Calls the remote procedure associated with ! 71: .L prognum , ! 72: .L versnum , ! 73: and ! 74: .L procnum ! 75: on the machine, ! 76: .L host . ! 77: The parameter ! 78: .L in ! 79: is the address of the procedure's argument(s), and ! 80: .L out ! 81: is the address of where to place the result(s); ! 82: .L inproc ! 83: is used to encode the procedure's parameters, and ! 84: .L outproc ! 85: is used to decode the procedure's results. ! 86: This routine returns zero if it succeeds, or the value of ! 87: .L "enum clnt_stat" ! 88: cast to an integer if it fails. ! 89: The routine ! 90: .L clnt_perrno() ! 91: is handy for translating failure statuses into messages. ! 92: Warning: calling remote procedures with this routine ! 93: uses UDP/IP as a transport; see ! 94: .L clntudp_create() ! 95: for restrictions. ! 96: .SH ! 97: clnt_broadcast() ! 98: .LP ! 99: .LS ! 100: enum clnt_stat ! 101: clnt_broadcast(prognum, versnum, procnum, inproc, in, outproc, out, eachresult) ! 102: u_long prognum, versnum, procnum; ! 103: char *in, *out; ! 104: xdrproc_t inproc, outproc; ! 105: resultproc_t eachresult; ! 106: .LE ! 107: Like ! 108: .L callrpc() , ! 109: except the call message is broadcast to all locally connected broadcast nets. ! 110: Each time it receives a response, this routine calls ! 111: .L eachresult , ! 112: whose form is ! 113: .LS ! 114: eachresult(out, addr) ! 115: char *out; ! 116: struct sockaddr_in *addr; ! 117: .LE ! 118: where ! 119: .L out ! 120: is the same as ! 121: .L out ! 122: passed to ! 123: .L clnt_broadcast() , ! 124: except that the remote procedure's output is decoded there; ! 125: .L addr ! 126: points to the address of the machine that sent the results. If ! 127: .L eachresult() ! 128: returns zero, ! 129: .L clnt_broadcast() ! 130: waits for more replies; ! 131: otherwise it returns with appropriate status. ! 132: .SH ! 133: clnt_call() ! 134: .LP ! 135: .LS ! 136: enum clnt_stat ! 137: clnt_call(clnt, procnum, inproc, in, outproc, out, tout) ! 138: CLIENT *clnt; long procnum; ! 139: xdrproc_t inproc, outproc; ! 140: char *in, *out; ! 141: struct timeval tout; ! 142: .LE ! 143: A macro that calls the remote procedure ! 144: .L procnum ! 145: associated with the client handle, ! 146: .L clnt , ! 147: which is obtained with an RPC client creation routine such as ! 148: .L clntudp_create . ! 149: The parameter ! 150: .L in ! 151: is the address of the procedure's argument(s), and ! 152: .L out ! 153: is the address of where to place the result(s); ! 154: .L inproc ! 155: is used to encode the procedure's parameters, and ! 156: .L outproc ! 157: is used to decode the procedure's results; ! 158: .L tout ! 159: is the time allowed for results to come back. ! 160: .SH ! 161: clnt_destroy() ! 162: .LP ! 163: .LS ! 164: clnt_destroy(clnt) ! 165: CLIENT *clnt; ! 166: .LE ! 167: A macro that destroys the client's RPC handle. ! 168: Destruction usually involves deallocation ! 169: of private data structures, including ! 170: .L clnt ! 171: itself. Use of ! 172: .L clnt ! 173: is undefined after calling ! 174: .L clnt_destroy() . ! 175: Warning: client destruction routines do not close sockets associated with ! 176: .L clnt ; ! 177: this is the responsibility of the user. ! 178: .SH ! 179: clnt_freeres() ! 180: .LP ! 181: .LS ! 182: clnt_freeres(clnt, outproc, out) ! 183: CLIENT *clnt; ! 184: xdrproc_t outproc; ! 185: char *out; ! 186: .LE ! 187: A macro that frees any data allocated by the RPC/XDR system ! 188: when it decoded the results of an RPC call. ! 189: The parameter ! 190: .L out ! 191: is the address of the results, and ! 192: .L outproc ! 193: is the XDR routine describing the results in simple primitives. ! 194: This routine returns one if the results were successfully freed, ! 195: and zero otherwise. ! 196: .SH ! 197: clnt_geterr() ! 198: .LP ! 199: .LS ! 200: void ! 201: clnt_geterr(clnt, errp) ! 202: CLIENT *clnt; ! 203: struct rpc_err *errp; ! 204: .LE ! 205: A macro that copies the error structure out of the client handle ! 206: to the structure at address ! 207: .L errp . ! 208: .SH ! 209: clnt_pcreateerror() ! 210: .LP ! 211: .LS ! 212: void ! 213: clnt_pcreateerror(s) ! 214: char *s; ! 215: .LE ! 216: Prints a message to standard error indicating ! 217: why a client RPC handle could not be created. ! 218: The message is prepended with string ! 219: .L s ! 220: and a colon. ! 221: .SH ! 222: clnt_perrno() ! 223: .LP ! 224: .LS ! 225: void ! 226: clnt_perrno(stat) ! 227: enum clnt_stat; ! 228: .LE ! 229: Prints a message to standard error corresponding ! 230: to the condition indicated by ! 231: .L stat . ! 232: .SH ! 233: clnt_perror() ! 234: .LP ! 235: .LS ! 236: clnt_perror(clnt, s) ! 237: CLIENT *clnt; ! 238: char *s; ! 239: .LE ! 240: Prints a message to standard error indicating why an RPC call failed; ! 241: .L clnt ! 242: is the handle used to do the call. ! 243: The message is prepended with string ! 244: .L s ! 245: and a colon. ! 246: .SH ! 247: clntraw_create() ! 248: .LP ! 249: .LS ! 250: CLIENT * ! 251: clntraw_create(prognum, versnum) ! 252: u_long prognum, versnum; ! 253: .LE ! 254: This routine creates a toy RPC client for the remote program ! 255: .L prognum , ! 256: version ! 257: .L versnum . ! 258: The transport used to pass messages to the service ! 259: is actually a buffer within the process's address space, ! 260: so the corresponding RPC server should live in the same address space; see ! 261: .L svcraw_create() . ! 262: This allows simulation of RPC and acquisition of RPC overheads, ! 263: such as round trip times, without any kernel interference. ! 264: This routine returns NULL if it fails. ! 265: .SH ! 266: clnttcp_create() ! 267: .LP ! 268: .LS ! 269: CLIENT * ! 270: clnttcp_create(addr, prognum, versnum, sockp, sendsz, recvsz) ! 271: struct sockaddr_in *addr; ! 272: u_long prognum, versnum; ! 273: int *sockp; ! 274: u_int sendsz, recvsz; ! 275: .LE ! 276: This routine creates an RPC client for the remote program ! 277: .L prognum , ! 278: version ! 279: .L versnum ; ! 280: the client uses TCP/IP as a transport. ! 281: The remote program is located at Internet address ! 282: .L *addr . ! 283: If ! 284: .L addr->sin_port ! 285: is zero, then it is set to the actual port that the remote ! 286: program is listening on (the remote ! 287: .I portmap ! 288: service is consulted for this information). ! 289: The parameter ! 290: .L *sockp ! 291: is a socket; if it is RPC_ANYSOCK, then ! 292: this routine opens a new one and sets ! 293: .L *sockp . ! 294: Since TCP-based RPC uses buffered I/O, the user may specify ! 295: the size of the send and receive buffers with the parameters ! 296: .L sendsz ! 297: and ! 298: .L recvsz ; ! 299: values of zero choose suitable defaults. ! 300: This routine returns NULL if it fails. ! 301: .SH ! 302: clntudp_create() ! 303: .LP ! 304: .LS ! 305: CLIENT * ! 306: clntudp_create(addr, prognum, versnum, wait, sockp) ! 307: struct sockaddr_in *addr; ! 308: u_long prognum, versnum; ! 309: struct timeval wait; ! 310: int *sockp; ! 311: .LE ! 312: This routine creates an RPC client for the remote program ! 313: .L prognum , ! 314: version ! 315: .L versnum ; ! 316: the client uses use UDP/IP as a transport. ! 317: The remote program is located at Internet address ! 318: .L *addr . ! 319: If ! 320: .L addr->sin_port ! 321: is zero, then it is set to actual port that the remote ! 322: program is listening on (the remote ! 323: .I portmap ! 324: service is consulted for this information). ! 325: The parameter ! 326: .L *sockp ! 327: is a socket; if it is RPC_ANYSOCK, ! 328: then this routine opens a new one and sets ! 329: .L *sockp . ! 330: The UDP transport resends the call message in intervals of ! 331: .L wait ! 332: time until a response is received or until the call times out. ! 333: Warning: since UDP-based RPC messages can only hold up to 8 Kbytes ! 334: of encoded data, this transport cannot be used for procedures ! 335: that take large arguments or return huge results. ! 336: .SH ! 337: get_myaddress() ! 338: .LP ! 339: .LS ! 340: void ! 341: get_myaddress(addr) ! 342: struct sockaddr_in *addr; ! 343: .LE ! 344: Stuffs the machine's IP address into ! 345: .L *addr , ! 346: without consulting the library routines that deal with ! 347: .I /etc/hosts . ! 348: The port number is always set to ! 349: .L htons(PMAPPORT) . ! 350: .SH ! 351: pmap_getmaps() ! 352: .LP ! 353: .LS ! 354: struct pmaplist * ! 355: pmap_getmaps(addr) ! 356: struct sockaddr_in *addr; ! 357: .LE ! 358: A user interface to the ! 359: .I portmap ! 360: service, which returns a list of the current RPC program-to-port mappings ! 361: on the host located at IP address ! 362: .L *addr . ! 363: This routine can return NULL. The command ! 364: .L "rpcinfo -p" ! 365: uses this routine. ! 366: .SH ! 367: pmap_getport() ! 368: .LP ! 369: .LS ! 370: u_short ! 371: pmap_getport(addr, prognum, versnum, protocol) ! 372: struct sockaddr_in *addr; ! 373: u_long prognum, versnum, protocol; ! 374: .LE ! 375: A user interface to the ! 376: .I portmap ! 377: service, which returns the port number ! 378: on which waits a service that supports program number ! 379: .L prognum , ! 380: version ! 381: .L versnum , ! 382: and speaks the transport protocol associated with protocol. ! 383: A return value of zero means that the mapping does not exist or that ! 384: the RPC system failured to contact the remote ! 385: .I portmap ! 386: service. In the latter case, the global variable ! 387: .L rpc_createerr ! 388: contains the RPC status. ! 389: .SH ! 390: pmap_rmtcall() ! 391: .LP ! 392: .LS ! 393: enum clnt_stat ! 394: pmap_rmtcall(addr, prognum, versnum, procnum, ! 395: inproc, in, outproc, out, tout, portp) ! 396: struct sockaddr_in *addr; ! 397: u_long prognum, versnum, procnum; ! 398: char *in, *out; ! 399: xdrproc_t inproc, outproc; ! 400: struct timeval tout; ! 401: u_long *portp; ! 402: .LE ! 403: A user interface to the ! 404: .I portmap ! 405: service, which instructs ! 406: .I portmap ! 407: on the host at IP address ! 408: .L *addr ! 409: to make an RPC call on your behalf to a procedure on that host. ! 410: The parameter ! 411: .L *portp ! 412: will be modified to the program's port number if the procedure succeeds. ! 413: The definitions of other parameters are discussed in ! 414: .L callrpc() ! 415: and ! 416: .L clnt_call() ; ! 417: see also ! 418: .L clnt_broadcast() . ! 419: .SH ! 420: pmap_set() ! 421: .LP ! 422: .LS ! 423: pmap_set(prognum, versnum, protocol, port) ! 424: u_long prognum, versnum, protocol; ! 425: u_short port; ! 426: .LE ! 427: A user interface to the ! 428: .I portmap ! 429: service, which establishes a mapping between the triple ! 430: .L [prognum,versnum,protocol] ! 431: and ! 432: .L port ! 433: on the machine's ! 434: .I portmap ! 435: service. The value of protocol is most likely IPPROTO_UDP or IPPROTO_TCP. ! 436: This routine returns one if it succeeds, zero otherwise. ! 437: .SH ! 438: pmap_unset() ! 439: .LP ! 440: .LS ! 441: pmap_unset(prognum, versnum) ! 442: u_long prognum, versnum; ! 443: .LE ! 444: A user interface to the ! 445: .I portmap ! 446: service, which destroys all mappings between the triple ! 447: .L [prognum,versnum,*] ! 448: and ! 449: .L ports ! 450: on the machine's ! 451: .I portmap ! 452: service. ! 453: This routine returns one if it succeeds, zero otherwise. ! 454: .SH ! 455: registerrpc() ! 456: .LP ! 457: .LS ! 458: registerrpc(prognum, versnum, procnum, procname, inproc, outproc) ! 459: u_long prognum, versnum, procnum; ! 460: char *(*procname)(); ! 461: xdrproc_t inproc, outproc; ! 462: .LE ! 463: Registers procedure ! 464: .L procname ! 465: with the RPC service package. If a request arrives for program ! 466: .L prognum , ! 467: version ! 468: .L versnum , ! 469: and procedure ! 470: .L procnum , ! 471: .L procname ! 472: is called with a pointer to its parameter(s); ! 473: .L progname ! 474: should return a pointer to its static result(s); ! 475: .L inproc ! 476: is used to decode the parameters while ! 477: .L outproc ! 478: is used to encode the results. ! 479: This routine returns zero if the registration succeeded, \-1 otherwise. ! 480: Warning: remote procedures registered in this form ! 481: are accessed using the UDP/IP transport; see ! 482: .L svcudp_create() ! 483: for restrictions. ! 484: .SH ! 485: rpc_createerr ! 486: .LP ! 487: .LS ! 488: struct rpc_createerr rpc_createerr; ! 489: .LE ! 490: A global variable whose value is set by any RPC client creation routine ! 491: that does not succeed. Use the routine ! 492: .L clnt_pcreateerror() ! 493: to print the reason why. ! 494: .SH ! 495: svc_destroy() ! 496: .LP ! 497: .LS ! 498: svc_destroy(xprt) ! 499: SVCXPRT *xprt; ! 500: .LE ! 501: A macro that destroys the RPC service transport handle, ! 502: .L xprt . ! 503: Destruction usually involves deallocation ! 504: of private data structures, including ! 505: .L xprt ! 506: itself. Use of ! 507: .L xprt ! 508: is undefined after calling this routine. ! 509: .SH ! 510: svc_fds ! 511: .LP ! 512: .LS ! 513: int svc_fds; ! 514: .LE ! 515: A global variable reflecting the RPC service side's ! 516: read file descriptor bit mask; it is suitable as a parameter to the ! 517: .L select ! 518: system call. This is only of interest ! 519: if a service implementor does not call ! 520: .L svc_run() , ! 521: but rather does his own asynchronous event processing. ! 522: This variable is read-only (do not pass its address to ! 523: .L select !), ! 524: yet it may change after calls to ! 525: .L svc_getreq() ! 526: or any creation routines. ! 527: .SH ! 528: svc_freeargs() ! 529: .LP ! 530: .LS ! 531: svc_freeargs(xprt, inproc, in) ! 532: SVCXPRT *xprt; ! 533: xdrproc_t inproc; ! 534: char *in; ! 535: .LE ! 536: A macro that frees any data allocated by the RPC/XDR system ! 537: when it decoded the arguments to a service procedure using ! 538: .L svc_getargs(). ! 539: This routine returns one if the results were successfully freed, ! 540: and zero otherwise. ! 541: .SH ! 542: svc_getargs() ! 543: .LP ! 544: .LS ! 545: svc_getargs(xprt, inproc, in) ! 546: SVCXPRT *xprt; ! 547: xdrproc_t inproc; ! 548: char *in; ! 549: .LE ! 550: A macro that decodes the arguments of an RPC request ! 551: associated with the RPC service transport handle, ! 552: .L xprt . ! 553: The parameter ! 554: .L in ! 555: is the address where the arguments will be placed; ! 556: .L inproc ! 557: is the XDR routine used to decode the arguments. ! 558: This routine returns one if decoding succeeds, and zero otherwise. ! 559: .SH ! 560: svc_getcaller() ! 561: .LP ! 562: .LS ! 563: struct sockaddr_in ! 564: svc_getcaller(xprt) ! 565: SVCXPRT *xprt; ! 566: .LE ! 567: The approved way of getting the network address of the caller ! 568: of a procedure associated with the RPC service transport handle, ! 569: .L xprt . ! 570: .SH ! 571: svc_getreq() ! 572: .LP ! 573: .LS ! 574: svc_getreq(rdfds) ! 575: int rdfds; ! 576: .LE ! 577: This routine is only of interest if a service implementor does not call ! 578: .L svc_run() , ! 579: but instead implements custom asynchronous event processing. ! 580: It is called when the ! 581: .L select ! 582: system call has determined that an RPC request ! 583: has arrived on some RPC socket(s); ! 584: .L rdfds ! 585: is the resultant read file descriptor bit mask. ! 586: The routine returns when all sockets associated with the value of ! 587: .L rdfds ! 588: have been serviced. ! 589: .SH ! 590: svc_register() ! 591: .LP ! 592: .LS ! 593: svc_register(xprt, prognum, versnum, dispatch, protocol) ! 594: SVCXPRT *xprt; ! 595: u_long prognum, versnum; ! 596: void (*dispatch)(); ! 597: u_long protocol; ! 598: .LE ! 599: Associates ! 600: .L prognum ! 601: and ! 602: .L versnum ! 603: with the service dispatch procedure, ! 604: .L dispatch . ! 605: If ! 606: .L protocol ! 607: is non-zero, then a mapping of the triple ! 608: .L [prognum,versnum,protocol] ! 609: to ! 610: .L xprt->xp_port ! 611: is also established with the local ! 612: .I portmap ! 613: service (generally ! 614: .L protocol ! 615: is zero, IPPROTO_UDP or IPPROTO_TCP). ! 616: The procedure ! 617: .L dispatch() ! 618: has the following form: ! 619: .LS ! 620: dispatch(request, xprt) ! 621: struct svc_req *request; ! 622: SVCXPRT *xprt; ! 623: .LE ! 624: The ! 625: .L svc_register ! 626: routine returns one if it succeeds, and zero otherwise. ! 627: .SH ! 628: svc_run() ! 629: .LP ! 630: .LS ! 631: svc_run() ! 632: .LE ! 633: This routine never returns. It waits for RPC requests to arrive ! 634: and calls the appropriate service procedure (using ! 635: .L svc_getreq ) ! 636: when one arrives. This procedure is usually waiting for a ! 637: .L select ! 638: system call to return. ! 639: .SH ! 640: svc_sendreply() ! 641: .LP ! 642: .LS ! 643: svc_sendreply(xprt, outproc, out) ! 644: SVCXPRT *xprt; ! 645: xdrproc_t outproc; ! 646: char *out; ! 647: .LE ! 648: Called by an RPC service's dispatch routine ! 649: to send the results of a remote procedure call. ! 650: The parameter ! 651: .L xprt ! 652: is the caller's associated transport handle; ! 653: .L outproc ! 654: is the XDR routine which is used to encode the results; and ! 655: .L out ! 656: is the address of the results. ! 657: This routine returns one if it succeeds, zero otherwise. ! 658: .SH ! 659: svc_unregister() ! 660: .LP ! 661: .LS ! 662: void ! 663: svc_unregister(prognum, versnum) ! 664: u_long prognum, versnum; ! 665: .LE ! 666: Removes all mapping of the double ! 667: .L [prognum,versnum] ! 668: to dispatch routines, and of the triple ! 669: .L [prognum,versnum,*] ! 670: to port number. ! 671: .SH ! 672: svcerr_auth() ! 673: .LP ! 674: .LS ! 675: void ! 676: svcerr_auth(xprt, why) ! 677: SVCXPRT *xprt; ! 678: enum auth_stat why; ! 679: .LE ! 680: Called by a service dispatch routine that refuses to perform ! 681: a remote procedure call due to an authentication error. ! 682: .SH ! 683: svcerr_decode() ! 684: .LP ! 685: .LS ! 686: void ! 687: svcerr_decode(xprt) ! 688: SVCXPRT *xprt; ! 689: .LE ! 690: Called by a service dispatch routine that can't successfully ! 691: decode its parameters. See also ! 692: .L svc_getargs() . ! 693: .SH ! 694: svcerr_noproc() ! 695: .LP ! 696: .LS ! 697: void ! 698: svcerr_noproc(xprt) ! 699: SVCXPRT *xprt; ! 700: .LE ! 701: Called by a service dispatch routine that doesn't implement ! 702: the desired procedure number the caller request. ! 703: .SH ! 704: svcerr_noprog() ! 705: .LP ! 706: .LS ! 707: void ! 708: svcerr_noprog(xprt) ! 709: SVCXPRT *xprt; ! 710: .LE ! 711: Called when the desired program is not registered with the RPC package. ! 712: Service implementors usually don't need this routine. ! 713: .SH ! 714: svcerr_progvers() ! 715: .LP ! 716: .LS ! 717: void ! 718: svcerr_progvers(xprt) ! 719: SVCXPRT *xprt; ! 720: .LE ! 721: Called when the desired version of a program is not registered ! 722: with the RPC package. ! 723: Service implementors usually don't need this routine. ! 724: .SH ! 725: svcerr_systemerr() ! 726: .LP ! 727: .LS ! 728: void ! 729: svcerr_systemerr(xprt) ! 730: SVCXPRT *xprt; ! 731: .LE ! 732: Called by a service dispatch routine when it detects a system error ! 733: not covered by any particular protocol. ! 734: For example, if a service can no longer allocate storage, ! 735: it may call this routine. ! 736: .SH ! 737: svcerr_weakauth() ! 738: .LP ! 739: .LS ! 740: void ! 741: svcerr_weakauth(xprt) ! 742: SVCXPRT *xprt; ! 743: .LE ! 744: Called by a service dispatch routine that refuses to perform ! 745: a remote procedure call due to insufficient (but correct) ! 746: authentication parameters. The routine calls ! 747: .L svcerr_auth(xprt,AUTH_TOOWEAK) . ! 748: .SH ! 749: svcraw_create() ! 750: .LP ! 751: .LS ! 752: SVCXPRT * ! 753: svcraw_create() ! 754: .LE ! 755: This routine creates a toy RPC service transport, ! 756: to which it returns a pointer. The transport ! 757: is really a buffer within the process's address space, ! 758: so the corresponding RPC client should live in the same address space; see ! 759: .L clntraw_create() . ! 760: This routine allows simulation of RPC and acquisition of RPC overheads ! 761: (such as round trip times), without any kernel interference. ! 762: This routine returns NULL if it fails. ! 763: .SH ! 764: svctcp_create() ! 765: .LP ! 766: .LS ! 767: SVCXPRT * ! 768: svctcp_create(sock, send_buf_size, recv_buf_size) ! 769: int sock; ! 770: u_int send_buf_size, recv_buf_size; ! 771: .LE ! 772: This routine creates a TCP/IP-based RPC service transport, ! 773: to which it returns a pointer. ! 774: The transport is associated with the socket ! 775: .L sock , ! 776: which may be RPC_ANYSOCK, in which case a new socket is created. ! 777: If the socket is not bound to a local TCP port, then this routine ! 778: binds it to an arbitrary port. Upon completion, ! 779: .L xprt->xp_sock ! 780: is the transport's socket number, and ! 781: .L xprt->xp_port ! 782: is the transport's port number. ! 783: This routine returns NULL if it fails. ! 784: Since TCP-based RPC uses buffered I/O, users may specify the size of the ! 785: .L send ! 786: and ! 787: .L receive ! 788: buffers; values of zero choose suitable defaults. ! 789: .SH ! 790: svcudp_create() ! 791: .LP ! 792: .LS ! 793: SVCXPRT * ! 794: svcudp_create(sock) ! 795: int sock; ! 796: .LE ! 797: This routine creates a UDP/IP-based RPC service transport, ! 798: to which it returns a pointer. ! 799: The transport is associated with the socket ! 800: .L sock , ! 801: which may be RPC_ANYSOCK, in which case a new socket is created. ! 802: If the socket is not bound to a local UDP port, then this routine ! 803: binds it to an arbitrary port. Upon completion, ! 804: .L xprt->xp_sock ! 805: is the transport's socket number, and ! 806: .L xprt->xp_port ! 807: is the transport's port number. ! 808: This routine returns NULL if it fails. ! 809: Warning: since UDP-based RPC messages can only hold up to 8 Kbytes ! 810: of encoded data, this transport cannot be used for procedures ! 811: that take large arguments or return huge results. ! 812: .SH ! 813: xdr_accepted_reply() ! 814: .LP ! 815: .LS ! 816: xdr_accepted_reply(xdrs, ar) ! 817: XDR *xdrs; ! 818: struct accepted_reply *ar; ! 819: .LE ! 820: Used for describing RPC messages, externally. ! 821: This routine is useful for users who wish to generate ! 822: RPC-style messages without using the RPC package. ! 823: .SH ! 824: xdr_array() ! 825: .LP ! 826: .LS ! 827: xdr_array(xdrs, arrp, sizep, maxsize, elsize, elproc) ! 828: XDR *xdrs; ! 829: char **arrp; ! 830: u_int *sizep, maxsize, elsize; ! 831: xdrproc_t elproc; ! 832: .LE ! 833: A filter primitive that translates between arrays ! 834: and their corresponding external representations. ! 835: The parameter ! 836: .L arrp ! 837: is the address of the pointer to the array, while ! 838: .L sizep ! 839: is the address of the element count of the array; ! 840: this element count cannot exceed ! 841: .L maxsize . ! 842: The parameter ! 843: .L elsize ! 844: is the ! 845: .L sizeof() ! 846: each of the array's elements, and ! 847: .L elproc ! 848: is an XDR filter that translates between ! 849: the array elements' C form, and their external representation. ! 850: This routine returns one if it succeeds, zero otherwise. ! 851: .SH ! 852: xdr_authunix_parms() ! 853: .LP ! 854: .LS ! 855: xdr_authunix_parms(xdrs, aupp) ! 856: XDR *xdrs; ! 857: struct authunix_parms *aupp; ! 858: .LE ! 859: Used for describing UNIX credentials, externally. ! 860: This routine is useful for users who wish to generate ! 861: these credentials without using the RPC authentication package. ! 862: .SH ! 863: xdr_bool() ! 864: .LP ! 865: .LS ! 866: xdr_bool(xdrs, bp) ! 867: XDR *xdrs; ! 868: bool_t *bp; ! 869: .LE ! 870: A filter primitive that translates between booleans (C integers) ! 871: and their external representations. ! 872: When encoding data, this filter produces values of either one or zero. ! 873: This routine returns one if it succeeds, zero otherwise. ! 874: .SH ! 875: xdr_bytes() ! 876: .LP ! 877: .LS ! 878: xdr_bytes(xdrs, sp, sizep, maxsize) ! 879: XDR *xdrs; ! 880: char **sp; ! 881: u_int *sizep, maxsize; ! 882: .LE ! 883: A filter primitive that translates between counted byte strings ! 884: and their external representations. ! 885: The parameter ! 886: .L sp ! 887: is the address of the string pointer. ! 888: The length of the string is located at address ! 889: .L sizep ; ! 890: strings cannot be longer than ! 891: .L maxsize . ! 892: This routine returns one if it succeeds, zero otherwise. ! 893: .SH ! 894: xdr_callhdr() ! 895: .LP ! 896: .LS ! 897: void ! 898: xdr_callhdr(xdrs, chdr) ! 899: XDR *xdrs; ! 900: struct rpc_msg *chdr; ! 901: .LE ! 902: Used for describing RPC messages, externally. ! 903: This routine is useful for users who wish to generate ! 904: RPC-style messages without using the RPC package. ! 905: .SH ! 906: xdr_callmsg() ! 907: .LP ! 908: .LS ! 909: xdr_callmsg(xdrs, cmsg) ! 910: XDR *xdrs; ! 911: struct rpc_msg *cmsg; ! 912: .LE ! 913: Used for describing RPC messages, externally. ! 914: This routine is useful for users who wish to generate ! 915: RPC-style messages without using the RPC package. ! 916: .SH ! 917: xdr_double() ! 918: .LP ! 919: .LS ! 920: xdr_double(xdrs, dp) ! 921: XDR *xdrs; ! 922: double *dp; ! 923: .LE ! 924: A filter primitive that translates between C ! 925: .L double ! 926: precision numbers and their external representations. ! 927: This routine returns one if it succeeds, zero otherwise. ! 928: .SH ! 929: xdr_enum() ! 930: .LP ! 931: .LS ! 932: xdr_enum(xdrs, ep) ! 933: XDR *xdrs; ! 934: enum_t *ep; ! 935: .LE ! 936: A filter primitive that translates between C ! 937: .L enum s ! 938: (actually integers) and their external representations. ! 939: This routine returns one if it succeeds, zero otherwise. ! 940: .SH ! 941: xdr_float() ! 942: .LP ! 943: .LS ! 944: xdr_float(xdrs, fp) ! 945: XDR *xdrs; ! 946: float *fp; ! 947: .LE ! 948: A filter primitive that translates between C ! 949: .L float s ! 950: and their external representations. ! 951: This routine returns one if it succeeds, zero otherwise. ! 952: .SH ! 953: xdr_inline() ! 954: .LP ! 955: .LS ! 956: long * ! 957: xdr_inline(xdrs, len) ! 958: XDR *xdrs; ! 959: int len; ! 960: .LE ! 961: A macro that invokes the in-line routine associated with the XDR stream, ! 962: .L xdrs . ! 963: The routine returns a pointer ! 964: to a contiguous piece of the stream's buffer; ! 965: .L len ! 966: is the byte length of the desired buffer. ! 967: Note that pointer is cast to ! 968: .L "long *" . ! 969: Warning: ! 970: .L xdr_inline() ! 971: may return 0 (NULL) if it cannot allocate ! 972: a contiguous piece of a buffer. ! 973: Therefore the behavior may vary among stream instances; ! 974: it exists for the sake of efficiency. ! 975: .SH ! 976: xdr_int() ! 977: .LP ! 978: .LS ! 979: xdr_int(xdrs, ip) ! 980: XDR *xdrs; ! 981: int *ip; ! 982: .LE ! 983: A filter primitive that translates between C integers ! 984: and their external representations. ! 985: This routine returns one if it succeeds, zero otherwise. ! 986: .SH ! 987: xdr_long() ! 988: .LP ! 989: .LS ! 990: xdr_long(xdrs, lp) ! 991: XDR *xdrs; ! 992: long *lp; ! 993: .LE ! 994: A filter primitive that translates between C ! 995: .L long ! 996: integers and their external representations. ! 997: This routine returns one if it succeeds, zero otherwise. ! 998: .SH ! 999: xdr_opaque() ! 1000: .LP ! 1001: .LS ! 1002: xdr_opaque(xdrs, cp, cnt) ! 1003: XDR *xdrs; ! 1004: char *cp; ! 1005: u_int cnt; ! 1006: .LE ! 1007: A filter primitive that translates between fixed size opaque data ! 1008: and its external representation. ! 1009: The parameter ! 1010: .L cp ! 1011: is the address of the opaque object, and ! 1012: .L cnt ! 1013: is its size in bytes. ! 1014: This routine returns one if it succeeds, zero otherwise. ! 1015: .SH ! 1016: xdr_opaque_auth() ! 1017: .LP ! 1018: .LS ! 1019: xdr_opaque_auth(xdrs, ap) ! 1020: XDR *xdrs; ! 1021: struct opaque_auth *ap; ! 1022: .LE ! 1023: Used for describing RPC messages, externally. ! 1024: This routine is useful for users who wish to generate ! 1025: RPC-style messages without using the RPC package. ! 1026: .SH ! 1027: xdr_pmap() ! 1028: .LP ! 1029: .LS ! 1030: xdr_pmap(xdrs, regs) ! 1031: XDR *xdrs; ! 1032: struct pmap *regs; ! 1033: .LE ! 1034: Used for describing parameters to various ! 1035: .I portmap ! 1036: procedures, externally. ! 1037: This routine is useful for users who wish to generate ! 1038: these parameters without using the ! 1039: .L pmap ! 1040: interface. ! 1041: .SH ! 1042: xdr_pmaplist() ! 1043: .LP ! 1044: .LS ! 1045: xdr_pmaplist(xdrs, rp) ! 1046: XDR *xdrs; ! 1047: struct pmaplist **rp; ! 1048: .LE ! 1049: Used for describing a list of port mappings, externally. ! 1050: This routine is useful for users who wish to generate ! 1051: these parameters without using the ! 1052: .L pmap ! 1053: interface. ! 1054: .SH ! 1055: xdr_reference() ! 1056: .LP ! 1057: .LS ! 1058: xdr_reference(xdrs, pp, size, proc) ! 1059: XDR *xdrs; ! 1060: char **pp; ! 1061: u_int size; ! 1062: xdrproc_t proc; ! 1063: .LE ! 1064: A primitive that provides pointer chasing within structures. ! 1065: The parameter ! 1066: .L pp ! 1067: is the address of the pointer; ! 1068: .L size ! 1069: is the ! 1070: .L sizeof() ! 1071: the structure that ! 1072: .L *pp ! 1073: points to; and ! 1074: .L proc ! 1075: is an XDR procedure that filters the structure ! 1076: between its C form and its external representation. ! 1077: This routine returns one if it succeeds, zero otherwise. ! 1078: .SH ! 1079: xdr_rejected_reply() ! 1080: .LP ! 1081: .LS ! 1082: xdr_rejected_reply(xdrs, rr) ! 1083: XDR *xdrs; ! 1084: struct rejected_reply *rr; ! 1085: .LE ! 1086: Used for describing RPC messages, externally. ! 1087: This routine is useful for users who wish to generate ! 1088: RPC-style messages without using the RPC package. ! 1089: .SH ! 1090: xdr_replymsg() ! 1091: .LP ! 1092: .LS ! 1093: xdr_replymsg(xdrs, rmsg) ! 1094: XDR *xdrs; ! 1095: struct rpc_msg *rmsg; ! 1096: .LE ! 1097: Used for describing RPC messages, externally. ! 1098: This routine is useful for users who wish to generate ! 1099: RPC style messages without using the RPC package. ! 1100: .SH ! 1101: xdr_short() ! 1102: .LP ! 1103: .LS ! 1104: xdr_short(xdrs, sp) ! 1105: XDR *xdrs; ! 1106: short *sp; ! 1107: .LE ! 1108: A filter primitive that translates between C ! 1109: .L short ! 1110: integers and their external representations. ! 1111: This routine returns one if it succeeds, zero otherwise. ! 1112: .SH ! 1113: xdr_string() ! 1114: .LP ! 1115: .LS ! 1116: xdr_string(xdrs, sp, maxsize) ! 1117: XDR *xdrs; ! 1118: char **sp; ! 1119: u_int maxsize; ! 1120: .LE ! 1121: A filter primitive that translates between C strings and their ! 1122: corresponding external representations. ! 1123: Strings cannot cannot be longer than ! 1124: .L maxsize . ! 1125: Note that ! 1126: .L sp ! 1127: is the address of the string's pointer. ! 1128: This routine returns one if it succeeds, zero otherwise. ! 1129: .SH ! 1130: xdr_u_int() ! 1131: .LP ! 1132: .LS ! 1133: xdr_u_int(xdrs, up) ! 1134: XDR *xdrs; ! 1135: unsigned *up; ! 1136: .LE ! 1137: A filter primitive that translates between C ! 1138: .L unsigned ! 1139: integers and their external representations. ! 1140: This routine returns one if it succeeds, zero otherwise. ! 1141: .SH ! 1142: xdr_u_long() ! 1143: .LP ! 1144: .LS ! 1145: xdr_u_long(xdrs, ulp) ! 1146: XDR *xdrs; ! 1147: unsigned long *ulp; ! 1148: .LE ! 1149: A filter primitive that translates between C ! 1150: .L "unsigned long" ! 1151: integers and their external representations. ! 1152: This routine returns one if it succeeds, zero otherwise. ! 1153: .SH ! 1154: xdr_u_short() ! 1155: .LP ! 1156: .LS ! 1157: xdr_u_short(xdrs, usp) ! 1158: XDR *xdrs; ! 1159: unsigned short *usp; ! 1160: .LE ! 1161: A filter primitive that translates between C ! 1162: .L "unsigned short" ! 1163: integers and their external representations. ! 1164: This routine returns one if it succeeds, zero otherwise. ! 1165: .SH ! 1166: xdr_union() ! 1167: .LP ! 1168: .LS ! 1169: xdr_union(xdrs, dscmp, unp, choices, dfault) ! 1170: XDR *xdrs; ! 1171: int *dscmp; ! 1172: char *unp; ! 1173: struct xdr_discrim *choices; ! 1174: xdrproc_t dfault; ! 1175: .LE ! 1176: A filter primitive that translates between a discriminated C ! 1177: .L union ! 1178: and its corresponding external representation. The parameter ! 1179: .L dscmp ! 1180: is the address of the union's discriminant, while ! 1181: .L unp ! 1182: in the address of the union. ! 1183: This routine returns one if it succeeds, zero otherwise. ! 1184: .SH ! 1185: xdr_void() ! 1186: .LP ! 1187: .LS ! 1188: xdr_void() ! 1189: .LE ! 1190: This routine always returns one. ! 1191: .SH ! 1192: xdr_wrapstring() ! 1193: .LP ! 1194: .LS ! 1195: xdr_wrapstring(xdrs, sp) ! 1196: XDR *xdrs; ! 1197: char **sp; ! 1198: .LE ! 1199: A primitive that calls ! 1200: .L xdr_string(xdrs,sp,MAXUNSIGNED); ! 1201: where MAXUNSIGNED is the maximum value of an unsigned integer. ! 1202: This is handy because the RPC package passes ! 1203: only two parameters XDR routines, whereas ! 1204: .L xdr_string() , ! 1205: one of the most frequently used primitives, requires three parameters. ! 1206: This routine returns one if it succeeds, zero otherwise. ! 1207: .SH ! 1208: xprt_register() ! 1209: .LP ! 1210: .LS ! 1211: void ! 1212: xprt_register(xprt) ! 1213: SVCXPRT *xprt; ! 1214: .LE ! 1215: After RPC service transport handles are created, ! 1216: they should register themselves with the RPC service package. ! 1217: This routine modifies the global variable ! 1218: .L svc_fds . ! 1219: Service implementors usually don't need this routine. ! 1220: .SH ! 1221: xprt_unregister() ! 1222: .LP ! 1223: .LS ! 1224: void ! 1225: xprt_unregister(xprt) ! 1226: SVCXPRT *xprt; ! 1227: .LE ! 1228: Before an RPC service transport handle is destroyed, ! 1229: it should unregister itself with the RPC service package. ! 1230: This routine modifies the global variable ! 1231: .L svc_fds . ! 1232: Service implementors usually don't need this routine.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.