ONC+ 開発ガイド

メッセージ表示プログラムとそのリモートバージョン


例 D–7 printmesg.c

/* printmsg.c: コンソールへメッセージを出力 */
#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);
}

/* コンソールへメッセージを出力 */

/*
 * メッセージを実際に出力したかどうかを示すブール値を返す。
 */
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);
}


例 D–8 printmesg.c のリモートバージョン

/*  * rprintmsg.c: "printmsg.c” のリモートバージョン */ 
#include <stdio.h> 
#include <rpc/rpc.h> /* 必ず必要 */ 
#include "msg.h”     /* 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);
	}
	/* 
	 * コマンド行引数の値を保存
	 */
	server = argv[1];
	message = argv[2]; 
/*
 * コマンド行で指定したサーバー上の MESSAGEPROG を呼び出すために使用する
 * クライアント「ハンドル」を作成
 */ 
	cl = clnt_create(server, MESSAGEPROG, PRINTMESSAGEVERS,
	                 "visible");
	if (cl == (CLIENT *)NULL) {
		/* 
		 * サーバーとの接続の確立に失敗。
		 * エラーメッセージを出力し終了。
		 */
		clnt_pcreateerror(server);
		exit(1);
	}
	/* サーバー上でリモートプロシージャ "printmessage" を呼び出す */
	result = printmessage_1(&message, cl);
	if (result == (int *)NULL) {  	
	/*
	 * サーバーの呼び出し中にエラーが発生
	 * エラーメッセージを出力し終了。
	 */ 
		clnt_perror(cl, server);
		exit(1);
	}
	/* リモートプロシージャの呼び出しに成功 */
	if (*result == 0) { 
		/*
		 * サーバーはメッセージの出力に失敗。
		 * エラーメッセージを出力し終了。
		 */
		fprintf(stderr,"%s"
	}
/* サーバーのコンソール上にメッセージを出力 */
	printf("Message delivered to %s!\n", server);
	exit(0);
}


例 D–9 rpcgen プログラム: msg.x

/* msg.x: リモートメッセージ出力プロトコル */
program MESSAGEPROG {
 	version MESSAGEVERS {
 		int PRINTMESSAGE(string) = 1;
 	} = 1;
} = 0x20000001;


例 D–10 mesg_proc.c

/*
 * msg_proc.c: リモートプロシージャ "printmessage" の実装
 */

#include <stdio.h>
#include <rpc/rpc.h> 	/* 必ず必要 */
#include "msg.h” 	/* rpcgen が 生成 */

/*
 * "printmessage" のリモートバージョン
 */
/*ARGSUSED1*/
int printmessage_1(msg, req)
	char **msg;
	struct svc_req *req;
{
	static int result; /* 必ず 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);
}