Netcompo アプリケーション会話サービス 2.1.1 LU0会話サービス編 - Solaris OE -
目次 索引 前ページ次ページ

付録A アプリケーションプログラム例

以下に、LU0会話サービスを使用するアプリケーションプログラムの、プログラム例を示します。

A.1 同期型アプリケーションの例

/*====================================================================*
 *     アプリケーションプログラム例  1                                *
 *                                                                    *
 *         (1)  main     :  メイン処理(同期型)                      *
 *         (2)  procend  :  プロセス終了処理                          *
 *                                                                    *
 *====================================================================*/

#include  <sys/types.h>
#include  <stdio.h>
#include  <memory.h>
#include  <errno.h>

#include  "lu0.h"

/*---------------------------------------------*/
/*      エントリーモジュール                   */
/*---------------------------------------------*/

void    main(int, char **);
void    procend(struct lu0rb *, int); 

/*---------------------------------------------*/
/*      グローバル変数                         */
/*---------------------------------------------*/

char              *luname = "lu02";         /* LU名                   */
char              *wbufp;                   /* 送信バッファポインタ   */
char              *rbufp;                   /* 受信バッファポインタ   */

/*---------------------------------------------*/
/*      ローカル定義                           */
/*---------------------------------------------*/

#define NORMAL  0                           /* マクロ命令復帰値正常   */

/*====================================================================*
 *      function name  :  (1) main                                    *
 *      function       :  メイン処理(同期型)                        *
 *====================================================================*/
void
main
 (
    int argc, 
    char **argv
) 
 {    
   struct  lu0rb      rcb;                  /* rcb                    */
   struct  lu0rb     *rcbp;                 /* rcbポインタ            */
   int                status;               /* 状態                   */
   int                dc;                   /* 送信データ作成用       */

/*=============================================*/
/*   rcbの初期化                               */
/*=============================================*

    rcbp  =  &rcb;                          /* rcbアドレス設定        */

/*=============================================*/
/*   内部状態の初期化                          */
/*=============================================*/

    status = 0;                             /*状態:初期状態             */

/*=============================================*/
/*   lu0open1  マクロ処理                      */
/*   <<< アプリ登録 >>>                        */
/*=============================================*/

    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */

    if( lu0open1( rcbp )  !=  NORMAL )      /* lu0open1正常?         */
    {                                       /* no --->                */
        printf( "lu0open1 NG %d, %d \n", rcbp->l_cplt, rcbp->l_errdtl); 
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    printf( "lu0open1 OK %d \n", rcbp->l_cplt); 
    status = 1;                             /* 状態:lu0open1済        */

/*=============================================*/
/*   lu0getbマクロ処理                         */
/*   <<< 送信バッファ獲得 >>>                  */
/*=============================================*/

    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    rcbp->l_bfsiz  =  12288;                /* 獲得サイズ設定 (12K)   */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */

    if( lu0getb( rcbp )  !=  NORMAL )       /* lu0getb正常?          */
    {                                       /* no --->                */
        printf( "lu0getb NG %d, %d \n", rcbp->l_cplt, rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    wbufp  =  rcbp->l_bufadr;               /* バッファアドレス退避   */
    printf( "lu0getb OK %d \n", rcbp->l_cplt); 
    status = 2;                             /*状態:送信バッファ獲得済 */

/*=============================================*/
/*   lu0getbマクロ処理                         */
/*   <<< 受信バッファ獲得 >>>                  */
/*=============================================*/

    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    rcbp->l_bfsiz  =  12288;                /* 獲得サイズ設定 (12K)   */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */

    if( lu0getb( rcbp )  !=  NORMAL )       /* lu0getb正常?          */
    {                                       /* no --->                */
        printf( "lu0getb NG %d, %d \n", rcbp->l_cplt, rcbp->l_errdtl);
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    rbufp  =  rcbp->l_bufadr;               /* バッファアドレス退避   */
    printf( "lu0getb OK %d \n", rcbp->l_cplt); 
    status = 3;                             /*状態:受信バッファ獲得済 */

/*=============================================*/
/*   lu0cnctマクロ処理                         */
/*   <<< セション確立 >>>                      */
/*=============================================*/

    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    rcbp->l_mode    =  LU0CACC;             /* ホスト主導型           */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */
    rcbp->l_cpltmd  =  LU0SYNC;             /* 同期型                 */
    rcbp->l_rbfp    =  rbufp;               /* 受信バッファアドレス   */
    rcbp->l_time    =  60;                  /* タイマ60秒             */
    rcbp->l_amode   =  CTLCD;               /* 送信権獲得制御あり     */
    rcbp->l_cmd1    =  SSCPNTC;             /* SSCPデータ通知有       */
    rcbp->l_cmd2    =  RESPRQT1;            /* タイプ1 応答要求       */
    rcbp->l_aplmx   =  12288;               /* 最大利用者データ長12K  */

    if( lu0cnct( rcbp )  !=  NORMAL )       /* lu0cnct正常?          */
    {                                       /* no --->                */
        printf( "lu0cnct NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    printf( "lu0cnct OK %d \n", rcbp->l_cplt); 
    status = 4;                             /* 状態:セション確立済    */

    do {
/*=============================================*/
/*   lu0chekマクロ処理                         */
/*   <<< 受信状態の問い合わせ >>>              */
/*=============================================*/

        memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
        strcpy( rcbp->l_unit, luname );         /* LU名設定               */

        if( lu0check( rcbp )  !=  NORMAL )      /* lu0check正常?         */
        {                                       /* no --->                */
            printf( "lu0chek NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
            procend( rcbp, status );            /* 終了処理               */
            return;                             /* < 異常終了 >           */
        }                                       /*                        */
        printf( "lu0chek OK %d \n", rcbp->l_cplt); 
        if( rcbp->l_cplt == ELU0NRCV )          /* データ受信なし         */
        {                                       /* yes --->               */
            sleep(1);                           /* データ受信待ち         */
        }
    } while( rcbp->l_cplt == ELU0NRCV );        /* データ受信待ちループ   */

/*=============================================*/
/*   lu0readマクロ処理                         */
/*   <<< データ受信 >>>                        */
/*=============================================*/

    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    rcbp->l_mode    =  LU0NML;              /* 通常のデータ受信       */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */
    rcbp->l_cpltmd  =  LU0SYNC;             /* 同期型                 */
    rcbp->l_rbfp    =  rbufp;               /* 受信バッファアドレス   */
    rcbp->l_time    =  60;                  /* タイマ値設定           */

    if( lu0read( rcbp )  !=  NORMAL )       /* lu0read 正常?         */
    {                                       /*                        */
        printf( "lu0read NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
        procend( rcbp, status );            /* no ---> 終了処理       */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    printf( "lu0read OK %d \n", rcbp->l_cplt); 
 
/*=============================================*/
/*   lu0writeマクロ処理                        */
/*   <<< データ送信 >>>                        */
/*=============================================*/

    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */
    rcbp->l_wcmd    =  L_DATA;              /* データ送信指定         */
    rcbp->l_cpltmd  =  LU0SYNC;             /* 同期型                 */
    rcbp->l_wlng    =  512;                 /* 送信データ長設定       */
    rcbp->l_wbfp    =  wbufp;               /* 送信バッファアドレス   */
    rcbp->l_wrmd1   =  CD;                  /* 送信権譲渡         */

    for( dc = 0 ; dc < 512 ; dc++)          /* A                      */
    {                                       /* |  送信データ設定      */
       wbufp[dc]  =  0x31;                  /* V                      */
    }                                       /*                        */

    if( lu0write( rcbp )  !=  NORMAL )      /* lu0write正常?         */
    {                                       /* no --->                */
        printf( "lu0write NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    printf( "lu0write OK %d \n", rcbp->l_cplt); 

/*=============================================*/
/*  終了処理                                   */
/*=============================================*/

    procend( rcbp, status );                 /* 終了処理              */
    return; 
}

/*====================================================================*
 *      function name  :  (2) procend                                 *
 *      function       :  プロセス終了処理                            *
 *====================================================================*/
void
procend
(
    struct lu0rb *rcbp, 
    int status
) 
{                                            /*                        */
    if( status == 4 )                        /* セション確立済?        */
    {                                        /* yes --->               */

/*=============================================*/
/*   lu0discマクロ処理                         */
/*   <<< セション解放 >>>                      */
/*=============================================*/

        memset( rcbp, 0, sizeof(*rcbp) );    /* rcb域クリア            */
        rcbp->l_mode    =  LU0FRC;           /* 強制終了               */
        strcpy( rcbp->l_unit, luname );      /* LU名設定               */
        rcbp->l_cpltmd  =  LU0SYNC;          /* 同期型                 */

        if( lu0disc( rcbp )  !=  NORMAL )    /* lu0disc 正常?         */
        {                                    /* no --->                */
            printf( "lu0disc NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
            status = 1;                      /* < 異常終了 >           */
        } else {                             /*状態:lu0open1済         */
            printf( "lu0disc OK %d \n", rcbp->l_cplt); 
            status = 3;                      /*状態:受信バッファ獲得済 */
        }
    }

    if( status == 3 )                        /* 受信バッファ獲得済?   */
    {                                        /* yes --->              */

/*=============================================*/
/*   lu0frebマクロ処理                         */
/*   <<< 受信バッファ解放 >>>                  */
/*=============================================*/

        memset( rcbp, 0, sizeof(*rcbp) );    /* rcb域クリア          */
        rcbp->l_bufadr  =  rbufp;            /* 受信バッファアドレス */
        strcpy( rcbp->l_unit, luname );      /* LU名設定             */

        if( lu0freb( rcbp )  !=  NORMAL )    /* lu0freb 正常?        */
        {                                    /* no --->               */
            printf( "lu0freb NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
            status = 1;                      /* < 異常終了 >          */
        } else {                             /*状態:lu0open1済        */
            printf( "lu0freb OK %d \n", rcbp->l_cplt); 
            status = 2;                      /*状態:送信バッファ獲得済*/
        }
    }

    if( status == 2 )                        /* 送信バッファ獲得済?   */
    {                                        /* yes --->              */

/*=============================================*/
/*   lu0frebマクロ処理                         */
/*   <<< 送信バッファ解放 >>>                  */
/*=============================================*/

        memset( rcbp, 0, sizeof(*rcbp) );    /* rcb域クリア           */
        rcbp->l_bufadr  =  wbufp;            /* 送信バッファアドレス  */
        strcpy( rcbp->l_unit, luname );      /* LU名設定              */

        if( lu0freb( rcbp )  !=  NORMAL )    /* lu0freb 正常?        */
        {                                    /* no --->               */
            printf( "lu0freb NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
            status = 1;                      /* < 異常終了 >          */
        } else {                             /*状態:lu0open1済        */
            printf( "lu0freb OK %d \n", rcbp->l_cplt); 
            status = 1;                      /*状態:lu0open1済        */
        }
    }

    if( status == 1 )                        /* lu0open1済?           */
    {                                        /* yes --->              */

/*=============================================*/
/*   lu0closeマクロ処理                        */
/*   <<< アプリ登録抹消 >>>                    */
/*=============================================*/

        memset( rcbp, 0, sizeof(*rcbp) );    /* rcb域クリア           */
        strcpy( rcbp->l_unit, luname );      /* LU名設定              */

        if( lu0close( rcbp )  !=  NORMAL )   /* lu0close 正常?       */
        {                                    /* no --->               */
            printf( "lu0close NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl);
            status = 0;                      /*状態:初期状態          */
        } else {                             /* yes -->               */
            printf( "lu0close OK %d \n", rcbp->l_cplt); 
            status = 0;                      /*状態:初期状態          */
        }
    }
    return;                                  /* < 正常終了 >          */
}                                            /*                       */

A.2 非同期型アプリケーションの例

/*====================================================================*
 *     アプリケーションプログラム例  2                                *
 *                                                                    *
 *         (1)  main     :  メイン処理(非同期型)                    *
 *         (2)  comprcv  :  完了受信処理                              *
 *         (3)  procend  :  プロセス終了処理                          *
 *                                                                    *
 *====================================================================*/

#include  <sys/types.h>
#include  <stdio.h>
#include  <memory.h>
#include  <errno.h>
#include  <fcntl.h>
#include  <stropts.h>
#include  <poll.h>

#include  "lu0.h"

/*---------------------------------------------*/
/*      エントリーモジュール                   */
/*---------------------------------------------*/

void    main(int, char **);
int     comprcv(struct lu0rb *);
void    procend(struct lu0rb *, int); 

/*---------------------------------------------*/
/*      グローバル変数                         */
/*---------------------------------------------*/

char              *luname = "lu01";         /* LU名                   */
int                rcvdfd;                  /* 受信用パイプfd退避域   */
char              *wbufp;                   /* 送信バッファポインタ   */
char              *rbufp;                   /* 受信バッファポインタ   */

/*---------------------------------------------*/
/*      ローカル定義                           */
/*---------------------------------------------*/

#define NORMAL  0                             /* マクロ命令復帰値正常 */

/*====================================================================*
 *      function name  :  (1) main                                    *
 *      function       :  メイン処理(非同期型)                      *
 *====================================================================*/
void
main
(
    int argc, 
    char **argv
)
 {
    struct  lu0rb      rcb;                 /* rcb                    */
    struct  lu0rb     *rcbp;                /* rcbポインタ            */
    int                rtnc;                /* 復帰値                 */
    int                status;              /* 状態                   */
    int                dc;                  /* 送信データ作成用       */

/*=============================================*/
/*   rcbの初期化                               */
/*=============================================*/

   rcbp  =  &rcb;                           /* rcbアドレス設定        */

/*=============================================*/
/*   lu0open1マクロ処理                        */
/*   <<< アプリ登録 >>>                        */
/*=============================================*/
    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */

    if( lu0open1( rcbp )  !=  NORMAL )      /* lu0open1正常?         */
    {                                       /* no --->                */
        printf( "lu0open1 NG %d, %d \n", rcbp->l_cplt, rcbp->l_errdtl); 
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    rcvdfd  =  rcbp->l_pipfd;               /* 受信用パイプfd退避     */
    printf( "lu0open1 OK %d \n", rcbp->l_cplt); 
    status = 1;                             /* 状態:lu0open1済        */

/*=============================================*/
/*   lu0getbマクロ処理                         */
/*   <<< 送信バッファ獲得 >>>                  */
/*=============================================*/
    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    rcbp->l_bfsiz  =  12288;                /* 獲得サイズ設定 (12K)   */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */

    if( lu0getb( rcbp )  !=  NORMAL )       /* lu0getb正常?          */
    {                                       /* no --->                */
        printf( "lu0getb NG %d, %d \n", rcbp->l_cplt, rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    wbufp  =  rcbp->l_bufadr;               /* バッファアドレス退避   */
    printf( "lu0getb OK %d \n", rcbp->l_cplt); 
    status = 2;                             /*状態:送信バッファ獲得済 */

/*=============================================*/
/*   lu0getbマクロ処理                         */
/*   <<< 受信バッファ獲得 >>>                  */
/*=============================================*/
    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    rcbp->l_bfsiz  =  12288;                /* 獲得サイズ設定 (12K)   */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */

    if( lu0getb( rcbp )  !=  NORMAL )       /* lu0getb正常?          */
    {                                       /* no --->                */
        printf( "lu0getb NG %d, %d \n", rcbp->l_cplt, rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    rbufp  =  rcbp->l_bufadr;               /* バッファアドレス退避   */
    printf( "lu0getb OK %d \n", rcbp->l_cplt); 
    status = 3;                             /*状態:受信バッファ獲得済 */

/*=============================================*/
/*   lu0cnctマクロ処理                         */
/*   <<< セション確立 >>>                      */
/*=============================================*/
    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    rcbp->l_mode    =  LU0CACC;             /* ホスト主導型           */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */
    rcbp->l_cpltmd  =  LU0ASYN;             /* 非同期型完了           */
    rcbp->l_rbfp    =  rbufp;               /* 受信バッファアドレス   */
    rcbp->l_amode   =  CTLCD;               /* 送信権獲得制御あり     */
    rcbp->l_cmd1    =  SSCPNTC;             /* SSCPデータ通知有       */
    rcbp->l_cmd2    =  RESPRQT1;            /* タイプ1応答要求        */
    rcbp->l_aplmx   =  12288;               /* 最大利用者データ長12K  */

    if( lu0cnct( rcbp )  !=  NORMAL )       /* lu0cnct正常?          */
    {                                       /* no --->                */
        printf( "lu0cnct NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    printf( "lu0cnct OK %d \n", rcbp->l_cplt); 
    status = 4;                             /* 状態:セション確立済    */

    rtnc = comprcv( rcbp );                 /* 完了受信待ち合わせ     */
    if( rtnc != 0 )                         /* 完了受信正常?         */
    {                                       /* no --->                */
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */

    if( rcbp->l_cplt != ELU0OK )            /* lu0cnct正常完了?      */
    {                                       /* no --->                */
        printf( "lu0rcv(lu0cnct) NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    printf( "lu0rcv(lu0cnct) OK %d \n", rcbp->l_cplt); 

/*=============================================*/
/*   lu0readマクロ処理                         */
/*   <<< データ受信 >>>                        */
/*=============================================*/
    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    rcbp->l_mode    =  LU0NML;              /* 通常のデータ受信       */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */
    rcbp->l_cpltmd  =  LU0ASYN;             /* 非同期型完了           */
    rcbp->l_rbfp    =  rbufp;               /* 受信バッファアドレス   */

    if( lu0read( rcbp )  !=  NORMAL )       /* lu0read正常?          */
    {                                       /* no --->                */
        printf( "lu0read NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    printf( "lu0read OK %d \n", rcbp->l_cplt); 

    rtnc = comprcv( rcbp );                 /* 完了受信待ち合わせ     */
    if( rtnc != 0 )                         /* 完了受信正常?         */
    {                                       /* no --->                */
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */

    if( rcbp->l_cplt != ELU0OK )            /* lu0read正常完了?      */
    {                                       /* no --->                */
        printf( "lu0rcv(lu0read) NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    printf( "lu0rcv(lu0read) OK %d \n", rcbp->l_cplt); 

/*=============================================*/
/*   lu0writeマクロ処理                        */
/*   <<< データ送信 >>>                        */
/*=============================================*/
    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */
    rcbp->l_wcmd    =  L_DATA;              /* データ送信指定         */
    rcbp->l_cpltmd  =  LU0ASYN;             /* 非同期型完了           */
    rcbp->l_wlng    =  512;                 /* 送信データ長設定       */
    rcbp->l_wbfp    =  wbufp;               /* 送信バッファアドレス   */
    rcbp->l_wrmd1   =  CD;                  /* 送信権譲渡         */

    for( dc = 0 ; dc < 512 ; dc++)          /* A                      */
    {                                       /* |  送信データ設定      */
        wbufp[dc]  =  0x31;                 /* V                      */
    }                                       /*                        */

    if( lu0write( rcbp )  !=  NORMAL )      /* lu0write正常?         */
    {                                       /* no --->                */
        printf( "lu0write NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    printf( "lu0write OK %d \n", rcbp->l_cplt); 

    rtnc = comprcv( rcbp );                 /* 完了受信待ち合わせ     */
    if( rtnc != 0 )                         /* 完了受信正常?         */
    {                                       /* no --->                */
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */

    if( rcbp->l_cplt != ELU0OK )            /* lu0write正常完了?     */
    {                                       /* no --->                */
        printf( "lu0rcv(lu0write) NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
        procend( rcbp, status );            /* 終了処理               */
        return;                             /* < 異常終了 >           */
    }                                       /*                        */
    printf( "lu0rcv(lu0write) OK %d \n", rcbp->l_cplt); 

/*=============================================*/
/*  終了処理                                   */
/*=============================================*/
    procend( rcbp, status );                /* 終了処理               */
    return; 
 }

/*====================================================================*
 *      function name  :  (2) comprcv                                 *
 *      function       :  完了受信処理                                *
 *====================================================================*/
int 
comprcv
 (
    struct lu0rb *rcbp
) 
 {
    struct  pollfd   pfd;                   /*                        */
    int              event;                 /*                        */

    pfd.fd      =  rcvdfd;                  /* 受信用パイプfd設定     */
    pfd.events  =  POLLIN;                  /*                        */
    pfd.revents =  0;                       /*                        */

    event = poll( &pfd, 1, 30000 );         /* 事象待ち合わせ(30秒)   */

    if( event == -1 )                       /* poll(2)異常復帰        */
    {
        printf( "poll NG %d \n", errno ); 
        return(-1);                         /* エラー復帰             */
    }

    if( event == 0 )                        /* poll(2)タイムアウト    */
    {
        printf( "poll timeout \n" ); 
        return(-1);                         /* エラー復帰             */
    }

    memset( rcbp, 0, sizeof(*rcbp) );       /* rcb域クリア            */
    strcpy( rcbp->l_unit, luname );         /* LU名設定               */

    lu0rcv( rcbp ); 

    switch( rcbp->l_cmcode )                /*                        */
    {
        case LU0CNCT   : return(0);         /* lu0cnct完了正常復帰    */
        case LU0DISC   : return(0);         /* lu0disc完了正常復帰    */
        case LU0READ   : return(0);         /* lu0read完了正常復帰    */
        case LU0WRITE  : return(0);         /* lu0write完了正常復帰   */
        default        :                    /* その他                 */
            printf
            (
                "lu0rcv(%d) NG %d, %d \n",
                rcbp->l_cmcode,rcbp->l_cplt, 
                rcbp->l_errdtl
            ); 
            return(-1);                     /* 異常復帰               */
    }                                       /*                        */
}                                           /*                        */

/*====================================================================*
 *      function name  :  (3) procend                                 *
 *      function       :  プロセス終了処理                            *
 *====================================================================*/
void
procend
 (
    struct lu0rb *rcbp, 
    int status
) 
{
    int                rtnc;                 /* 復帰値                 */

    if( status == 4 )                        /* セション確立済?        */
    {                                        /* yes --->               */
/*=============================================*/
/*   lu0discマクロ処理                         */
/*   <<< セション解放 >>>                      */
/*=============================================*/
        memset( rcbp, 0, sizeof(*rcbp) );    /* rcb域クリア            */
        rcbp->l_mode    =  LU0FRC;           /* 強制終了               */
        strcpy( rcbp->l_unit, luname );      /* LU名設定               */
        rcbp->l_cpltmd  =  LU0ASYN;          /* 非同期型完了           */

        if( lu0disc( rcbp )  !=  NORMAL )    /* lu0disc 正常?         */
        {                                    /* no --->                */
            printf( "lu0disc NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl);
            status = 1;                      /*状態:lu0open1済         */
        }                                    /*                        */
        else
        {                                    /* yes -->                */
            printf( "lu0disc OK %d \n", rcbp->l_cplt); 
            status = 3;                      /*状態:受信バッファ獲得済 */
        }

/*=============================================*/
/*  lu0discマクロ命令の完了を待つ              */
/*=============================================*/
        do
        {
            rtnc = comprcv( rcbp );          /* 完了受信待ち合わせ     */
            if( rtnc != 0 )                  /* 完了受信正常?         */
            {                                /* no --->                */
                status = 1;                  /*状態:lu0open1済         */
                break;                       /* < 異常終了 >           */
            }                                /*                        */

            if( rcbp->l_cmcode != LU0DISC )  /* lu0disc完了?           */
            {                                /* no --->                */
                printf
                (
                    "lu0rcv(%d) NG %d, %d \n",
                    rcbp->l_cmcode, 
                    rcbp->l_cplt, 
                    rcbp->l_errdtl
                ); 
                continue;                    /* 再度待ち合わせる       */
            }                                /*                        */
            else if( rcbp->l_cplt != ELU0OK )/* lu0disc 正常完了?     */
            {                                /* no --->                */
                printf
                (
                    "lu0rcv(lu0disc) NG %d, %d \n",
                    rcbp->l_cplt, 
                    rcbp->l_errdtl
                ); 
                status = 1;                  /*状態:lu0open1済         */
            }                                /*                        */
            else                             /* yes -->                */
            {
                printf( "lu0rcv(lu0disc) OK %d \n", rcbp->l_cplt); 
            }
        } while( rcbp->l_cmcode != LU0DISC ); 
    }

    if( status == 3 )                        /* 受信バッファ獲得済?   */
    {                                        /* yes --->              */
/*=============================================*/
/*   lu0frebマクロ処理                         */
/*   <<< 受信バッファ解放 >>>                  */
/*=============================================*/

        memset( rcbp, 0, sizeof(*rcbp) );    /* rcb域クリア           */
        rcbp->l_bufadr  =  rbufp;            /* 受信バッファアドレス  */
        strcpy( rcbp->l_unit, luname );      /* LU名設定              */
        if( lu0freb( rcbp )  !=  NORMAL )    /* lu0freb 正常?        */
        {                                    /* no --->               */
            printf( "lu0freb NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl);
            status = 1;                      /* < 異常終了 >          */
        } else {                             /*状態:lu0open1済        */
            printf( "lu0freb OK %d \n", rcbp->l_cplt); 
            status = 2;                      /*状態:送信バッファ獲得済*/
        }
    }

    if( status == 2 )                        /* 送信バッファ獲得済?   */
    {                                        /* yes --->              */

/*=============================================*/
/*   lu0frebマクロ処理                         */
/*   <<< 送信バッファ解放 >>>                  */
/*=============================================*/

        memset( rcbp, 0, sizeof(*rcbp) );    /* rcb域クリア           */
        rcbp->l_bufadr  =  wbufp;            /* 送信バッファアドレス  */
        strcpy( rcbp->l_unit, luname );      /* LU名設定              */

        if( lu0freb( rcbp )  !=  NORMAL )    /* lu0freb 正常?        */
        {                                    /* no --->               */
            printf( "lu0freb NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl);
            status = 1;                      /* < 異常終了 >          */
        } else {                             /*状態:lu0open1済        */
            printf( "lu0freb OK %d \n", rcbp->l_cplt); 
            status = 1;                      /*状態:lu0open1済        */
        }
    }

    if( status == 1 )                        /* lu0open1済?           */
    {                                        /* yes --->              */

/*=============================================*/
/*   lu0closeマクロ処理                        */
/*   <<< アプリ登録抹消 >>>                    */
/*=============================================*/
        memset( rcbp, 0, sizeof(*rcbp) );    /* rcb域クリア           */
        strcpy( rcbp->l_unit, luname );      /* LU名設定              */

        if( lu0close( rcbp )  !=  NORMAL )   /* lu0close 正常?       */
        {                                    /* no --->               */
            printf( "lu0close NG %d, %d \n", rcbp->l_cplt,rcbp->l_errdtl); 
            status = 0;                      /*状態:初期状態          */
        } else {                             /* yes -->               */
            printf( "lu0close OK %d \n", rcbp->l_cplt); 
            status = 0;                      /*状態:初期状態          */
        }
    }
    return;                                  /* < 正常終了 >          */
}                                            /*                       */


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2004