C400

90. API : QWCRNETA : ネットワーク属性の検索

C/400 でシステム名を調べるには、どのようにすれば良いのだろうか ?

CLP であれば RTVNETA コマンドによって現行のシステム名を調べることができるので

C/400 でも外部 CLP を呼び出すようにすれば、システム名の取得は実現可能であるが

あまりスマートな方法ではない。

ここでは RTVNETA に相当する API : QWCRNETA : ネットワーク属性の検索 を使って

システム名を紹介するサンプル・ソースを紹介しよう。

パラメータ

必須パラメータ・グループ:

1. レシーバー変数 出力 Char(*)
2. レシーバー変数の長さ 入力 Binary(4)
3. 検索するネットワーク属性の数 入力 Binary(4)
4. ネットワーク属性名 入力 Char(10)の配列(*)
5. エラー・コード 入出力 Char(*)

レシーバー変数レシーバー変数の長さ は先で説明したのでここでは省略する。

検索するネットワーク属性の数 も 1 個だけの指定のほうがわかりやすい。

ネットワーク属性名 は次のように多くの種類が用意されている。

今回、指定するのはこの表の一番最後の SYSNAME である。

ネットワーク属性 タイプ 説明
ALRBCKFP CHAR(16) 警報バックアップ・フォーカル・ポイント
ALRCTLD CHAR(10) 警報制御装置
ALRDFTFP CHAR(10) 警報フォーカル・ポイント
ALRFTR CHAR(20) 警報フィルター
ALRHLDCNT BINARY(4) 警報保留カウント
ALRLOGSTS CHAR(7) 警報ロギング状況
ALRPRIFP CHAR(10) 警報1次フォーカル・ポイント
ALRSTS CHAR(10) 警報状況
ALWANYNET CHAR(10) AnyNet サポートの許可
DDMACC CHAR(20) DDM 要求アクセス
DFTCNNLST CHAR(10) 省略時 ISDN 接続リスト
DFTMODE CHAR(8) 省略時モード
DFTNETTYPE CHAR(10) ISDN ネットワーク・タイプ
DTACPR BINARY(4) データ圧縮
DTACPRINM BINARY(4) 中間データ圧縮
JOBACN CHAR(10) ジョブの処置
LCLCPNAME CHAR(8) ローカル制御点
LCLLOCNAME CHAR(8) ローカル・ロケーション
LCLNETID CHAR(8) ローカル・ネットワークID
MAXINTSSN BINARY(4) 最大セッション
MAXHOP BINARY(4) 最大ホップ・カウント
MSGQ CHAR(20) メッセージ待ち行列
NETSERVER CHAR(85) サーバー・ネットワーク ID
NODETYPE CHAR(8) APPN ノード・タイプ
NWSDOMAIN CHAR(8) ネットワーク・サーバー定義域
OUTQ CHAR(20) 出力待ち行列
PNDSYSNAME CHAR(8) 保留システム名
PCSACC CHAR(20) クライアント・アクセス
PAR BINARY(4) 加算抵抗
SYSNAME CHAR(8) システム名
0001.00 #include <stdio.h>                                  
0002.00 #include <stdlib.h>                                 
0003.00 #include <string.h>                                 
0004.00 #include <QWCRNETA.h>   /* ネットワーク属性の検索 */
0005.00                                                           
0006.00 #define TRUE         0                                                
0007.00 #define FALSE       -1                                                
0008.00 typedef struct {                                                      
0009.00    int  BYTESPRO;                                                     
0010.00    int  BYTESAVL;                                                     
0011.00    char MSGID[7];                                                     
0012.00    char RESRVD;                                                       
0013.00    char EXCPDATA[100];                                                
0014.00 } ERRSTRUCTURE;     /* Define the error return structure            */
0015.00 ERRSTRUCTURE  errcode;/* Error Code Structure for RCVMSG      */      
0016.00                                                                       
0017.00 void main(void){                                                      
0018.00 typedef struct {                                                      
0019.00   Qwc_Rneta_Data_Rtnd_t  neta_rtnd;                                   
0020.00   int  offset;                                                        
0021.00   char Data[256];                                                     
0022.00 } NETA_RTND;                                                          
0023.00 NETA_RTND neta_rtnd;                                                  
0024.00 typedef struct {                                                      
0025.00   Qwc_Rneta_Attr_Table_t netattr;                                     
0026.00   char data[256];                                                     
0027.00 } NETATTR;                                                            
0028.00 NETATTR* netattr;                                                     
0029.00    int len, offset;                                                   
0030.00    char QSYSNAM[9], value[129];                                       
0031.00                                                                       
0032.00    printf("** TESTSYS3: システム名の検索 **\n");                      
0033.00    getchar();                                                         
0034.00    errcode.BYTESPRO = 160;                                            
0035.00    errcode.BYTESAVL  = 0;                                             
0036.00    /*( ネットワーク属性の検索 )*/                                     
0037.00    QWCRNETA(&neta_rtnd, sizeof(NETA_RTND), 1, "SYSNAME   ", &errcode);
0038.00    if(errcode.BYTESAVL != 0){/* APIERR */                             
0039.00      printf("* APiErr\n");                                            
0040.00      getchar();                                                       
0041.00      exit(-1);                                                        
0042.00    }/* APIERR */                                                      
0043.00    offset = neta_rtnd.offset - 8;                                     
0044.00    netattr = (NETATTR*)&(neta_rtnd.Data[offset]);                     
0045.00    memcpy(QSYSNAM, netattr->data, 8);                                 
0046.00    QSYSNAM[8] = 0x00;                                                 
0047.00    printf("QSYSNAM = %s\n", QSYSNAM);                                 
0048.00    getchar();                                                         
0049.00 }
【解説】

ネットワーク属性の検索の API : QWCRNETA もまた複数個のネットワーク属性の中から

選択して取得できるという便利なようで複雑な機能を持っている。

ここでも話を簡単にするために

0037.00 QWCRNETA(&neta_rtnd, sizeof(NETA_RTND), 1, “SYSNAME “, &errcode);

のようにして SYSNAME ( システム名 ) というひとつだけのネットワーク属性を指定している。

値を取得した結果、

0043.00    offset = neta_rtnd.offset - 8;                
0044.00    netattr = (NETATTR*)&(neta_rtnd.Data[offset]);
0045.00    memcpy(QSYSNAM, netattr->data, 8);

のようにして取得したオフセットから 8 を引いた開始位置からネットワーク属性 netattr

取得してシステム名を得ている。

この他のネットワーク属性もこの方法で取得できるので試して頂きたい。

ただしネットワーク属性は、1 個ずつ取得したほうが扱いは簡単になる。