複数のデバイスのUCBを求める
複数(すべて)のデバイスのUCBを求める
すべてのデバイス、あるいは特定の装置群のデバイス(例えば、ディスク装置、テープ装置)のUCBを求めたい場合がある。デバイスにI/Oを行うのではなく、システム上のデバイスをリストアップして一覧表を作るような処理を行う場合などである。
MVS(z/OS)
システム上のデバイスのUCBアドレスを1つずつ順番に求めるなら、UCBSCANマクロが利用できる。
: LOOP DS 0H UCBSCAN ADDRESS, CALL UCB SCAN SERVICE + UCBPTR=AUCB, + WORKAREA=SCANWORK, + NOPIN,DYNAMIC=YES,RANGE=ALL,LOC=ANY LTR RF,RF DONE FOR ALL DEVICES ? BNZ ENDOFUCB YES, L R6,AUCB LOAD UCB ADDRESS USING UCBOB,R6 ADDRESS TO UCB COMMON SEGMENT : : B LOOP : AUCB DC A(0) UCB ADDRESS SCANWORK DC XL100'00' UCBSCAN WORKAREA : DUCB DSECT , IEFUCBOB , UCB :
UCBSCANマクロを発行する度に、次のデバイスのUCBアドレスが返される。UCBはデバイスの装置番号の低い順に返される。WORKAREAで指定したマクロ作業域にどのデバイスのUCBまで返したかの情報が格納される。返されたUCBアドレスをベースにしてIEFUCBOBマクロでUCBの各フィールドをマッピングすることができる。
なお、UCBLOOKマクロはスーパーバイザー・モード(もしくはPSWキー0から7)での発行が必須なのでAPF許可プログラムである必要がある。
: LOOP DS 0H UCBSCAN COPY, CALL UCB SCAN SERVICE + UCBAREA=UCBDATA, + WORKAREA=SCANWORK, + DYNAMIC=YES,RANGE=ALL,DEVCLASS=DASD LTR RF,RF DONE FOR ALL DEVICES ? BNZ DONE YES, USING UCBOB,UCBDATA ADDRESS TO UCB COMMON SEGMENT : : B LOOP : UCBDATA DC XL48'00' COPIED UCB DATA SCANWORK DC XL100'00' UCBSCAN WORKAREA : DUCB DSECT , IEFUCBOB , UCB :
UCBSCANマクロではUCBアドレスではなく、UCBの内容そのものをデータとして返すこともできる。このインターフェースであれば、非APF許可プログラムでも使用できる。デバイスの一覧表を作るなど、UCBの基本的なフィールド内容を参照するだけであれば直接UCB領域をアクセスしなくても内容のコピーを得られれば十分である。
アドレスを得るにしろ、内容のコピーを得るにしろ、DEVCLASSパラメーターで探索するUCBを特定の装置群に範囲を絞ることができる。このサンプルでは、DASD装置のUCBだけを探索している。
MSP
MVSのUCBSCAN ADDRESS機能に相当するのが、UCBスキャンサービスルーチンである。MVSのUCBSCANと異なりAPF許可は不要である。マクロ命令で記述するか、直接サービスルーチンを呼び出すかのコーディング法の違いはあるが、機能的には同等機能となる。ただし、UCBが装置番号順に返される保証はない。
: LOOP DS 0H LA R1,PLIST POINT TO UCBSCAN PLIST L RF,CVTPTR LOAD CVT ADDRESS L RF,CVTUCBSC-CVTMAP(,RF) LOAD UCBSCAN ROUTINE ENTRY BASR RE,RF CALL IT LTR RF,RF DONE FOR ALL DEVICES ? BNZ DONE YES, L R6,AUCB LOAD UCB ADDRESS USING UCBOB,R6 ADDRESS TO UCB COMMON SEGMENT : : B LOOP : PLIST CALL ,(SCANWORK,DEVCLASS,AUCB),VL,MF=L AUCB DC A(0) UCB ADDRESS DEVCLASS DC XL1'20' TARGET DEVICE CLASS SCANWORK DC XL100'00' UCBSCAN WORKAREA : CVT DSECT=YES CVT KAAUCB PREFIX=NO,LIST=YES UCB :
このサービスルーチンはMVS/XAのUCB走査サービスとの互換機能である。ESA以降のMVSでは、Dynamic UCBや4桁装置番号のUCBなどはUCBSCANマクロでないと探索できないなどの理由で推奨されていないが、現在のz/OSでもサービスは残っており上記と同じインターフェースで利用することは可能である。従ってUCBSCANマクロを使用したモジュールは、一旦MVS/XA時代のUCB走査サービスの利用に戻せばMSPでもそのまま実行モジュール・レベルで互換となる。(CVT内の入口点フィールドの位置も同じ)
VOS3
VOS3にはMVSにおけるUCBSCANマクロやMSPにおけるUCBスキャンサービスに相当するAPIはない。代わりにCVTからポイントされるUCBルックアップテーブルにOS上に定義されたデバイスのUCBアドレスが格納されている。
CVTILK2 ---+ I I +----------------+ I +----> +-----------+ ULUT(UCB LookUp Table) I I +-----------+ I I +-----------+ I I +-----------+ : +-----------+ I xFFFFFFFF I +-----------+ LA R1,PLIST POINT TO UCBSCAN PLIST L RF,CVTPTR LOAD CVT ADDRESS L R6,CVTILK2-CVTMAP(,RF) LOAD UCB LOOKUP TABLE L R1,0(,R6) LOAD 1ST DEVICE UCB ADDRESS : LA R6,4(,R6) LOCATE TO NEXT TABLE ENTRY L R1,0(,R6) LOAD 2ND DEVICE UCB ADDRESS : CLC 0(4,R6),=XL4'FFFFFFFF' END OF UCB ENTRY ? BE DONE YES, : : CVT DSECT=YES CVT UCB DSECT JAAHUCBD , :
UCBルックアップテーブルの形式についてはマニュアルなどで解説されているわけではないが、単にUCBアドレスが並んでいるだけのシンプルな構造なのでCVTILK2フィールドが示す領域をダンプすれば容易にわかる。
入出力動的再構成機能の対象デバイスについてはルックアップテーブルではなくGETUCBADマクロ(非公開マクロ)を使用する必要がある。