ONC+ Developer's Guide

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);
}