3.3.1 CUPとSPPの作成
CUPとSPPの構成例を次の図に示します。例題では,Windows環境以外の場合を示します。
|
|
000010 #include <stdio.h>
000020 #include <stdlib.h>
000030 #include <string.h>
000040 #include <dcvclt.h>
000050 #include <dcvrpc.h>
000060
000070 #define BUFSIZE 512
000080 #define SERVICE "spp01"
000090
000100 main()
000110 {
000120 char in[BUFSIZE];
000130 DCULONG in_len;
000140 char out[BUFSIZE];
000150 DCULONG out_len;
000160 char indata[BUFSIZE];
000170 DCLONG rc;
000180 DCCLT_ID cltid;
000190 char clt_flag = 0;
000200 char rpc_flag = 0;
000210
000220 /*
000230 * クライアントユーザの認証要求
000240 */
000250 if((rc = dc_clt_cltin_s(NULL, &cltid, NULL, NULL, "user01", "puser01",
000260 NULL, DCNOFLAGS)) != DC_OK){
000270 printf("cup01: dc_clt_cltin_sに失敗しました。CODE=%d\n", rc);
000280 goto PROG_EXIT;
000290 }
000300 clt_flag = 1;
000310
000320 /*
000330 * RPC-OPEN(RPC環境の初期設定)
000340 */
000350 if((rc = dc_rpc_open_s(cltid, DCNOFLAGS)) != DC_OK) {
000360 printf("cup01: dc_rpc_open_sに失敗しました。CODE=%d\n", rc);
000370 goto PROG_END;
000380 }
000390 rpc_flag = 1;
000400
000410 while (1) {
000420 printf("****** 伝言板メニュー ******\n");
000430 printf("伝言の取り出し ... [1] 伝言の書き込み ... [2]\n");
000440 printf("終了 ............. [9]\n");
000450 printf("番号を入力して下さい。=>");
000460 gets(indata);
000470
000480 if(indata[0] == '1') {
000490
000500 /*
000510 * RPC-CALL(RPCの実行)
000520 */
000530 strcpy(in, "cup01");
000540 in_len = strlen(in) + 1;
000550 out_len = sizeof(out);
000560 if((rc = dc_rpc_call_s(cltid, SERVICE, "get", in, &in_len, out,
000570 &out_len, DCNOFLAGS)) != DC_OK) {
000580 printf("cup01: dc_rpc_call_sに失敗しました。CODE=%d\n", rc);
000590 goto PROG_END;
000600 }
000610 printf("伝言の内容: %s\n", out);
000620 }
000630
000640 else if(indata[0] == '2') {
000650 printf("伝言を入力して下さい =>");
000660 gets(indata);
000670 if(indata[0] == '\0') {
000680 strcpy(indata, "伝言はありません。\n");
000690 }
000700
000710 /*
000720 * RPC-CALL(RPCの実行)
000730 */
000740 strcpy(in, indata);
000750 in_len = strlen(in) + 1;
000760 out_len = sizeof(out);
000770 if((rc = dc_rpc_call_s(cltid, SERVICE, "put", in, &in_len, out,
000780 &out_len, DCNOFLAGS)) != DC_OK) {
000790 printf("cup01: dc_rpc_call_sに失敗しました。CODE=%d\n", rc);
000800 goto PROG_END;
000810 }
000820 printf("%s\n", out);
000830 }
000840
000850 else if(indata[0] == '9') {
000860 break;
000870 }
000880
000890 else {
000900 continue;
000910 }
000920 }
000930
000940 PROG_END:
000950 /*
000960 * RPC-CLOSE(RPC環境の解除)
000970 */
000980 if(rpc_flag) {
000990 dc_rpc_close_s(cltid, DCNOFLAGS);
001000 }
001010
001020 PROG_EXIT:
001030 if(clt_flag) {
001040 dc_clt_cltout_s(cltid, DCNOFLAGS);
001050 }
001060 exit(0);
001070 }この例題で使用する,SPPのコーディング例(メイン関数 DAMアクセス)を次に示します。
000010 #include <stdio.h>
000020 #include <dcrpc.h>
000030 #include <dcdam.h>
000040 #define DAMFILE "damfile0"
000050
000060 int damfd;
000070
000080 main()
000090 {
000100 int rc;
000110
000120 /*
000130 * RPC-OPEN(UAPの開始)
000140 */
000150 if ((rc = dc_rpc_open(DCNOFLAGS)) != DC_OK) {
000160 printf("spp01: dc_rpc_openに失敗しました。CODE=%d\n", rc);
000170 goto PROG_END;
000180 }
000190 /*
000200 * DAM-OPEN(論理ファイルのオープン)
000210 */
000220 if ((rc = dc_dam_open(DAMFILE,DCDAM_BLOCK_EXCLUSIVE)) < 0) {
000230 printf("spp01: dc_dam_openに失敗しました。CODE=%d\n", rc);
000240 goto PROG_END;
000250 }
000260 damfd = rc;
000270 /*
000280 * RPC-MAINLOOP(SPPのサービス開始)
000290 */
000300 printf("spp01: mainloopに入ります。\n");
000310 if ((rc = dc_rpc_mainloop(DCNOFLAGS)) != DC_OK) {
000320 printf("spp01: dc_rpc_mainloopに失敗しました。CODE=%d\n",rc);
000330 }
000340 /*
000350 * DAM-CLOSE(論理ファイルのクローズ)
000360 */
000370 if ((rc = dc_dam_close(damfd, DCNOFLAGS)) != DC_OK) {
000380 printf("spp01: dc_dam_closeに失敗しました。CODE=%d\n", rc);
000390 }
000400 PROG_END:
000410 /*
000420 * RPC-CLOSE(UAPの終了)
000430 */
000440 dc_rpc_close(DCNOFLAGS);
000450 printf("spp01: SPPのサービス処理を終了します。\n");
000460 exit(0);
000470 }この例題で使用する,SPPのコーディング例(サービス関数 DAMアクセス)を次に示します。
000010 #include <stdio.h>
000020 #include <string.h>
000030 #include <dcrpc.h>
000040 #include <dctrn.h>
000050 #include <dcdam.h>
000060 #define DAMBLKSIZE 504
000070
000080 extern int damfd;
000090 static char damblk[DAMBLKSIZE];
000100
000110 void get(in, in_len, out, out_len)
000120 char *in;
000130 DCULONG *in_len;
000140 char *out;
000150 DCULONG *out_len;
000160 {
000170 int rc;
000180 struct DC_DAMKEY keyptr;
000190 static char *service = "get";
000200
000210 printf("%s: %sからのサービス要求を受け付けました。\n", service, in);
000220
000230 /*
000240 * TRN-BEGIN(トランザクションの開始)
000250 */
000260 if ((rc = dc_trn_begin()) != DC_OK) {
000270 sprintf(out, "%s: dc_trn_beginに失敗しました。CODE=%d\n",
000280 service,rc);
000290 printf("%s", out);
000300 goto PROG_END;
000310 }
000320 /*
000330 * DAM_READ(DAMファイルの読み込み)
000340 */
000350 keyptr.fstblkno = 0;
000360 keyptr.endblkno = 0;
000370 if ((rc = dc_dam_read(damfd, &keyptr, 1, damblk, DAMBLKSIZE,
000380 DCDAM_REFERENCE | DCDAM_NOWAIT)) != DC_OK) {
000390 sprintf(out, "%s: dc_dam_readに失敗しました。CODE=%d\n",
000400 service,rc);
000410 printf("%s", out);
000420 goto TRN_COMMIT;
000430 }
000440 strncpy(out, damblk, *out_len);
000450
000460 TRN_COMMIT:
000470 /*
000480 * TRN_UNCHAINED_COMMIT(非連鎖モードのコミット)
000490 */
000500 if ((rc = dc_trn_unchained_commit()) != DC_OK) {
000510 sprintf(out, "%s: dc_trn_unchained_commitに失敗しました。CODE=%d\n",
000520 service, rc);
000530 printf("%s", out);
000540 }
000550 PROG_END:
000560 *out_len = strlen(out) + 1;
000570 return;
000580 }
000590
000600 void put(in, in_len, out, out_len)
000610 char *in;
000620 DCULONG *in_len;
000630 char *out;
000640 DCULONG *out_len;
000650 {
000660 int rc;
000670 struct DC_DAMKEY keyptr;
000680 static char *service = "put";
000690
000700 printf("%s: サービス要求を受け付けました。\n", service);
000710
000720 /*
000730 * TRN-BEGIN(トランザクションの開始)
000740 */
000750 if ((rc = dc_trn_begin()) != DC_OK) {
000760 sprintf(out, "%s: dc_trn_beginに失敗しました。CODE=%d\n",
000770 service,rc);
000780 printf("%s", out);
000790 goto PROG_END;
000800 }
000810 /*
000820 * DAM_WRITE(DAMファイルへ書き込み)
000830 */
000840 keyptr.fstblkno = 0;
000850 keyptr.endblkno = 0;
000860 strncpy(damblk, in, DAMBLKSIZE);
000870 if ((rc = dc_dam_write(damfd, &keyptr, 1, damblk,
000880 DAMBLKSIZE, DCDAM_WAIT)) != DC_OK) {
000890 sprintf(out, "%s: dc_dam_writeに失敗しました。CODE=%d\n",
000900 service, rc);
000910 printf("%s", out);
000920 dc_trn_unchained_rollback();
000930 goto PROG_END;
000940 }
000950 sprintf(out, "%s: 正常に処理を終了しました。\n", service);
000960 /*
000970 * TRN_UNCHAINED_COMMIT(非連鎖モードのコミット)
000980 */
000990 if ((rc = dc_trn_unchained_commit()) != DC_OK) {
001000 sprintf(out, "%s: dc_trn_unchained_commitに失敗しました。CODE=%d\n",
001010 service, rc);
001020 printf("%s", out);
001030 }
001040 PROG_END:
001050 *out_len = strlen(out) + 1;
001060 return;
001070 }