C/400

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 である。

ネットワーク属性タイプ説明
ALRBCKFPCHAR(16)警報バックアップ・フォーカル・ポイント
ALRCTLDCHAR(10)警報制御装置
ALRDFTFPCHAR(10)警報フォーカル・ポイント
ALRFTRCHAR(20)警報フィルター
ALRHLDCNTBINARY(4)警報保留カウント
ALRLOGSTSCHAR(7)警報ロギング状況
ALRPRIFPCHAR(10)警報1次フォーカル・ポイント
ALRSTSCHAR(10)警報状況
ALWANYNETCHAR(10)AnyNet サポートの許可
DDMACCCHAR(20)DDM 要求アクセス
DFTCNNLSTCHAR(10)省略時 ISDN 接続リスト
DFTMODECHAR(8)省略時モード
DFTNETTYPECHAR(10)ISDN ネットワーク・タイプ
DTACPRBINARY(4)データ圧縮
DTACPRINMBINARY(4)中間データ圧縮
JOBACNCHAR(10)ジョブの処置
LCLCPNAMECHAR(8)ローカル制御点
LCLLOCNAMECHAR(8)ローカル・ロケーション
LCLNETIDCHAR(8)ローカル・ネットワークID
MAXINTSSNBINARY(4)最大セッション
MAXHOPBINARY(4)最大ホップ・カウント
MSGQCHAR(20)メッセージ待ち行列
NETSERVERCHAR(85)サーバー・ネットワーク ID
NODETYPECHAR(8)APPN ノード・タイプ
NWSDOMAINCHAR(8)ネットワーク・サーバー定義域
OUTQCHAR(20)出力待ち行列
PNDSYSNAMECHAR(8)保留システム名
PCSACCCHAR(20)クライアント・アクセス
PARBINARY(4)加算抵抗
SYSNAMECHAR(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 個ずつ取得したほうが扱いは簡単になる。