#if defined(W32) || defined (LNX)
.TSO サポート
tn3270+s3270+ind$file で TSO/E と接続し MVS のファイルを Downloadしlocalで編集,Upload します。
3270-FTP はかなり遅いので,xeの操作性を取る場合はお試しください。
しばらくはプライベートな Dataset で様子を見て下さい。
!!! xeの使用によるいかなる問題が発生しても責任は負えません。!!!
Windows版しかテストできていません。また HOSTの設定の関係で ISPF =6 画面でしかテストできていません。
初期画面がセッションマネージャーモード(ネイティブ TSO READY 画面)の場合は
xe3270.cfgのログオン手順定義でISPFコマンドを追加してください。
(--TurnkeyMVSの場合--)
"Turnkey MVS"はPC上で動くMVSR38Jです。HerculesがS370命令をエミュレートします。
以下TurnkeyMVSに特殊なことは(--TurnkeyMVSの場合--)で記述されます。
(0) 前提
s3270を経由します。s3270の導入が必要です。x3270/c3270/wc3270は使用できません。
#ifdef W32
s3270.exe のため cygwinの導入が必要です。
#endif
(--TurnkeyMVSの場合--)
x3270を使用する場合はその導入と、xe3270.cfgでの設定が必要です。
x3270を使用するとその時点の3270画面が見れますが、Focusを取られるようなら
Minimaizeしたほうが良いでしょう。
#ifdef W32
xe3270を開始する前にXサーバーを開始しておかないとコネクションが
失敗します("Pipe Closed"ないしは"TimeOut"になります)
#endif
MVS に IND$FILE の導入が必要です。ISPFの=6画面で IND$FILE と打って見て下さい。
(APVUFILEはDBCS対応していますが) IND$FILEは DBCS 対応していません。
DBCS(DoubleByteCharacterSet)については(6)を見て下さい。
また、SBCS言語環境でもuploadでスペース(0x20)がEBCDICブランク(0x40)にならない場合の
の対応についても(6)を見て下さい。
(--TurnkeyMVSの場合--)
(注意)IND$FILEバージョンに注意。
Hostファイル名を間違った時 ind$file106は "TARNS00file not opened"を
返しますが、ind$file111は応答を返さず待ちになります。
xeの対応としては事前にLISTDSコマンドで存在を確認します。
herculesがリモートにある場合はFireWallの例外設定が必要になる場合があります。
最初はs3270単体で次のように接続テストをしたほうがよいでしょう。
.s3270をオペランド無しでスタート。
.'connect hostname:23' と入力。 hostnameのところは "localhost" など
(--TurnkeyMVSの場合--)
'connect hostname:3270'
hosts ファイル(/etc/hosts ないし c:\windows\system32\drivers\etc\hosts) に定義された宛先。
表示されるステータス行のインディケータが"C"(4番目の文字)に変わりましたか。
画面内容はいつでも ascii コマンドで確認できます。
ascii
と入力してログイン画面が確認できますか。
.接続できたらLOGON 手順を実施するのですがこれはそれぞれの環境で異なります。
文字はStringコマンドで入力します。 例えば "LOGON UID001" と入力したい場合は
String "LOGON UID001\n"
と入力します。 最後の \n は Enterキーの意味で これを省略した場合は次に
Enter
と打ち込みます。
パスワードプロンプトが出たら同様にStringコマンドで答えます。
REENTER などがでて、ブレークにPA1を打ちたい場合は
PA(1)
PFキー,例えばPF3は
PF(3)
と打ち込みます。
(--TurnkeyMVSの場合--)
String "logon herc01\n"
と入力してログオンする
.FTPするにはTransferコマンドを使用します。
Transfer Direction=Receive HostFile=xxxx(yyy) LocalFile=zzz Exist=replace
FTPコマンド入力は 画面が TSO READY のときでないと出来ませんが
HOSTのLOGON PROCEDUREがLOGON後ISPF画面を呼び出す設定になっているかもしれません
その場合は "String =6\n" で SPF をコマンドシェル画面にしてください。
(1) xe の設定。
."::xehosts"(ワークディレクトリー内のxehostsファイル) に 接続先を定義する
例) T4E Heaven HERC01 "" TSO=23R
T4J 192.168.2.33 HERC02 password TSO=23R HOME='TEST.SRC.ASM'
"TSO=" が3270接続識別になります。オペランドにtn3270のポート番号を指定してください
通常は telnet の 23 で良いと思います
"R" は TurnkeyMVS でないことを示します。
(xe の SUB コマンドはTSOのSUBMITコマンドを使用します)
(--TurnkeyMVSの場合--)
TSO=3270 を指定してください
TurnkeyMVS の場合でその submit ツールを使用せず
TSOのSUBMITコマンドでJOBをSUBMITする場合は TSO=3270Sとしてください。
"TSO=" がないと通常の tcpip:ftp を使用したリモートファイルアクセスとなります。
TSOの場合ホストID(1つ目の項目)は大文字小文字区別無しです。
パスワードはファイルを保存すると暗号化されます。
HOMEを設定するとファイル名指定でDSNを省略してメンバー名のみを指定すればよくなります。
例えば "e h01:" でPDS メンバーリストを表示し、"e h01:abc"でメンバーABCを開きます。
HOMEは省略値の現行PDSの意味ですが CD コマンドでこれを一時的に変更できます。
HOME指定を有効に戻すには "CD h02:''"のように指定してください。
よく使用するPDSをいくつか別のホストIDで登録しておくのも良いでしょう。
但しlogon は userID 単位なのでリモートシェルでは同じ画面を見ることになります。
.xe3270.cfgの設定。
(作成、修正したら1度
xe3270 1 -wxxdir
でエラーがないかチェックしてください。xxdir は xe3270.cfg のあるディレクトリー。
xe3270.cfg に形式エラーがなければ
==>のコマンドプロンプトから
logon hostid,userid[/pswd]
と入力しLOGON手順を確認してください。
ここでの hostid は xehosts の宛先でなく OS の hosts の宛先です。
)
ファイルの場所は xe3270 の /w コマンドラインオプションでDirを指定しますが、
xe から自動起動される場合は 自動的にxeのワークディレクトリになります。
このファイルでログオン手順を定義してください。
SPF情報を表示/更新するにはSPF_LEVELとCMD_MEMBLISTの両方を指定します。
以下のオプションIDは、
CMD3270, OPTIONS, LOGON_CMD, LOGOFF_CMD, LOGON_ERR, TEXT_PRELOGON, SUBMITWORK
例えば LOGON_CMD は LOGON_CMD.T4E のように
オプションIDの後ろに宛先ID(xehostの1番目のワード)を指定できます
指定無しは省略値を設定します。宛先IDを指定した場合は
その宛先に対しては省略値は使用されないのでそのオプションIDに
ついて全記述する必要があります。
CMD3270 :s3270 にパスが通ってない場合、-charsetなどのオプションを指定する場合に使用。
:省略値は s3270。
(--TurnkeyMVSの場合--)
x3270を使用する場合は -script オプションをつけてください
#ifdef LNX
CMD3270 = "x3270 -script"
#else
CMD3270 = "bash c:\x3270script"
シェル x3270scriptは
DISPLAY=:0.0 x3270 -script
#endif
OPTIONS :以下のオプションがあります
NOGETCONF :Turnkey MVS との接続の場合転送ミスがあったのでDownloadは2度やって
両者が等しいことを確認います。これをオプションにしました。
NOPUTCONF :同様にUploadもUploadが完了したら再度Downloadして転送ミスがないか
確認しています。NOPUTCONFでやめることが出来ます。
(確認オプションONで転送確認処理でエラーを見つけた場合 ::xe3270ftp.perrlogに追加モードで
記録しています。一時は様子を見たほうが良いでしょう)
TEXT_PRELOGON :VTAM LOGON 画面を識別する文字列。
画面でこの文字列を見つけるとLOGON手順を開始します。
指定がないと3270セッションがx22で切れた場合に
"UNSUPPORTED FUNCTION"などのエラーが戻ります。
LOGON_CMD :LOGON 手順を記述します。
LOGON手順を記述しないと "logon %userid%/%pswd%\n" を打ち込みます
(%userid%,%pswd%はxehostに定義したものに置換)
各行に入力文字列[,確認文字列,[リトライ回数]]を指定し、xe3270は順に実行します
確認文字列の指定がありそれがリトライ回数以内に見つからないと手順は中断します。
リトライ回数の省略値=8で3秒(100から700msまでの和)待ちに相当します。
入力文字列には最後に\nをつけてください、そうしないとEnterキーを押したことになりません。
例えば
LOGON_CMD = "LOGON %user%\n"
入力文字列に"Action" プレフィクスをつけて3270アクション(3270のコマンド)を指定できます
例えば
LOGON_CMD = "Action MoveCursot(6,10)"
ただしEnter だけは Actionプレフィックスは省略できます
LOGON_CMD = Enter
のように"Action"プレフィックスなしで指定でき、Enter処理します。
3270アクションはs3270,x3270-scriptのマニアルを見てください。
EraseEOF,Attnなどがあります
複数フィールドに入力するとき\nをつけずに "ABC"のように入力、
Home,Tabアクションでカーソル移動し最後にEnterしてください。
\t(TAB),\r(改行),\f(Clear)も利用できます。
ABC\t123\rXYZ\n
は
ABC ; Action TAB ; 123 ; Action Newline ; XYX ; Enter
と同等です。
待ち時間をとるには ミリ秒単位でsleepコマンドを入れます
LOGON_CMD ="Sleep 5000" は5秒waitします
確認MSGの先頭に"|"をつけると取り扱いが変わります。例2参照。
例-1. TSO READY モードでない場合
LOGON_CMD = "Action Reset" # 保護エラー状態の可能性に対処。
LOGON_CMD = "Action Clear" # カーソル位置の入力可能を確保。
LOGON_CMD = "APP TSO4\n",IKJ56700A # VTAMの画面に "APP TSO4" を入力
# 画面中に"IKJ56700A" が表示されるのを待ちます。
# (IKJ56700A ENTER USERID)
LOGON_CMD = %user%\n,"TSO/E LOGON" # user id を入力します
# %user% は xehosts で定義されたuseridに置換されます
# "TSO/E LOGON" はこの例で ユーザーIDを入力した後
# パスワード入力用の画面のタイトル部に表示される文字列です。
# ユーザーID入力で画面が切り替わるのを待ちます。
LOGON_CMD = %pswd%\n,ICH70001I # %pswd% は xehosts で定義されたパスワードに置換されます。
# パスワード入力で画面が ICH7001I ... LAST ACCESSED ...
# に切り替わるのを待ちます。
LOGON_CMD = Enter,ISPF,3 # Enter Key を押す。
# ISPF 初期メニュー画面が表示されるのを待ちます。
# Timingの問題か時々ミスるので100ms sleepし3回リトライします。
LOGON_CMD = "=6\n" # SPF コマンドシェルパネルに移行します。
例-2 DBCS 環境のため パネルなしエラーとなる場合
LOGON_CMD = "Action Reset" # 保護エラー状態の可能性に対処。
LOGON_CMD = "Action Clear" # カーソル位置の入力可能を確保。
LOGON_CMD = "APP TSO4\n",IKJ56700A
LOGON_CMD = %user%\n,"TSO/E LOGON"
LOGON_CMD = %pswd%\n,ICH70001I
LOGON_CMD = Enter,"|ISPF DIALOG ERROR" #パネルエラー画面が出るので
#Enterをおすと TSO READY モードになるが
#("|ISPF DIALOG ERROR"のプレフィックス"|"は
#確認MSGが見つからなくてもLOGON失敗とせず次に進む。)
LOGON_CMD = Enter,READY #Enterをおすと TSO READY モードになるが
#この状態でTSOコマンドは使用できないので
LOGON_CMD = ISPF\n,"OPTION ===>" #ISPF と打って ISPFメニューを出す(但し英語モード)
LOGON_CMD = "=6\n","COMMAND SHELL" #=6パネルに移行(英語モードのタイトルを確認。)
LOGOFF_CMD :LOGOFF手順。
指定方法はLOGON_CMDと同じです。
LOGOFF手順を指定しないと PA(1)でREADYが出るのを待って"logoff\n"を打ち込みます
(--TurnkeyMVSの場合--)
PA1でRPFがbreakされTSO READY 画面になり有効ですが
ISPF では breakしても元のISPF画面に戻るため LOGOFF が unsupported cmd
になります。
例-1 (SPF終了で自動で切断される場合)
LOGOFF_CMD = "=X\n","*** VTAM" #SPF LOG/LIST 印刷オプション画面でとまらないように設定してください
#VTAM LOGON プロンプト画面を確認
例-2
logoff_cmd = "=X\n",BATCH #LOG/LIST オプション指定画面でとまる場合
logoff_cmd = "2\n","*** (T4)" #LOG/LIST オプションを入力してVTAM画面に推移するのを待つ
LOGON_ERR :LOGON 手順中画面に現れるエラーメッセージと対応アクションを定義。
アクションの指定方法はLOGON_CMDと同じですが、
複数アクションを";"で連結できます。
但し、"CONTINUE" アクションはエラーーとせずに何らかのアクションを
実行するための便宜的なものです。
下の例では"HIT THE ENTER KEY"が現れたらEnterキーを押すが
このMSGはエラーでなくログオン処理を続ける(LOGON_CMDの確認文字列を探す)。
また例の "_"プレフィックスは確認文字列が見つからなかった時に調べることを意味する。
"_"がない場合はLOGON_ERRを先にチェックするので同時に確認文字列があっても
LOGON失敗になる。
例
LOGON_ERR = IKJ56425I,"logoff\n" #ユーザーIDは使用中
#ENTER LOGON OR LOGOFF に LOGOFF と応答する
LOGON_ERR = IKJ56420I,"Action PF(3)" #ユーザーIDがオーソライズされてない。
#この場合の画面はPF3でLOGOFF処理がされる
LOGON_ERR = IKJ56421I,"Action PF(3)" #パスワードエラー
LOGON_ERR = IKJ56447I,"Action PF(3)" #REENTER THE NEW PASSWORD ... FOR VERIFICATION
LOGON_ERR = IKJ56415I,"Action PF(3)" #CURRENT PASSWORD HAS EXPIRED
LOGON_ERR = IKJ56710I,"Action PA(1);logoff\n" #INVALID USERID REENTER と出た場合
#PA1でブレークし、LOGOFF と入力する
LOGON_ERR = "_HIT THE ENTER KEY","Enter;Continue" #
RETRY_UPLOAD :PUTCONFIRM オプションの時のリトライ回数を指定。
Max:4 Min:0 Default:2
RETRY_DOWNLOAD :GETCONFIRM オプションの時のリトライ回数を指定。
Max:4 Min:0 Default:2
SPF_LEVEL :Dataset メンバーのSPF情報の取り扱い
0:TSOのLISTDS コマンドの出力情報を表示します。
1:メンバーのSPF情報がXE4S001Zを呼び出してディレクトリーリスト画面に表示されます。
2:SPF情報がxeのやり方で更新されます。
省略値はCMD_MEMBLIST指定がなければ 0, あれば 2。
CMD_MEMBLIST :PDSのメンバーリストを得るための TSO コマンド
XE4S001Z を呼び出すCALL コマンドを指定する。
指定しないと TSO の LISTDS コマンドが使用され、SPF 情報は表示されない。
例
CMD_MEMBLIST = "call 'TEST01.load.asm(xe4s001z)'"
PS_UPLOAD :Uploadの宛先としてメンバー指定のないDSNAME指定を許すか否か
1:許可 0:不許可(省略値)
PDSが壊されるのを心配したが現在は宛先にPDSのDSNAMEを指定すると
TRANS17 Missing or incorrect TSO data set name: file transfer canceled
で拒否されるようなので。
1としても問題はないようです。
RSH_ECHO :=6 (リモートシェル)画面のとき画面出力内容を
xe3270画面にもエコーする。
1:エコーあり(省略値)。0:エコー無し。
エコー無しにするとカーソル移動などの応答が多少よくなる。
TIMEOUT_CONNECT:3270接続のタイムアウト時間。
タイムアウトになるとxe3270の処理は続いているが一旦タイムアウト応答をxeに返すので
xe側は応答待ちを抜けて操作可能になる。
xe3270のDOS窓で状況をチェックしてください。
-1:無制限, 省略値=10秒
TIMEOUT_LOGON :接続後LOGON処理のタイムアウト時間
-1:無制限, 省略値=5秒
TIMEOUT_LOGOFF :接続後LOGOFF処理のタイムアウト時間
-1:無制限, 省略値=3秒
TIMEOUT_DISCONN:LOGOFF後切断処理のタイムアウト時間
-1:無制限, 省略値=3秒
TIMEOUT_FTP :FTP Send/Receive のタイムアウト時間
commandline parm -T override this cfg parm
-1:無制限,省略値=600秒(10分)
TIMEOUT_TSOCMD :RENAME,ALLOC,FREE など xe の tso コマンドで入力したコマンドの
タイムアウト時間。
-1:無制限, 省略値=30秒
CMD_ROW :SPFのコマンドシェル画面のコマンド入力行の行番号
REDAY モードかSPFパネルモードかの判定に使用
省略値は 6 (先頭行は1)
CHARSET_CFG :ICU/iconvなどの外部コンバータを使用する場合の
変換定義パラメータファイル名。
("EBCDIC変換"参照)
例。(先頭 "#"はコメントです)
#####################################################################
# xe3270.cfg
# Following options may be destination specific by the format of OPT.dest=xxxx.
# CMD3270, OPTIONS, LOGON_CMD, LOGOFF_CMD, LOGON_ERR, TEXT_PRELOGON, SUBMITWORK
# For ex. LOGON_CMD.T4E is for the destination T4E on xehosts.
# That is default if destination specified.
#
# CMD3270 :cmd to call 3270(enclose by quotation if optional parameter required)
# default is s3270
# To use x3270 on TurnkeyMVS -script option is required for xe.
# Windows example
# CMD3270 = "bash c:\x3270script"
# c:\x3270script contents is as following
# DISPLAY=:0.0 x3270 -script
# Linux example
# CMD3270 = "x3270 -script"
# OPTIONS : NOGETCONF:bypass confirmation procedure to download twice then compare.
# : NOPUTCONF:bypass confirmation procedure to download after upload then compare.
# ex) OPTIONS=NOGETCONF,NOPUTCONF
# TEXT_PRELOGON :String to detect VTAM LOGON prompt screen.
# Start logon procedure when this string is found on the screen.
# ex) TEXT_PRELOGON="Welcome to MVS3.8J" # Turnkey-MVS VTAM panel detection
# LOGON_CMD :defines xe3270 logon procedure.
# Each line format is
# Input string[,String to be detected[,Retry count]]
#
# ex) LOGON_CMD = "LOGON %user%\n",ICH70001I
# %user% and %pswd% is replaced by those defined on ::xehosts.
# \n:Enter, \r:Newline, \t:Tab, \f:Clear
# You can specify 3270 Actions(3270 cmd) using "Action" prefix.
# ex) LOGON_CMD = "Action Home"
# To insert timing sleep,
# ex) LOGON_CMD ="Sleep 5000".
#
#
# LOGOFF_CMD :define xe3270 LOGOFF procedure.
# same format as LOGON_CMD
# ex) LOGOFF_CMD = "=X\n","*** VTAM"
# LOGON_ERR :defines error message to be detected in LOGON procedure and related actions.
# ex) LOGON_ERR = IKJ56420I,"Action PF(3)" #USERID NOT AUTHORIZED
# Ex. (in my environment)
# LOGON_ERR = IKJ56425I,"logoff\n" #REJECT BY ALREADY LOGON
# LOGON_ERR = IKJ56420I,"Action PF(3)" #REJECT BY USERID NOT AUTH
# LOGON_ERR = IKJ56421I,"Action PF(3)" #REJECT BY PSWD NOT AUTH
# LOGON_ERR = IKJ56447I,"Action PF(3)" #REENTER THE NEW PASSWORD ... FOR VERIFICATION
# LOGON_ERR = IKJ56415I,"Action PF(3)" #CURRENT PASSWORD HAS EXPIRED
# LOGON_ERR = IKJ56710I,"Action PA(1);logoff\n" #invalid userid reenter
# RETRY_UPLOAD :read-check retry count when read check after put failed.
# Max:4 Min:0 Default:2
# RETRY_DOWNLOAD :read retry count when dual read unmatch
# Max:4 Min:0 Default:2
# SPF_LEVEL :process level of SPF information
# 0:CMD_MEMBLIST is not used.
# 1:SPF info is displayed on dir-list using XE4S001Z
# 2:SPF info is maintenanced using XE4S001Z
# default is 0 without CMD_MEMBLIST or 2 with CMD_MEMBLIST specified
# CMD_MEMBLIST :TSO command to get PDS memberlist
# Default is TSO native "LISTDS" command
# Specify you LibraryDataSet name if you use XE4S001Z prepared by xe package.
# ex) CMD_MEMBLIST = "call 'herc01.load.asm(xe4s001z)'"
# PS_UPLOAD :Allow DSNAME as upload target
# 1:allow 0:prohibit(default)
# "1" may accidentaly cause corruption of PDS directory.
# RSH_ECHO :Echo output to RSH screen to also xe3270 screen.
# 1:Echo ON(Default), 0:Echo OFF.
# CHASET_CFG :FTP translation parameter filename
#
# TIMEOUT_CONNECT:timeout to get 3270 connection by seconds
# commandline parm -C override this cfg parm
# -1:infinite, default=10
# TIMEOUT_LOGON :timeout to LOGON after 3270 connection succeeded.
# default=5
# TIMEOUT_LOGOFF :timeout to LOGOFF.
# default=3
# TIMEOUT_DISCONN:timeout to disconnect after LOGOFF.
# default=3
# TIMEOUT_FTP :timeout to file Send/Receive
# commandline parm -T override this cfg parm
# default=600
# TIMEOUT_TSOCMD :timeout to file Send/Receive
# -1:infinite, default=30
# CMD_ROW :Command input line of ISPF command shell panel.
# default=6 (start from 1)
#####################################################################
CMD3270.T4J = "s3270 -charset japanese-939 -km windows-932 -trace -tracefile c:\xe_wd\s3270.trc"
CMD3270.T4E = "s3270 -trace -tracefile c:\xe_wd\s3270.trc"
CMD3270 = s3270
OPTIONS = NOPUTCONF,NOGETCONF
#RETRY_UPLOAD = 2
#RETRY_DOWNLOAD = 2
SPF_LEVEL = 2
CMD_MEMBLIST = "call 'sak01.load.asm(xe4s001z)'"
PS_UPLOAD = 1 #allow upload to dataset without member specification
RSH_ECHO = 0 #no echo to xe3270 for input from RSH
charset_cfg = c:\xeebc.map
#######
#text_prelogon ="Welcome to MVS3.8J" # Turnkey-MVS VTAM panel detection
text_prelogon ="*** (T4)" #VTAM panel detection
text_prelogon ="UNSUPPORTED FUNCTION" #VTAM panel detection
###### LOGON procedure for the case initialy ISPF panel opened #########
#
LOGON_CMD.t4j = "Action Reset" # Reset protection error status
LOGON_CMD.t4j = "Action Clear" # confirm string input availability
LOGON_CMD.t4j = "APP TSO4\n",IKJ56700A # Input on VTAM prompt panel
# After input "APP TSO4", wait "IKJ56700A" appears.
# (IKJ56700A ENTER USERID)
LOGON_CMD.t4j = %user%\n,"TSO/E LOGON" # Input user id.
# %user% is replaced by userid defined on xehosts.
# Wait "TSO/E LOGON" appears.
# "TSO/E" the string in the panel prompting input password
# in my environment.
LOGON_CMD.t4j = %pswd%\n,ICH70001I # %pswd% is replaced by password on xehosts.
# Wait "ICH7001I ... LAST ACCESSED ..." appears.
LOGON_CMD.t4j = Enter,ISPF,3 # Press Enter key.
# Wait ISPF primary options menu panel.
# Retry screen check 3 times inserting 10mms sleep.
LOGON_CMD.t4j = "=6\n" # change to command shell panel
#
## DIALOG ERROR case when s3270 is not enable-DBCS and HOST SPF is DBCS panel(for Japanese user)
#
LOGON_CMD.t4e = "Action Reset" # Reset protection error status
LOGON_CMD.t4e = "Action Clear" # confirm string input availability
LOGON_CMD.t4e = "APP TSO4\n",IKJ56700A
LOGON_CMD.t4e = %user%\n,"TSO/E LOGON"
LOGON_CMD.t4e = %pswd%\n,ICH70001I
LOGON_CMD.t4e = Enter,"|ISPF DIALOG ERROR",3 #error caused by DBCS environment
#but changes to native TSO READY mode by Enter key.
#prefix "|" means that it is not logon-fail
#when the msg is not found,
# and continue to next procedure.
LOGON_CMD.t4e = Enter,READY,3 #change to native TSO READY mode by Enter key.
#any TSO cmd cause disconnection in this status.
LOGON_CMD.t4e = ISPF\n,"OPTION ===>" #but ISPF is only avalable cmd,
#change to english mode ISPF primary options menu panel.
LOGON_CMD.t4e = "=6\n","COMMAND SHELL" #change to command shell panel.
#define action if detected error msg in logon procedure
LOGON_ERR = IKJ56425I,"logoff\n" #REJECT BY ALREADY LOGON
LOGON_ERR = IKJ56420I,"Action PF(3)" #REJECT BY USERID NOT AUTH
LOGON_ERR = IKJ56421I,"Action PF(3)" #REJECT BY PSWD NOT AUTH
LOGON_ERR = IKJ56447I,"Action PF(3)" #REENTER THE NEW PASSWORD ... FOR VERIFICATION
LOGON_ERR = IKJ56415I,"Action PF(3)" #CURRENT PASSWORD HAS EXPIRED
LOGON_ERR = IKJ56710I,"Action PA(1);logoff\n" #invalid userid reenter
LOGON_ERR = "_HIT THE ENTER KEY","Enter;Continue" #
##
#define logoff procedure
## for the case that Automatically disconnected when exit from ISPF
LOGOFF_CMD = "Action Home" #move cursor to home position
LOGOFF_CMD = "Action EraseEOF" #enable to input string
LOGOFF_CMD = "=X\n","*** VTAM",3 #Set LOG/LIST option to bypass the LOG/LIST option input panel.
# #detect VTAM LOGON prompting panel
##SPF LOG/LIST option set required case
#logoff_cmd = "=X\n",BATCH #detect LOG/LIST option input panel
#logoff_cmd = "2\n","*** VTAM" #Input LOG/LIST option,then wait ISPF exit.
#
#TIMEOUT_CONNECT = 20
TIMEOUT_LOGON = 20
TIMEOUT_LOGOFF = 5
#TIMEOUT_FTP = 600
#TIMEOUT_TSOCMD = 60
#CMD_ROW =6
#####################################################################
.XE4S001Zの導入。
xe3270.cfgでCMD_MEMBLISTを使用する場合は添付のXE4S001Zを
ASSEMBLEして適当なLoadModuleLibralyに置きconfigを設定してください。
PDSのメンバーリストにSPF情報(最終更新日時、ファイルサイズ、行数、
ユーザー名)が表示されメンテナンスされるようになります。
ASSEMLE の参照 MACLIB はつぎのとうりです。(SPマクロを使用しています)
// EXEC PGM=IFOX00,PARM='...,SYSPARM=NOSNAP',...
//SYSLIB DD DSN=SYS2.MACLIB,DISP=SHR
// DD DSN=SYS1.MACLIB,DISP=SHR
// DD DSN=SYS1.AMODGEN,DISP=SHR
(SYSPARM=NOSNAPはデバッグ用のマクロULSNAPをNOP化するための指定です)
Assemble 出来ない場合は添付のOBJECTをLKEDして見て下さい
XE4S001Z.obj を LRECL=80 バイナリーモードでFTP UploadしLKED。
//TESTLKED PROC MBR= 00040000
//********************************************************************//00050000
//* LKED *//00060000
//********************************************************************//00070000
//********************************************************************//00127000
//* LINK EDIT ( AMODE=31,RMODE=ANY ) *//00128000
//********************************************************************//00129000
//LKED EXEC PGM=IEWL, 00130000
// PARM='LET,LIST,MAP,XREF,RENT' 00140001
//SYSLMOD DD DISP=SHR,DSN=TEST.SAK.LOAD(&MBR) 00170000
//SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA, 00180000
// SPACE=(1024,(200,50),,CONTIG,ROUND),DCB=BLKSIZE=1024 00190000
//SYSPRINT DD SYSOUT=* 00200000
//SYSLIN DD DISP=OLD,DSN=TEST.SAK.OBJ(&MBR) 00211000
// PEND 00220000
//SS1 EXEC TESTLKED,MBR=XE4S001Z COND=ONLY 00230000
//* 00260000
(--TurnkeyMVSの場合--)
添付のawsテープファイルからLoadModuleを導入するには次のようにしてください
- テープユニットをオンラインにする。
MVS コンソールから "V 480,ONLINE" と入力
- XE4S001Z.jclをサブミットする。
Turnkey-MVSのsubツールを使用するか、3270FTPで転送してTSOサブミットする。
jclは//DD2の導入先DSNを自分の環境にあわせて変更してください。
(LoadModuleはBLKSIZE=19069で作成してあります)
- マウント要求がでるので Hercules のコンソールからawsファイルをマウントする。
"devinit 480 (path)XE4S001Z.aws"
(path)のところにはPCでのXE4S001Z.awsの経路をあたえる。
修正してaws ファイルを作成する方法は添付の MAKEAWS.jcl を参照
(2) TSO アクセス。
(2-1) FTP
xe の Edit/Browse コマンドでファイル名の先頭でHost識別を指定します。
例) e h02:'herc01.source.asm(memb1)'
e herc01:source.asm(memb1)
最初のアクセス要求の時にxe3270.exeをスタートさせ名前付パイプでやり取りします。
#ifdef LNX
中継サーバー子プロセスxe3270を起動するTerminal Emulatorはiniファイルで
設定されます。省略値はgnome-terminal,konsoleを探しなければxtermが使用されます。
#endif
パイプの窓口はマルチで対3270はマルチスレッドですがこれはTimeout用で
基本的にはシングルスレッド処理です。
ユーザーID毎に3270エミュレータプロセスを立ち上げるので複数xeからの
同じユーザーIDの使用が出来、一つのxeから複数のユーザーIDの使用も出来ます。
xeを終了してもxe3270.exeは残り、xeからの次のリクエストを待ちます。
xe3270.exeはDOS窓を持ち、状況が確認できます。
画面出力はオプション(xeの /F オプション)で::xe3270.logにロギングします。
xe の "TSO" コマンドでいくつかのコマンドをサポートし、
MVS TSO コマンドの実行、障害時の応答の入力などに使用します。
コマンドはxe3270プロセスのシェル窓からも入力できます。
ログオン手順が失敗して正しく画面推移できなかった場合や、
予期せぬ応答待ち画面(ENTER-,REENTER-)になった場合に
String コマンドで適切に対応する場合などに使用します。
(2-2) リモートシェル。
(a) xeのコマンド出力画面(=6画面)を開いて TSO logonするとlistalcなどのTSOコマンドを
そのまま入力できます。
=6.xxx [FS3|FST|NFS]
xxx :xehostに定義された宛先.
FS3 :(b)の3270キーボードモードで開始。
FST :(c)のTSOキーボードモードで開始。
NFS :(全画面モードではない)画面追記モードで開始。
指定なしは"TSO xxx: logon FS" と同じです。
FS(全画面モード)でない場合は応答分のみが表示されます。
入力は最初が CAP ON 状態です。
("\"のあとの文字はs3270に送る時には小文字に戻されます。 例えば \N-->\n。)
Ascii/Snapコマンドは現在の 3270 画面を全画面表示します。
全画面モードのとき画面には入力できません。
TSO logoffでローカルコマンドモードに戻ります。
("TSO xxx logoff" と入力、xxxは上記のxxx)
操作性は良くないですが SPF の画面入力も出来ます。
xeのコマンド行からカーソル位置への文字列入力、
s3270がサポートするActionコマンドが利用できます。
xeのコマンド,TSO画面入力文字列,Actionコマンドで重複がある場合
">" プレフィックスをつければ3270入力、
2重引用符で囲めばTSO画面文字列、
Action プレフィックスをつければActionコマンドになります。
例えば exec TSO コマンドは xe の EXEecute コマンドとコマンド名が重複します
TSOへ送るには
>exec 'herc01.source.clist(helloc)'\n
のように入力します。
=2
は xe の =2 ですが
>=2\n
"=2\n"
は TSO 画面への入力となります。
Action Home
>Action Home
>>Home
はs3270 Action コマンドです。
以下のコマンドは Action プレフィックス無しで入力できます。
大文字小文字の区別はありません
例) eraseeof
EEOF
>EEOF
>>H
>>D
>Ins
次のキーは代替の文字入力出来ます
Enter:\n, TAB:\t, 改行:\r, 画面クリアー:\f, Left :\b
例) >ABC\tEFG\tXYZ\n
3270 Action 短縮形 機能
------------- ------ -------------------------------------
"Attn" "Att" //attention key
"BackSpace" "BS" //move cursor left (or send ASCII BS)
"BackTab" "BT" //tab to start of previous input field
"CircumNot" "Not" //input "^" in NVT mode, or "¬" in 3270 mode
"Clear" "" //clear screen
"DeleteField" "DF" //delete the entire field
"Delete" "DC" //delete character under cursor (or send ASCII DEL)
"Down" ">D" //move cursor down
"Enter" "" //Enter AID (or send ASCII CR)
"EraseEOF" "EEOF" //erase to end of current field
"EraseInput" "EINP" // erase all input fields
"Erase" "ERA" //erase previous character (or send ASCII BS)
"FieldEnd" "FEND" //move cursor to end of field
"HexString" "Hex" //(hex_digits) insert control-character string
"Home" ">H" //move cursor to first input field
"Insert" "" //set insert mode
"Key" "" //(keysym) insert key keysym
"Left" ">L" //move cursor left
"MoveCursor" "MVC" //(row, col) move cursor to (row,col)
"Newline" "NL" //move cursor to first field on next line (or send ASCII LF)
"PA" "" //PA n/PA(n) Program Attention AID (n from 1 to 3)
"PF" "" //PF n/PF(n) Program Function AID (n from 1 to 24)
"Reset" "Res" //reset locked keyboard
"Right" ">R" //move cursor right
"String" "Str" //(string) insert string (simple macro facility)
"SysReq" "Sys" //System Request AID
"Tab" "" //move cursor to next input field
"ToggleInsert" "Ins" //toggle insert mode
"Transfer" "FTP" //(option=value...) file transfer
"Up" ">U" //move cursor up
(注) 現在の所 画面のInsert状態を知る手段がありません。
InsertキーをToggleInsertアクションに割りあてています。
TSOモードのときにローカルコマンドを実行したい場合はローカルコマンドの前に
":"を付けてください。例えば
:grep ABC *.c
(b) HOTキーでキーボードアクションを3270様に切り替えることができます
3270---*::SO2 T4J:(128.101.207.9) ---------------------------- 001-( 1)-102=Rep
===> ===>HALF
11:26:41 ===>> PF(11)
メニュー ユーティリティー コンパイラー オプション 状況
ヘルプ
------------------------------------------------------------------------------
ISPF 基本オプション・メニュ .RIGHT . が非活動状態
オプション ===>
0 設定 端末とユーザー・パラメーター USER ID . : USER002
1 ビュー ソース・データまたは 時刻 . . : 11:24
リスト表示 端末 . . : 3277KN
2 編集 ソース・データの作成と変更 画面 . . : 1
3 ユーティリティー ユーティリティー機能の実行 言語 . . : KANJDBCS
4 前景 対話式言語処理 APPL ID . : XXX
5 バッチ 言語処理へジョブの実行要求 TSO LOGON : TSOLPS2
6 コマンド TSO またはワークステー TSO PREFIX: USER002
ション・コマンドの入力 SYSTEM ID : T4J1
7 ダイアログ・テスト ダイアログ・テストの実行 MVS 会計 : * なし *
8 LM 機能 ライブラリー管理機能 リリース : ISPF 5.0
9 IBM 製品 IBM プログラム開発製品
X を入力すると、ログ/リストの省略値を用いて終了します。
U F U C(128.101.207.9) I 4 24 80 4 19 0x0 -
ok
********** END OF FILE **********************************************************
(日本語画面表示のためにはセットアップが必要です。(6) DBCS 環境 を参照)
3270---*::SO1 T4E:(128.101.207.9) ------------------------------- 001-( 5)-102=Ins
===> ===>HALF
10:21:35 ===>> PF(3)
MENU UTILITIES COMPILERS OPTIONS STATUS HELP
ISPF PRIMARY OPTION MENU
OPTION ===>
0 SETTINGS TERMINAL AND USER PARAMETERS User ID . : USER002
1 VIEW DISPLAY SOURCE DATA OR LISTINGS Time. . . : 10:20
2 EDIT CREATE OR CHANGE SOURCE DATA Terminal. : 3277KN
3 UTILITIES PERFORM UTILITY FUNCTIONS Screen. . : 1
4 FOREGROUND INTERACTIVE LANGUAGE PROCESSING Language. : ENGLISH
5 BATCH SUBMIT JOB FOR LANGUAGE PROCESSING Appl ID . : XXX
6 COMMAND ENTER TSO OR WORKSTATION COMMANDS TSO logon : TSOLPS2
7 DIALOG TEST PERFORM DIALOG TESTING TSO prefix: USER002
8 LM FACILITY LIBRARY ADMINISTRATOR FUNCTIONS System ID : T4E1
9 IBM PRODUCTS IBM PROGRAM DEVELOPMENT PRODUCTS MVS acct. : **NONE**
ENTER X TO TERMINATE USING LOG/LIST DEFAULTS
U F U C(128.101.207.9) I 4 24 80 3 13 0x0 -
ok
********** END OF FILE *********************************************************
HOTキーの省略値は A+z です。再度押すとxeのモードに戻ります。
ヘッダー行の左端 "3270" が3270キーボードモードを示します。
3270キーボードの機能キーは次の表のとおりです。
xeの機能の余地を残すためPCOM省略値とは多少違います。
たとえば "Attn" は Shift+Esc,カーソル移動はShift+です。
画面には入力できません。コマンド入力行から入力します。
入力文字列はEnterキーでTSO画面入力とされます。
xeのコマンドと重複する場合xeの処理が行われます。
例えば、
HEX
は xe のHEX コマンド、
>HEX
"HEX"
は 画面文字入力=HEX、
>>HEX
は 画面文字入力=>HEX となります。
3270 Action 入力は,3270アクションをコマンド入力行に入力し
Alt+aキーを使用してください。
ISPFの場合FTPコマンドLISTCなどのTSOコマンドは=6画面からしか入力できないので
xe3270はSPF画面のときは内部的に=6を発行しています。
従ってTSOフルスクリーンリモートシェルの画面は裏面で変わっていることがあります。
(--TurnkeyMVSの場合--)
RPF は =6を入力できない画面があるので=6を発行しません。
FTP/LISTC は READY モードで使用してください。
RPFを全画面で操作する場合別のUSERIDを使用してください。
3270モードキーとアクション
+----------------------------------------------------------------+
| Key ||(No modifier)|Shift+ | Alt+ | Ctrl+ |
|----------||-------------|------------|-------------|-----------|
| Enter ||Enter/NewLine| | | |
| R-Ctrl ||Enter/NewLine| | | |
| Esc || |Attn |SysReq | |
| Tab ||Tab |BackTab | | |
| BackSpace||Erase | | | |
| a || | |Action | |
| c || | |Reset | |
| q || | |(TSO-kbd) | |
| r || | |NewLine | |
| Insert ||ToggleInsert | |PA(1) | |
| Delete ||Delete | | |DeleteWord |
| Home ||Home | |PA(2) | |
| End ||EraseEOF |DeleteField |EraseInput | |
| Left || |Left |PreviousWord | |
| Right || |Right |NextWord | |
| Up || |Up | | |
| Down || |Down | | |
| PgUp || | |PA(3) | |
| F1 ||PF(1) |PF(13) | | |
| F2 ||PF(2) |PF(14) | | |
| F3 ||PF(3) |PF(15) | | |
| F4 ||PF(4) |PF(16) | | |
| F5 ||PF(5) |PF(17) | | |
| F6 ||PF(6) |PF(18) | | |
| F7 ||PF(7) |PF(19) | | |
| F8 ||PF(8) |PF(20) | | |
| F9 ||PF(9) |PF(21) | | |
| F10 ||PF(10) |PF(22) | | |
| F11 ||PF(11) |PF(23) | | |
| F12 ||PF(12) |PF(24) | | |
+----------------------------------------------------------------+
(注)右Ctrlキー使用のオプションでEnter/R-Ctrl の効果は変わります
また各々、条件によってはxeの機能が実行されます。
基本はコマンド入力行に入力があるときは xe の処理をします。
Enter/Rctrl:実行機能の時はカーソルがコマンド入力行にあり、
コマンド入力行に入力があるときはxeとしてコマンド行入力を処理します。
Home :カーソルがxeのホーム(コマンド入力行の最初)にないときは
xeのホームにカーソルを移動します。
BackSpace :カーソルがコマンド入力行でホーム位置でないときは
xeが処理します。
Ins/Del/End:カーソルがコマンド入力行にあり、コマンド入力行に入力が
あるときはxeが処理します。
(c) A+q でさらに TSO スペシフィックなモードになります。
文字入力は1文字づつ転送されます。"\n"なども特別な意味は持ちません
Alt+a(アクションコマンド)は使えません。
カーソル移動はシフトキーなしです。
このモードの時Alt+qは3270モードへ、3270ホットキーはxeモードへ
戻します。
(3) 障害対応
(--TurnkeyMVSの場合--)
.Herculesがあがってない,MVSがあがってない
#ifdef LNX
"port 3270:Connection refused."(Heculesがあがっていない場合)
"Connection rejected,no available 3270 device"(Heculesがあがっている場合)
#else
応答無し-->TimeOut(10秒)
#endif
.3270デバイスがつながってない。
応答無し-->TimeOut(10秒)
---> MVSコンソールから INACT/ACTする。
V NET,INACT,ID=CUU0Cx,I
V NET,ACT,ID=CUU0Cx
この手順は、PF2にコマンド設定されいるとおもいます。
(MVSコンソールから"D PFK"で確認)
.セッション数が定義を超えた(xeはホスト名+USERID単位でs3270を立ち上げます)
"no available 3270 device"
--->開いている 00Cx のTSO画面をどれか閉じてxe3270から使えるようにする。
また、端末数を増やすにはsetupterm を実行する。
starttermも調整してxe用にセッションを空ける。
(SYS1.VTAMLSTには0C0から0C7までの8個が定義されている。)
.TSOがあがってない
"APPLICATION IS INACTIVE"
--->S TSO
.USERID エラー
"INPUT NOT RECOGNIZED"
--->::xehostsを修正してリトライ
.PSWD エラー
"PASSWORD NOT AUTOLIZED FOR USERID"
"REENTER -"
--->"TSO reply hostid valid-password"コマンドを入力
(LOGON 手順定義の中でREENTERをブレークしLOGOFF発行まで自動化できます)
::xehostsのパスワードは修正しておく
現在の3270画面はxe3270.exeDOS窓から"snap"コマンドで見ることが出来ます。
.重複ログオン
"IKJ56425I LOGON REJECTED, USERID xxxx INUSE"
--->Native TSO READY モードの場合は内部的にLOGOFFを発行する。
SPF モードの場合はLOGON 手順定義の中にLOGOFF発行を組み込んでください。
もし複数ユーザーIDを持っていれば別のユーザーIDでLOGONし
"C U=xxxx"と打てば早く開放できる。
(--TurnkeyMVSの場合--)
"C U=xxxx"はMVS コンソールから入力します。
.ファイルエラー
Datasetなし、メンバーなしともに
TRANS17 Missing or incorrect TSO data set name: file transfer canceled
が返されます。
x37のABENDが起こっても次のような応答が帰り、
TRANS19 Error reading or writing to host disk: file transfer canceled
(--TurnkeyMVSの場合--)
ファイルが見つからないとき
IND$FILEのv106は FILE00のエラーを返すが、v111では無限Waitします。
xeはLISTDSコマンドで事前に存在確認をしますがWaitした場合
MVSコンソールでS013ABENDなどが起こってないかチェックしてください。
.タイムアウト。
LANケーブル抜けなど
接続時は10秒TimeOutを設定していますが、FTP時はTimeout無しです。
xe3270.exe のDOS窓からCancelしてください。
Timeout しても s3270から応答が帰るまではスレッドはふさがっているので
"now busy"のエラーになります。
xe3270が反応しない場合はTSOユーザーをキャンセルして見て下さい
C U=userid
だめならs3270プロセスをキャンセルしてください
#ifdef LNX
killコマンドを使用。
#else
Windowsの場合は同梱のツール xkp を使用してください
xkp -l で xe3270 の 子プロセスのs3270を特定し
xkp pid で kill します。
#endif
障害で保存できない時は Save コマンドで一旦ローカルに保存し
CANcel で編集を終え、回復したら保存先を開いて元のファイルに戻してください。
(4) その他。
.TSOファイルを開く時省略値はCAPS ONで開きます。
そうしたくない場合はCAPコマンドで省略値を変更するか
Edit/Browseコマンドで[CAP|NOCAP]オプションを指定してください。
CAPオプションが有効な時英小文字入力ははShiftキーを使用します。
.RECFM=Fx,LRECL=80のTSO ファイルでは E/B コマンドはデフォルトでEN/BNの
扱いになります。(COBOLファイルの場合 col73-80:行番号を自動メンテするには
依然としてECNのようにNの指定が必要です)
col.73-80が行番号でなく通常データのファイルの場合 F80のオプション指定が
便利ですがこれも E8 コマンドを使用してください。
別名コマンド機能を使うと/p1(col73-80を保護)などのオプションパラメータを
毎回指定するわずらわしさを避けることができます。
バイナリーオープン(EB,EHコマンド)するとEBCDICのままDownload/Upload
されます。(Copy/Move/App コマンドでは /B オプションで無変換転送になります)
.ファイル名の他ファイル参照形式は次の形式も使用できます。
*\ --> *. **\ --> **. ^*\ --> ^*.
例えば h01:'a.b.c(m1)' を開いている画面で "e *(m2)"と入力すると
h01:'a.b.c(m2)'を開きます。 **.d(m3) で h01:'a.b.d(m3)'。
分割画面では "^*"で他方の画面のファイル名を参照します。
例えば h01:'a.b.c(m1)' を開いているとき分割画面のもう一方から
"e ^*(m2)"で h01:'a.b.c(m2)'を開きます。 ^*.**(m4)で h01:'a.b(m4)'。
.JCLのSUBMITは TSO SUBMIT コマンドを使用します
DataSet のメンバーを開き画面上で更新ありの場合は、
規定のDataset:'XE3270.TEMP.SUBMIT'に更新内容をUploadしSUBMITします。
規定のSUBMIT用のワークは xe3270.cfg で変更できます。
SUBMITWORK.xxx="'DSNAME(MEMBNAME)'" の形式で指定してください
PDSでなくSEQUENCIAL D/S よい。1重引用符(')なしのばあい UserIDが前に着く。
それ以外の場合(DataSet ディレクトリーリストの "#" 行コマンド,
ファイル名指定の SUBmit コマンド、JCL メンバーを開いた画面で更新無しの場合)は
そのまま、そのDSN(MEMBER)をSUBMIT します。
ローカルファイルを直接TSO SUBMITはできません。Uploadしてください。
(--TurnkeyMVSの場合--)
Download の オーバーヘッドを避けるため TSOEの場合と同じにしたい場合は
::xehost での指定が必要です
TSO=3270S
のように "S" をつけてください。
ローカルのファイルを直接SUBMITしたい場合は以下のようにしてください。
JCLをSUBMITするにはTurnkey-MVSで提供されているsub.batを使用します。
xe の SUBコマンドでこのsub.batを呼び出します。
PATHを通して置いてください。
Turnkey-MVSのファイルを開いている画面では単に"SUB"とすればSubmitされます。
Localのファイルを開いている画面では "SUB sub *"と入力します。
これが面倒な場合、別名コマンド機能を使用すれば入力を簡略化できます。
=0.1の画面で 例えば"Alis:JCL SUB sub.bat *"としておけば
Localのファイルを開いている画面で JCL とだけ入力すればよい。
さらにはSUBをTSOサブミットとしたければiniファイルのサブミットコマンドの
コマンドIDをSUB以外に換えてAliasでSUBを定義すれば可能です。
ディレクトリーリストからSUBする場合は "#" 行コマンドを使用します。
改名欄のオペランドは指定しても無視されます。
"%" 行コマンドを使用する場合は改名欄に sub(Turnkey-MVSの提供するツール名)を
入力します。
.SPF情報について。
xe3270.cfgでXE4S001Z使用を指定した場合、RECFM=Fx,LRECL=80のPDSのメンバーについては
ディレクトリーのSPF情報(バージョン、更新日、行数など)をもしあれば
それをディレクトリーリスト画面で表示します。
F6キーで行数とファイルサイズ表示を切り替えられますが、TSOファイルの初期値は行数表示です。
USERIDを表示するにはShift+F6を使用します。
PDSのディレクトリーのユーザーデータ(SPF情報)はIND$FILEでUploadすると失われますがxeで更新情報を
復元します。
MM(更新番号)の更新は以下のようになります。
カラム73-80が全て数字の場合カラム79-80が更新番号として使用されます
読み込み時に全行の最大番号がそのメンバーのMMとなり編集終了時に
そのセッションでの更新行に+1が設定されます。
Save/Replaceコマンドで既存メンバーを置換する時もその値が設定されます。
PCファイルなど元ファイルがSPF情報がないファイルをTSOファイルに
Save/Replaceする場合とAppendコマンドの場合は宛先のMM+1を設定します。
XCOpyコマンドでは複写元の値が複写され、XAPpendコマンドでは+1になります
バージョン番号の変更はディレクトリーリストの"a"行コマンドでも可能です。
xeのTSOコマンド-SPFサブコマンドでPDS全体(ワイルドカード指定も可能)の
SPF情報を一括して設定することも出来ます。
例えば、SPF情報のないPDSの全メンバーに現在行数をカウントしてSPF情報を設定したい場合など。
(RPFでSPF情報が表示されるには作成日、更新日、ユーザー名が必要なようです)
XE4S001Zをバッチで実行する場合、パラメータの指定はXE4S001Zのソースのヘッダー部を参照してください
"NOW"を作成日、更新日時、初期行数、現在行数で指定できます。
今日の日付,時間,メンバー現在行数が設定されます。
ユーザーID以外では先頭が数字でなければ無指定とみなします。
*(2)* UPDATE SPF INFORMATION ON PDS DIRECTORY ********************* 00330030
* PARM FORMAT 00340030
* '1,DSN(MEMB),VV,MM,CDATE,UDATE,UTIME,CURLINE,INITLINE,USER' 00350035
* 00360034
* (START BY NOT NUMERIC MEANS MISSING OPERAND EXCEPT FOR USERID) 00370034
* (!!! RPF(V153) NEED CRE-DATE/UP-DATE/USERID TO DISPLY ON DIRLIST) 00380039
* 00390034
* 1:FUNCTION ID:UPDATE SPF INFO 00400030
* MEMB:REQUIRE. WILDCARD('*' or '?') IS AVAILABLE. 00410030
* VV:VERSION 00410030
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00420034
* +N FORMAT IS USED TO INCREMENT 00430030
* MM:MODIFICATION LEVEL 00440030
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00450034
* +N FORMAT IS USED TO INCREMENT 00460030
* 'NOW' IS USED TO SET TO MAX VALUE OF COLUMN 79-80 00470038
* CDATE:CREATED DATE 00480030
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00490039
* 'NOW' IS USED TO SET TO TODAY 00500034
* '000000' IS USED TO SET TO 0 00510039
* UDATE:LAST UPDATED DATE 00520030
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00530039
* 'NOW' IS USED TO SET TO TODAY 00540030
* '000000' IS USED TO SET TO 0 00550039
* UTIME:LAST UPDATED TIME 00560030
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00570039
* 'NOW' IS USED TO SET TO CURRENT TIME 00580031
* CURLINE:CURRENT LINE COUNT 00590031
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO 00600033
* 'NOW' IS USED TO SET CURRENT LINE COUNT BY READING MEMBER 00610034
* INITLINE:INITIAL LINE COUNT 00620035
* IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO. 00630035
* 'NOW' IS USED TO SET CURRENT LINE COUNT BY READING MEMBER 00640035
* USER :LAST UPDATED USER 00650031
* IF MISSING,KEEP CURRENT VALUE OR SET BLANK IF NO PREVIOUS INFO 00660031
*SAMPLE JCL TO EXECUTE BATCH * 00670031
*//GO EXEC PGM=XE4S001Z,PARM=('1','HERC01.SOURCE.ASM(MEMB),', 00680033
*// '01,21,061105,061125,2210,99,101,HERC01') 00690031
*//GO EXEC PGM=XE4S001Z,PARM=('1','HERC01.SOURCE.ASM(MEMB),', 00700033
*// 'VV,+1,CDT,NOW,NOW,CLC,NOW,HERC01') 00710035
*//GO EXEC PGM=XE4S001Z,PARM='1,HERC01.SOURCE.ASM(MEMB),DEL' 00720035
*//STEPLIB DD DISP=SHR,DSN=HERC01.LOAD.ASM 00730031
(5) 使用上の制限
!! .SPF情報の更新はPDSディレクトリを排他使用する必要があるためDISP=OLDのアロケーションで
失敗することがあります。(RESERVEは使用していません)
SPFを閉じて再度保存を実行してください。
.UploadはデフォルトではPDSのメンバーに限ります。
.RECFM=F(B)へUploadすると短文は拡張され,長文は分割されるようです。
Downloadでは後ろのブランクはトリムされます。
バイナリーモードでDown/Upすると固定長の整数倍にNullが補填される様です。
!! .TurnkeyMVSとのS3270+IND$FILEでは原因は不明ですがUp/Downとも転送で1画面量(24*76=1844?)程度の重複出力が
発生することがありました。
以下の対応をしていますが現在のメインフレーム相手で必要かどうかはわかっていません。
::xe3270ftp.errlogにappendモードで記録しているので様子を見てください。
cfgファイルで NOPUTCONFIRM,NOGETCONFIRM オプションを指定することにより以下の処理は省略出来ます
xe3270ではGet時Downloadを2回行い2回の内容が同じ時にGet成功としています。
2回の内容が異なる時リトライします。リトライ回数はxe3270.cfgで指定します。
(タイムアウトの場合はリトライしません)
リトライ回数を超えて失敗した場合一時Dir(Windowsでは TEMP環境変数のDir,Linuxでは/tmp)に
検証用のファイル残されています。
ネーミングはxe32270pc.xxxxxxxx.GETn.yy。xxxxxxxxはメンバー名。
エラーが発生したら通常は再度Getをすればよいでしょう。
PDS全体ののコピーが中断した場合などには"/y-"(同じ名前がある場合は飛ばして処理続行)
オプションを指定すると良いでしょう。
Put時は再Downloadし送信元と同じか確認します。
SPF_LEVELを指定した場合はタイムスタンプが変わっていなければOKと判断しますが
そうでない場合サイドDownloadして中身を比較します。
(--TurnkeyMVSの場合--)
RPF V1M5R3ではディレクトリーには時分しか保存されていません
分単位の誤差が出ます。
バイナリーモードのPutではRECFM=Fを維持するためNullが補填され
長さが変わることがあります。Nullが追加されただけの場合はxe3270の窓に
出力されます(Logオプションを指定していればLogにも残ります)が
xe上は正常保存とみなされます。
READ-CHKが失敗したらPut/Getをリトライします。リトライ回数はxe3270.cfgで指定します。
リトライ回数を超えて失敗した場合一時Dirに検証用のファイル残されています。
ファイルのネーミングはxe32270pc.xxxxxxxx.PUTGETn.yyです。xxxxxxxxはメンバー名。
編集の保存によるPutでこれが発生した場合は更新を破棄しても編集後の内容が
ワークDir\xeftpwdに残されています。ファイルのネーミングは xxxxxxxx.timestampです。
エラーが発生したら通常は再度保存すればよいでしょう。
但し、IND$FILEはRECFM=Fxで行長がLRECLを超える場合行を分割します。
READ-CHKはこれを考慮し行分割を検知したらxe3270窓に警告を出しBeepを二回
鳴らしますがUploadは成功とします。
EBCDIC<-->ASCIIの変換が可逆的でない文字が含まれる場合にも発生します。
ファイル比較ツールなどで確認してください。(xeパッケージにも
比較ツールxfcがついています)
!! .保存時に再度DownloadしてUpload時と内容が同じか確認しますが
(前項のタイムスタンプチェック)ファイルのロックはかかっていません。
SPFはDownload中であることを知らないので上書きされる可能性もあります。
必要に応じて xe の TSO コマンド Alloc/Free を利用してください。
保存時に内容がUpload時と異なる場合ワークDir\xeftpwdに
最初にDawnloadした時のと保存時にDownloadしたのと両方のファイルが
残されていますが現在の状態は自分で保存する必要があります。
保存を強行するか他ファイルに保存してください。
保存ファイル名はxxxxxxxx.timestampとxxxxxxxx.timestamp.UPDATECHKです。
.xe3270はLogon Procedure,LISTDS コマンドなどの応答メッセージの様式に
依存しています。cfgで対応できない場合xe3270?.cを修正してください。
(6) DBCS 環境
.Uploadでスペース(ASCII-0x20)がブランク(EBCDIC-0x40)以外に変換される障害について。
s3270 で -charset を指定した場合 charset によってはこの障害が起こります。
s3270のソースパッケージ中の X3270.xadで定義されているEBC->ASCII 変換テーブル(#table)で
ASCIIコードが >0x40 のコードポイントが 0 となっているもので発生すると思われます。
バージョン3.3では
hebrew, bracket437, simplified-chinese, chinese-gb18030,
japanese, japanese-290, japanese-930, japanese-939, japanese-1390, japanese-1399
がそうでした。
charset.c の以下の修正を試して見て下さい。(全体はsample Dirに入れておきます)
この1行の追加です ==> if (iso!=0x20) //a#20080802 for the case apace->unprintable
/* Process a single character definition. */
static void
remap_one(unsigned char ebc, KeySym iso, remap_scope scope, Boolean one_way)
{
unsigned char cg;
/* Ignore mappings of EBCDIC control codes and the space character. */
if (ebc <= 0x40)
return;
/* If they want to map to a NULL or a blank, make it a one-way blank. */
if (iso == 0x0)
iso = 0x20;
if (iso == 0x20)
one_way = True;
if (!auto_keymap || iso <= 0xff) {
#if defined(X3270_FT) /*[*/
unsigned char aa;
#endif /*]*/
if (scope == BOTH || scope == CS_ONLY) {
if (iso <= 0xff) {
cg = asc2cg[iso];
if (cg2asc[cg] == iso || iso == 0) {
/* well-defined */
ebc2cg[ebc] = cg;
if (!one_way)
cg2ebc[cg] = ebc;
} else {
/* into a hole */
ebc2cg[ebc] = CG_boxsolid;
}
}
if (ebc > 0x40) {
ebc2asc[ebc] = iso;
if (!one_way)
asc2ebc[iso] = ebc;
}
}
#if defined(X3270_FT) /*[*/
if (iso <= 0xff && ebc > 0x40) {
/* Change the file transfer translation table. */
if (scope == BOTH) {
/*
* We have an alternate mapping of an EBCDIC
* code to an ASCII code. Modify the existing
* ASCII(ft)-to-ASCII(desired) maps.
*
* This is done by figuring out which ASCII
* code the host usually translates the given
* EBCDIC code to (asc2ft0[ebc2asc0[ebc]]).
* Now we want to translate that code to the
* given ISO code, and vice-versa.
*/
aa = asc2ft0[ebc2asc0[ebc]];
if (aa != ' ') {
ft2asc[aa] = iso;
if (iso!=0x20) //a#20080802 for the case apace->unprintable
asc2ft[iso] = aa;
}
} else if (scope == FT_ONLY) {
/*
* We have a map of how the host translates
* the given EBCDIC code to an ASCII code.
* Generate the translation between that code
* and the ISO code that we would normally
* use to display that EBCDIC code.
*/
ft2asc[iso] = ebc2asc[ebc];
asc2ft[ebc2asc[ebc]] = iso;
}
}
#endif /*]*/
} else {
/* Auto-keymap. */
add_xk(iso, (KeySym)ebc2asc[ebc]);
}
}
.IND$FILEはDBCSをサポートしません。
(APVUFILEが対応,日本語についてはxeで対応(次項))
s3270の -charset での指定は画面出力、キーボード入力にのみ有効です。
FTPの部分は1バイトごとのASCII<-->EBCDIC 変換です(X3270.xadの変換テーブル使用)
また、ホストがDBCS環境の場合 適切な -charset オプションを指定しないと
LOGON手順がISPF パネルなしで失敗します。
(クライアントがDBCSである通知をあげないと、//ISPPALT DD を探さず、DBCS用パネルが見つからない)
幸いパネル無しのダイアログエラーにEnterを入力しREADYになった場面でISPFを入力すると
英語モードでISPFがあがるのでxeはファイルをDownload/Uploadできます。
サンプルのLOGON 手順はこの例を手順化しています。
画面をDBCSとしたい場合は日本語の例ですが以下のようにします
a. s3270 を -DX3270_DBCS でコンパイルする。(cygwin bash上で configure, make )
(私の環境でコンパイルしたものを同梱しています、 s3270-cygwin-dbcs.exe)
s3270 を
./configure --enable-dbcs
s3270の.configure が
Warning disabling DBCS
を発するかもしれません
ICUの導入が必要です、但しcygwinの場合特殊事情があります。
ICUのライブラリー名がcygwinのときlinuxの時とは変わります
s3270 の configure 4803 行あたりの1行に以下の修正を加えた後
#LIBS="-licui18n $LIBS"
LIBS="-lsicuuc $LIBS"
次のようにconfigure && make してください
export LIBS="-lsicudt -enable-auto-import"
./configure --enable-dbcs
b. ICUの導入
通常の導入以外に次の場合は追加の操作が必要です。
s3270 の -charset に japanese を指定すると
Cannot find ICU converter for ibm-1027
が出るかもしれません。
japanese :1027(SBCS)+300(DBCS) 1027は英小文字の空いたところにカタカナを埋めたもの
japanese-290: 290(SBCS)+300(DBCS) 290はカタカナに英小文字を埋めたもの
がX3270.xadに定義されています。
930=290(SBCS)+300(DBCS),939=1027(SBCS)+300(DBCS)のはずですが
X3270.xadではDBCSのみ定義してあるので jpanese-939もcp1027なしで通るようです。
cp1027を使用する場合は以下のようにします
ibm-1027....ucm ファイルは s3270のパッケージに含まれて居ます。
s3270を --enable-dbcs で configure すると makeconv により対応する.cnvファイルが
作成されるのですが、ICU_DATA 環境変数の設定がうまく効いてくれず japaneseが使えませんでした。
そこでICUのmakeに組み込みました。以下のようにします
s3270 パッケージの ucm ファイルを icu\source\data\mappings にcopy
icu\source\data\mappings\ucmlocal.mk を作成する
###
UCM_SOURCE_LOCAL = ibm-1027_P100-1995.ucm\
ibm-1385_P100-1997.ucm\
ibm-300_P110-1997.ucm\
ibm-837_P100-2000.ucm
./configure --enable-static && make する
.xeの日本語対応は以下の通りです。
HOST のコードページは CP1027(英小文字拡張)とCP290(カタカナ拡張)を
サポート。xehosts で DBCS= オプションの指定が必要です。
DBCS={cp930|cp939}
cp930のSBCSはcp290、cp939のSBCSが CP1027です
DBCSは新JIS(JIS83)+IBMです。(CV コマンド参照)
固定長レコードDatasetのみの対応です。
バイナリーモードでDownloadしLRECLで行分割し
EBCDIC->SJIS変換。SO(0x0e)/SI(0x0f)はスペース(0x20)に置換します。
Upload時は行ごとにSJIS->EBCDICS変換。
DBCSの前後にSO/SIを設定する方法は、スペースがあれば置換、
なければ挿入しますが延長した分は後続のスペースを潰して補います。
但し、1桁のスペースは潰しません。
変換後がLRECLより長い場合、変換前がLRECL以下の場合は切り捨て、
元々長文の場合はLRECLで行分割します(SO/SOの途中の考慮はしていません)。
変換後がLRECLより短い意場合はLRECL迄スペースパディングします。
従って73-80の行番号の位置がずれる可能性があります。
#ifdef LNX
LANGがEUC の場合に EBCDIC<=>euc.jp 変換します。
EUC.JPでは半角カタカナが2バイト(0x8e+xx)になります
半角カタカナが含まれているとDownloadで行長がLRECLを超えます。
xeが行長エラーの警告を出します。
Uploadで行長が短くなるとスペースパディングされます。
従って73-80の行番号の位置がずれる可能性があります。
SPF ファイルとして開いたファイルはできるだけ73-80の行番号位置を保持しようとします
Save/Rep/CreコマンドではプロファイルでNUMSTDが設定されていれば考慮されます。
XCOpy/XMOvコマンド、行コマンドCopy/Moveでは考慮されません。
#endif
#endif