IBM i の IP アドレスは IBM i に装填されている LAN カード毎に与えられる。
そこで複数毎の LAN カードが装填されている IBM i は IP アドレスは
一意的に決まるものではない。
従って IBM i のIP アドレスを取得するコマンドは存在しない。
実は IBM i の IP アドレスは「QUSRSYS/QATOCIFC
」という物理ファイルに登録されている。
そこでこのファイルを CLP で RCVF
で読めば
IP アドレスが取得できるという具合になるのだが
このファイルは特殊な要件をいくつか備えているため通常の DCLF
では
ファイルとして正しく定義することができず、コンパイル・エラーになってしまう。
ここでは CLP による IP アドレスを取得できる正しい CLP のサンプルを示す。
【 サンプル・ソース: TESTIPCL 】
0001.00 PGM 0002.00 DCL VAR(&DUMY) TYPE(*CHAR) LEN(1) 0003.00 DCLF FILE(QUSRSYS/QATOCIFC) ALWGRAPHIC(*YES) + 0004.00 DCLBINFLD(*INT) 0005.00 0006.00 READ: RCVF RCDFMT(QIFC) 0007.00 MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(REDEND)) 0008.00 IF COND((&LIND *NE ' ') *AND + 0009.00 (%SST(&LIND 1 1) *NE '*')) THEN(DO) 0010.00 SNDPGMMSG MSG('IPADR=' *CAT &INTERNET) MSGTYPE(*DIAG) 0011.00 ENDDO 0012.00 GOTO READ 0013.00 REDEND: 0014.00 ENDPGM
【 解説 】
DCLF
では
0003.00 DCLF FILE(QUSRSYS/QATOCIFC) ALWGRAPHIC(*YES) + 0004.00 DCLBINFLD(*INT)
として定義しないとグラフィック・フィールドが含まれているので
ALWGRAPHIC(*YES)
がないと DCLF
が有効とはならなくて
そのためコンパイル・エラーが発生する。
また DCLBINFLD(*INT)
がないと実行時には受入れフィールドの長さ不足となり
実行することができない。
さらに条件として
0008.00 IF COND((&LIND *NE ' ') *AND + 0009.00 (%SST(&LIND 1 1) *NE '*')) THEN(DO)
があるのは 回線記述がありそれは *LOOPBACK
でないことを条件としている。