Libinfo-542.40.3.tar.gz
[apple/libinfo.git] / rpc.subproj / rpc.3
1 .\"     from: @(#)rpc.3n        2.4 88/08/08 4.0 RPCSRC; from 1.19 88/06/24 SMI
2 .\"     $Id: rpc.3,v 1.1 1999/04/13 23:15:37 wsanchez Exp $
3 .\"
4 .TH RPC 3N "16 February 1988"
5 .SH NAME
6 rpc \- library routines for remote procedure calls
7 .SH SYNOPSIS AND DESCRIPTION
8 These routines allow C programs to make procedure
9 calls on other machines across the network.
10 First, the client calls a procedure to send a
11 data packet to the server.
12 Upon receipt of the packet, the server calls a dispatch routine
13 to perform the requested service, and then sends back a
14 reply.
15 Finally, the procedure call returns to the client.
16 .LP
17 Routines that are used for Secure RPC (DES authentication) are described in
18 .BR rpc_secure (3N).
19 Secure RPC can be used only if DES encryption is available.
20 .LP
21 .ft B
22 .nf
23 .sp .5
24 #include <rpc/rpc.h>
25 .fi
26 .ft R
27 .br
28 .if t .ne 8
29 .LP
30 .ft B
31 .nf
32 .sp .5
33 void
34 auth_destroy(auth)
35 \s-1AUTH\s0 *auth;
36 .fi
37 .ft R
38 .IP
39 A macro that destroys the authentication information associated with
40 .IR auth .
41 Destruction usually involves deallocation of private data
42 structures. The use of
43 .I auth
44 is undefined after calling
45 .BR auth_destroy(\|) .
46 .br
47 .if t .ne 6
48 .LP
49 .ft B
50 .nf
51 .sp .5
52 \s-1AUTH\s0 *
53 authnone_create(\|)
54 .fi
55 .ft R
56 .IP
57 Create and returns an
58 .SM RPC
59 authentication handle that passes nonusable authentication
60 information with each remote procedure call. This is the
61 default authentication used by
62 .SM RPC.
63 .if t .ne 10
64 .LP
65 .ft B
66 .nf
67 .sp .5
68 \s-1AUTH\s0 *
69 authunix_create(host, uid, gid, len, aup_gids)
70 char *host;
71 int uid, gid, len, *aup.gids;
72 .fi
73 .ft R
74 .IP
75 Create and return an
76 .SM RPC
77 authentication handle that contains
78 .UX
79 authentication information.
80 The parameter
81 .I host
82 is the name of the machine on which the information was
83 created;
84 .I uid
85 is the user's user
86 .SM ID ;
87 .I gid
88 is the user's current group
89 .SM ID ;
90 .I len
91 and
92 .I aup_gids
93 refer to a counted array of groups to which the user belongs.
94 It is easy to impersonate a user.
95 .br
96 .if t .ne 5
97 .LP
98 .ft B
99 .nf
100 .sp .5
101 \s-1AUTH\s0 *
102 authunix_create_default(\|)
103 .fi
104 .ft R
105 .IP
106 Calls
107 .B authunix_create(\|)
108 with the appropriate parameters.
109 .br
110 .if t .ne 13
111 .LP
112 .ft B
113 .nf
114 .sp .5
115 callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out)
116 char *host;
117 u_long prognum, versnum, procnum;
118 char *in, *out;
119 xdrproc_t inproc, outproc;
120 .fi
121 .ft R
122 .IP
123 Call the remote procedure associated with
124 .IR prognum ,
125 .IR versnum ,
126 and
127 .I procnum
128 on the machine,
129 .IR host .
130 The parameter
131 .I in
132 is the address of the procedure's argument(s), and
133 .I out
134 is the address of where to place the result(s);
135 .I inproc
136 is used to encode the procedure's parameters, and
137 .I outproc
138 is used to decode the procedure's results.
139 This routine returns zero if it succeeds, or the value of
140 .B "enum clnt_stat"
141 cast to an integer if it fails.
142 The routine
143 .B clnt_perrno(\|)
144 is handy for translating failure statuses into messages.
145 .IP
146 Warning: calling remote procedures with this routine
147 uses
148 .SM UDP/IP
149 as a transport; see
150 .B clntudp_create(\|)
151 for restrictions.
152 You do not have control of timeouts or authentication using
153 this routine.
154 .br
155 .if t .ne 16
156 .LP
157 .ft B
158 .nf
159 .sp .5
160 enum clnt_stat
161 clnt_broadcast(prognum, versnum, procnum, inproc, in, outproc, out, eachresult)
162 u_long prognum, versnum, procnum;
163 char *in, *out;
164 xdrproc_t inproc, outproc;
165 resultproc_t eachresult;
166 .fi
167 .ft R
168 .IP
169 Like
170 .BR callrpc(\|) ,
171 except the call message is broadcast to all locally
172 connected broadcast nets. Each time it receives a
173 response, this routine calls
174 .BR eachresult(\|) ,
175 whose form is:
176 .IP
177 .RS 1i
178 .ft B
179 .nf
180 eachresult(out, addr)
181 char *out;
182 struct sockaddr_in *addr;
183 .ft R
184 .fi
185 .RE
186 .IP
187 where
188 .I out
189 is the same as
190 .I out
191 passed to
192 .BR clnt_broadcast(\|) ,
193 except that the remote procedure's output is decoded there;
194 .I addr
195 points to the address of the machine that sent the results.
196 If
197 .B eachresult(\|)
198 returns zero,
199 .B clnt_broadcast(\|)
200 waits for more replies; otherwise it returns with appropriate
201 status.
202 .IP
203 Warning: broadcast sockets are limited in size to the
204 maximum transfer unit of the data link. For ethernet,
205 this value is 1500 bytes.
206 .br
207 .if t .ne 13
208 .LP
209 .ft B
210 .nf
211 .sp .5
212 enum clnt_stat
213 clnt_call(clnt, procnum, inproc, in, outproc, out, tout)
214 \s-1CLIENT\s0 *clnt;
215 u_long
216 procnum;
217 xdrproc_t inproc, outproc;
218 char *in, *out;
219 struct timeval tout;
220 .fi
221 .ft R
222 .IP
223 A macro that calls the remote procedure
224 .I procnum
225 associated with the client handle,
226 .IR clnt ,
227 which is obtained with an
228 .SM RPC
229 client creation routine such as
230 .BR clnt_create(\|) .
231 The parameter
232 .I in
233 is the address of the procedure's argument(s), and
234 .I out
235 is the address of where to place the result(s);
236 .I inproc
237 is used to encode the procedure's parameters, and
238 .I outproc
239 is used to decode the procedure's results;
240 .I tout
241 is the time allowed for results to come back.
242 .br
243 .if t .ne 7
244 .LP
245 .ft B
246 .nf
247 .sp .5
248 clnt_destroy(clnt)
249 \s-1CLIENT\s0 *clnt;
250 .fi
251 .ft R
252 .IP
253 A macro that destroys the client's
254 .SM RPC
255 handle. Destruction usually involves deallocation
256 of private data structures, including
257 .I clnt
258 itself.  Use of
259 .I clnt
260 is undefined after calling
261 .BR clnt_destroy(\|) .
262 If the
263 .SM RPC
264 library opened the associated socket, it will close it also.
265 Otherwise, the socket remains open.
266 .br
267 .if t .ne 10
268 .LP
269 .ft B
270 .nf
271 .sp .5
272 \s-1CLIENT\s0 *
273 clnt_create(host, prog, vers, proto)
274 char *host;
275 u_long prog, vers;
276 char *proto;
277 .fi
278 .ft R
279 .IP
280 Generic client creation routine.
281 .I host
282 identifies the name of the remote host where the server
283 is located.
284 .I proto
285 indicates which kind of transport protocol to use. The
286 currently supported values for this field are \(lqudp\(rq
287 and \(lqtcp\(rq.
288 Default timeouts are set, but can be modified using
289 .BR clnt_control(\|) .
290 .IP
291 Warning: Using
292 .SM UDP
293 has its shortcomings.  Since
294 .SM UDP\s0-based
295 .SM RPC
296 messages can only hold up to 8 Kbytes of encoded data,
297 this transport cannot be used for procedures that take
298 large arguments or return huge results.
299 .br
300 .if t .ne 10
301 .LP
302 .ft B
303 .nf
304 .sp .5
305 bool_t
306 clnt_control(cl, req, info)
307 \s-1CLIENT\s0 *cl;
308 char *info;
309 .fi
310 .ft R
311 .IP
312 A macro used to change or retrieve various information
313 about a client object.
314 .I req
315 indicates the type of operation, and
316 .I info
317 is a pointer to the information. For both
318 .SM UDP
319 and
320 .SM TCP\s0,
321 the supported values of
322 .I req
323 and their argument types and what they do are:
324 .IP
325 .nf
326 .ta +2.0i +2.0i +2.0i
327 .SM CLSET_TIMEOUT\s0    struct timeval  set total timeout
328 .SM CLGET_TIMEOUT\s0    struct timeval  get total timeout
329 .fi
330 .IP
331 Note: if you set the timeout using
332 .BR clnt_control(\|) ,
333 the timeout parameter passed to
334 .B clnt_call(\|)
335 will be ignored in all future calls.
336 .IP
337 .nf
338 .SM CLGET_SERVER_ADDR\s0        struct sockaddr_in      get server's address
339 .fi
340 .br
341 .IP
342 The following operations are valid for
343 .SM UDP
344 only:
345 .IP
346 .nf
347 .ta +2.0i +2.0i +2.0i
348 .SM CLSET_RETRY_TIMEOUT\s0              struct timeval  set the retry timeout
349 .SM CLGET_RETRY_TIMEOUT\s0              struct timeval  get the retry timeout
350 .fi
351 .br
352 .IP
353 The retry timeout is the time that
354 .SM "UDP RPC"
355 waits for the server to reply before
356 retransmitting the request.
357 .br
358 .if t .ne 10
359 .LP
360 .ft B
361 .nf
362 .sp .5
363 clnt_freeres(clnt, outproc, out)
364 \s-1CLIENT\s0 *clnt;
365 xdrproc_t outproc;
366 char *out;
367 .fi
368 .ft R
369 .IP
370 A macro that frees any data allocated by the
371 .SM RPC/XDR
372 system when it decoded the results of an
373 .SM RPC
374 call.  The
375 parameter
376 .I out
377 is the address of the results, and
378 .I outproc
379 is the
380 .SM XDR
381 routine describing the results.
382 This routine returns one if the results were successfully
383 freed,
384 and zero otherwise.
385 .br
386 .if t .ne 6
387 .LP
388 .ft B
389 .nf
390 .sp .5
391 void
392 clnt_geterr(clnt, errp)
393 \s-1CLIENT\s0 *clnt;
394 struct rpc_err *errp;
395 .fi
396 .ft R
397 .IP
398 A macro that copies the error structure out of the client
399 handle
400 to the structure at address
401 .IR errp .
402 .br
403 .if t .ne 8
404 .LP
405 .ft B
406 .nf
407 .sp .5
408 void
409 clnt_pcreateerror(s)
410 char *s;
411 .fi
412 .ft R
413 .IP
414 Print a message to standard error indicating
415 why a client
416 .SM RPC
417 handle could not be created.
418 The message is prepended with string
419 .I s
420 and a colon.
421 Used when a
422 .BR clnt_create(\|) ,
423 .BR clntraw_create(\|) ,
424 .BR clnttcp_create(\|) ,
425 or
426 .B clntudp_create(\|)
427 call fails.
428 .br
429 .if t .ne 8
430 .LP
431 .ft B
432 .nf
433 .sp .5
434 void
435 clnt_perrno(stat)
436 enum clnt_stat stat;
437 .fi
438 .ft R
439 .IP
440 Print a message to standard error corresponding
441 to the condition indicated by
442 .IR stat .
443 Used after
444 .BR callrpc(\|) .
445 .br
446 .if t .ne 8
447 .LP
448 .ft B
449 .nf
450 .sp .5
451 clnt_perror(clnt, s)
452 \s-1CLIENT\s0 *clnt;
453 char *s;
454 .fi
455 .ft R
456 .IP
457 Print a message to standard error indicating why an
458 .SM RPC
459 call failed;
460 .I clnt
461 is the handle used to do the call.
462 The message is prepended with string
463 .I s
464 and a colon.
465 Used after
466 .BR clnt_call(\|) .
467 .br
468 .if t .ne 9
469 .LP
470 .ft B
471 .nf
472 .sp .5
473 char *
474 clnt_spcreateerror
475 char *s;
476 .fi
477 .ft R
478 .IP
479 Like
480 .BR clnt_pcreateerror(\|) ,
481 except that it returns a string
482 instead of printing to the standard error.
483 .IP
484 Bugs: returns pointer to static data that is overwritten
485 on each call.
486 .br
487 .if t .ne 9
488 .LP
489 .ft B
490 .nf
491 .sp .5
492 char *
493 clnt_sperrno(stat)
494 enum clnt_stat stat;
495 .fi
496 .ft R
497 .IP
498 Take the same arguments as
499 .BR clnt_perrno(\|) ,
500 but instead of sending a message to the standard error
501 indicating why an
502 .SM RPC
503 call failed, return a pointer to a string which contains
504 the message.  The string ends with a
505 .SM NEWLINE\s0.
506 .IP
507 .B clnt_sperrno(\|)
508 is used instead of
509 .B clnt_perrno(\|)
510 if the program does not have a standard error (as a program
511 running as a server quite likely does not), or if the
512 programmer
513 does not want the message to be output with
514 .BR printf ,
515 or if a message format different than that supported by
516 .B clnt_perrno(\|)
517 is to be used.
518 Note: unlike
519 .B clnt_sperror(\|)
520 and
521 .BR clnt_spcreaterror(\|) ,
522 .B clnt_sperrno(\|)
523 returns pointer to static data, but the
524 result will not get overwritten on each call.
525 .br
526 .if t .ne 7
527 .LP
528 .ft B
529 .nf
530 .sp .5
531 char *
532 clnt_sperror(rpch, s)
533 \s-1CLIENT\s0 *rpch;
534 char *s;
535 .fi
536 .ft R
537 .IP
538 Like
539 .BR clnt_perror(\|) ,
540 except that (like
541 .BR clnt_sperrno(\|) )
542 it returns a string instead of printing to standard error.
543 .IP
544 Bugs: returns pointer to static data that is overwritten
545 on each call.
546 .br
547 .if t .ne 10
548 .LP
549 .ft B
550 .nf
551 .sp .5
552 \s-1CLIENT\s0 *
553 clntraw_create(prognum, versnum)
554 u_long prognum, versnum;
555 .fi
556 .ft R
557 .IP
558 This routine creates a toy
559 .SM RPC
560 client for the remote program
561 .IR prognum ,
562 version
563 .IR versnum .
564 The transport used to pass messages to the service is
565 actually a buffer within the process's address space, so the
566 corresponding
567 .SM RPC
568 server should live in the same address space; see
569 .BR svcraw_create(\|) .
570 This allows simulation of
571 .SM RPC
572 and acquisition of
573 .SM RPC
574 overheads, such as round trip times, without any
575 kernel interference. This routine returns
576 .SM NULL
577 if it fails.
578 .br
579 .if t .ne 15
580 .LP
581 .ft B
582 .nf
583 .sp .5
584 \s-1CLIENT\s0 *
585 clnttcp_create(addr, prognum, versnum, sockp, sendsz, recvsz)
586 struct sockaddr_in *addr;
587 u_long prognum, versnum;
588 int *sockp;
589 u_int sendsz, recvsz;
590 .fi
591 .ft R
592 .IP
593 This routine creates an
594 .SM RPC
595 client for the remote program
596 .IR prognum ,
597 version
598 .IR versnum ;
599 the client uses
600 .SM TCP/IP
601 as a transport. The remote program is located at Internet
602 address
603 .IR *addr .
604 If
605 .\"The following in-line font conversion is necessary for the hyphen indicator
606 \fB\%addr\->sin_port\fR
607 is zero, then it is set to the actual port that the remote
608 program is listening on (the remote
609 .B portmap
610 service is consulted for this information). The parameter
611 .I sockp
612 is a socket; if it is
613 .BR \s-1RPC_ANYSOCK\s0 ,
614 then this routine opens a new one and sets
615 .IR sockp .
616 Since
617 .SM TCP\s0-based
618 .SM RPC
619 uses buffered
620 .SM I/O ,
621 the user may specify the size of the send and receive buffers
622 with the parameters
623 .I sendsz
624 and
625 .IR recvsz ;
626 values of zero choose suitable defaults.
627 This routine returns
628 .SM NULL
629 if it fails.
630 .br
631 .if t .ne 15
632 .LP
633 .ft B
634 .nf
635 .sp .5
636 \s-1CLIENT\s0 *
637 clntudp_create(addr, prognum, versnum, wait, sockp)
638 struct sockaddr_in *addr;
639 u_long prognum, versnum;
640 struct timeval wait;
641 int *sockp;
642 .fi
643 .ft R
644 .IP
645 This routine creates an
646 .SM RPC
647 client for the remote program
648 .IR prognum ,
649 version
650 .IR versnum ;
651 the client uses use
652 .SM UDP/IP
653 as a transport. The remote program is located at Internet
654 address
655 .IR addr .
656 If
657 \fB\%addr\->sin_port\fR
658 is zero, then it is set to actual port that the remote
659 program is listening on (the remote
660 .B portmap
661 service is consulted for this information). The parameter
662 .I sockp
663 is a socket; if it is
664 .BR \s-1RPC_ANYSOCK\s0 ,
665 then this routine opens a new one and sets
666 .IR sockp .
667 The
668 .SM UDP
669 transport resends the call message in intervals of
670 .B wait
671 time until a response is received or until the call times
672 out.
673 The total time for the call to time out is specified by
674 .BR clnt_call(\|) .
675 .IP
676 Warning: since
677 .SM UDP\s0-based
678 .SM RPC
679 messages can only hold up to 8 Kbytes
680 of encoded data, this transport cannot be used for procedures
681 that take large arguments or return huge results.
682 .br
683 .if t .ne 8
684 .LP
685 .ft B
686 .nf
687 .sp .5
688 \s-1CLIENT\s0 *
689 clntudp_bufcreate(addr, prognum, versnum, wait, sockp, sendsize, recosize)
690 struct sockaddr_in *addr;
691 u_long prognum, versnum;
692 struct timeval wait;
693 int *sockp;
694 unsigned int sendsize;
695 unsigned int recosize;
696 .fi
697 .ft R
698 .IP
699 This routine creates an
700 .SM RPC
701 client for the remote program
702 .IR prognum ,
703 on
704 .IR versnum ;
705 the client uses use
706 .SM UDP/IP
707 as a transport. The remote program is located at Internet
708 address
709 .IR addr .
710 If
711 \fB\%addr\->sin_port\fR
712 is zero, then it is set to actual port that the remote
713 program is listening on (the remote
714 .B portmap
715 service is consulted for this information). The parameter
716 .I sockp
717 is a socket; if it is
718 .BR \s-1RPC_ANYSOCK\s0 ,
719 then this routine opens a new one and sets
720 .BR sockp .
721 The
722 .SM UDP
723 transport resends the call message in intervals of
724 .B wait
725 time until a response is received or until the call times
726 out.
727 The total time for the call to time out is specified by
728 .BR clnt_call(\|) .
729 .IP
730 This allows the user to specify the maximun packet size for sending and receiving 
731 .SM UDP\s0-based
732 .SM RPC
733 messages.
734 .br
735 .if t .ne 7
736 .LP
737 .ft B
738 .nf
739 .sp .5
740 void
741 get_myaddress(addr)
742 struct sockaddr_in *addr;
743 .fi
744 .ft R
745 .IP
746 Stuff the machine's
747 .SM IP
748 address into
749 .IR *addr ,
750 without consulting the library routines that deal with
751 .BR /etc/hosts .
752 The port number is always set to
753 .BR htons(\s-1PMAPPORT\s0) .
754 .br
755 .if t .ne 10
756 .LP
757 .ft B
758 .nf
759 .sp .5
760 struct pmaplist *
761 pmap_getmaps(addr)
762 struct sockaddr_in *addr;
763 .fi
764 .ft R
765 .IP
766 A user interface to the
767 .B portmap
768 service, which returns a list of the current
769 .SM RPC
770 program-to-port mappings
771 on the host located at
772 .SM IP
773 address
774 .IR *addr .
775 This routine can return
776 .SM NULL .
777 The command
778 .RB ` "rpcinfo \-p" '
779 uses this routine.
780 .br
781 .if t .ne 12
782 .LP
783 .ft B
784 .nf
785 .sp .5
786 u_short
787 pmap_getport(addr, prognum, versnum, protocol)
788 struct sockaddr_in *addr;
789 u_long prognum, versnum, protocol;
790 .fi
791 .ft R
792 .IP
793 A user interface to the
794 .B portmap
795 service, which returns the port number
796 on which waits a service that supports program number
797 .IR prognum ,
798 version
799 .IR versnum ,
800 and speaks the transport protocol associated with
801 .IR protocol .
802 The value of
803 .I protocol
804 is most likely
805 .B
806 .SM IPPROTO_UDP
807 or 
808 .BR \s-1IPPROTO_TCP\s0 .
809 A return value of zero means that the mapping does not exist
810 or that
811 the
812 .SM RPC
813 system failured to contact the remote
814 .B portmap
815 service.  In the latter case, the global variable
816 .B rpc_createerr(\|)
817 contains the
818 .SM RPC
819 status.
820 .br
821 .if t .ne 15
822 .LP
823 .ft B
824 .nf
825 .sp .5
826 enum clnt_stat
827 pmap_rmtcall(addr, prognum, versnum, procnum, inproc, in, outproc, out, tout, portp)
828 struct sockaddr_in *addr;
829 u_long prognum, versnum, procnum;
830 char *in, *out;
831 xdrproc_t inproc, outproc;
832 struct timeval tout;
833 u_long *portp;
834 .fi
835 .ft R
836 .IP
837 A user interface to the
838 .B portmap
839 service, which instructs
840 .B portmap
841 on the host at
842 .SM IP
843 address
844 .I *addr
845 to make an
846 .SM RPC
847 call on your behalf to a procedure on that host.
848 The parameter
849 .I *portp
850 will be modified to the program's port number if the
851 procedure
852 succeeds. The definitions of other parameters are discussed
853 in
854 .B callrpc(\|)
855 and
856 .BR clnt_call(\|) .
857 This procedure should be used for a \(lqping\(rq and nothing
858 else.
859 See also
860 .BR clnt_broadcast(\|) .
861 .br
862 .if t .ne 9
863 .LP
864 .ft B
865 .nf
866 .sp .5
867 pmap_set(prognum, versnum, protocol, port)
868 u_long prognum, versnum, protocol;
869 u_short port;
870 .fi
871 .ft R
872 .IP
873 A user interface to the
874 .B portmap
875 service, which establishes a mapping between the triple
876 .RI [ prognum , versnum , protocol\fR]
877 and
878 .I port
879 on the machine's
880 .B portmap
881 service. The value of
882 .I protocol
883 is most likely
884 .B
885 .SM IPPROTO_UDP
886 or 
887 .BR \s-1IPPROTO_TCP\s0 .
888 This routine returns one if it succeeds, zero otherwise.
889 Automatically done by
890 .BR svc_register(\|) .
891 .br
892 .if t .ne 7
893 .LP
894 .ft B
895 .nf
896 .sp .5
897 pmap_unset(prognum, versnum)
898 u_long prognum, versnum;
899 .fi
900 .ft R
901 .IP
902 A user interface to the
903 .B portmap
904 service, which destroys all mapping between the triple
905 .RI [ prognum , versnum , *\fR]
906 and
907 .B ports
908 on the machine's
909 .B portmap
910 service. This routine returns one if it succeeds, zero
911 otherwise.
912 .br
913 .if t .ne 15
914 .LP
915 .ft B
916 .nf
917 .sp .5
918 registerrpc(prognum, versnum, procnum, procname, inproc, outproc)
919 u_long prognum, versnum, procnum;
920 char *(*procname) (\|) ;
921 xdrproc_t inproc, outproc;
922 .fi
923 .ft R
924 .IP
925 Register procedure
926 .I procname
927 with the
928 .SM RPC
929 service package.  If a request arrives for program
930 .IR prognum ,
931 version
932 .IR versnum ,
933 and procedure
934 .IR procnum ,
935 .I procname
936 is called with a pointer to its parameter(s);
937 .I progname
938 should return a pointer to its static result(s);
939 .I inproc
940 is used to decode the parameters while
941 .I outproc
942 is used to encode the results.
943 This routine returns zero if the registration succeeded, \-1
944 otherwise.
945 .IP
946 Warning: remote procedures registered in this form
947 are accessed using the
948 .SM UDP/IP
949 transport; see
950 .B svcudp_create(\|)
951 for restrictions.
952 .br
953 .if t .ne 5
954 .LP
955 .ft B
956 .nf
957 .sp .5
958 struct rpc_createerr     rpc_createerr;
959 .fi
960 .ft R
961 .IP
962 A global variable whose value is set by any
963 .SM RPC
964 client creation routine
965 that does not succeed.  Use the routine
966 .B clnt_pcreateerror(\|)
967 to print the reason why.
968 .if t .ne 7
969 .LP
970 .ft B
971 .nf
972 .sp .5
973 svc_destroy(xprt)
974 \s-1SVCXPRT\s0 *
975 xprt;
976 .fi
977 .ft R
978 .IP
979 A macro that destroys the
980 .SM RPC
981 service transport handle,
982 .IR xprt .
983 Destruction usually involves deallocation
984 of private data structures, including
985 .I xprt
986 itself.  Use of
987 .I xprt
988 is undefined after calling this routine.
989 .br
990 .if t .ne 8
991 .LP
992 .ft B
993 .nf
994 .sp .5
995 fd_set svc_fdset;
996 .fi
997 .ft R
998 .IP
999 A global variable reflecting the
1000 .SM RPC
1001 service side's
1002 read file descriptor bit mask; it is suitable as a parameter
1003 to the
1004 .B select
1005 system call. This is only of interest
1006 if a service implementor does not call
1007 .BR svc_run(\|) ,
1008 but rather does his own asynchronous event processing.
1009 This variable is read-only (do not pass its address to
1010 .BR select !),
1011 yet it may change after calls to
1012 .B svc_getreqset(\|)
1013 or any creation routines.
1014 .br
1015 .if t .ne 6
1016 .LP
1017 .ft B
1018 .nf
1019 .sp .5
1020 int svc_fds;
1021 .fi
1022 .ft R
1023 .IP
1024 Similar to
1025 .BR svc_fedset(\|) ,
1026 but limited to 32 descriptors. This
1027 interface is obsoleted by
1028 .BR svc_fdset(\|) .
1029 .br
1030 .if t .ne 9
1031 .LP
1032 .ft B
1033 .nf
1034 .sp .5
1035 svc_freeargs(xprt, inproc, in)
1036 \s-1SVCXPRT\s0 *xprt;
1037 xdrproc_t inproc;
1038 char *in;
1039 .fi
1040 .ft R
1041 .IP
1042 A macro that frees any data allocated by the
1043 .SM RPC/XDR
1044 system when it decoded the arguments to a service procedure
1045 using
1046 .BR svc_getargs(\|) .
1047 This routine returns 1 if the results were successfully
1048 freed,
1049 and zero otherwise.
1050 .br
1051 .if t .ne 10
1052 .LP
1053 .ft B
1054 .nf
1055 .sp .5
1056 svc_getargs(xprt, inproc, in)
1057 \s-1SVCXPRT\s0 *xprt;
1058 xdrproc_t inproc;
1059 char *in;
1060 .fi
1061 .ft R
1062 .IP
1063 A macro that decodes the arguments of an
1064 .SM RPC
1065 request
1066 associated with the
1067 .SM RPC
1068 service transport handle,
1069 .IR xprt .
1070 The parameter
1071 .I in
1072 is the address where the arguments will be placed;
1073 .I inproc
1074 is the
1075 .SM XDR
1076 routine used to decode the arguments.
1077 This routine returns one if decoding succeeds, and zero
1078 otherwise.
1079 .br
1080 .if t .ne 9
1081 .LP
1082 .ft B
1083 .nf
1084 .sp .5
1085 struct sockaddr_in *
1086 svc_getcaller(xprt)
1087 \s-1SVCXPRT\s0 *xprt;
1088 .fi
1089 .ft R
1090 .IP
1091 The approved way of getting the network address of the caller
1092 of a procedure associated with the
1093 .SM RPC
1094 service transport handle,
1095 .IR xprt .
1096 .br
1097 .if t .ne 9
1098 .LP
1099 .ft B
1100 .nf
1101 .sp .5
1102 svc_getreqset(rdfds)
1103 fd_set *rdfds;
1104 .fi
1105 .ft R
1106 .IP
1107 This routine is only of interest if a service implementor
1108 does not call
1109 .BR svc_run(\|) ,
1110 but instead implements custom asynchronous event processing.
1111 It is called when the
1112 .B select
1113 system call has determined that an
1114 .SM RPC
1115 request has arrived on some
1116 .SM RPC
1117 .B socket(s) ;
1118 .I rdfds
1119 is the resultant read file descriptor bit mask.
1120 The routine returns when all sockets associated with the
1121 value of
1122 .I rdfds
1123 have been serviced.
1124 .br
1125 .if t .ne 6
1126 .LP
1127 .ft B
1128 .nf
1129 .sp .5
1130 svc_getreq(rdfds)
1131 int rdfds;
1132 .fi
1133 .ft R
1134 .IP
1135 Similar to
1136 .BR svc_getreqset(\|) ,
1137 but limited to 32 descriptors. This interface is obsoleted by
1138 .BR svc_getreqset(\|) .
1139 .br
1140 .if t .ne 17
1141 .LP
1142 .ft B
1143 .nf
1144 .sp .5
1145 svc_register(xprt, prognum, versnum, dispatch, protocol)
1146 \s-1SVCXPRT\s0 *xprt;
1147 u_long prognum, versnum;
1148 void (*dispatch) (\|);
1149 u_long protocol;
1150 .fi
1151 .ft R
1152 .IP
1153 Associates
1154 .I prognum
1155 and
1156 .I versnum
1157 with the service dispatch procedure,
1158 .IR dispatch .
1159 If
1160 .I protocol
1161 is zero, the service is not registered with the
1162 .B portmap
1163 service.  If
1164 .I protocol
1165 is non-zero, then a mapping of the triple
1166 .RI [ prognum , versnum , protocol\fR]
1167 to
1168 \fB\%xprt\->xp_port\fR
1169 is established with the local
1170 .B portmap
1171 service (generally
1172 .I protocol
1173 is zero,
1174 .B
1175 .SM IPPROTO_UDP
1176 or 
1177 .B
1178 .SM IPPROTO_TCP
1179 ).
1180 The procedure
1181 .I dispatch
1182 has the following form:
1183 .RS 1i
1184 .ft B
1185 .nf
1186 dispatch(request, xprt)
1187 struct svc_req *request;
1188 \s-1SVCXPRT\s0 *xprt;
1189 .ft R
1190 .fi
1191 .RE
1192 .IP
1193 The
1194 .B svc_register(\|)
1195 routine returns one if it succeeds, and zero otherwise.
1196 .br
1197 .if t .ne 6
1198 .LP
1199 .ft B
1200 .nf
1201 .sp .5
1202 svc_run(\|)
1203 .fi
1204 .ft R
1205 .IP
1206 This routine never returns. It waits for
1207 .SM RPC
1208 requests to arrive, and calls the appropriate service
1209 procedure using
1210 .B svc_getreq(\|)
1211 when one arrives. This procedure is usually waiting for a
1212 .B select(\|)
1213 system call to return.
1214 .br
1215 .if t .ne 9
1216 .LP
1217 .ft B
1218 .nf
1219 .sp .5
1220 svc_sendreply(xprt, outproc, out)
1221 \s-1SVCXPRT\s0 *xprt;
1222 xdrproc_t outproc;
1223 char *out;
1224 .fi
1225 .ft R
1226 .IP
1227 Called by an
1228 .SM RPC
1229 service's dispatch routine to send the results of a
1230 remote procedure call.  The parameter
1231 .I xprt
1232 is the request's associated transport handle;
1233 .I outproc
1234 is the
1235 .SM XDR
1236 routine which is used to encode the results; and
1237 .I out
1238 is the address of the results.
1239 This routine returns one if it succeeds, zero otherwise.
1240 .br
1241 .if t .ne 7
1242 .LP
1243 .ft B
1244 .nf
1245 .sp .5
1246 void
1247 svc_unregister(prognum, versnum)
1248 u_long prognum, versnum;
1249 .fi
1250 .ft R
1251 .IP
1252 Remove all mapping of the double
1253 .RI [ prognum , versnum ]
1254 to dispatch routines, and of the triple
1255 .RI [ prognum , versnum , *\fR]
1256 to port number.
1257 .br
1258 .if t .ne 9
1259 .LP
1260 .ft B
1261 .nf
1262 .sp .5
1263 void
1264 svcerr_auth(xprt, why)
1265 \s-1SVCXPRT\s0 *xprt;
1266 enum auth_stat why;
1267 .fi
1268 .ft R
1269 .IP
1270 Called by a service dispatch routine that refuses to perform
1271 a remote procedure call due to an authentication error.
1272 .br
1273 .if t .ne 7
1274 .LP
1275 .ft B
1276 .nf
1277 .sp .5
1278 void
1279 svcerr_decode(xprt)
1280 \s-1SVCXPRT\s0 *xprt;
1281 .fi
1282 .ft R
1283 .IP
1284 Called by a service dispatch routine that cannot successfully
1285 decode its parameters. See also
1286 .BR svc_getargs(\|) .
1287 .br
1288 .if t .ne 7
1289 .LP
1290 .ft B
1291 .nf
1292 .sp .5
1293 void
1294 svcerr_noproc(xprt)
1295 \s-1SVCXPRT\s0 *xprt;
1296 .fi
1297 .ft R
1298 .IP
1299 Called by a service dispatch routine that does not implement
1300 the procedure number that the caller requests.
1301 .br
1302 .if t .ne 7
1303 .LP
1304 .ft B
1305 .nf
1306 .sp .5
1307 void
1308 svcerr_noprog(xprt)
1309 \s-1SVCXPRT\s0 *xprt;
1310 .fi
1311 .ft R
1312 .IP
1313 Called when the desired program is not registered with the
1314 .SM RPC
1315 package. Service implementors usually do not need this routine.
1316 .br
1317 .if t .ne 7
1318 .LP
1319 .ft B
1320 .nf
1321 .sp .5
1322 void
1323 svcerr_progvers(xprt)
1324 \s-1SVCXPRT\s0 *xprt;
1325 .fi
1326 .ft R
1327 .IP
1328 Called when the desired version of a program is not registered
1329 with the
1330 .SM RPC
1331 package. Service implementors usually do not need this routine.
1332 .br
1333 .if t .ne 7
1334 .LP
1335 .ft B
1336 .nf
1337 .sp .5
1338 void
1339 svcerr_systemerr(xprt)
1340 \s-1SVCXPRT\s0 *xprt;
1341 .fi
1342 .ft R
1343 .IP
1344 Called by a service dispatch routine when it detects a system
1345 error
1346 not covered by any particular protocol.
1347 For example, if a service can no longer allocate storage,
1348 it may call this routine.
1349 .br
1350 .if t .ne 8
1351 .LP
1352 .ft B
1353 .nf
1354 .sp .5
1355 void
1356 svcerr_weakauth(xprt)
1357 \s-1SVCXPRT\s0 *xprt;
1358 .fi
1359 .ft R
1360 .IP
1361 Called by a service dispatch routine that refuses to perform
1362 a remote procedure call due to insufficient
1363 authentication parameters.  The routine calls
1364 .BR "svcerr_auth(xprt, \s-1AUTH_TOOWEAK\s0)" .
1365 .br
1366 .if t .ne 11
1367 .LP
1368 .ft B
1369 .nf
1370 .sp .5
1371 \s-1SVCXPRT\s0 *
1372 svcraw_create(\|)
1373 .fi
1374 .ft R
1375 .IP
1376 This routine creates a toy
1377 .SM RPC
1378 service transport, to which it returns a pointer.  The
1379 transport
1380 is really a buffer within the process's address space,
1381 so the corresponding
1382 .SM RPC
1383 client should live in the same
1384 address space;
1385 see
1386 .BR clntraw_create(\|) .
1387 This routine allows simulation of
1388 .SM RPC
1389 and acquisition of
1390 .SM RPC
1391 overheads (such as round trip times), without any kernel
1392 interference.
1393 This routine returns
1394 .SM NULL
1395 if it fails.
1396 .br
1397 .if t .ne 11
1398 .LP
1399 .ft B
1400 .nf
1401 .sp .5
1402 \s-1SVCXPRT\s0 *
1403 svctcp_create(sock, send_buf_size, recv_buf_size)
1404 int sock;
1405 u_int send_buf_size, recv_buf_size;
1406 .fi
1407 .ft R
1408 .IP
1409 This routine creates a
1410 .SM TCP/IP\s0-based
1411 .SM RPC
1412 service transport, to which it returns a pointer.
1413 The transport is associated with the socket
1414 .IR sock ,
1415 which may be
1416 .BR \s-1RPC_ANYSOCK\s0 ,
1417 in which case a new socket is created.
1418 If the socket is not bound to a local
1419 .SM TCP
1420 port, then this routine binds it to an arbitrary port.  Upon
1421 completion,
1422 \fB\%xprt\->xp_sock\fR
1423 is the transport's socket descriptor, and
1424 \fB\%xprt\->xp_port\fR
1425 is the transport's port number.
1426 This routine returns
1427 .SM NULL
1428 if it fails. Since
1429 .SM TCP\s0-based
1430 .SM RPC
1431 uses buffered
1432 .SM I/O ,
1433 users may specify the size of buffers; values of zero
1434 choose suitable defaults.
1435 .br
1436 .if t .ne 11
1437 .LP
1438 .ft B
1439 .nf
1440 .sp .5
1441 \s-1SVCXPRT\s0 *
1442 svcfd_create(fd, sendsize, recvsize)
1443 int fd;
1444 u_int sendsize;
1445 u_int recvsize;
1446 .fi
1447 .ft R
1448 .IP
1449 Create a service on top of any open descriptor. Typically,
1450 this
1451 descriptor is a connected socket for a stream protocol such
1452 as
1453 .SM TCP\s0.
1454 .I sendsize
1455 and
1456 .I recvsize
1457 indicate sizes for the send and receive buffers.  If they are
1458 zero, a reasonable default is chosen.
1459 .br
1460 .if t .ne 10
1461 .LP
1462 .ft B
1463 .nf
1464 .sp .5
1465 \s-1SVCXPRT\s0 *
1466 svcudp_bufcreate(sock, sendsize, recosize)
1467 int sock;
1468 .fi
1469 .ft R
1470 .IP
1471 This routine creates a
1472 .SM UDP/IP\s0-based
1473 .SM RPC
1474 service transport, to which it returns a pointer.
1475 The transport is associated with the socket
1476 .IR sock ,
1477 which may be
1478 .B \s-1RPC_ANYSOCK\s0 ,
1479 in which case a new socket is created.
1480 If the socket is not bound to a local
1481 .SM UDP
1482 port, then this routine binds it to an arbitrary port. Upon
1483 completion,
1484 \fB\%xprt\->xp_sock\fR
1485 is the transport's socket descriptor, and
1486 \fB\%xprt\->xp_port\fR
1487 is the transport's port number.
1488 This routine returns
1489 .SM NULL
1490 if it fails.
1491 .IP
1492 This allows the user to specify the maximun packet size for sending and 
1493 receiving
1494 .SM UDP\s0-based
1495 .SM RPC messages.
1496 .br
1497 .if t .ne 7
1498 .LP
1499 .ft B
1500 .nf
1501 .sp .5
1502 xdr_accepted_reply(xdrs, ar)
1503 \s-1XDR\s0 *xdrs;
1504 struct accepted_reply *ar;
1505 .fi
1506 .ft R
1507 .IP
1508 Used for encoding
1509 .SM RPC
1510 reply messages. This routine is useful for users who
1511 wish to generate
1512 \s-1RPC\s0-style
1513 messages without using the
1514 .SM RPC
1515 package.
1516 .br
1517 .if t .ne 7
1518 .LP
1519 .ft B
1520 .nf
1521 .sp .5
1522 xdr_authunix_parms(xdrs, aupp)
1523 \s-1XDR\s0 *xdrs;
1524 struct authunix_parms *aupp;
1525 .fi
1526 .ft R
1527 .IP
1528 Used for describing
1529 .SM UNIX
1530 credentials. This routine is useful for users
1531 who wish to generate these credentials without using the
1532 .SM RPC
1533 authentication package.
1534 .br
1535 .if t .ne 7
1536 .LP
1537 .ft B
1538 .nf
1539 .sp .5
1540 void
1541 xdr_callhdr(xdrs, chdr)
1542 \s-1XDR\s0 *xdrs;
1543 struct rpc_msg *chdr;
1544 .fi
1545 .ft R
1546 .IP
1547 Used for describing
1548 .SM RPC
1549 call header messages.
1550 This routine is useful for users who wish to generate
1551 .SM RPC\s0-style
1552 messages without using the
1553 .SM RPC
1554 package.
1555 .br
1556 .if t .ne 7
1557 .LP
1558 .ft B
1559 .nf
1560 .sp .5
1561 xdr_callmsg(xdrs, cmsg)
1562 \s-1XDR\s0 *xdrs;
1563 struct rpc_msg *cmsg;
1564 .fi
1565 .ft R
1566 .IP
1567 Used for describing
1568 .SM RPC
1569 call messages.
1570 This routine is useful for users who wish to generate
1571 .SM RPC\s0-style
1572 messages without using the
1573 .SM RPC
1574 package.
1575 .br
1576 .if t .ne 7
1577 .LP
1578 .ft B
1579 .nf
1580 .sp .5
1581 xdr_opaque_auth(xdrs, ap)
1582 \s-1XDR\s0 *xdrs;
1583 struct opaque_auth *ap;
1584 .fi
1585 .ft R
1586 .IP
1587 Used for describing
1588 .SM RPC
1589 authentication information messages.
1590 This routine is useful for users who wish to generate
1591 .SM RPC\s0-style
1592 messages without using the
1593 .SM RPC
1594 package.
1595 .br
1596 .if t .ne 7
1597 .LP
1598 .ft B
1599 .nf
1600 .sp .5
1601 xdr_pmap(xdrs, regs)
1602 \s-1XDR\s0 *xdrs;
1603 struct pmap *regs;
1604 .fi
1605 .ft R
1606 .IP
1607 Used for describing parameters to various
1608 .B portmap
1609 procedures, externally.
1610 This routine is useful for users who wish to generate
1611 these parameters without using the
1612 .B pmap
1613 interface.
1614 .br
1615 .if t .ne 7
1616 .LP
1617 .ft B
1618 .nf
1619 .sp .5
1620 xdr_pmaplist(xdrs, rp)
1621 \s-1XDR\s0 *xdrs;
1622 struct pmaplist **rp;
1623 .fi
1624 .ft R
1625 .IP
1626 Used for describing a list of port mappings, externally.
1627 This routine is useful for users who wish to generate
1628 these parameters without using the
1629 .B pmap
1630 interface.
1631 .br
1632 .if t .ne 7
1633 .LP
1634 .ft B
1635 .nf
1636 .sp .5
1637 xdr_rejected_reply(xdrs, rr)
1638 \s-1XDR\s0 *xdrs;
1639 struct rejected_reply *rr;
1640 .fi
1641 .ft R
1642 .IP
1643 Used for describing
1644 .SM RPC
1645 reply messages.
1646 This routine is useful for users who wish to generate
1647 .SM RPC\s0-style
1648 messages without using the
1649 .SM RPC
1650 package.
1651 .br
1652 .if t .ne 8
1653 .LP
1654 .ft B
1655 .nf
1656 .sp .5
1657 xdr_replymsg(xdrs, rmsg)
1658 \s-1XDR\s0 *xdrs;
1659 struct rpc_msg *rmsg;
1660 .fi
1661 .ft R
1662 .IP
1663 Used for describing
1664 .SM RPC
1665 reply messages.
1666 This routine is useful for users who wish to generate
1667 .SM RPC
1668 style messages without using the
1669 .SM RPC
1670 package.
1671 .br
1672 .if t .ne 8
1673 .LP
1674 .ft B
1675 .nf
1676 .sp .5
1677 void
1678 xprt_register(xprt)
1679 \s-1SVCXPRT\s0 *xprt;
1680 .fi
1681 .ft R
1682 .IP
1683 After
1684 .SM RPC
1685 service transport handles are created,
1686 they should register themselves with the
1687 .SM RPC
1688 service package.
1689 This routine modifies the global variable
1690 .BR svc_fds(\|) .
1691 Service implementors usually do not need this routine.
1692 .br
1693 .if t .ne 8
1694 .LP
1695 .ft B
1696 .nf
1697 .sp .5
1698 void
1699 xprt_unregister(xprt)
1700 \s-1SVCXPRT\s0 *xprt;
1701 .fi
1702 .ft R
1703 .IP
1704 Before an
1705 .SM RPC
1706 service transport handle is destroyed,
1707 it should unregister itself with the
1708 .SM RPC
1709 service package.
1710 This routine modifies the global variable
1711 .BR svc_fds(\|) .
1712 Service implementors usually do not need this routine.
1713 .SH SEE ALSO
1714 .BR rpc_secure (3N),
1715 .BR xdr (3N)
1716 .br
1717 The following manuals:
1718 .RS
1719 .ft I
1720 Remote Procedure Calls: Protocol Specification
1721 .br
1722 Remote Procedure Call Programming Guide
1723 .br
1724 rpcgen Programming Guide
1725 .br
1726 .ft R
1727 .RE
1728 .IR "\s-1RPC\s0: Remote Procedure Call Protocol Specification" ,
1729 .SM RFC1050, Sun Microsystems, Inc.,
1730 .SM USC-ISI\s0.
1731