Tools

71. TAPE にもバックアップできる SAVUSRIFS

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 は

のような保管および印刷が可能になった。

【 コマンド: 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(' 活動状態保管 ')        
【解説】

テープ装置のために追加したのは

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 を実行する場合も

INZTAP DEV(TAP01) NEWVOL(IBMIRD) CHECK(*NO) DENSITY(*CTGTYPE)

のように指定すること。

印刷のためには次を追加した。

0065.00  PRINT:      PMTCTL     CTL(OPTION) COND((*EQ *PRINT))
【 CLP: SAVUSRIFSC 】
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      /*  テープ保管  */                     
【 コマンド: SAVUSRIFS 】
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 関数によって算出されるディリクトリー配下の
コンテンツの数である。