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 }