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.