TCP/IP

35. IBM i のIPアドレスを取得するには ?

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 でないことを条件としている。