7.1.3 SPPの例(サービス関数)
SPPのサービス関数のコーディング例を次に示します。
10 /* 20 *SVR01 サービス関数 30 */ 40 #include <stdio.h> 50 #include <string.h> 60 #include <dcrpc.h> 70 #include <dcdam.h> 80 #define DAMFILE "damfile0" 90 #define DAM_BLK_SIZE 504 100 #define REWRITE_LEN 19 110 extern int damfd; 120 130 void svr01(in_data,in_leng,out_data,out_leng) 140 char *in_data; 150 DCLONG *in_leng; 160 char *out_data; 170 DCLONG *out_leng; 180 { 190 /* 200 *変数の定義 210 */ 220 static struct DC_DAMKEY keyptr; 230 static char *damc_buf; 240 static char dam_cntl_buf[DAM_BLK_SIZE]; 250 static char write_buf[DAM_BLK_SIZE]; 260 struct dam_cntl_p { 270 int w_point; 280 char rewrite_data[REWRITE_LEN]; 290 } *dam_cntl_p; 300 int rc; 310 int write_size; 320 int rewrite_size; 330 int damc_buf_size; 340 350 keyptr.fstblkno = 0; 360 keyptr.endblkno = 0; 370 damc_buf_size = DAM_BLK_SIZE; 380 printf("SVR01:処理の開始 \n"); 390 /* 400 *DAM_READ(論理ファイルからブロックの入力) 410 */ 420 rc = dc_dam_read(damfd,&keyptr,1,dam_cntl_buf, 430 damc_buf_size,DCDAM_MODIFY); 440 if(rc != DC_OK) { 450 printf("SVR01:dc_dam_readに失敗しました。CODE = %d \n",rc); 460 strcpy(out_data,"SVR01:DAM READ FAILED"); 470 *out_leng = strlen(out_data); 480 goto PROG_END; 490 } 500 /* 510 *DAM_WRITE(論理ファイルへブロックの出力) 520 *DAM_REWRITE(論理ファイルのブロックの更新) 530 */ 540 DAM_WRITE: 550 dam_cntl_p = (struct dam_cntl_p *)dam_cntl_buf; 560 write_size = DAM_BLK_SIZE; 570 memcpy(write_buf,in_data,*in_leng); 580 dam_cntl_p->w_point = dam_cntl_p->w_point + 1; 590 keyptr.fstblkno = dam_cntl_p->w_point; 600 keyptr.endblkno = 0; 610 rc = dc_dam_write(damfd,&keyptr,1,write_buf, 620 write_size,DCNOFLAGS); 630 if(rc != DC_OK) { 640 if(rc == DCDAMER_BNOER) { 650 dam_cntl_p->w_point = 0; 660 goto DAM_WRITE; 670 } 680 printf("SVR01:dc_dam_writeに失敗しました。CODE = %d \n",rc); 690 strcpy(out_data,"SVR01;DAM WRITE FAILED"); 700 *out_leng = strlen(out_data); 710 goto PROG_END; 720 } 730 keyptr.fstblkno = 0; 740 keyptr.endblkno = 0; 750 damc_buf_size = DAM_BLK_SIZE; 760 sprintf(dam_cntl_p->rewrite_data,"REWRITE COMPLETE\n"); 770 rc = dc_dam_rewrite(damfd,&keyptr,1,dam_cntl_buf, 780 damc_buf_size,DCDAM_UPDATE); 790 if(rc != DC_OK) { 800 printf("SVR01:dc_dam_rewriteに失敗しました。CODE = %d\n",rc); 810 strcpy(out_data,"SVR01:DAM REWRITE FAILED"); 820 *out_leng = strlen(out_data); 830 } 840 strcpy(out_data,"SVR01:PROCESS COMPLETE"); 850 *out_leng = strlen(out_data); 860 PROG_END: 870 printf("SVR01:処理を終了します。\n"); 880 return; 890 }