メッセージ表示プログラムとそのリモートバージョン
例 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);
}