Time Server Program (rpcgen)
Example D-4 rpcgen Program: time.x
/*
* time.x: Remote time protocol
*/
program TIMEPROG {
version TIMEVERS {
unsigned int TIMEGET(void) = 1;
} = 1;
} = 0x20000044;
#ifdef RPC_SVC
%int *
%timeget_1()
%{
% static int thetime;
%
% thetime = time(0);
% return (&thetime);
%}
#endif
|
Add Two Numbers Program (rpcgen)
Example D-5 rpcgen program: Add Two Numbers
/* This program contains a procedure to add 2 numbers to
demonstrate
* some of the features of the new rpcgen. Note that add() takes 2
* arguments in this case.
*/
program ADDPROG { /* program number */
version ADDVER { /* version number */
int add ( int, int ) /* procedure */
= 1;
} = 1;
} = 199;
|
Spray Packets Program (rpcgen)
Refer to the notes section on the spray(1M) man page for information about using
this tool.
Example D-6 rpcgen program: spray.x
/*
* Copyright (c) 1987, 1991 by Sun Microsystems, Inc.
*/
/* from spray.x */
#ifdef RPC_HDR
#pragma ident "@(#)spray.h 1.2 91/09/17 SMI"
#endif
/*
* Spray a server with packets
* Useful for testing flakiness of network interfaces
*/
const SPRAYMAX = 8845; /* max amount can spray */
/*
* GMT since 0:00, 1 January 1970
*/
struct spraytimeval {
unsigned int sec;
unsigned int usec;
};
/*
* spray statistics
*/
struct spraycumul {
unsigned int counter;
spraytimeval clock;
};
/*
* spray data
*/
typedef opaque sprayarr<SPRAYMAX>;
program SPRAYPROG {
version SPRAYVERS {
/*
* Just throw away the data and increment the counter. This
* call never returns, so the client should always time it
out.
*/
void
SPRAYPROC_SPRAY(sprayarr) = 1;
/*
* Get the value of the counter and elapsed time since last
* CLEAR.
*/
spraycumul
SPRAYPROC_GET(void) = 2;
/*
* Clear the counter and reset the elapsed time
*/
void
SPRAYPROC_CLEAR(void) = 3;
} = 1;
} = 100012;
|
Print Message Program With Remote Version
Example D-7 printmesg.c
/* printmsg.c: print a message on the console */
#include <stdio.h>
main(argc, argv)
int argc;
char *argv[];
{
char *message;
if (argc != 2) {
fprintf(stderr, "usage: %s <message>\n", argv[0]);
exit(1);
}
message = argv[1];
if( !printmessage(message) ) {
fprintf(stderr, "%s: couldn't print your message\n",
argv[0]);
exit(1);
}
printf("Message Delivered!\n");
exit(0);
}
/* Print a message to the console. */
/*
* Return a boolean indicating whether the message was actually
* printed.
*/
printmessage(msg)
char *msg;
{
FILE *f;
if = fopen("/dev/console","w");
if (f == (FILE *)NULL)
return (0);
fprintf(f,"%sen", msg);
fclose(f);
return (1);
}
|
Example D-8 Remote Version of printmesg.c
/* * rprintmsg.c: remote version of "printmsg.c" */
#include <stdio.h>
#include <rpc/rpc.h> /* always needed */
#include "msg.h" /* msg.h generated by rpcgen */
main(argc, argv)
int argc;
char *argv[];
{
CLIENT *cl;
int *result;
char *server;
char *message;
extern int sys_nerr;
extern char *sys_errlist[];
if (argc != 3) {
fprintf(stderr,"usage: %s host messagen", argv[0]);
exit(1);
}
/*
* Save values of command line arguments
*/
server = argv[1];
message = argv[2];
/*
* Create client"handle" used for calling
* MESSAGEPROG on the server
* designated on the command line.
*/
cl = clnt_create(server, MESSAGEPROG, PRINTMESSAGEVERS,
"visible");
if (cl == (CLIENT *)NULL) {
/*
* Couldn't establish connection with server.
* Print error message and die.
*/
clnt_pcreateerror(server);
exit(1);
}
/* Call the remote procedure "printmessage" on the server */
result = printmessage_1(&message, cl);
if (result == (int *)NULL) {
/*
* An error occurred while calling the server.
* Print error message and die.
*/
clnt_perror(cl, server);
exit(1);
}
/* Okay, we successfully called the remote procedure. */
if (*result == 0) {
/*
* Server was unable to print our message.
* Print error message and die.
*/
fprintf(stderr,"%s"
}
/* The message got printed on the server's console */
printf("Message delivered to %s!\n", server);
exit(0);
}
|
Example D-9 rpcgen Program: msg.x
/* msg.x: Remote message printing protocol */
program MESSAGEPROG {
version MESSAGEVERS {
int PRINTMESSAGE(string) = 1;
} = 1;
} = 0x20000001;
|
Example D-10 mesg_proc.c
/*
* msg_proc.c: implementation of the remote
* procedure "printmessage"
*/
#include <stdio.h>
#include <rpc/rpc.h> /* always needed */
#include "msg.h" /* msg.h generated by rpcgen */
/*
* Remote version of "printmessage"
*/
/*ARGSUSED1*/
int printmessage_1(msg, req)
char **msg;
struct svc_req *req;
{
static int result; /* must be static! */
FILE *f;
f = fopen("/dev/console", "w");
if (f == (FILE *)NULL) {
result = 0;
return (&result);
}
fprintf(f, "%sen", *msg);
fclose(f);
result = 1;
return (&result);
}
|