* Simon Phipps: > On Nov 18, 2008, at 03:52, Ben Hutchings wrote: > >> Many of the functions in portmap.c seem to correspond to >> rpcbind (usr/src/cmd/rpcbind) in OpenSolaris: > > Is it just the function prototypes that are derived, or is there > derived source defining them too?
>From our portmap.c: | /* | * Stuff for the rmtcall service | */ | #define ARGSIZE 9000 | | struct encap_parms { | u_int arglen; | char *args; | }; | | static bool_t | xdr_encap_parms(XDR *xdrs, struct encap_parms *epp) | { | | return (xdr_bytes(xdrs, &(epp->args), &(epp->arglen), ARGSIZE)); | } | | struct rmtcallargs { | u_long rmt_prog; | u_long rmt_vers; | u_long rmt_port; | u_long rmt_proc; | struct encap_parms rmt_args; | }; | | static bool_t | xdr_rmtcall_args(XDR *xdrs, struct rmtcallargs *cap) | { | | /* does not get a port number */ | if (xdr_u_long(xdrs, &(cap->rmt_prog)) && | xdr_u_long(xdrs, &(cap->rmt_vers)) && | xdr_u_long(xdrs, &(cap->rmt_proc))) { | return (xdr_encap_parms(xdrs, &(cap->rmt_args))); | } | return (FALSE); | } | | static bool_t | xdr_rmtcall_result(XDR *xdrs, struct rmtcallargs *cap) | { | if (xdr_u_long(xdrs, &(cap->rmt_port))) | return (xdr_encap_parms(xdrs, &(cap->rmt_args))); | return (FALSE); | } | | /* | * only worries about the struct encap_parms part of struct rmtcallargs. | * The arglen must already be set!! | */ | static bool_t | xdr_opaque_parms(XDR *xdrs, struct rmtcallargs *cap) | { | | return (xdr_opaque(xdrs, cap->rmt_args.args, cap->rmt_args.arglen)); | } >From ><http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/rpcbind/rpcb_svc_com.c>: | /* | * Stuff for the rmtcall service | */ | struct encap_parms { | ulong_t arglen; | char *args; | }; | | static bool_t | xdr_encap_parms(xdrs, epp) | XDR *xdrs; | struct encap_parms *epp; | { | return (xdr_bytes(xdrs, &(epp->args), (uint_t *)&(epp->arglen), ~0)); | } | | | struct r_rmtcall_args { | ulong_t rmt_prog; | ulong_t rmt_vers; | ulong_t rmt_proc; | int rmt_localvers; /* whether to send port # or uaddr */ | char *rmt_uaddr; | struct encap_parms rmt_args; | }; | | /* | * XDR remote call arguments. It ignores the address part. | * written for XDR_DECODE direction only | */ | static bool_t | xdr_rmtcall_args(xdrs, cap) | register XDR *xdrs; | register struct r_rmtcall_args *cap; | { | /* does not get the address or the arguments */ | if (xdr_u_long(xdrs, &(cap->rmt_prog)) && | xdr_u_long(xdrs, &(cap->rmt_vers)) && | xdr_u_long(xdrs, &(cap->rmt_proc))) { | return (xdr_encap_parms(xdrs, &(cap->rmt_args))); | } | return (FALSE); | } | | /* | * XDR remote call results along with the address. Ignore | * program number, version number and proc number. | * Written for XDR_ENCODE direction only. | */ | static bool_t | xdr_rmtcall_result(xdrs, cap) | register XDR *xdrs; | register struct r_rmtcall_args *cap; | { | bool_t result; | | #ifdef PORTMAP | if (cap->rmt_localvers == PMAPVERS) { | int h1, h2, h3, h4, p1, p2; | ulong_t port; | | /* interpret the universal address for TCP/IP */ | if (sscanf(cap->rmt_uaddr, "%d.%d.%d.%d.%d.%d", | &h1, &h2, &h3, &h4, &p1, &p2) != 6) | return (FALSE); | port = ((p1 & 0xff) << 8) + (p2 & 0xff); | result = xdr_u_long(xdrs, &port); | } else | #endif | if ((cap->rmt_localvers == RPCBVERS) || | (cap->rmt_localvers == RPCBVERS4)) { | result = xdr_wrapstring(xdrs, &(cap->rmt_uaddr)); | } else { | return (FALSE); | } | if (result == TRUE) | return (xdr_encap_parms(xdrs, &(cap->rmt_args))); | return (FALSE); | } | | /* | * only worries about the struct encap_parms part of struct r_rmtcall_args. | * The arglen must already be set!! | */ | static bool_t | xdr_opaque_parms(xdrs, cap) | XDR *xdrs; | struct r_rmtcall_args *cap; | { | return (xdr_opaque(xdrs, cap->rmt_args.args, cap->rmt_args.arglen)); | } So there's certainly some overlap, and it's not just prototypes. -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]