クライアントプログラムのこの部分は、コマンド行入力を受け入れて、クライアントハンドルを作成します。
#include <stdio.h> #include <stdlib.h> #include <rpc/rpc.h> #include <netdb.h> #include <tsix/t6attrs.h> #include "rpc_test.h" extern int main(int argc, char *argv[]) { struct timeval time_out; CLIENT *handlep; enum clnt_stat stat; int input, output; uid_t uid; if (argc < 2 || argc > 3) { fprintf(stderr, "Usage: simple_rpc_clnt_test HOSTNAME [UID]¥n"); exit(1); } handlep = clnt_create(argv[1], RPC_TEST_PROG, RPC_TEST_VERS, "udp"); if (handlep == (CLIENT *) NULL) { fprintf(stderr, "Couldn't create client%s.¥n", clnt_spcreateerror("")); exit(1); }
クライアントプログラムのこの部分は、コマンド行から入力されるユーザー ID に割り当てられる領域を指すようにクライアントハンドルを設定し、ユーザー ID 値を設定し、その値をサーバープロセスに送信し、サーバー応答を待機します。クライアントは、サーバー応答を出力して終了します。
クライアントプログラムは、変更された発信ユーザー ID を送信するために有効セットに net_setid 特権を必要とします。コード内のコメントは、特権のブラケットが必要な位置を示します。
if (argc == 3) { handlep->cl_tsol_outgoing_attrsp = t6alloc_blk(T6M_UID); if (handlep->cl_tsol_outgoing_attrsp == NULL) { fprintf(stderr, "Can't create attr buffer¥n"); exit(1); } printf ("Sending UID %s¥n", argv[2]); uid = atoi(argv[2]); if (t6set_attr(T6_UID, &uid, handlep->cl_tsol_outgoing_attrsp) != 0) { fprintf(stderr, "Error returned by t6set_attr.¥n"); exit(1); } } time_out.tv_sec = 30; time_out.tv_usec = 0; input = 3; /* 有効セット内で net_uid をオン (有効) にする */ stat = clnt_call( handlep, RPC_TEST_DOUBLE1, xdr_int, (caddr_t) &input, xdr_int, (caddr_t) &output, time_out); if (stat != RPC_SUCCESS) { fprintf(stderr, "Call failed. %s.¥n", clnt_sperror(handlep, "")); exit(1); } /* net_uid をオフ (無効) にする */ printf("Response received: %d¥n", output); (void) clnt_destroy(handlep); return (0); }