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 個ずつ取得したほうが扱いは簡単になる。