librpcsvc
for sun).
/usr/include/rpcsvc
for details.
#include <stdio.h> #include <stdlib.h> #include <rpcsvc/rstat.h> int main(int argc, char * argv[]) const int dsk = havedisk(argv[1]); if (dsk < 0) cerr << "havedisk(" << argv[1] << ") failed.\n" return EXIT_FAILURE cout << argv[1] << (dsk ? "has" : "doesn't have") << " a disk.\n";
$ make cc-high-rstat g++ -c cc-high-rstat.cc -o cc-high-rstat.o g++ -o cc-high-rstat cc-high-rstat.o -lrpcsvc $ uname -a SunOS clayton 5.7 Generic_106541-11 sun4u sparc SUNW,Ultra-5_10 $ cc-high-rstat cslab05 cslab05 has a disk. $ cc-high-rstat clayton clayton has a disk. $ cc-high-rstat starbase.se.monmouth.edu starbase.se.monmouth.edu has a disk. $ cc-high-rstat cslab00 havedisk(cslab00) failed. $ rsh cslab00 ps -Af | grep -i rpc root 156 1 0 /usr/sbin/rpcbind root 186 1 0 /usr/lib/netsvc/yp/rpc.ypupdated root 171 169 0 rpc.nisd_resolv -F -C 8 root 667 1 0 /usr/sbin/rpc.bootparamd root 785 213 0 /usr/dt/bin/rpc.ttdbserverd $ rsh cslab05 ps -Af | grep -i rpc root 105 1 0 /usr/sbin/rpcbind root 338 142 0 rpc.ttdbserverd daemon 537 142 0 rpc.cmsd root 2835 142 0 rpc.rstatd
rpc_call()
- make an rpc-service call.
rpc_reg()
- register an rpc-service call.
rpc_run()
- execute an rpc service.
$ cat rusers.c #include <utmpx.h> #include <rpc/rpc.h> #include <rpcsvc/rusers.h> int main(int argc, char * argv[]) unsigned int nusers const enum clnt_stat cs = rpc_call( argv[1], // host RUSERS_PROG, // service RUSERS_VERS, // version RUSERS_PROC_NUM, // call xdr_void, // marshal 0, // input xdr_u_int, // unmarshal (char *) &nusers, // output "visible") // protocol if cs != RPC_SUCCESS clnt_perrno(cs) exit(EXIT_FAILURE) cout << nusers << " users on " << argv[1]) << "\n"
$ gcc -o rusers rusers.c -lrpcsvc -lnsl $ ./rusers cslab18 0 users on cslab18. $ ./rusers cslab00 38 users on cslab00. $ ./rusers enterprise.se.monmouth.edu RPC: Program/version mismatch $ ./rusers rockhopper.monmouth.edu RPC: Program not registered $ ./rusers moncol.monmouth.edu RPC: Program not registered $ ./rusers bluehawk.monmouth.edu RPC: Program/version mismatch $
#include <rpc/rpc.h> int main() const int e = rpc_reg( ENCRYPT_SVR, // service ENCRYPT_VER, // version ENCRYPT_PROCNO, // call encrypt, // procedure xdr_string, // marshal xdr_string, // unmarshal "visible") // protocol if (e == -1) perror("rpc_reg() failed") exit(EXIT_FAILURE) svc_run() /* Doesn't return. */
#include <utmpx.h> #include <rpc/rpc.h> #include <rpcsvc/rusers.h> int main(int argc, char * argv[]) unsigned int nusers enum clnt_stat cs = rpc_call( argv[1], ENCRYPT_PROG, ENCRYPT_VERS, ENCRYPT_PROCNUM, xdr_string, (char *) &clear, xdr_u_int, (char *) &cypher, "visible") if cs != RPC_SUCCESS clnt_perrno(cs) exit(EXIT_FAILURE)
#include <stdio.h> #include <stdlib.h> #define PORTMAP #include <rpc/rpc.h> #include <rpcsvc/rstat.h> #include <rpc/xdr.h> int main(int argc, char * argv[]) if argc != 2 fprintf(stderr, "Command format is \"%s hostname\".\n", argv[0]) return EXIT_FAILURE int dsk; enum clnt_stat stat = callrpc(argv[1], RSTATPROG, RSTATVERS_VAR, RSTATPROC_HAVEDISK, xdr_void, 0, xdr_u_long, &dsk) if stat clnt_perrno(stat) return EXIT_FAILURE printf("%s %s a disk.\n", argv[1], dsk ? "has" : "doesn't have") return EXIT_SUCCESS
$ make cc-mid-rstat g++ -c cc-mid-rstat.cc -o cc-mid-rstat.o g++ -o cc-mid-rstat cc-mid-rstat.o -lnsl $ cc-mid-rstat clayton clayton has a disk. $ cc-mid-rstat cslab05 cslab05 has a disk. $ cc-mid-rstat starbase.se.monmouth.edu RPC: Program/version mismatch $
int main(int argc, char * argv[]) struct hostent *hp if (hp = gethostbyname(argv[1])) == NULL fprintf(stderr, "can't get addr for %s\n",argv[1]) return EXIT_FAILURE int sock = RPC_ANYSOCK struct timeval pertry_timeout, total_timeout struct sockaddr_in server_addr pertry_timeout.tv_sec = 3 pertry_timeout.tv_usec = 0 bcopy(hp->h_addr, (caddr_t)&server_addr.sin_addr, hp->h_length) server_addr.sin_family = AF_INET server_addr.sin_port = 0 CLIENT *client = clntudp_create(&server_addr, RSTATPROG, RSTATVERS_VAR, pertry_timeout, &sock) if NULL == client clnt_pcreateerror("clntudp_create") return EXIT_FAILURE total_timeout.tv_sec = 20 total_timeout.tv_usec = 0 unsigned long dsk enum clnt_stat stat = clnt_call( client, RSTATPROC_HAVEDISK, (bool_t (*)(XDR *, void *)) xdr_void, 0, xdr_u_long, (char *) &dsk, total_timeout) if stat != RPC_SUCCESS clnt_perror(client, "rpc") return EXIT_FAILURE printf("%s %s a disk.\n", argv[1], dsk ? "has" : "doesn't have") clnt_destroy(client) close(sock) return EXIT_SUCCESS
$ cc-low-rstat cslab05 cslab05 has a disk. $ cc-low-rstat cslab00 clntudp_create: RPC: Program not registered $ cc-low-rstat starbase.se.monmouth.edu rpc: RPC: Program/version mismatch; low version = 1, high version = 3 $
This page last modified on 17 January 2004.