SAVUSRLIB をテープ装置に対応したので SAVUSRIFS もテープ装置にバックアップ
できるように対応した。
ところで IFS のバックアップは SAV コマンドという、いわゆる 3 文字コマンドで
行うことができる。
IBM は IFS の処理は SAV, CPY, ... などの 3 文字のコマンドを用意していて
これら 3 文字のコマンドを IBM ユーザーも利用することになる。
そして SAV コマンドであるがテープ装置は
/QSYS.LIB/TAP01.DEVD
のように表現する。
IFS : /MYDIR をテープ装置: TAP01 に保管するのであれば
SAV DEV('/QSYS.LIB/TAP01.DEVD') OBJ('/MYDIR')
という具合である。
ここで /MYDIR と指定すると /MYDIR と /MYDIR の配下に含まれているすべての
コンテンツも併せて保管することができる。
/MYDIR/* とすると /MYDIR の配下のコンテンツすべてを保管することを意味することに
なるが、/MYDIR 自身は保管されないので注意されたい。
必ず /MYDIR のように指定する必要がある。
この改訂によって SAVUSRIFS は
のような保管および印刷が可能になった。
0001.00 CMD PROMPT(' ユーザー IFS 保存 ')
0002.00 PARM KWD(IFS) TYPE(*PNAME) LEN(256) DFT(*ALL) +
0003.00 SPCVAL((*ALL)) MAX(50)
0004.00 PARM KWD(OPTION) TYPE(*CHAR) LEN(6) RSTD(*YES) +
0005.00 DFT(*NONE) VALUES(*NONE *CLOUD *SEND +
0006.00 *TAPE *PRINT) PROMPT(' 出力オプション ')
0007.00 CLOUD: PMTCTL CTL(OPTION) COND((*EQ *CLOUD))
0008.00 PARM KWD(NFSDIR) TYPE(*PNAME) LEN(5000) +
0009.00 DFT('/QNFS') VARY(*YES *INT4) +
0010.00 CASE(*MIXED) PMTCTL(CLOUD) +
0011.00 PROMPT(' 保管先 NFS ディレクトリー ')
0012.00 SEND: PMTCTL CTL(OPTION) COND((*EQ *SEND))
0013.00 PARM KWD(FRMADDRESS) TYPE(*CHAR) LEN(15) +
0014.00 DFT('*DFT') PMTCTL(SEND) +
0015.00 PROMPT(' ホスト IP アドレス ')
0016.00 PARM KWD(TOADDRESS) TYPE(*CHAR) LEN(15) +
0017.00 DFT('192.168.1.8') PMTCTL(SEND) +
0018.00 PROMPT(' 相手先 IP アドレス ')
0019.00 PARM KWD(TOPASS) TYPE(*CHAR) LEN(128) +
0020.00 DFT('/BACKUP/V6R1/IFS/') CASE(*MIXED) +
0021.00 PMTCTL(SEND) PROMPT(' 相手先ファイル・パス ')
0022.00 PARM KWD(USER) TYPE(*CHAR) LEN(13) DFT(BACKUP) +
0023.00 SPCVAL((*NONE)) CASE(*MIXED) PMTCTL(SEND) +
0024.00 PROMPT(' 遠隔ユーザー ID')
0025.00 PARM KWD(PASSWORD) TYPE(*CHAR) LEN(13) DFT(*NONE) +
0026.00 SPCVAL((*NONE)) CASE(*MIXED) +
0027.00 DSPINPUT(*NO) PMTCTL(SEND) +
0028.00 INLPMTLEN(*PWD) PROMPT(' 遠隔パスワード ')
0029.00 PARM KWD(LOG) TYPE(*CHAR) LEN(4) RSTD(*YES) +
0030.00 DFT(*YES) VALUES(*YES *NO) PMTCTL(SEND) +
0031.00 PROMPT(' ログ表示 ')
0032.00 TAPE: PMTCTL CTL(OPTION) COND((*EQ *TAPE))
0033.00 PARM KWD(DEV) TYPE(*CHAR) LEN(10) DFT(TAP01) +
0034.00 PMTCTL(TAPE) PROMPT(' 装置 ')
0035.00 PARM KWD(VOL) TYPE(*CHAR) LEN(32) DFT(IBMIRD) +
0036.00 PMTCTL(TAPE) PROMPT(' ボーリューム ID')
0037.00 PARM KWD(SEQNBR) TYPE(*DEC) LEN(8 0) DFT(*END) +
0038.00 RANGE(1 16777215) SPCVAL((*END 0)) +
0039.00 PMTCTL(TAPE) PROMPT(' 順序番号 ')
0040.00 PARM KWD(LABEL) TYPE(*CHAR) LEN(17) DFT(*LIB) +
0041.00 PMTCTL(TAPE) PROMPT(' ラベル ')
0042.00 PARM KWD(EXPDATE) TYPE(*DATE) DFT(*PERM) +
0043.00 SPCVAL((*PERM 1999999)) +
0044.00 PMTCTL(TAPE) PROMPT(' ファイル満了日 ')
0045.00 PARM KWD(ENDOPT) TYPE(*CHAR) LEN(7) RSTD(*YES) +
0046.00 DFT(*REWIND) VALUES(*REWIND *LEAVE +
0047.00 *UNLOAD) PMTCTL(TAPE) +
0048.00 PROMPT(' 媒体の終わりオプション ')
0049.00 PARM KWD(STRLIB) TYPE(*CHAR) LEN(10) DFT(*FIRST) +
0050.00 PMTCTL(TAPE) PROMPT(' 開始ライブラリー ')
0051.00 PARM KWD(INZTAP) TYPE(*CHAR) LEN(4) RSTD(*YES) +
0052.00 DFT(*NO) VALUES(*YES *NO) +
0053.00 PMTCTL(TAPE) PROMPT(' テープの初期設定 ')
0054.00 PARM KWD(CHECK) TYPE(*CHAR) LEN(4) RSTD(*YES) +
0055.00 DFT(*NO) VALUES(*YES *NO) +
0056.00 PMTCTL(TAPE) PROMPT(' 活動ファイルの検査 ')
0057.00 PARM KWD(DENSITY) TYPE(*CHAR) LEN(10) RSTD(*YES) +
0058.00 DFT(*CTGTYPE) VALUES(*DEVTYPE *CTGTYPE +
0059.00 *QIC120 10000 *QIC525 16000 *QIC1000 +
0060.00 *QIC2GB *QIC3040 *QIC5010 *FMT3480 38000 +
0061.00 *FMT3090E *FMT3570 *FMT3570E *FMT3590 +
0062.00 1600 3200 6250 *FMT2GB 43200 *FMT5GB +
0063.00 *FMT7GB *ULTRIUM3 *ULTRIUM4) +
0064.00 PMTCTL(TAPE) PROMPT(' テープ密度 ')
0065.00 PRINT: PMTCTL CTL(OPTION) COND((*EQ *PRINT))
0066.00 PARM KWD(OBJ) TYPE(*PNAME) LEN(128) DFT('*') +
0067.00 SPCVAL((*)) MAX(30) CASE(*MIXED) +
0068.00 PMTCTL(*PMTRQS) +
0069.00 PROMPT(' 除外するオブジェクト ')
0070.00 PARM KWD(SAVACT) TYPE(*CHAR) LEN(5) RSTD(*YES) +
0071.00 DFT(*YES) VALUES(*NO *YES *SYNC) +
0072.00 EXPR(*YES) PMTCTL(*PMTRQS) +
0073.00 PROMPT(' 活動状態保管 ')
0001.00 PGM PARM(&PASR &OPTION &NFSDIR &FROMIP &TOIP +
0002.00 &TODIRP &USER &PASSWRD &LOG &DEV &VOL +
0003.00 &SEQNBR &LABEL &EXPDATE7 &ENDOPT &STRLIB +
0004.00 &INZTAP &CHECK &DENSITY &OBJR &SAVACT)
0005.00 /*-------------------------------------------------------------------*/
0006.00 /* SAVUSRIFSC : ユーザー IFS 保存 */
0007.00 /* */
0008.00 /* 2018/09/21 作成 */
0009.00 /* CRTBNDCL でコンパイルすること */
0010.00 /*-------------------------------------------------------------------*/
0011.00 DCL VAR(&PASR) TYPE(*CHAR) LEN(12802)
0012.00 DCL VAR(&BUFFER) TYPE(*CHAR) LEN(80)
0013.00 DCL VAR(&PGM) TYPE(*CHAR) LEN(10)
0014.00 DCL VAR(&OBJLIB) TYPE(*CHAR) LEN(10)
0015.00 DCL VAR(&INZPAS) TYPE(*CHAR) LEN(256)
0016.00 DCL VAR(&OPTION) TYPE(*CHAR) LEN(6)
0017.00 DCL VAR(&NFSDIR) TYPE(*CHAR) LEN(5004)
0018.00 DCL VAR(&NFS) TYPE(*CHAR) LEN(5000)
0019.00 DCL VAR(&LEN) TYPE(*DEC) LEN(4 0)
0020.00 DCL VAR(&FLD4) TYPE(*CHAR) LEN(4)
0021.00 DCL VAR(&FLD2) TYPE(*CHAR) LEN(2)
0022.00 DCL VAR(&FLD1) TYPE(*CHAR) LEN(1)
0023.00 DCL VAR(&SAVSU) TYPE(*DEC) LEN(4 0)
0024.00 DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
0025.00 DCL VAR(&OBJR) TYPE(*CHAR) LEN(3842)
0026.00 DCL VAR(&OBJSU) TYPE(*DEC) LEN(4 0)
0027.00 DCL VAR(&SAVACT) TYPE(*CHAR) LEN(5)
0028.00 DCL VAR(&INZLIB) TYPE(*CHAR) LEN(10)
0029.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0030.00 DCL VAR(&STSMSG) TYPE(*CHAR) LEN(132)
0031.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0032.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0033.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0034.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0035.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0036.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)
0037.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0038.00 VALUE('*ESCAPE ')
0039.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0040.00 VALUE(X'000074') /* 2 進数 */
0041.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) +
0042.00 VALUE(X'00000000')
0043.00 DCL VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */
0044.00 DCL VAR(&POS) TYPE(*DEC) LEN(4 0)
0045.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1)
0046.00 /*( SNDFTP 送信のための変数 )*/
0047.00 DCL VAR(&FROMMBR) TYPE(*CHAR) LEN(128) +
0048.00 VALUE('/QSYS.LIB/IFSLIB.LIB')
0049.00 DCL VAR(&FROMIP) TYPE(*CHAR) LEN(15)
0050.00 DCL VAR(&FROMPASS) TYPE(*CHAR) LEN(128)
0051.00 DCL VAR(&TOIP) TYPE(*CHAR) LEN(15)
0052.00 DCL VAR(&TODIRP) TYPE(*CHAR) LEN(132)
0053.00 DCL VAR(&TODIR) TYPE(*CHAR) LEN(128)
0054.00 DCL VAR(&TOPASS) TYPE(*CHAR) LEN(128)
0055.00 DCL VAR(&USER) TYPE(*CHAR) LEN(13)
0056.00 DCL VAR(&PASSWRD) TYPE(*CHAR) LEN(13)
0057.00 DCL VAR(&LOG) TYPE(*CHAR) LEN(4)
0058.00 DCL VAR(&TEXT) TYPE(*CHAR) LEN(50)
0059.00 /*( TAPE 送信のための変数 )*/
0060.00 DCL VAR(&DEV) TYPE(*CHAR) LEN(10)
0061.00 DCL VAR(&DEVD) TYPE(*CHAR) LEN(48)
0062.00 DCL VAR(&VOL) TYPE(*CHAR) LEN(32)
0063.00 DCL VAR(&SEQNBR) TYPE(*DEC) LEN(8 0)
0064.00 DCL VAR(&SEQNBRC) TYPE(*CHAR) LEN(8)
0065.00 DCL VAR(&LABEL) TYPE(*CHAR) LEN(17)
0066.00 DCL VAR(&ENDOPT) TYPE(*CHAR) LEN(7)
0067.00 DCL VAR(&STRLIB) TYPE(*CHAR) LEN(10)
0068.00 DCL VAR(&INZTAP) TYPE(*CHAR) LEN(4)
0069.00 DCL VAR(&CHECK) TYPE(*CHAR) LEN(4)
0070.00 DCL VAR(&DENSITY) TYPE(*CHAR) LEN(10)
0071.00 DCL VAR(&EXPDATE7) TYPE(*CHAR) LEN(7)
0072.00 DCL VAR(&EXPDATE) TYPE(*CHAR) LEN(8)
0073.00 DCL VAR(&CYYYY) TYPE(*CHAR) LEN(4)
0074.00 DCL VAR(&CYY) TYPE(*CHAR) LEN(2)
0075.00 DCL VAR(&CMM) TYPE(*CHAR) LEN(2)
0076.00 DCL VAR(&CDD) TYPE(*CHAR) LEN(2)
0077.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0078.00
0079.00 /*( 環境の取得 )*/
0080.00 RTVJOBA TYPE(&TYPE)
0081.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0082.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ')
0083.00 ENDDO /* バッチ */
0084.00 ELSE CMD(DO) /* 対話式 */
0085.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ')
0086.00 ENDDO /* 対話式 */
0087.00 /* CALLPRC PRC('_MATPGMNM') PARM((&BUFFER *BYREF)) */
0088.00 CHGVAR VAR(&PGM) VALUE(%SST(&BUFFER 51 10))
0089.00 CHGVAR VAR(&OBJLIB) VALUE(%SST(&BUFFER 19 10))
0090.00 CHGVAR VAR(&OBJLIB) VALUE('QUATTRO ')
0091.00 CHKOBJ OBJ(IFSLIB) OBJTYPE(*LIB)
0092.00 MONMSG MSGID(CPF9800) EXEC(DO)
0093.00 CHGVAR VAR(&MSG) +
0094.00 VALUE(' 作業ライブラリー IFSLIB を作成して +
0095.00 ください。 ')
0096.00 GOTO SNDMSG
0097.00 ENDDO
0098.00
0099.00 /*( パラメータの取得 )*/
0100.00 CHGVAR VAR(&FLD2) VALUE(%SST(&PASR 1 2))
0101.00 CHGVAR VAR(&SAVSU) VALUE(%BIN(&FLD2))
0102.00 CHGVAR VAR(&INZPAS) VALUE(%SST(&PASR 3 256))
0103.00 IF COND(&OPTION *EQ '*SEND ') THEN(DO) /* +
0104.00 送信 */
0105.00 IF COND(%SST(&PASSWRD 1 5) *EQ '*NONE') THEN(DO)
0106.00 CHGVAR VAR(&MSG) +
0107.00 VALUE(' パスワードが指定されていません。 ')
0108.00 GOTO SNDMSG
0109.00 ENDDO
0110.00 ENDDO /* 送信 */
0111.00
0112.00 /*( パラメータの検査 )*/
0113.00 IF COND(&OPTION *EQ '*CLOUD') THEN(DO) +
0114.00 /* クラウド */
0115.00 CHGVAR VAR(&FLD4) VALUE(%SST(&NFSDIR 1 4))
0116.00 CHGVAR VAR(&LEN) VALUE(%BIN(&FLD4))
0117.00 CHGVAR VAR(&FLD4) VALUE(&LEN)
0118.00 CHGVAR VAR(&NFS) VALUE(%SST(&NFSDIR 5 &LEN))
0119.00 IF COND(%SST(&NFS &LEN 1) *NE '/') THEN(DO)
0120.00 CHGVAR VAR(&MSG) +
0121.00 VALUE(' パスの末尾は / でなくてはなりませ +
0122.00 ん。 ')
0123.00 GOTO SNDMSG
0124.00 ENDDO
0125.00 ENDDO /* クラウド */
0126.00 /*( テープの初期設定 )*/
0127.00 IF COND(&OPTION *EQ '*TAPE ') THEN(DO) /* +
0128.00 テープ保管 */
0129.00 IF COND(&INZTAP *EQ '*YES') THEN(DO) /* +
0130.00 初期設定 */
0131.00 CHGVAR VAR(&STSMSG) VALUE(' テープを初期設定中 ')
0132.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +
0133.00 TOPGMQ(*EXT) MSGTYPE(*STATUS)
0134.00 INZTAP DEV(&DEV) NEWVOL(&VOL) NEWOWNID(&LABEL) +
0135.00 CHECK(&CHECK) DENSITY(&DENSITY) +
0136.00 CODE(*EBCDIC) ENDOPT(*REWIND) CLEAR(*NO)
0137.00 ENDDO /* 初期設定 */
0138.00 CHGVAR VAR(&CYY) VALUE(%SST(&EXPDATE7 2 2))
0139.00 CHGVAR VAR(&CMM) VALUE(%SST(&EXPDATE7 4 2))
0140.00 CHGVAR VAR(&CDD) VALUE(%SST(&EXPDATE7 6 2))
0141.00 CHGVAR VAR(&CYYYY) VALUE('20' *CAT &CYY)
0142.00 CHGVAR VAR(&EXPDATE) VALUE(&CYYYY *CAT &CMM *CAT +
0143.00 &CDD)
0144.00 IF COND(%SST(&EXPDATE 1 8) *EQ '20999999') +
0145.00 THEN(DO)
0146.00 CHGVAR VAR(&EXPDATE) VALUE('*PERM ')
0147.00 ENDDO
0148.00 IF COND(&SEQNBR *EQ 0) THEN(DO)
0149.00 CHGVAR VAR(&SEQNBRC) VALUE('*END ')
0150.00 ENDDO
0151.00 ELSE CMD(DO)
0152.00 CHGVAR VAR(&SEQNBRC) VALUE(&SEQNBR)
0153.00 ENDDO
0154.00 ENDDO /* テープ保管 */
0155.00 IF COND(&OPTION *EQ '*SEND ') THEN(DO) /* +
0156.00 FTP 送信 */
0157.00 CHGVAR VAR(&LEN) VALUE(1)
0158.00 NXTLEN: IF COND(%SST(&TODIRP &LEN 2) *NE ' ') THEN(DO)
0159.00 CHGVAR VAR(&LEN) VALUE(&LEN + 1)
0160.00 GOTO NXTLEN
0161.00 ENDDO
0162.00 CHGVAR VAR(&LEN) VALUE(&LEN - 1)
0163.00 CHGVAR VAR(&TODIR) VALUE(%SST(&TODIRP 1 &LEN))
0164.00 IF COND(%SST(&TODIR &LEN 1) *NE '/') THEN(DO)
0165.00 CHGVAR VAR(&FLD1) VALUE(%SST(&TODIR &LEN 1))
0166.00 CHGVAR VAR(&MSG) +
0167.00 VALUE(' パスの末尾は / でなくてはなりませ +
0168.00 ん。 ' *CAT &FLD1)
0169.00 GOTO SNDMSG
0170.00 ENDDO
0171.00 ENDDO /* FTP 送信 */
0172.00 /*( 除外するオブジェクト )*/
0173.00 CHGVAR VAR(&FLD2) VALUE(%SST(&OBJR 1 2))
0174.00 CHGVAR VAR(&OBJSU) VALUE(%BIN(&FLD2))
0175.00
0176.00 IF COND(&OPTION *EQ '*TAPE ') THEN(DO) /* +
0177.00 テープ保管 */
0178.00 IF COND(&INZTAP *EQ '*YES') THEN(DO) /* +
0179.00 初期設定 */
0180.00 INZTAP DEV(&DEV) NEWVOL(&VOL) NEWOWNID(&LABEL) +
0181.00 CHECK(&CHECK) DENSITY(&DENSITY) +
0182.00 CODE(*EBCDIC) ENDOPT(*REWIND) CLEAR(*NO)
0183.00 ENDDO /* 初期設定 */
0184.00 CHGVAR VAR(&CYY) VALUE(%SST(&EXPDATE7 2 2))
0185.00 CHGVAR VAR(&CMM) VALUE(%SST(&EXPDATE7 4 2))
0186.00 CHGVAR VAR(&CDD) VALUE(%SST(&EXPDATE7 6 2))
0187.00 CHGVAR VAR(&CYYYY) VALUE('20' *CAT &CYY)
0188.00 CHGVAR VAR(&EXPDATE) VALUE(&CYYYY *CAT &CMM *CAT +
0189.00 &CDD)
0190.00 IF COND(%SST(&EXPDATE 1 8) *EQ '20999999') +
0191.00 THEN(DO)
0192.00 CHGVAR VAR(&EXPDATE) VALUE('*PERM ')
0193.00 ENDDO
0194.00 IF COND(&SEQNBR *EQ 0) THEN(DO)
0195.00 CHGVAR VAR(&SEQNBRC) VALUE('*END ')
0196.00 ENDDO
0197.00 ELSE CMD(DO)
0198.00 CHGVAR VAR(&SEQNBRC) VALUE(&SEQNBR)
0199.00 ENDDO
0200.00 ENDDO /* テープ保管 */
0201.00
0202.00 IF COND(%SST(&INZPAS 1 4) *EQ '*ALL') THEN(DO) +
0203.00 /*ALL */
0204.00 CHGVAR VAR(&STSMSG) VALUE('IFS を保管中です。 ')
0205.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +
0206.00 TOPGMQ(*EXT) MSGTYPE(*STATUS)
0207.00 CALL PGM(&OBJLIB/SAVUSRIFS) PARM(&OPTION &ERR +
0208.00 &MSG &FROMIP &TOIP &TODIR &USER &PASSWRD +
0209.00 &OBJR &SAVACT &LOG &DEV &VOL &SEQNBRC +
0210.00 &LABEL &EXPDATE &ENDOPT &STRLIB &INZTAP +
0211.00 &CHECK &DENSITY)
0212.00 IF COND(&ERR *EQ ' ') THEN(DO)
0213.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ')
0214.00 ENDDO
0215.00 IF COND(&MSG *NE ' ') THEN(DO)
0216.00 GOTO SNDMSG
0217.00 ENDDO
0218.00 ENDDO /*ALL */
0219.00 ELSE CMD(DO) /* 個別 IFS 保管 */
0220.00 IF COND(&OPTION *EQ '*TAPE ') THEN(DO) /* +
0221.00 テープ保管 */
0222.00 CHGVAR VAR(&DEVD) VALUE('/QSYS.LIB/' *CAT &DEV +
0223.00 *TCAT '.DEVD')
0224.00 SAV DEV(&DEVD) OBJ((&INZPAS)) LABEL(&INZPAS) +
0225.00 SEQNBR(&SEQNBRC) EXPDATE(&EXPDATE) +
0226.00 ENDOPT(&ENDOPT)
0227.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ')
0228.00 GOTO ERROR
0229.00 ENDDO /* テープ保管 */
0230.00 ENDDO /* 個別 IFS 保管 */
0231.00 RETURN
0232.00
0233.00 APIERR:
0234.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0235.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0236.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0237.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0238.00 GOTO SNDMSG
0239.00
0240.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0241.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0242.00 MSGFLIB(&MSGFLIB)
0243.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0244.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0245.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)
0246.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0247.00 ENDDO
0248.00 ELSE CMD(DO)
0249.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0250.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +
0251.00 MSGTYPE(&MSGTYPE)
0252.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0253.00 ENDDO
0254.00 ENDPGM
テープ保管のために追加した記述は次のとおりである。
0126.00 /*( テープの初期設定 )*/
0127.00 IF COND(&OPTION *EQ '*TAPE ') THEN(DO) /* +
0128.00 テープ保管 */
0129.00 IF COND(&INZTAP *EQ '*YES') THEN(DO) /* +
0130.00 初期設定 */
0131.00 CHGVAR VAR(&STSMSG) VALUE(' テープを初期設定中 ')
0132.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +
0133.00 TOPGMQ(*EXT) MSGTYPE(*STATUS)
0134.00 INZTAP DEV(&DEV) NEWVOL(&VOL) NEWOWNID(&LABEL) +
0135.00 CHECK(&CHECK) DENSITY(&DENSITY) +
0136.00 CODE(*EBCDIC) ENDOPT(*REWIND) CLEAR(*NO)
0137.00 ENDDO /* 初期設定 */
0138.00 CHGVAR VAR(&CYY) VALUE(%SST(&EXPDATE7 2 2))
0139.00 CHGVAR VAR(&CMM) VALUE(%SST(&EXPDATE7 4 2))
0140.00 CHGVAR VAR(&CDD) VALUE(%SST(&EXPDATE7 6 2))
0141.00 CHGVAR VAR(&CYYYY) VALUE('20' *CAT &CYY)
0142.00 CHGVAR VAR(&EXPDATE) VALUE(&CYYYY *CAT &CMM *CAT +
0143.00 &CDD)
0144.00 IF COND(%SST(&EXPDATE 1 8) *EQ '20999999') +
0145.00 THEN(DO)
0146.00 CHGVAR VAR(&EXPDATE) VALUE('*PERM ')
0147.00 ENDDO
0148.00 IF COND(&SEQNBR *EQ 0) THEN(DO)
0149.00 CHGVAR VAR(&SEQNBRC) VALUE('*END ')
0150.00 ENDDO
0151.00 ELSE CMD(DO)
0152.00 CHGVAR VAR(&SEQNBRC) VALUE(&SEQNBR)
0153.00 ENDDO
0154.00 ENDDO /* テープ保管 */
0001.00 /********************************************************************/
0002.00 /* */
0003.00 /* SAVUSRIFS : ユーザー IFS 保存 */
0004.00 /* */
0005.00 /* Office Quattro Co,.Ltd 2018/09/21 13:43:00 created */
0006.00 /* */
0007.00 /* */
0008.00 /********************************************************************/
0009.00 #pragma comment(COPYRIGHT, "as400-net.com EnterpriseServer (C) CopyRight ™
0010.00 Office Quattro.Corp. 2018- All right reserved. Users Restricted ™
0011.00 Rights - Use, duplication or disclosure restricted by Office Quattro ™
0012.00 Corp. Licenced Materials-Property of Office Quattro.")
0013.00 #include <stdio.h>
0014.00 #include <stdlib.h>
0015.00 #include <string.h>
0016.00 #include <micomput.h> /* triml */
0017.00 #include <errno.h>
0018.00 #include <signal.h>
0019.00 #include <dirent.h>
0020.00 #include <sys/stat.h>
0021.00 #include <QMHSNDPM.h>
0022.00 #include <ctype.h>
0023.00 #include <dirent.h>
0024.00
0025.00 #define TRUE 0
0026.00 #define FALSE -1
0027.00 #define ERROR 1
0028.00 int bLR = FALSE;
0029.00 typedef struct {
0030.00 int BYTESPRO;
0031.00 int BYTESAVL;
0032.00 char MSGID[7];
0033.00 char RESRVD;
0034.00 char EXCPDATA[100];
0035.00 } ERRSTRUCTURE; /* Define the error return structure */
0036.00 ERRSTRUCTURE errcode;/* Error Code Structure for RCVMSG */
0037.00 volatile _INTRPT_Hndlr_Parms_T ca;
0038.00 typedef struct {
0039.00 short int OBJSU;
0040.00 char OBJ[30][128];
0041.00 } OBJR;
0042.00 OBJR m_objr;
0043.00
0044.00 /*************************************************************/
0045.00 /* 内 部 使 用 関 数 */
0046.00 /*************************************************************/
0047.00 void GetParam(int argc, char *argv[]);
0048.00 void INZSR(void);
0049.00 int saveIFS(char* name, char* type, int size);
0050.00 int OmitObject(char* dir);
0051.00 int CountContents(char* name);
0052.00 void SendMessage(char* Message, char* Status, char* Pgmque);
0053.00 void cvt5026to5035(char* record);
0054.00 void LRRTN(char* argv[]);
0055.00
0056.00 /*************************************************************/
0057.00 /* IMPORT 関 数 */
0058.00 /*************************************************************/
0059.00 /*************************************************************/
0060.00 /* IMPORT 変 数 */
0061.00 /*************************************************************/
0062.00 /*************************************************************/
0063.00 /* 外 部 呼 出 し 関 数 */
0064.00 /*************************************************************/
0065.00 void MonitorMSG(_INTRPT_Hndlr_Parms_T ca, char* ref);
0066.00 #pragma linkage(MonitorMSG, OS)
0067.00 #pragma map(MonitorMSG, "ASNET.COM/MONMSG")
0068.00 /*************************************************************/
0069.00 /* グ ロ ー バ ル 変 数 */
0070.00 /*************************************************************/
0071.00 /*------( 受取りパラメータ値 )----------*/
0072.00 char OPTION[7], FROMIP[16], TOIP[16], TODIR[129], USER[14], PASSWRD[14],
0073.00 SAVACT[6], LOG[5], DEV[11], VOL[33], LABEL[18], EXPDATE[9], STRLIB[11],
0074.00 INZTAP[5], CHECK[5], DENSITY[11], SEQNBR[9], ENDOPT[8];
0075.00 /*------( 受取りパラメータ値 )----------*/
0076.00 char ref[133];
0077.00 char handle[9];
0078.00 char listopt[5];
0079.00 char lsthnd[5];
0080.00 char home[50], msg[132], ERR[2];
0081.00 int saveSU = 0;
0082.00 /********************************************************************/
0083.00 /* m a i n --- main module of this pgm */
0084.00 /* */
0085.00 /* <PARAMETER> 1. OPTION */
0086.00 /* 2. ERR */
0087.00 /* 3. MSG */
0088.00 /* 4. FROMIP */
0089.00 /* 5. TOIP */
0090.00 /* 6. TODIR */
0091.00 /* 7. USER */
0092.00 /* 8. PASSWRD */
0093.00 /* 9. OBJR */
0094.00 /* 10. SAVACT */
0095.00 /* 11. LOG */
0096.00 /* 12. DEV */
0097.00 /* 13. VOL */
0098.00 /* 14. SEQNBR */
0099.00 /* 15. LABEL */
0100.00 /* 16. EXPDATE */
0101.00 /* 17. ENDOPT */
0102.00 /* 18. STRLIB */
0103.00 /* 19. INZTAP */
0104.00 /* 20. CHECK */
0105.00 /* 21. DENSITY */
0106.00 /* */
0107.00 /*------------------------------------------------------------------*/
0108.00
0109.00 int main(int argc, char *argv[]){
0110.00 DIR *dir;
0111.00 struct dirent *entry;
0112.00 char path[257];
0113.00 struct stat info;
0114.00 char objtype[11];
0115.00 int size;
0116.00 int bUSER = TRUE;
0117.00 int len;
0118.00
0119.00 #pragma exception_handler(MONMSG, ca, 0, _C2_MH_ESCAPE, ™
0120.00 _CTLA_HANDLE)
0121.00 GetParam(argc, argv); /*[ パラメータの取得 ]*/
0122.00 INZSR(); /*[ 初期設定 ]*/
0123.00
0124.00 if((dir = opendir(home)) == NULL){/* オープン・エラー */
0125.00 printf("%s™n", home);
0126.00 perror("opendir error™n");
0127.00 getchar();
0128.00 exit(0);
0129.00 }/* オープン・エラー */
0130.00 else{/* 正常 */
0131.00 while((entry = readdir(dir)) != NULL){/*while*/
0132.00 if(strncmp(entry->d_name, ".", 1) == 0) continue;
0133.00 if(bUSER == TRUE){/*USER*/
0134.00 if(strncmp(entry->d_name, "Q", 1) == 0 &&
0135.00 strncmp(entry->d_name, "QATMHSTOUT", 6) != 0)
0136.00 /* strncmp(entry->d_name, "QOpenSys", 8) != 0) */
0137.00 continue;
0138.00 }/*USER*/
0139.00 sprintf(path, "%s/%s", home, entry->d_name);
0140.00 if(stat(path, &info) != TRUE)
0141.00 memset(objtype, ' ', sizeof(objtype));
0142.00 else sprintf(objtype, "%s", info.st_objtype);
0143.00 if(strncmp(&objtype[1], "DIR", 3) == 0 ||
0144.00 strncmp(&objtype[1], "LIB", 3) == 0 ||
0145.00 strncmp(&objtype[1], "FLR", 3) == 0){/*DIR*/
0146.00 size = 0;
0147.00 }/*DIR*/
0148.00 else{/*STMF*/
0149.00 size = (int)info.st_allocsize;
0150.00 }/*STMF*/
0151.00 if(strncmp(entry->d_name, "A", 1) >= 0 &&
0152.00 strncmp(entry->d_name, "Z", 1) <= 0 &&
0153.00 strncmp(&objtype[1], "DIR", 3) == 0){/* 英大文字 */
0154.00 if(strstr(entry->d_name, "TEST") != NULL) continue;
0155.00 if(strlen(entry->d_name) > 10 &&
0156.00 strncmp(entry->d_name, "AS400-NET.USR ", 14) == 0) continue;
0157.00 if(strchr(entry->d_name, '_') != NULL) continue;
0158.00 if(strncmp(entry->d_name, "PROJECT", 7) == 0) continue;
0159.00 if(strncmp(entry->d_name, "OOTAKE", 6) == 0) continue;
0160.00 if(strncmp(entry->d_name, "WORK.ZIP", 8) == 0) continue;
0161.00 if(strncmp(entry->d_name, "YOGI", 4) == 0) continue;
0162.00 if(strncmp(entry->d_name, "PTF", 3) == 0) continue;
0163.00 if(strncmp(entry->d_name, "JPN", 3) == 0) continue;
0164.00 if(strncmp(entry->d_name, "TAAAWBLIB", 9) == 0) continue;
0165.00 if(OmitObject(entry->d_name) == TRUE) continue;
0166.00 if(saveIFS(entry->d_name, &objtype[1], size) == FALSE) continue;
0167.00 }/* 英大文字 */
0168.00 }/*while*/
0169.00 closedir(dir);
0170.00 }/* 正常 */
0171.00 if(strncmp(OPTION, "*PRINT", 6) == 0){/*PRINT 印刷 */
0172.00 getchar();
0173.00 sprintf(msg, "%d 個の IFS を印刷しました。 ", saveSU);
0174.00 }/*PRINT 印刷 */
0175.00 else{/* 保管 */
0176.00 sprintf(msg, "%d 個の IFS を保管しました。 ", saveSU);
0177.00 }/* 保管 */
0178.00
0179.00 LRRTN(argv);
0180.00 exit(0);
0181.00
0182.00 MONMSG:
0183.00 #pragma disable_handler
0184.00 strcpy(ref, "SAVUSRIFS");
0185.00 MonitorMSG(ca, ref);
0186.00
0187.00 exit(0);
0188.00 }
0189.00 /*************************************/
0190.00 void GetParam(int argc, char *argv[])
0191.00 /*************************************/
0192.00 {
0193.00 int len;
0194.00
0195.00 memcpy(OPTION, argv[1], 6);
0196.00 OPTION[6] = 0x00;
0197.00 memcpy(FROMIP, argv[4], 15);
0198.00 FROMIP[15] = 0x00;
0199.00 len = triml(FROMIP, ' ');
0200.00 if(len > 0) FROMIP[len] = 0x00;
0201.00 memcpy(TOIP, argv[5], 15);
0202.00 TOIP[15] = 0x00;
0203.00 len = triml(TOIP, ' ');
0204.00 if(len > 0) TOIP[len] = 0x00;
0205.00 memcpy(TODIR, argv[6], 128);
0206.00 TODIR[128] = 0x00;
0207.00 len = triml(TODIR, ' ');
0208.00 if(len > 0) TODIR[len] = 0x00;
0209.00 memcpy(USER, argv[7], 13);
0210.00 USER[13] = 0x00;
0211.00 len = triml(USER, ' ');
0212.00 if(len > 0) USER[len] = 0x00;
0213.00 memcpy(PASSWRD, argv[8], 13);
0214.00 PASSWRD[13] = 0x00;
0215.00 len = triml(PASSWRD, ' ');
0216.00 if(len > 0) PASSWRD[len] = 0x00;
0217.00 memcpy((char*)&m_objr, argv[9], 3842);
0218.00 memcpy(SAVACT, argv[10], 5);
0219.00 SAVACT[5] = 0x00;
0220.00 memcpy(LOG, argv[11], 4);
0221.00 LOG[4] = 0x00;
0222.00 len = triml(LOG, ' ');
0223.00 if(len > 0) LOG[len] = 0x00;
0224.00 memcpy(DEV, argv[12], 10);
0225.00 DEV[10] = 0x00;
0226.00 len = triml(DEV, ' ');
0227.00 if(len > 0) DEV[len] = 0x00;
0228.00 memcpy(VOL, argv[13], 32);
0229.00 VOL[32] = 0x00;
0230.00 memcpy(SEQNBR, argv[14], 8);
0231.00 SEQNBR[8] = 0x00;
0232.00 memcpy(LABEL, argv[15], 17);
0233.00 LABEL[17] = 0x00;
0234.00 memcpy(EXPDATE, argv[16], 8);
0235.00 EXPDATE[8] = 0x00;
0236.00 memcpy(ENDOPT, argv[17], 7);
0237.00 ENDOPT[7] = 0x00;
0238.00 memcpy(STRLIB, argv[18], 10);
0239.00 STRLIB[10] = 0x00;
0240.00 memcpy(INZTAP, argv[19], 4);
0241.00 INZTAP[4] = 0x00;
0242.00 memcpy(CHECK, argv[20], 4);
0243.00 CHECK[4] = 0x00;
0244.00 memcpy(DENSITY, argv[21], 10);
0245.00 DENSITY[10] = 0x00;
0246.00 }
0247.00 /****************/
0248.00 void INZSR(void)
0249.00 /****************/
0250.00 {
0251.00 errcode.BYTESPRO = 160;
0252.00 errcode.BYTESAVL = 0;
0253.00 strcpy(home, "/");
0254.00 strcpy(ERR, " ");
0255.00 }
0256.00 /*********************************************/
0257.00 int saveIFS(char* name, char* type, int size)
0258.00 /*********************************************/
0259.00 {
0260.00 char ifs[91], obj[91], cmd[256], msgtxt[132], dir[256], objtype[11];
0261.00 int len, i, rc, count;
0262.00 struct stat info;
0263.00
0264.00 strcpy(ifs, name);
0265.00 len = triml(ifs, ' ');
0266.00 if(len > 0) ifs[len] = 0x00;
0267.00 if(strncmp(ifs, "AS400-NET.USR", 13) == 0){/*AS400-NET.USR*/
0268.00 strcpy(obj, "ASNETUSR");
0269.00 }/*AS400-NET.USR*/
0270.00 else{/* 通常 */
0271.00 strcpy(obj, ifs);
0272.00 }/* 通常 */
0273.00 if(strlen(obj) > 10){/*10 バイトに制限 */
0274.00 obj[10] = 0x00;
0275.00 }/*10 バイトに制限 */
0276.00 cvt5026to5035(obj);
0277.00 for(i = 0; i<strlen(obj); i++){/*for-loop*/
0278.00 obj[i] = toupper(obj[i]);
0279.00 }/*for-loop*/
0280.00 sprintf(msgtxt, "/%s を保管中です。 ", ifs);
0281.00 SendMessage(msgtxt, "*STATUS ", "*EXT ");
0282.00
0283.00 /*( TAPE 保管 )*/
0284.00 if(strncmp(OPTION, "*TAPE", 5) == 0){/*TAPE 保管 */
0285.00 sprintf(cmd,
0286.00 "SAV DEV('/QSYS.LIB/%s.DEVD') OBJ('/%s') LABEL('%s') SAVACT(%s) ™
0287.00 ENDOPT(*LEAVE)",
0288.00 DEV, ifs, ifs, SAVACT);
0289.00 rc = system(cmd);
0290.00 if(rc == ERROR){/* エラー */
0291.00 printf("[%d] SAV エラー ™n", __LINE__);
0292.00 printf("[%d] [%s]™n", __LINE__, cmd);
0293.00 getchar();
0294.00 return FALSE;
0295.00 }/* エラー */
0296.00 else{/* 成功 */
0297.00 saveSU ++;
0298.00 return TRUE;
0299.00 }/* 成功 */
0300.00 }/*TAPE 保管 */
0301.00
0302.00 if(strncmp(OPTION, "*PRINT", 6) == 0){/*PRINT 印刷 */
0303.00 sprintf(dir, "/QSYS.LIB/IFSLIB.LIB/%s.FILE", obj);
0304.00 lstat(dir, &info);
0305.00 /* sprintf(objtype, "%s", info.st_objtype); */
0306.00 strcpy(objtype, type);
0307.00 len = triml(objtype, ' ');
0308.00 if(len > 0) objtype[len] = 0x00;
0309.00 if(strncmp(type, "LIB", 3) != 0)
0310.00 count = CountContents(ifs);
0311.00 else count = 0;
0312.00 printf("DIR:/%s [%d]: %d バイト ™n", ifs, count, info.st_size);
0313.00 /* printf(" : オブジェクト数 %d 個 ™n", info.st_nlink32); */
0314.00 saveSU ++;
0315.00 return TRUE;
0316.00 }/*PRINT 印刷 */
0317.00
0318.00 if(system("CHKOBJ OBJ(IFSLIB) OBJTYPE(*LIB)") == ERROR){/* エラー */
0319.00 system("CRTLIB LIB(IFSLIB) TEXT('FOR SAVUSRIFS BACKUP') AUT(*ALL)");
0320.00 }/* エラー */
0321.00 sprintf(cmd, "CHKOBJ OBJ(IFSLIB/%s) OBJTYPE(*FILE)", obj);
0322.00 if(system(cmd) == ERROR){/* エラー */
0323.00 sprintf(cmd, "CRTSAVF FILE(IFSLIB/%s) AUT(*ALL)", obj);
0324.00 system(cmd);
0325.00 }/* エラー */
0326.00 /*( IFSLIB に *SAVF を作成する )*/
0327.00 sprintf(cmd, "CLRSAVF FILE(IFSLIB/%s)", obj);
0328.00 system(cmd);
0329.00 /*( IFSLIB の保管ファイルに IFS を保存する )*/
0330.00 sprintf(cmd, "SAV DEV('/QSYS.LIB/IFSLIB.LIB/%s.FILE') OBJ('/%s/*')",
0331.00 obj, ifs);
0332.00 system(cmd);
0333.00
0334.00 /*( FTP 転送 )*/
0335.00 if(strncmp(OPTION, "*SEND", 5) == 0){/*FTP 転送 */
0336.00 sprintf(dir, "/QSYS.LIB/IFSLIB.LIB/%s.FILE", obj);
0337.00 if(lstat(dir, &info) == FALSE) return FALSE;
0338.00 if(info.st_size == 0){/* ファイルが空である */
0339.00 if(strncmp(LOG, "*YES", 4) == 0){/*LOG*/
0340.00 printf("[%d] %s- このファイルは空のため保管されません。 ™n",__LINE__,dir);
0341.00 }/*LOG*/
0342.00 return FALSE;
0343.00 }/* ファイルが空である */
0344.00 /*( IFS に保管ファイルを転送する )*/
0345.00 sprintf(cmd,
0346.00 "CPYTOSTMF FROMMBR('/QSYS.LIB/IFSLIB.LIB/%s.FILE') ™
0347.00 TOSTMF('/TEST/%s.FILE') STMFOPT(*REPLACE)", obj, obj);
0348.00 system(cmd);
0349.00 /*( FTP でファイルを転送する )*/
0350.00 memset(cmd, 0, sizeof(cmd));
0351.00 sprintf(cmd,
0352.00 "SPOOLWTR/SNDFTP FRMADDRESS('%s') ™
0353.00 FROMFILE('/TEST/%s.FILE') TOADDRESS('%s') ™
0354.00 TOFILE('%s%s.FILE') USER('%s') PASSWORD('%s') ™
0355.00 CONVERT(*NO) LOG(%s)", FROMIP, obj, TOIP, TODIR, obj, USER, PASSWRD, LOG);
0356.00 if(strncmp(LOG, "*YES", 4) == 0){/*LOG*/
0357.00 printf("[%d] %s™n", __LINE__, cmd);
0358.00 getchar();
0359.00 }/*LOG*/
0360.00 system(cmd);
0361.00 saveSU ++;
0362.00 }/*FTP 転送 */
0363.00
0364.00 /*( IFS のファイルを削除する )*/
0365.00 sprintf(cmd, "RMVLNK OBJLNK('/TEST/%s.FILE')", obj);
0366.00 system(cmd);
0367.00 return TRUE;
0368.00 }
0369.00 /**************************/
0370.00 int OmitObject(char* dir)
0371.00 /**************************/
0372.00 {
0373.00 int i, len;
0374.00 char OBJ[31], *ptr;
0375.00
0376.00 if(m_objr.OBJSU == 0) return FALSE;
0377.00 for(i = 0; i<m_objr.OBJSU; i++){/*for-loop*/
0378.00 memcpy(OBJ, m_objr.OBJ[i], 30);
0379.00 OBJ[30] = 0x00;
0380.00 ptr = strchr(OBJ, '*');
0381.00 if(ptr != NULL){/* 総称 */
0382.00 len = (int)(ptr - OBJ);
0383.00 }/* 総称 */
0384.00 else len = strlen(dir);
0385.00 if(len > 0 &&
0386.00 strncmp(dir, m_objr.OBJ[i], len) == 0){/* 名前が一致 */
0387.00 return TRUE;
0388.00 }/* 名前が一致 */
0389.00 }/*for-loop*/
0390.00 return FALSE;
0391.00 }
0392.00 /**********************************************************/
0393.00 void SendMessage(char* Message, char* Status, char* Pgmque)
0394.00 /**********************************************************/
0395.00 {
0396.00 char msg_id[7];
0397.00 char msg_fl_name[20];
0398.00 char msg_data[3000];
0399.00 int msg_data_len;
0400.00 char msg_type[10];
0401.00 int pgm_stk_cnt;
0402.00 char msg_key[4];
0403.00 char pgm_que[10];
0404.00
0405.00 memset(msg_id, 0, sizeof(msg_id));
0406.00 strcpy(msg_id, "CPF9897");
0407.00 memset(msg_fl_name, 0, sizeof(msg_fl_name));
0408.00 strcpy(msg_fl_name, "QCPFMSG QSYS ");
0409.00 memset(msg_data, 0, sizeof(msg_data));
0410.00 strcpy(msg_data, Message);
0411.00 msg_data_len = triml(Message, ' ');
0412.00 strcpy(msg_type, Status);
0413.00 strcpy(pgm_que, Pgmque);
0414.00 if(strncmp(Pgmque, "*EXT ", 10) == 0)
0415.00 pgm_stk_cnt = 0;
0416.00 else pgm_stk_cnt = 1;
0417.00 memset(msg_key, 0x40, sizeof(msg_key));
0418.00 errcode.BYTESPRO = errcode.BYTESAVL = 0;
0419.00 QMHSNDPM(msg_id, msg_fl_name, msg_data, msg_data_len, msg_type,
0420.00 pgm_que, pgm_stk_cnt, msg_key, &errcode);
0421.00 }
0422.00 /****************************/
0423.00 int CountContents(char* name)
0424.00 /****************************/
0425.00 {
0426.00 DIR *dir;
0427.00 struct dirent *entry;
0428.00 char parent[257];
0429.00 int count =0;
0430.00
0431.00 sprintf(parent, "/%s", name);
0432.00 if((dir = opendir(parent)) == NULL)
0433.00 return 0;
0434.00 else{
0435.00 while((entry = readdir(dir)) != NULL){
0436.00 if(strncmp(entry->d_name, ".", 1) == 0) continue;
0437.00 count++;
0438.00 }
0439.00 closedir(dir);
0440.00 }
0441.00 return count;
0442.00 }
0443.00 /*******************************/
0444.00 void cvt5026to5035(char* record)
0445.00 /*******************************/
0446.00 {
0447.00 char ch;
0448.00 char* ptr;
0449.00 int pos, len, i, bKJ = FALSE;
0450.00 char KANA5035[]= "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァゥェォ ャュョー゚゙™
0451.00 abcdefghijklmnopqrstuvwxyzッィ[]^~「」・。、¥$";
0452.00 char KANA5026[]= "abcdefghiテナニヌネ jklmnopqrノフヘホstuvwxyzマム[メモロワン・]ヲィゥェ ォャュー゚゙™
0453.00 イウエオカキクケサシスセソタチツトハミヤユヨラリルレョァコ ^…。「、 」$™™";
0454.00
0455.00 len = strlen(record);
0456.00 for(i = 0; i<len; i++){/*for-loop*/
0457.00 if(bKJ == FALSE){/* ANK */
0458.00 if(record[i] == 0x0e) bKJ = TRUE;
0459.00 else{/* ABC */
0460.00 ch = record[i];
0461.00 if(ch != ' ' && (ptr = strchr(KANA5026, ch)) != NULL){
0462.00 pos = (int)(ptr - KANA5026);
0463.00 record[i] = KANA5035[pos];
0464.00 }
0465.00 }/* ABC */
0466.00 }/* ANK */
0467.00 else{/* 漢字中 */
0468.00 if(record[i] == 0x0f) bKJ = FALSE;
0469.00 }/* 漢字中 */
0470.00 }/*for-loop*/
0471.00
0472.00 }
0473.00 /***********************/
0474.00 void LRRTN(char* argv[])
0475.00 /***********************/
0476.00 {
0477.00 if(bLR == TRUE) return;
0478.00 bLR = TRUE;
0479.00 strcpy(argv[2], ERR);
0480.00 strcpy(argv[3], msg);
0481.00 }
C 言語は IBM ユーザーに馴染みが無いと思うが
CRTBNDC PGM(MYLIB/SAVUSRIFS) SRCFILE(MYSRCLIB/QCSRC) AUT(*ALL)
にしてコンパイルする。
テープ装置への保管を行っているのは
0283.00 /*( TAPE 保管 )*/
0284.00 if(strncmp(OPTION, "*TAPE", 5) == 0){/*TAPE 保管 */
0285.00 sprintf(cmd,
0286.00 "SAV DEV('/QSYS.LIB/%s.DEVD') OBJ('/%s') LABEL('%s') SAVACT(%s) ™
0287.00 ENDOPT(*LEAVE)",
0288.00 DEV, ifs, ifs, SAVACT);
0289.00 rc = system(cmd);
0290.00 if(rc == ERROR){/* エラー */
0291.00 printf("[%d] SAV エラー ™n", __LINE__);
0292.00 printf("[%d] [%s]™n", __LINE__, cmd);
0293.00 getchar();
0294.00 return FALSE;
0295.00 }/* エラー */
0296.00 else{/* 成功 */
0297.00 saveSU ++;
0298.00 return TRUE;
0299.00 }/* 成功 */
0300.00 }/*TAPE 保管 */
であり、
0285.00 sprintf(cmd,
0286.00 "SAV DEV('/QSYS.LIB/%s.DEVD') OBJ('/%s') LABEL('%s') SAVACT(%s) ™
0287.00 ENDOPT(*LEAVE)",
0288.00 DEV, ifs, ifs, SAVACT);
で
SAV DEV('QSYS.LIB/TAP01.DEVD') OBJ('/MYDIR') LABEL('MYDIR) SAVACT(*NO) ENDOPT(*LEAVE)
という 3 文字コマンド: SAV を生成して system( cmd ) によって
実行している。
印刷を行っているのは
0302.00 if(strncmp(OPTION, "*PRINT", 6) == 0){/*PRINT 印刷 */
0303.00 sprintf(dir, "/QSYS.LIB/IFSLIB.LIB/%s.FILE", obj);
0304.00 lstat(dir, &info);
0305.00 /* sprintf(objtype, "%s", info.st_objtype); */
0306.00 strcpy(objtype, type);
0307.00 len = triml(objtype, ' ');
0308.00 if(len > 0) objtype[len] = 0x00;
0309.00 if(strncmp(type, "LIB", 3) != 0)
0310.00 count = CountContents(ifs);
0311.00 else count = 0;
0312.00 printf("DIR:/%s [%d]: %d バイト ™n", ifs, count, info.st_size);
0313.00 /* printf(" : オブジェクト数 %d 個 ™n", info.st_nlink32); */
0314.00 saveSU ++;
0315.00 return TRUE;
0316.00 }/*PRINT 印刷 */
であり、
0312.00 printf("DIR:/%s [%d]: %d バイト ™n", ifs, count, info.st_size);
で、印刷している。
count とは CountContents 関数によって算出されるディリクトリー配下の
コンテンツの数である。
テープ装置のために追加したのは
0004.00 PARM KWD(OPTION) TYPE(*CHAR) LEN(6) RSTD(*YES) + 0005.00 DFT(*NONE) VALUES(*NONE *CLOUD *SEND + 0006.00 *TAPE *PRINT) PROMPT(' 出力オプション ')の *TAPE の入力を追加した。
次にテープ装置の入力パラメータとして追加したのが以下の記述である。
0032.00 TAPE: PMTCTL CTL(OPTION) COND((*EQ *TAPE)) 0033.00 PARM KWD(DEV) TYPE(*CHAR) LEN(10) DFT(TAP01) + 0034.00 PMTCTL(TAPE) PROMPT(' 装置 ') 0035.00 PARM KWD(VOL) TYPE(*CHAR) LEN(32) DFT(IBMIRD) + 0036.00 PMTCTL(TAPE) PROMPT(' ボーリューム ID') 0037.00 PARM KWD(SEQNBR) TYPE(*DEC) LEN(8 0) DFT(*END) + 0038.00 RANGE(1 16777215) SPCVAL((*END 0)) + 0039.00 PMTCTL(TAPE) PROMPT(' 順序番号 ') 0040.00 PARM KWD(LABEL) TYPE(*CHAR) LEN(17) DFT(*LIB) + 0041.00 PMTCTL(TAPE) PROMPT(' ラベル ') 0042.00 PARM KWD(EXPDATE) TYPE(*DATE) DFT(*PERM) + 0043.00 SPCVAL((*PERM 1999999)) + 0044.00 PMTCTL(TAPE) PROMPT(' ファイル満了日 ') 0045.00 PARM KWD(ENDOPT) TYPE(*CHAR) LEN(7) RSTD(*YES) + 0046.00 DFT(*REWIND) VALUES(*REWIND *LEAVE + 0047.00 *UNLOAD) PMTCTL(TAPE) + 0048.00 PROMPT(' 媒体の終わりオプション ') 0049.00 PARM KWD(STRLIB) TYPE(*CHAR) LEN(10) DFT(*FIRST) + 0050.00 PMTCTL(TAPE) PROMPT(' 開始ライブラリー ') 0051.00 PARM KWD(INZTAP) TYPE(*CHAR) LEN(4) RSTD(*YES) + 0052.00 DFT(*NO) VALUES(*YES *NO) + 0053.00 PMTCTL(TAPE) PROMPT(' テープの初期設定 ') 0054.00 PARM KWD(CHECK) TYPE(*CHAR) LEN(4) RSTD(*YES) + 0055.00 DFT(*NO) VALUES(*YES *NO) + 0056.00 PMTCTL(TAPE) PROMPT(' 活動ファイルの検査 ') 0057.00 PARM KWD(DENSITY) TYPE(*CHAR) LEN(10) RSTD(*YES) + 0058.00 DFT(*CTGTYPE) VALUES(*DEVTYPE *CTGTYPE + 0059.00 *QIC120 10000 *QIC525 16000 *QIC1000 + 0060.00 *QIC2GB *QIC3040 *QIC5010 *FMT3480 38000 + 0061.00 *FMT3090E *FMT3570 *FMT3570E *FMT3590 + 0062.00 1600 3200 6250 *FMT2GB 43200 *FMT5GB + 0063.00 *FMT7GB *ULTRIUM3 *ULTRIUM4) + 0064.00 PMTCTL(TAPE) PROMPT(' テープ密度 ')注意して欲しいのはテープの初期設定として INZTAP コマンドでテープ密度
として *CTGTYPE を DENSITY パラメータとして指定することである。
これは LTE テープ装置の場合で指定するようにして欲しい。
手動で INZTAP を実行する場合も
のように指定すること。
印刷のためには次を追加した。