rpc(3) Library Functions Manual rpc(3) rpc - LIBRARY Standard C library (libc, -lc) , , . , . (dispatch) . . , . : typedef int bool_t; typedef bool_t (*xdrproc_t)(XDR *, void *, ...); typedef bool_t (*resultproc_t)(caddr_t resp, struct sockaddr_in *raddr); AUTH, CLIENT, SVCXPRT XDR . void auth_destroy(AUTH *auth); , , auth. , , . auth auth_destroy() . AUTH *authnone_create(void); RPC, . RPC . AUTH *authunix_create(char *host, uid_t uid, gid_t gid, int len, gid_t aup_gids[.len]); RPC, . host , ; uid ; gid ; len aup_gids (counted) , . . AUTH *authunix_create_default(void); authunix_create() . int callrpc(char *host, unsigned long prognum, unsigned long versnum, unsigned long procnum, xdrproc_t inproc, const char *in, xdrproc_t outproc, char *out); , prognum, versnum procnum host. in , out -- , ; inproc , outproc -- . 0 enum clnt_stat . clnt_perrno(). : UDP/IP; clntudp_create(). . enum clnt_stat clnt_broadcast(unsigned long prognum, unsigned long versnum, unsigned long procnum, xdrproc_t inproc, char *in, xdrproc_t outproc, char *out, resultproc_t eachresult); callrpc(), . eachresult() : eachresult(char *out, struct sockaddr_in *addr); out -- out, clnt_broadcast(), , ; addr , . eachresult() 0, clnt_broadcast() ; . : . ethernet 1500 . enum clnt_stat clnt_call(CLIENT *clnt, unsigned long procnum, xdrproc_t inproc, char *in, xdrproc_t outproc, char *out, struct timeval tout); , procnum, clnt, RPC, clnt_create(). in -- , out -- , ; inproc , outproc ; tout -- . clnt_destroy(CLIENT *clnt); , RPC. , , , clnt. clnt clnt_destroy() . RPC , . . CLIENT *clnt_create(const char *host, unsigned long prog, unsigned long vers, const char *proto); Generic client creation routine. host identifies the name of the remote host where the server is located. proto indicates which kind of transport protocol to use. The currently supported values for this field are "udp" and "tcp". Default timeouts are set, but can be modified using clnt_control(). : UDP . RPC UDP 8 , . bool_t clnt_control(CLIENT *cl, int req, char *info); , . req , info -- . UDP TCP req : // CLSET_TIMEOUT struct timeval // CLGET_TIMEOUT struct timeval : clnt_control(), , clnt_call(), . CLGET_SERVER_ADDR struct sockaddr_in // get server's address UDP: // CLSET_RETRY_TIMEOUT struct timeval // CLGET_RETRY_TIMEOUT struct timeval -- , <> . clnt_freeres(CLIENT * clnt, xdrproc_t outproc, char *out); , , RPC/XDR, RPC. out -- , outproc -- XDR, . 1, 0 . void clnt_geterr(CLIENT *clnt, struct rpc_err *errp); , errp. void clnt_pcreateerror(const char *s); , RPC . s . clnt_create(), clntraw_create(), clnttcp_create() clntudp_create(). void clnt_perrno(enum clnt_stat stat); , stat. callrpc(). clnt_perror(CLIENT *clnt, const char *s); , RPC . clnt -- , . s . clnt_call(). char *clnt_spcreateerror(const char *s); clnt_pcreateerror(), . : , . char *clnt_sperrno(enum clnt_stat stat); , clnt_perrno(), , RPC , . NEWLINE. clnt_sperrno() clnt_perrno(), ( , ), printf(3), , clnt_perrno(). : clnt_sperror() clnt_spcreateerror(), clnt_sperrno() , . char *clnt_sperror(CLIENT *rpch, const char *s); clnt_perror(), ( clnt_sperrno()) . : , . CLIENT *clntraw_create(unsigned long prognum, unsigned long versnum); RPC prognum versnum. , , , RPC ; svcraw_create(). RPC - . NULL.. CLIENT *clnttcp_create(struct sockaddr_in *addr, unsigned long prognum, unsigned long versnum, int *sockp, unsigned int sendsz, unsigned int recvsz); RPC prognum, versnum; TCP/IP. - *addr. addr->sin_port 0, , ( portmap). sockp -- ; RPC_ANYSOCK, sockp. RPC TCP -, sendsz recvsz; 0 . NULL. CLIENT *clntudp_create(struct sockaddr_in *addr, unsigned long prognum, unsigned long versnum, struct timeval wait, int *sockp); RPC prognum versnum; UDP/IP. - *addr. addr->sin_port 0, , ( portmap). sockp -- ; RPC_ANYSOCK, sockp. UDP , wait, . clnt_call(). : RPC UDP 8 , . CLIENT *clntudp_bufcreate(struct sockaddr_in *addr, unsigned long prognum, unsigned long versnum, struct timeval wait, int *sockp, unsigned int sendsize, unsigned int recosize); RPC prognum versnum; UDP/IP. - *addr. addr->sin_port 0, , ( portmap). sockp -- ; RPC_ANYSOCK, sockp. UDP , wait, . clnt_call(). RPC UDP. void get_myaddress(struct sockaddr_in *addr); IP- *addr, , /etc/hosts. htons(PMAPPORT). struct pmaplist *pmap_getmaps(struct sockaddr_in *addr); A user interface to the portmap service, which returns a list of the current RPC program-to-port mappings on the host located at IP address *addr. This routine can return NULL. The command rpcinfo -p uses this routine. unsigned short pmap_getport(struct sockaddr_in *addr, unsigned long prognum, unsigned long versnum, unsigned int protocol); portmap, , , prognum versnum, , protocol. , protocol IPPROTO_UDP IPPROTO_TCP. 0 , RPC portmap. rpc_createerr RPC. enum clnt_stat pmap_rmtcall(struct sockaddr_in *addr, unsigned long prognum, unsigned long versnum, unsigned long procnum, xdrproc_t inproc, char *in, xdrproc_t outproc, char *out, struct timeval tout, unsigned long *portp); A user interface to the portmap service, which instructs portmap on the host at IP address *addr to make an RPC call on your behalf to a procedure on that host. The parameter *portp will be modified to the program's port number if the procedure succeeds. The definitions of other parameters are discussed in callrpc() and clnt_call(). This procedure should be used for a "ping" and nothing else. See also clnt_broadcast(). bool_t pmap_set(unsigned long prognum, unsigned long versnum, int protocol, unsigned short port); portmap, [prognum,versnum,protocol] port portmap. , protocol IPPROTO_UDP IPPROTO_TCP. 1 0 . svc_register(). bool_t pmap_unset(unsigned long prognum, unsigned long versnum); portmap, [prognum,versnum,*] ports portmap. 1 0 . int registerrpc(unsigned long prognum, unsigned long versnum, unsigned long procnum, char *(*procname)(char *), xdrproc_t inproc, xdrproc_t outproc); procname RPC. prognum versnum procnum, procname ; procname ; inproc , outproc -- . 0 -1 . : , , UDP/IP; svcudp_create(). struct rpc_createerr rpc_createerr; , RPC . clnt_pcreateerror() . void svc_destroy(SVCXPRT *xprt); , RPC xprt. , , , xprt. xprt . fd_set svc_fdset; , RPC; select(2). , , svc_run(). ( select(2)!), svc_getreqset() . int svc_fds; svc_fdset, 32 . , svc_fdset. svc_freeargs(SVCXPRT *xprt, xdrproc_t inproc, char *in); , , RPC/XDR svc_getargs(). 1, , 0 . svc_getargs(SVCXPRT *xprt, xdrproc_t inproc, char *in); , RPC, RPC xprt. in -- , ; inproc -- XDR, . 1 0 . struct sockaddr_in *svc_getcaller(SVCXPRT *xprt); , RPC xprt. void svc_getreqset(fd_set *rdfds); , svc_run(), . , select(2) , RPC - RPC; rdfds -- . , rdfds. void svc_getreq(int rdfds); svc_getreqset(), 32 . , svc_getreqset(). bool_t svc_register(SVCXPRT *xprt, unsigned long prognum, unsigned long versnum, void (*dispatch)(struct svc_req *, SVCXPRT *), unsigned long protocol); prognum versnum dispatch. protocol 0, portmap. protocol 0, [prognum,versnum,protocol] xprt->xp_port portmap (, protocol 0, IPPROTO_UDP IPPROTO_TCP). dispatch : dispatch(struct svc_req *request, SVCXPRT *xprt); svc_register() 1 0 . void svc_run(void); . RPC svc_getreq(). , select(2). bool_t svc_sendreply(SVCXPRT *xprt, xdrproc_t outproc, char *out); RPC . xprt -- ; outproc -- XDR, ; out -- , . 1 0 . void svc_unregister(unsigned long prognum, unsigned long versnum); [prognum,versnum] [prognum,versnum,*] . void svcerr_auth(SVCXPRT *xprt, enum auth_stat why); , . void svcerr_decode(SVCXPRT *xprt); , . svc_getargs(). void svcerr_noproc(SVCXPRT *xprt); , , . void svcerr_noprog(SVCXPRT *xprt); , RPC. , . void svcerr_progvers(SVCXPRT *xprt, unsigned long low_vers, unsigned long high_vers); , RPC. , . void svcerr_systemerr(SVCXPRT *xprt); , - . , , . void svcerr_weakauth(SVCXPRT *xprt); . svcerr_auth(xprt, AUTH_TOOWEAK). SVCXPRT *svcfd_create(int fd, unsigned int sendsize, unsigned int recvsize); . , , TCP. sendsize recvsize . , . SVCXPRT *svcraw_create(void); RPC . , RPC ; clntraw_create(). RPC RPC (, , ) - . NULL. SVCXPRT *svctcp_create(int sock, unsigned int send_buf_size, unsigned int recv_buf_size); RPC TCP/IP . sock, RPC_ANYSOCK; . TCP, . xprt->xp_sock , xprt->xp_port -- . NULL. RPC TCP -, ; . SVCXPRT *svcudp_bufcreate(int sock, unsigned int sendsize, unsigned int recosize); RPC UDP/IP . sock, RPC_ANYSOCK; . UDP, . xprt->xp_sock , xprt->xp_port -- . NULL. RPC UDP. SVCXPRT *svcudp_create(int sock); svcudp_bufcreate(sock,SZ,SZ) SZ . bool_t xdr_accepted_reply(XDR *xdrs, struct accepted_reply *ar); RPC. , RPC- RPC. bool_t xdr_authunix_parms(XDR *xdrs, struct authunix_parms *aupp); (credentials) UNIX. , RPC. void xdr_callhdr(XDR *xdrs, struct rpc_msg *chdr); RPC. , RPC- RPC. bool_t xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg); RPC. , RPC- RPC. bool_t xdr_opaque_auth(XDR *xdrs, struct opaque_auth *ap); RPC. , RPC- RPC. bool_t xdr_pmap(XDR *xdrs, struct pmap *regs); portmap . , pmap. bool_t xdr_pmaplist(XDR *xdrs, struct pmaplist **rp); . , pmap. bool_t xdr_rejected_reply(XDR *xdrs, struct rejected_reply *rr); RPC. , RPC- RPC. bool_t xdr_replymsg(XDR *xdrs, struct rpc_msg *rmsg); RPC. , RPC- RPC. void xprt_register(SVCXPRT *xprt); RPC RPC. svc_fds. , . void xprt_unregister(SVCXPRT *xprt); RPC RPC. svc_fds. , . attributes(7). +----------------------------+----------------------------------------------------------+--------------------------+ | | | | +----------------------------+----------------------------------------------------------+--------------------------+ |auth_destroy(), | | MT-Safe | |authnone_create(), | | | |authunix_create(), | | | |authunix_create_default(), | | | |callrpc(), | | | |clnt_broadcast(), | | | |clnt_call(), | | | |clnt_destroy(), | | | |clnt_create(), | | | |clnt_control(), | | | |clnt_freeres(), | | | |clnt_geterr(), | | | |clnt_pcreateerror(), | | | |clnt_perrno(), | | | |clnt_perror(), | | | |clnt_spcreateerror(), | | | |clnt_sperrno(), | | | |clnt_sperror(), | | | |clntraw_create(), | | | |clnttcp_create(), | | | |clntudp_create(), | | | |clntudp_bufcreate(), | | | |get_myaddress(), | | | |pmap_getmaps(), | | | |pmap_getport(), | | | |pmap_rmtcall(), pmap_set(), | | | |pmap_unset(), | | | |registerrpc(), | | | |svc_destroy(), | | | |svc_freeargs(), | | | |svc_getargs(), | | | |svc_getcaller(), | | | |svc_getreqset(), | | | |svc_getreq(), | | | |svc_register(), svc_run(), | | | |svc_sendreply(), | | | |svc_unregister(), | | | |svcerr_auth(), | | | |svcerr_decode(), | | | |svcerr_noproc(), | | | |svcerr_noprog(), | | | |svcerr_progvers(), | | | |svcerr_systemerr(), | | | |svcerr_weakauth(), | | | |svcfd_create(), | | | |svcraw_create(), | | | |svctcp_create(), | | | |svcudp_bufcreate(), | | | |svcudp_create(), | | | |xdr_accepted_reply(), | | | |xdr_authunix_parms(), | | | |xdr_callhdr(), | | | |xdr_callmsg(), | | | |xdr_opaque_auth(), | | | |xdr_pmap(), xdr_pmaplist(), | | | |xdr_rejected_reply(), | | | |xdr_replymsg(), | | | |xprt_register(), | | | |xprt_unregister() | | | +----------------------------+----------------------------------------------------------+--------------------------+ . xdr(3) : Remote Procedure Calls: Protocol Specification Remote Procedure Call Programming Guide rpcgen Programming Guide RPC: Remote Procedure Call Protocol Specification, RFC 1050, Sun Microsystems, Inc., USC-ISI. aereiae , Azamat Hackimov , Dmitriy S. Seregin , Katrin Kutepova , Lockal , Yuri Kozlov , ; GNU 3 , . . , , . Linux man-pages 6.06 31 2023 . rpc(3)