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