1.\" @(#)rpc.3n 2.4 88/08/08 4.0 RPCSRC; from 1.19 88/06/24 SMI 2.\" $NetBSD: rpc_soc.3,v 1.17 2017/07/03 21:32:49 wiz Exp $ 3.\" Converted to mdoc by Thomas Klausner <wiz@NetBSD.org> 4.\" 5.Dd December 29, 2016 6.Dt RPC_SOC 3 7.Os 8.Sh NAME 9.Nm rpc_soc , 10.Nm auth_destroy , 11.Nm authnone_create , 12.Nm authunix_create , 13.Nm authunix_create_default , 14.Nm callrpc , 15.Nm clnt_broadcast , 16.Nm clnt_call , 17.Nm clnt_control , 18.Nm clnt_create , 19.Nm clnt_destroy , 20.Nm clnt_freeres , 21.Nm clnt_geterr , 22.Nm clnt_pcreateerror , 23.Nm clnt_perrno , 24.Nm clnt_perror , 25.Nm clnt_spcreateerror , 26.Nm clnt_sperrno , 27.Nm clnt_sperror , 28.Nm clntraw_create , 29.Nm clnttcp_create , 30.Nm clntudp_bufcreate , 31.Nm clntudp_create , 32.Nm get_myaddress , 33.Nm pmap_getmaps , 34.Nm pmap_getport , 35.Nm pmap_rmtcall , 36.Nm pmap_set , 37.Nm pmap_unset , 38.Nm registerrpc , 39.Nm rpc_createerr , 40.Nm svc_destroy , 41.Nm svc_fds , 42.Nm svc_fdset , 43.Nm svc_getargs , 44.Nm svc_getcaller , 45.Nm svc_getreg , 46.Nm svc_getregset , 47.Nm svc_getrpccaller , 48.Nm svc_register , 49.Nm svc_run , 50.Nm svc_sendreply , 51.Nm svc_unregister , 52.Nm svcerr_auth , 53.Nm svcerr_decode , 54.Nm svcerr_noproc , 55.Nm svcerr_noprog , 56.Nm svcerr_progvers , 57.Nm svcerr_systemerr , 58.Nm svcerr_weakauth , 59.Nm svcfd_create , 60.Nm svcraw_create , 61.Nm xdr_accepted_reply , 62.Nm xdr_authunix_parms , 63.Nm xdr_callhdr , 64.Nm xdr_callmsg , 65.Nm xdr_opaque_auth , 66.Nm xdr_pmap , 67.Nm xdr_pmaplist , 68.Nm xdr_rejected_reply , 69.Nm xdr_replymsg , 70.Nm xprt_register , 71.Nm xprt_unregister 72.Nd library routines for remote procedure calls 73.Sh SYNOPSIS 74.In rpc/rpc.h 75.Ft void 76.Fn auth_destroy "AUTH *auth" 77.Ft AUTH * 78.Fn authnone_create "void" 79.Ft AUTH * 80.Fn authunix_create "char *host" "int uid" "int gid" "int len" "int *aup_gids" 81.Ft AUTH * 82.Fn authunix_create_default "void" 83.Ft int 84.Fn callrpc "char *host" "int prognum" "int versnum" \ 85"int procnum" "xdrproc_t inproc" "char *in" "xdrproc_t outproc" "char *out" 86.Ft enum clnt_stat 87.Fn clnt_broadcast "u_long prognum" "u_long versnum" "u_long procnum" \ 88"xdrproc_t inproc" "char *in" "xdrproc_t outproc" "char *out" \ 89"resultproc_t eachresult" 90.Ft enum clnt_stat 91.Fn clnt_call "CLIENT *clnt" "u_long procnum" "xdrproc_t inproc" \ 92"char *in" "xdrproc_t outproc" "char *out" "struct timeval tout" 93.Ft int 94.Fn clnt_destroy "CLIENT *clnt" 95.Ft CLIENT * 96.Fn clnt_create "const char *host" "rpcprog_t prog" "rpcvers_t vers" "const char *proto" 97.Ft bool_t 98.Fn clnt_control "CLIENT *cl" "u_int req" "char *info" 99.Ft int 100.Fn clnt_freeres "CLIENT *clnt" "xdrproc_t outproc" "char *out" 101.Ft void 102.Fn clnt_geterr "CLIENT *clnt" "struct rpc_err errp" 103.Ft void 104.Fn clnt_pcreateerror "const char *s" 105.Ft void 106.Fn clnt_perrno "enum clnt_stat stat" 107.Ft void 108.Fn clnt_perror "CLIENT *clnt" "const char *s" 109.Ft char * 110.Fn clnt_spcreateerror "const char *s" 111.Ft char * 112.Fn clnt_sperrno "enum clnt_stat stat" 113.Ft char * 114.Fn clnt_sperror "CLIENT *rpch" "const char *s" 115.Ft CLIENT * 116.Fn clntraw_create "u_long prognum" "u_long versnum" 117.Ft CLIENT * 118.Fn clnttcp_create "struct sockaddr_in *addr" "u_long prognum" \ 119"u_long versnum" "int *sockp" "u_int sendsz" "u_int recvsz" 120.Ft CLIENT * 121.Fn clntudp_create "struct sockaddr_in *addr" "u_long prognum" \ 122"u_long versnum" "struct timeval wait" "int *sockp" 123.Ft CLIENT * 124.Fn clntudp_bufcreate "struct sockaddr_in *addr" "u_long prognum" \ 125"u_long versnum" "struct timeval wait" "int *sockp" \ 126"unsigned int sendsize" "unsigned int recosize" 127.Ft int 128.Fn get_myaddress "struct sockaddr_in *addr" 129.Ft struct pmaplist * 130.Fn pmap_getmaps "struct sockaddr_in *addr" 131.Ft u_short 132.Fn pmap_getport "struct sockaddr_in *addr" "u_long prognum" \ 133"u_long versnum" "u_int protocol" 134.Ft enum clnt_stat 135.Fo pmap_rmtcall 136.Fa "struct sockaddr_in *addr" 137.Fa "u_long prognum" 138.Fa "u_long versnum" 139.Fa "u_long procnum" 140.Fa "xdrproc_t inproc" 141.Fa "char *in" 142.Fa "xdrproc_t outproc" 143.Fa "char *out" 144.Fa "struct timeval tout" 145.Fa "u_long *portp" 146.Fc 147.Ft int 148.Fn pmap_set "u_long prognum" "u_long versnum" "int protocol" \ 149"int port" 150.Ft int 151.Fn pmap_unset "u_long prognum" "u_long versnum" 152.Ft int 153.Fn registerrpc "int prognum" "int versnum" "int procnum" \ 154"char *(*procname)()" "xdrproc_t inproc" "xdrproc_t outproc" 155.Fd struct rpc_createerr rpc_createerr; 156.Ft int 157.Fn svc_destroy "SVCXPRT *xprt" 158.Fd fd_set svc_fdset; 159.Fd int svc_fds; 160.Ft int 161.Fn svc_freeargs "SVCXPRT *xprt" "xdrproc_t inproc" "char *in" 162.Ft int 163.Fn svc_getargs "SVCXPRT *xprt" "xdrproc_t inproc" "char *in" 164.Ft struct sockaddr_in * 165.Fn svc_getcaller "SVCXPRT *xprt" 166.Ft void 167.Fn svc_getreqset "fd_set *rdfds" 168.Ft void 169.Fn svc_getreq "int rdfds" 170.Ft struct netbuf * 171.Fn svc_getrpccaller "SVCXPRT *xprt" 172.Ft bool_t 173.Fn svc_register "SVCXPRT *xprt" "u_long prognum" "u_long versnum" \ 174"void (*dispatch)()" "int protocol" 175.Ft void 176.Fn svc_run "void" 177.Ft bool_t 178.Fn svc_sendreply "SVCXPRT *xprt" "xdrproc_t xdr_results" "const char *location" 179.Ft void 180.Fn svc_unregister "u_long prognum" "u_long versnum" 181.Ft void 182.Fn svcerr_auth "SVCXPRT *xprt" "enum auth_stat why" 183.Ft void 184.Fn svcerr_decode "SVCXPRT *xprt" 185.Ft void 186.Fn svcerr_noproc "SVCXPRT *xprt" 187.Ft void 188.Fn svcerr_noprog "SVCXPRT *xprt" 189.Ft void 190.Fn svcerr_progvers "SVCXPRT *xprt" "rpcvers_t low_vers" "rpcvers_t high_vers" 191.Ft void 192.Fn svcerr_systemerr "SVCXPRT *xprt" 193.Ft void 194.Fn svcerr_weakauth "SVCXPRT *xprt" 195.Ft SVCXPRT * 196.Fn svcraw_create "void" 197.Ft SVCXPRT * 198.Fn svctcp_create "int sock" "u_int send_buf_size" \ 199"u_int recv_buf_size" 200.Ft SVCXPRT * 201.Fn svcfd_create "int fd" "u_int sendsize" "u_int recvsize" 202.Ft SVCXPRT * 203.Fn svcudp_bufcreate "int sock" "u_int sendsize" "u_int recosize" 204.Ft SVCXPRT * 205.Fn svcudp_create "int sock" 206.Ft int 207.Fn xdr_accepted_reply "XDR *xdrs" "struct accepted_reply *ar" 208.Ft int 209.Fn xdr_authunix_parms "XDR *xdrs" "struct authunix_parms *aupp" 210.Ft bool_t 211.Fn xdr_callhdr "XDR *xdrs" "struct rpc_msg *chdr" 212.Ft int 213.Fn xdr_callmsg "XDR *xdrs" "struct rpc_msg *cmsg" 214.Ft int 215.Fn xdr_opaque_auth "XDR *xdrs" "struct opaque_auth *ap" 216.Ft int 217.Fn xdr_pmap "XDR *xdrs" "struct pmap *regs" 218.Ft int 219.Fn xdr_pmaplist "XDR *xdrs" "struct pmaplist **rp" 220.Ft int 221.Fn xdr_rejected_reply "XDR *xdrs" "struct rejected_reply *rr" 222.Ft int 223.Fn xdr_replymsg "XDR *xdrs" "struct rpc_msg *rmsg" 224.Ft bool_t 225.Fn xprt_register "SVCXPRT *xprt" 226.Ft void 227.Fn xprt_unregister "SVCXPRT *xprt" 228.Sh DESCRIPTION 229.Em "The svc and clnt functions described in this page are the old, TS-RPC" 230.Em "interface to the XDR and RPC library, and exist for backward compatibility." 231.Em "The new interface is described in the pages referenced from" 232.Xr rpc 3 . 233.Pp 234These routines allow C programs to make procedure 235calls on other machines across the network. 236First, the client calls a procedure to send a 237data packet to the server. 238Upon receipt of the packet, the server calls a dispatch routine 239to perform the requested service, and then sends back a 240reply. 241Finally, the procedure call returns to the client. 242.\" XXX: NOTYET 243.\".Pp 244.\"Routines that are used for Secure RPC (DES authentication) are described in 245.\".Xr rpc_secure 3 . 246.\"Secure RPC can be used only if DES encryption is available. 247.Pp 248.Bl -tag -width xxx 249.It Fn auth_destroy 250A macro that destroys the authentication information associated with 251.Fa auth . 252Destruction usually involves deallocation of private data structures. 253The use of 254.Fa auth 255is undefined after calling 256.Fn auth_destroy . 257.It Fn authnone_create 258Create and returns an RPC authentication handle that passes nonusable 259authentication information with each remote procedure call. 260This is the default authentication used by RPC. 261.It Fn authunix_create 262Create and return an RPC authentication handle that contains 263.\" XXX: .UX ? 264authentication information. 265The parameter 266.Fa host 267is the name of the machine on which the information was 268created; 269.Fa uid 270is the user's user ID; 271.Fa gid 272is the user's current group id; 273.Fa len 274and 275.Fa aup_gids 276refer to a counted array of groups to which the user belongs. 277It is easy to impersonate a user. 278.It Fn authunix_create_default 279Calls 280.Fn authunix_create 281with the appropriate parameters. 282.It Fn callrpc 283Call the remote procedure associated with 284.Fa prognum , 285.Fa versnum , 286and 287.Fa procnum 288on the machine, 289.Fa host . 290The parameter 291.Fa in 292is the address of the procedure's argument(s), and 293.Fa out 294is the address of where to place the result(s); 295.Fa inproc 296is used to encode the procedure's parameters, and 297.Fa outproc 298is used to decode the procedure's results. 299This routine returns zero if it succeeds, or the value of 300.Va "enum clnt_stat" 301cast to an integer if it fails. 302The routine 303.Fn clnt_perrno 304is handy for translating failure statuses into messages. 305.Pp 306Warning: calling remote procedures with this routine 307uses UDP/IP as a transport; see 308.Fn clntudp_create 309for restrictions. 310You do not have control of timeouts or authentication using 311this routine. 312.It Fn clnt_broadcast 313Like 314.Fn callrpc , 315except the call message is broadcast to all locally 316connected broadcast nets. 317Each time it receives a response, this routine calls 318.Fn eachresult , 319whose form is 320.Ft int 321.Fn eachresult "char *out" "struct sockaddr_in *addr" 322where 323.Fa out 324is the same as 325.Fa out 326passed to 327.Fn clnt_broadcast , 328except that the remote procedure's output is decoded there; 329.Fa addr 330points to the address of the machine that sent the results. 331If 332.Fn eachresult 333returns zero, 334.Fn clnt_broadcast 335waits for more replies; otherwise it returns with appropriate 336status. 337.Pp 338Warning: broadcast sockets are limited in size to the 339maximum transfer unit of the data link. 340For ethernet, this value is 1500 bytes. 341.It Fn clnt_call 342A macro that calls the remote procedure 343.Fa procnum 344associated with the client handle, 345.Fa clnt , 346which is obtained with an RPC client creation routine such as 347.Fn clnt_create . 348The parameter 349.Fa in 350is the address of the procedure's argument(s), and 351.Fa out 352is the address of where to place the result(s); 353.Fa inproc 354is used to encode the procedure's parameters, and 355.Fa outproc 356is used to decode the procedure's results; 357.Fa tout 358is the time allowed for results to come back. 359.It Fn clnt_destroy 360A macro that destroys the client's RPC handle. 361Destruction usually involves deallocation 362of private data structures, including 363.Fa clnt 364itself. 365Use of 366.Fa clnt 367is undefined after calling 368.Fn clnt_destroy . 369If the RPC library opened the associated socket, it will close it 370also. 371Otherwise, the socket remains open. 372.It Fn clnt_create 373Generic client creation routine. 374.Fa host 375identifies the name of the remote host where the server 376is located. 377.Fa proto 378indicates which kind of transport protocol to use. 379The currently supported values for this field are 380.Dq udp 381and 382.Dq tcp . 383Default timeouts are set, but can be modified using 384.Fn clnt_control . 385.Pp 386.Em Warning : 387Using UDP has its shortcomings. 388Since UDP-based RPC messages can only hold up to 8 Kbytes of encoded 389data, this transport cannot be used for procedures that take 390large arguments or return huge results. 391.It Fn clnt_control 392A macro used to change or retrieve various information 393about a client object. 394.Fa req 395indicates the type of operation, and 396.Fa info 397is a pointer to the information. 398For both UDP and TCP the supported values of 399.Fa req 400and their argument types and what they do are: 401.Bl -tag -width CLSET_RETRY_TIMEOUTX 402.It CLSET_TIMEOUT 403.Vt struct timeval ; 404set total timeout. 405.It CLGET_TIMEOUT 406.Vt struct timeval ; 407get total timeout. 408.Pp 409Note: if you set the timeout using 410.Fn clnt_control , 411the timeout parameter passed to 412.Fn clnt_call 413will be ignored in all future calls. 414.It CLGET_SERVER_ADDR 415.Vt struct sockaddr_in ; 416get server's address. 417.El 418.Pp 419The following operations are valid for UDP only: 420.Bl -tag -width CLSET_RETRY_TIMEOUT 421.It CLSET_RETRY_TIMEOUT 422.Vt struct timeval ; 423set the retry timeout. 424.It CLGET_RETRY_TIMEOUT 425.Vt struct timeval ; 426get the retry timeout. 427.Pp 428The retry timeout is the time that UDP RPC waits for the server to 429reply before retransmitting the request. 430.El 431.It Fn clnt_freeres 432A macro that frees any data allocated by the RPC/XDR system when it 433decoded the results of an RPC call. 434The parameter 435.Fa out 436is the address of the results, and 437.Fa outproc 438is the XDR routine describing the results. 439This routine returns one if the results were successfully freed, 440and zero otherwise. 441.It Fn clnt_geterr 442A macro that copies the error structure out of the client 443handle to the structure at address 444.Fa errp . 445.It Fn clnt_pcreateerror 446Print a message to standard error indicating why a client RPC handle 447could not be created. 448The message is prepended with string 449.Fa s 450and a colon. 451A newline character is appended at the end of the message. 452Used when a 453.Fn clnt_create , 454.Fn clntraw_create , 455.Fn clnttcp_create , 456or 457.Fn clntudp_create 458call fails. 459.It Fn clnt_perrno 460Print a message to standard error corresponding 461to the condition indicated by 462.Fa stat . 463A newline character is appended at the end of the message. 464Used after 465.Fn callrpc . 466.It Fn clnt_perror 467Print a message to standard error indicating why an RPC call failed; 468.Fa clnt 469is the handle used to do the call. 470The message is prepended with string 471.Fa s 472and a colon. 473A newline character is appended at the end of the message. 474Used after 475.Fn clnt_call . 476.It Fn clnt_spcreateerror 477Like 478.Fn clnt_pcreateerror , 479except that it returns a string 480instead of printing to the standard error. 481.Pp 482Bugs: returns pointer to static data that is overwritten 483on each call. 484.It Fn clnt_sperrno 485Take the same arguments as 486.Fn clnt_perrno , 487but instead of sending a message to the standard error 488indicating why an RPC call failed, return a pointer to a string which 489contains the message. 490.Pp 491.Fn clnt_sperrno 492is used instead of 493.Fn clnt_perrno 494if the program does not have a standard error (as a program 495running as a server quite likely does not), or if the 496programmer does not want the message to be output with 497.Xr printf 3 , 498or if a message format different than that supported by 499.Fn clnt_perrno 500is to be used. 501Note: unlike 502.Fn clnt_sperror 503and 504.Fn clnt_spcreateerror , 505.Fn clnt_sperrno 506returns a pointer to static data, but the 507result will not get overwritten on each call. 508.It Fn clnt_sperror 509Like 510.Fn clnt_perror , 511except that (like 512.Fn clnt_sperrno ) 513it returns a string instead of printing to standard error. 514.Pp 515Bugs: returns pointer to static data that is overwritten 516on each call. 517.It Fn clntraw_create 518This routine creates a toy RPC client for the remote program 519.Fa prognum , 520version 521.Fa versnum . 522The transport used to pass messages to the service is 523actually a buffer within the process's address space, so the 524corresponding RPC server should live in the same address space; see 525.Fn svcraw_create . 526This allows simulation of RPC and acquisition of RPC overheads, such 527as round trip times, without any kernel interference. 528This routine returns 529.Dv NULL 530if it fails. 531.It Fn clnttcp_create 532This routine creates an RPC client for the remote program 533.Fa prognum , 534version 535.Fa versnum ; 536the client uses TCP/IP as a transport. 537The remote program is located at Internet address 538.Fa *addr . 539If 540.Fa addr->sin_port 541is zero, then it is set to the actual port that the remote 542program is listening on (the remote 543.Xr rpcbind 8 544or 545.Cm portmap 546service is consulted for this information). 547The parameter 548.Fa sockp 549is a socket; if it is 550.Dv RPC_ANYSOCK , 551then this routine opens a new one and sets 552.Fa sockp . 553Since TCP-based RPC uses buffered I/O , 554the user may specify the size of the send and receive buffers 555with the parameters 556.Fa sendsz 557and 558.Fa recvsz ; 559values of zero choose suitable defaults. 560This routine returns 561.Dv NULL 562if it fails. 563.It Fn clntudp_create 564This routine creates an RPC client for the remote program 565.Fa prognum , 566version 567.Fa versnum ; 568the client uses UDP/IP as a transport. 569The remote program is located at Internet address 570.Fa addr . 571If 572.Fa addr->sin_port 573is zero, then it is set to actual port that the remote 574program is listening on (the remote 575.Xr rpcbind 8 576or 577.Cm portmap 578service is consulted for this information). 579The parameter 580.Fa sockp 581is a socket; if it is 582.Dv RPC_ANYSOCK , 583then this routine opens a new one and sets 584.Fa sockp . 585The UDP transport resends the call message in intervals of 586.Fa wait 587time until a response is received or until the call times out. 588The total time for the call to time out is specified by 589.Fa clnt_call . 590.Pp 591Warning: since UDP-based RPC messages can only hold up to 8 Kbytes 592of encoded data, this transport cannot be used for procedures 593that take large arguments or return huge results. 594.It Fn clntudp_bufcreate 595This routine creates an RPC client for the remote program 596.Fa prognum , 597on 598.Fa versnum ; 599the client uses UDP/IP as a transport. 600The remote program is located at Internet address 601.Fa addr . 602If 603.Fa addr->sin_port 604is zero, then it is set to actual port that the remote 605program is listening on (the remote 606.Xr rpcbind 8 607or 608.Cm portmap 609service is consulted for this information). 610The parameter 611.Fa sockp 612is a socket; if it is 613.Dv RPC_ANYSOCK , 614then this routine opens a new one and sets 615.Fa sockp . 616The UDP transport resends the call message in intervals of 617.Fa wait 618time until a response is received or until the call times out. 619The total time for the call to time out is specified by 620.Fa clnt_call . 621.Pp 622This allows the user to specify the maximum packet size for sending and 623receiving UDP-based RPC messages. 624.It Fn get_myaddress 625Stuff the machine's IP address into 626.Fa *addr , 627without consulting the library routines that deal with 628.Pa /etc/hosts . 629The port number is always set to 630.Fn htons "PMAPPORT" . 631Returns zero on success, non-zero on failure. 632.It Fn pmap_getmaps 633A user interface to the 634.Xr rpcbind 8 635service, which returns a list of the current RPC program-to-port 636mappings on the host located at IP address 637.Fa *addr . 638This routine can return 639.Dv NULL . 640The command 641.Dl Cm rpcinfo Fl p 642uses this routine. 643.It Fn pmap_getport 644A user interface to the 645.Xr rpcbind 8 646service, which returns the port number 647on which waits a service that supports program number 648.Fa prognum , 649version 650.Fa versnum , 651and speaks the transport protocol associated with 652.Fa protocol . 653The value of 654.Fa protocol 655is most likely 656.Dv IPPROTO_UDP 657or 658.Dv IPPROTO_TCP . 659A return value of zero means that the mapping does not exist 660or that the RPC system failured to contact the remote 661.Xr rpcbind 8 662service. 663In the latter case, the global variable 664.Fn rpc_createerr 665contains the RPC status. 666.It Fn pmap_rmtcall 667A user interface to the 668.Xr rpcbind 8 669service, which instructs 670.Xr rpcbind 8 671on the host at IP address 672.Fa *addr 673to make an RPC call on your behalf to a procedure on that host. 674The parameter 675.Fa *portp 676will be modified to the program's port number if the 677procedure succeeds. 678The definitions of other parameters are discussed in 679.Fn callrpc 680and 681.Fn clnt_call . 682This procedure should be used for a 683.Dq ping 684and nothing else. 685See also 686.Fn clnt_broadcast . 687.It Fn pmap_set 688A user interface to the 689.Xr rpcbind 8 690service, which establishes a mapping between the triple 691.Fa [ prognum , 692.Fa versnum , 693.Fa protocol ] 694and 695.Fa port 696on the machine's 697.Xr rpcbind 8 698service. 699The value of 700.Fa protocol 701is most likely 702.Dv IPPROTO_UDP 703or 704.Dv IPPROTO_TCP . 705This routine returns one if it succeeds, zero otherwise. 706Automatically done by 707.Fn svc_register . 708.It Fn pmap_unset 709A user interface to the 710.Xr rpcbind 8 711service, which destroys all mapping between the triple 712.Fa [ prognum , 713.Fa versnum , 714.Fa * ] 715and 716.Fa ports 717on the machine's 718.Xr rpcbind 8 719service. 720This routine returns one if it succeeds, zero otherwise. 721.It Fn registerrpc 722Register procedure 723.Fa procname 724with the RPC service package. 725If a request arrives for program 726.Fa prognum , 727version 728.Fa versnum , 729and procedure 730.Fa procnum , 731.Fa procname 732is called with a pointer to its parameter(s); 733.Fa progname 734should return a pointer to its static result(s); 735.Fa inproc 736is used to decode the parameters while 737.Fa outproc 738is used to encode the results. 739This routine returns zero if the registration succeeded, \-1 740otherwise. 741.Pp 742Warning: remote procedures registered in this form 743are accessed using the UDP/IP transport; see 744.Fn svcudp_bufcreate 745for restrictions. 746.It struct rpc_createerr rpc_createerr ; 747A global variable whose value is set by any RPC 748client creation routine that does not succeed. 749Use the routine 750.Fn clnt_pcreateerror 751to print the reason why. 752.It Fn svc_destroy 753A macro that destroys the RPC service transport handle, 754.Fa xprt . 755Destruction usually involves deallocation 756of private data structures, including 757.Fa xprt 758itself. 759Use of 760.Fa xprt 761is undefined after calling this routine. 762.It fd_set svc_fdset ; 763A global variable reflecting the RPC service side's read file 764descriptor bit mask; it is suitable as a parameter to the 765.Xr select 2 766system call. 767This is only of interest if a service implementor does not call 768.Fn svc_run , 769but rather does his own asynchronous event processing. 770This variable is read-only (do not pass its address to 771.Xr select 2 ! ) , 772yet it may change after calls to 773.Fn svc_getreqset 774or any creation routines. 775.It int svc_fds; 776Similar to 777.Fn svc_fedset , 778but limited to 32 descriptors. 779This interface is obsoleted by 780.Fn svc_fdset . 781.It Fn svc_freeargs 782A macro that frees any data allocated by the RPC/XDR 783system when it decoded the arguments to a service procedure using 784.Fn svc_getargs . 785This routine returns 1 if the results were successfully freed, 786and zero otherwise. 787.It Fn svc_getargs 788A macro that decodes the arguments of an RPC request associated with 789the RPC service transport handle, 790.Fa xprt . 791The parameter 792.Fa in 793is the address where the arguments will be placed; 794.Fa inproc 795is the XDR routine used to decode the arguments. 796This routine returns one if decoding succeeds, and zero otherwise. 797.It Fn svc_getcaller 798The obsolete way of getting the network address of the caller 799of a procedure associated with the RPC service transport handle, 800.Fa xprt , 801use 802.Fn svc_getrpccaller . 803.It Fn svc_getreqset 804This routine is only of interest if a service implementor 805does not call 806.Fn svc_run , 807but instead implements custom asynchronous event processing. 808It is called when the 809.Xr select 2 810system call has determined that an RPC request has arrived on some 811RPC socket(s) ; 812.Fa rdfds 813is the resultant read file descriptor bit mask. 814The routine returns when all sockets associated with the 815value of 816.Fa rdfds 817have been serviced. 818.It Fn svc_getreq 819Similar to 820.Fn svc_getreqset , 821but limited to 32 descriptors. 822This interface is obsoleted by 823.Fn svc_getreqset . 824.It Fn svc_getrpccaller 825The approved way of getting the network address of the caller 826of a procedure associated with the RPC service transport handle, 827.Fa xprt . 828.It Fn svc_register 829Associates 830.Fa prognum 831and 832.Fa versnum 833with the service dispatch procedure, 834.Fa dispatch . 835If 836.Fa protocol 837is zero, the service is not registered with the 838.Xr rpcbind 8 839service. 840If 841.Fa protocol 842is non-zero, then a mapping of the triple 843.Fa [ prognum , 844.Fa versnum , 845.Fa protocol ] 846to 847.Fa xprt->xp_port 848is established with the local 849.Xr rpcbind 8 850service (generally 851.Fa protocol 852is zero, 853.Dv IPPROTO_UDP 854or 855.Dv IPPROTO_TCP ) . 856The procedure 857.Fa dispatch 858has the following form: 859.Ft int 860.Fn dispatch "struct svc_req *request" "SVCXPRT *xprt" . 861.Pp 862The 863.Fn svc_register 864routine returns one if it succeeds, and zero otherwise. 865.It Fn svc_run 866This routine never returns. 867It waits for RPC requests to arrive, and calls the appropriate service 868procedure using 869.Fn svc_getreq 870when one arrives. 871This procedure is usually waiting for a 872.Xr select 2 873system call to return. 874.It Fn svc_sendreply 875Called by an RPC service's dispatch routine to send the results of a 876remote procedure call. 877The parameter 878.Fa xprt 879is the request's associated transport handle; 880.Fa xdr_results 881is the XDR routine which is used to encode the results; and 882.Fa xdr_location 883is the address of the results. 884This routine returns one if it succeeds, zero otherwise. 885.It Fn svc_unregister 886Remove all mapping of the double 887.Fa [ prognum , 888.Fa versnum ] 889to dispatch routines, and of the triple 890.Fa [ prognum , 891.Fa versnum , 892.Fa * ] 893to port number. 894.It Fn svcerr_auth 895Called by a service dispatch routine that refuses to perform 896a remote procedure call due to an authentication error. 897.It Fn svcerr_decode 898Called by a service dispatch routine that cannot successfully 899decode its parameters. 900See also 901.Fn svc_getargs . 902.It Fn svcerr_noproc 903Called by a service dispatch routine that does not implement 904the procedure number that the caller requests. 905.It Fn svcerr_noprog 906Called when the desired program is not registered with the RPC 907package. 908Service implementors usually do not need this routine. 909.It Fn svcerr_progvers 910Called when the desired version of a program is not registered 911with the RPC package. 912Service implementors usually do not need this routine. 913.\" TODO: document low_vers and high_vers 914.It Fn svcerr_systemerr 915Called by a service dispatch routine when it detects a system error 916not covered by any particular protocol. 917For example, if a service can no longer allocate storage, 918it may call this routine. 919.It Fn svcerr_weakauth 920Called by a service dispatch routine that refuses to perform 921a remote procedure call due to insufficient 922authentication parameters. 923The routine calls 924.Fn svcerr_auth "xprt" "AUTH_TOOWEAK" . 925.It Fn svcraw_create 926This routine creates a toy RPC service transport, to which it returns 927a pointer. 928The transport is really a buffer within the process's address space, 929so the corresponding RPC client should live in the same address space; 930see 931.Fn clntraw_create . 932This routine allows simulation of RPC and acquisition of RPC overheads 933(such as round trip times), without any kernel interference. 934This routine returns 935.Dv NULL 936if it fails. 937.It Fn svctcp_create 938This routine creates a TCP/IP-based RPC service transport, to which it 939returns a pointer. 940The transport is associated with the socket 941.Fa sock , 942which may be 943.Dv RPC_ANYSOCK , 944in which case a new socket is created. 945If the socket is not bound to a local TCP 946port, then this routine binds it to an arbitrary port. 947Upon completion, 948.Fa xprt->xp_sock 949is the transport's socket descriptor, and 950.Fa xprt->xp_port 951is the transport's port number. 952This routine returns 953.Dv NULL 954if it fails. 955Since TCP-based RPC uses buffered I/O , 956users may specify the size of buffers; values of zero 957choose suitable defaults. 958.It Fn svcfd_create 959Create a service on top of any open descriptor. 960Typically, this descriptor is a connected socket 961for a stream protocol such as TCP. 962.Fa sendsize 963and 964.Fa recvsize 965indicate sizes for the send and receive buffers. 966If they are zero, a reasonable default is chosen. 967.It Fn svcudp_bufcreate 968This routine creates a UDP/IP-based RPC 969service transport, to which it returns a pointer. 970The transport is associated with the socket 971.Fa sock , 972which may be 973.Dv RPC_ANYSOCK , 974in which case a new socket is created. 975If the socket is not bound to a local UDP 976port, then this routine binds it to an arbitrary port. 977Upon completion, 978.Fa xprt->xp_sock 979is the transport's socket descriptor, and 980.Fa xprt->xp_port 981is the transport's port number. 982This routine returns 983.Dv NULL 984if it fails. 985.Pp 986This allows the user to specify the maximum packet size for sending and 987receiving UDP-based RPC messages. 988.It Fn svcudp_create 989This acts as 990.Fn svcudp_bufcreate 991with predefined sizes for the maximum packet sizes. 992.It Fn xdr_accepted_reply 993Used for encoding RPC reply messages. 994This routine is useful for users who wish to generate RPC-style 995messages without using the RPC package. 996.It Fn xdr_authunix_parms 997Used for describing UNIX credentials. 998This routine is useful for users who wish to generate these 999credentials without using the RPC authentication package. 1000.It Fn xdr_callhdr 1001Used for describing RPC call header messages. 1002This routine is useful for users who wish to generate RPC-style 1003messages without using the RPC package. 1004.It Fn xdr_callmsg 1005Used for describing RPC call messages. 1006This routine is useful for users who wish to generate RPC-style 1007messages without using the RPC package. 1008.It Fn xdr_opaque_auth 1009Used for describing RPC authentication information messages. 1010This routine is useful for users who wish to generate RPC-style 1011messages without using the RPC package. 1012.It Fn xdr_pmap 1013Used for describing parameters to various 1014.Xr rpcbind 8 1015procedures, externally. 1016This routine is useful for users who wish to generate 1017these parameters without using the 1018.Em pmap 1019interface. 1020.It Fn xdr_pmaplist 1021Used for describing a list of port mappings, externally. 1022This routine is useful for users who wish to generate 1023these parameters without using the 1024.Em pmap 1025interface. 1026.It Fn xdr_rejected_reply 1027Used for describing RPC reply messages. 1028This routine is useful for users who wish to generate RPC-style 1029messages without using the RPC package. 1030.It Fn xdr_replymsg 1031Used for describing RPC reply messages. 1032This routine is useful for users who wish to generate RPC-style 1033messages without using the RPC package. 1034.It Fn xprt_register 1035After RPC service transport handles are created, 1036they should register themselves with the RPC service package. 1037This routine modifies the global variable 1038.Va svc_fds . 1039Service implementors usually do not need this routine. 1040.It Fn xprt_unregister 1041Before an RPC service transport handle is destroyed, 1042it should unregister itself with the RPC service package. 1043This routine modifies the global variable 1044.Va svc_fds . 1045Service implementors usually do not need this routine. 1046.El 1047.Sh SEE ALSO 1048.\".Xr rpc_secure 3 , 1049.Xr xdr 3 1050.Pp 1051The following manuals: 1052.Rs 1053.%B Remote Procedure Calls: Protocol Specification 1054.Re 1055.Rs 1056.%B Remote Procedure Call Programming Guide 1057.Re 1058.Rs 1059.%B rpcgen Programming Guide 1060.Re 1061.Pp 1062.Rs 1063.%A Sun Microsystems, Inc., USC-ISI 1064.%T "RPC: Remote Procedure Call Protocol Specification" 1065.%J RFC 1066.%V 1050 1067.Re 1068