いくつかの API を使用すると任意のユーザー環境から、別のユーザー環境を仮想的に
セットアップすることができる。
例えば CGI は、すべて QTMHHTTP というユーザー・プロフィールの下で動作するが、
ログインしたユーザー・プロフィールとして動作させたい場合などに応用することができる。
API: QSYGETPH によってユーザー,パスワードを指定して、
API: QWTSETP によって仮想ユーザー環境を開始する。
仮想ログインした環境から元の環境に戻すには、チョッとしたコツが要る。
API : QSYRLSPH = ユーザー・ハンドルの解放 を呼び出しただけではログオフ
されないのである。
これは QSYGETPH で取得したハンドルを解放するだけであって、ログオフを意味して
いるわけではない。
であれば、QTMHHTTP に戻すのであれば QSYGETPH によってハンドルを取得
してから QWTSETPH で戻せば良いのであるが QTMHHTTP にはパスワードが
登録されていない。
もちろん API: QSYGETPH のIBM の解説によれば *NOPWD を指定すれば
ハンドルを取得できることになっているが、どういうわけかパスワードのない *NOPWD では、
ハンドルを取得しようとするとエラーになってしまう。
そこで仮想ログインのときに *CURRENT でのハンドルを取得しておいて、ログオフのときに
保存しておいた *CURRENT のハンドルに戻す作業が必要となってくる。
PGM PARM(&USER &PASSWRD &PRFHND &CURHND)
/*---------------------------------------------------------*/
/* LOGIN : 仮想ログイン */
/*---------------------------------------------------------*/
DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
DCL VAR(&USER) TYPE(*CHAR) LEN(10)
DCL VAR(&PASSWRD) TYPE(*CHAR) LEN(48)
DCL VAR(&CURHND) TYPE(*CHAR) LEN(12)
DCL VAR(&PRFHND) TYPE(*CHAR) LEN(12)
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
/*( 現在のユーザーでのハンドルを保存 )*/
CALL PGM(QSYS/QSYGETPH) PARM('*CURRENT ' +
&PASSWRD &CURHND)
/*( 新しいユーザーでのハンドルを取得してセッションを開始 )*/
CALL PGM(QSYS/QSYGETPH) PARM(&USER &PASSWRD &PRFHND)
CALL PGM(QSYS/QWTSETP) PARM(&PRFHND)
RETURN
ERROR: RCVMSG RMV(*NO) MSG(&MSG)
SNDMSG: SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG)
ENDPGM
PGM PARM(&PRFHND &CURHND)
/*---------------------------------------------------------*/
/* LOGOFF : 仮想ログオフ */
/*---------------------------------------------------------*/
DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
DCL VAR(&PRFHND) TYPE(*CHAR) LEN(12)
DCL VAR(&CURHND) TYPE(*CHAR) LEN(12)
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
/*( 仮想ログイン・ユーザーのハンドルを解放 )*/
CALL PGM(QSYS/QSYRLSPH) PARM(&PRFHND)
/*( 元のユーザーでのハンドルを取得してセッションを再開 )*/
CALL PGM(QSYS/QSYSETH) PARM(&CURHND)
RETURN
ERROR: RCVMSG RMV(*NO) MSG(&MSG)
SNDMSG: SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG)
ENDPGM