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