いくつかの 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