     PGM  PARM(&VERSION)
/*****************************************************************/
/* PROGRAM: AUDITLIB/AUDITSFTPC                                  */
/*                                                               */
/* NOTE:                                                         */
/* THE &LIBVARUC VARIABLE CAN BE USED TO ALTER THE LIBRARY THAT  */
/* IS USED TO:                                                   */
/* -  CREATE ALL PF-DTA FILES AND DATA AREAS                     */
/* -  ADD AND REMOVE THE USER DEFINED LIBRARY TO THE USER LIBLIST*/
/* -  CALL AS400EXT                                              */
/* THE DEFAULT VALUE FOR &LIBVARUC IS 'AUDITLIB'.               */
/*                                                               */
/* THIS PROGRAM, AUDITLIB/AUDITSFTPC, WILL WRITE AUDIT DATA      */
/* FROM THE QAUDJRN JOURNAL, USING DSPJRN, TO A FILE CALLED      */
/* AUDITLIB/AUDITDTA THE AUDITLIB/AUDITDTA FILE WILL BECOME      */
/* INPUT TO THE AS400EXT *PGM PROGRAM WHICH WILL CREATE THE      */
/* AUDITLIB/AUDITFMT FILE THAT CONTAINS THE FORMATTED DATA FOR   */
/* SECURITY ANALYTICS.  SFTP WILL BE USED TO SEND THE DATA TO A  */
/* REMOTE SYSTEM.  THE REMOTE SYSTEM IS IDENTIFIED USING THE     */
/* IP ADDRESS SPECIFIED ON THE SFTP COMMAND IN THIS PROGRAM.     */
/* THIS PROGRAM WILL KEEP TRACK OF THE LAST TIME THE AUDIT       */
/* DATA WAS READ FROM THE QAUDJRN JOURNAL AND WILL USE THIS      */
/* DATE/TIME AS THE STARTING POINT FOR THE NEXT RUN OF THIS      */
/* PROGRAM.                                                      */
/*                                                               */
/* PLEASE NOTE THAT ALL IFS DIRECTORY AND FILE SPECIFICATIONS ARE*/
/* CASE SENSITIVE!!!                                             */
/*                                                               */
/* PROGRAM SETUP INSTRUCTIONS:                                   */
/*   1) SIGNON TO THE ISERIES SYSTEM USING AN ADMINISTRATOR ID   */
/*      E.G. QSECOFR                                             */
/*   2) CRTLIB LIB(AUDITLIB) AUT(*EXCLUDE)                       */
/*   3) CRTSRCPF FILE(AUDITLIB/QCLSRC)                           */
/*   4) STRSEU SRCFILE(AUDITLIB/QCLSRC) SRCMBR(AUDITSFTPC)       */
/*       COPY THE SOURCE FOR PROGRAM AUDITLIB/AUDITSFTPC INTO    */
/*       THIS SOURCE MEMBER, TYPE IS CLP.                        */
/*   5) STRSEU SRCFILE(AUDITLIB/QCLSRC) SRCMBR(SFTPCMD)          */
/*       COPY THE SOURCE FOR SFTP SCRIPT AUDITLIB/SFTPCMD        */
/*       INTO THIS SOURCE MEMBER. FOLLOW THE INSTRUCTIONS IN THIS*/
/*       SOURCE MEMBER.                                          */
/*       NOTE: SFTPCMD IS REQUIRED IF &BLDFTPFLAG IS SET TO THE  */
/*             DEFAULT 'VALUE(N)'.                               */
/*   6) THE &BLDFTPFLAG VARIABLE DCL DEFAULTS TO VALUE(N). IF YOU*/
/*      WANT TO DYNAMICALLY GENERATE AN FTPSCRIPT THAT CREATES A */
/*      UNIQUE FTP 'TO' FILENAME, CHANGE THE VALUE TO: VALUE(Y)  */
/*      AND FOLLOW THE INSTRUCTIONS IN SFTPCMD.                  */
/*   7) CRTCLPGM PGM(AUDITLIB/AUDITSFTPC)                        */
/*       SRCFILE(AUDITLIB/QCLSRC) SRCMBR(AUDITSFTPC)             */
/*       TEXT('AUDIT PROGRAM FOR SFTP')                          */
/*   8) MKDIR DIR('/home/sftpinfodir')                           */
/*       MAKE AN IFS DIRECTORY FOR THE ASCII FORMATTED FTP       */
/*       COMMAND FILE AND THE SFTP MESSAGE OUTPUT FILE           */
/*   9) MKDIR DIR('/home/auditlib')                              */
/*       MAKE AN IFS DIRECTORY FOR THE ASCII FORMATTED AUDIT     */
/*       DATA FILE THAT WILL BE SFTP'd TO ENVISION               */
/*  10) CPYTOIMPF  FROMFILE(AUDITLIB/QCLSRC SFTPCMD) +           */
/*                 TOSTMF('/home/sftpinfodir/sftpput.txt') +     */
/*                 STMFCODPAG(00819) RCDDLM(*CRLF) DTAFMT(*FIXED)*/
/*       COPY THE EBCDIC FORMATTED SFTP COMMAND FILE             */
/*       TO AN ASCII FORMATTED IFS FILE.  FOLLOW THE INSTRUCTIONS*/
/*       IN THE sftpput.txt FILE.                                */
/*       NOTE: IF &BLDFTPFLAG IS SET TO 'VALUE(Y)', THEN         */
/*             '/home/sftpinfodir/sftpput.txt' WILL BE DELETED   */
/*             AND RE-CREATED EACH TIME THIS JOB RUNS.           */
/*  11) CRTCLPGM PGM(AUDITLIB/AUDITSFTPC)                        */
/*       SRCFILE(AUDITLIB/QCLSRC) SRCMBR(AUDITSFTPC)             */
/*       TEXT('AUDIT PROGRAM FOR SFTP')                          */
/*  12) STRSEU SRCFILE(AUDITLIB/QCLSRC) SRCMBR(AS400SAVCR)       */
/*       COPY THE SOURCE FOR PROGRAM AUDITLIB/AS400SAVCR INTO    */
/*       THIS SOURCE MEMBER, TYPE IS CLP.                        */
/*       NOTE:  FOLLOW THE INSTRUCTIONS IN THE SCOL DOCUMENTATION*/
/*              TO RESTORE THE AS400EXT.SAVF FILE TO AN *PGM     */
/*              TYPE FILE FOR USE IN AUDITLIB/AUDITSFTPC.        */
/*                                                               */
/* PROGRAM RUN INSTRUCTIONS:                                     */
/*   1) THE PROGRAM, AUDITLIB/AUDITSFTPC, CAN BE CALLED USING    */
/*      THE FOLLOWING COMMAND:                                   */
/*       CALL PGM(AUDITLIB/AUDITSFTPC) PARM('V6')                */
/*       NOTE: REPLACE THE 'V6' WITH THE I5/OS OPERATING SYSTEM  */
/*             VERSION NUMBER OF YOUR SYSTEM.  THE FORMAT MUST   */
/*             INCLUDE THE LETTER 'V' FOLLOWED BY A NUMBER:      */
/*             6 FOR VERSION 6, 7 FOR VERSION 7, ETC.            */
/*   2) THE JOB SCHEDULER FUNCTION CAN BE USED TO SCHEDULE       */
/*      A BATCH JOB THAT WILL BE RUN PERIODICALLY TO CALL THIS   */
/*      PROGRAM.  THIS CAN BE USEFUL TO SEND THE AUDIT DATA TO   */
/*      THE REMOTE SYSTEM AT SCHEDULED INTERVALS. FOR EXAMPLE,   */
/*      THE FOLLOWING COMMAND WILL SCHEDULE A JOB TO RUN DAILY   */
/*      AT 6:00PM.                                               */
/*                                                               */
/*    ADDJOBSCDE JOB(AUDITJOB) CMD(CALL PGM(AUDITLIB/AUDITSFTPC) */
/*       PARM('V6')) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*ALL)    */
/*       SCDTIME('18:00:00')                                     */
/*****************************************************************/

             /************************************************/
             /* DECLARE VARIABLES                            */
             /************************************************/
             DCL        VAR(&VERSION) TYPE(*CHAR) LEN(2)
             DCL        VAR(&VERSIONOUT) TYPE(*CHAR) LEN(3)
             DCL        VAR(&NULL)    TYPE(*CHAR) LEN(1) +
                        VALUE(X'00')
             DCL        VAR(&BLDFTPFLAG) TYPE(*CHAR) VALUE(Y)
             DCL        VAR(&DATEVAR) TYPE(*CHAR) LEN(6)
             DCL        VAR(&DATEVAR2) TYPE(*CHAR) LEN(6)
             DCL        VAR(&MONTH) TYPE(*CHAR) LEN(2)
             DCL        VAR(&DAY) TYPE(*CHAR) LEN(2)
             DCL        VAR(&YEAR) TYPE(*CHAR) LEN(2)
             DCL        VAR(&TIMERTV) TYPE(*CHAR) LEN(9)
             DCL        VAR(&TIMEVAR) TYPE(*CHAR) LEN(6)
             DCL        VAR(&TYPETDATA) TYPE(*CHAR) LEN(1) VALUE(Y)
             DCL        VAR(&DSPJRNDB2) TYPE(*CHAR) LEN(1) VALUE(N)
             /************************************************/
             /* CHANGE &LIBVARUC IF YOU WILL RUN AS400EXT    */
             /* FROM A LIBRARY OTHER THAN AUDITLIB.  YOUR    */
             /* PF-DTA FILES WILL BE CREATED AND PROCESSED   */
             /* IN THE &LIBVARUC LIBRARY!!                   */
             /************************************************/
             DCL        VAR(&LIBVARUC) TYPE(*CHAR) LEN(10) +
                        VALUE(AUDITLIB)
             DCL        VAR(&FROMMEM)    TYPE(*CHAR) LEN(80)
             DCL        VAR(&FTPPUT) TYPE(*CHAR) LEN(100)
             DCL        VAR(&FTPCMDS) TYPE(*CHAR) LEN(100)
             DCL        VAR(&CMD) TYPE(*CHAR) LEN(150)
             DCL        VAR(&MSGDATA) TYPE(*CHAR) LEN(4)
             DCL        VAR(&MSGID)  TYPE(*CHAR) LEN(7)
             DCL        VAR(&RESULT) TYPE(*CHAR) LEN(4)
             DCL        VAR(&STATUS) TYPE(*DEC) LEN(10 0)
             DCL        VAR(&SIGNAL) TYPE(*DEC) LEN(10 0)
             DCL        VAR(&CHARSTAT) TYPE(*CHAR) LEN(10)
             DCL        VAR(&CHARSIG) TYPE(*CHAR) LEN(10)

             /************************************************/
             /* ADD I/O LIBRARY TO THE LIBLIST               */
             /************************************************/
             ADDLIBLE  LIB(&LIBVARUC)  POSITION(*FIRST)

             /************************************************/
             /* CHECK EXISTENCE OF THE DATA AREA THAT        */
             /* CONTAINS THE LAST RUN TIME INFORMATION.      */
             /* IF THE DATA AREA DOESN'T EXIST, CREATE THE   */
             /* DATA AREA FOR LAST RUN TIME AND LAST RUN     */
             /* DATE.                                        */
             /************************************************/
             CHKOBJ     OBJ(&LIBVARUC/TIME) OBJTYPE(*DTAARA)
             MONMSG     MSGID(CPF9801) EXEC(DO)
               /************************************************/
               /* CREATE DATA AREAS USED TO SAVE DATE/TIME OF  */
               /* LAST DSPJRN.                                 */
               /************************************************/
               DLTDTAARA  DTAARA(&LIBVARUC/DATE)
               MONMSG CPF0000
               DLTDTAARA  DTAARA(&LIBVARUC/TIME)
               MONMSG CPF0000
               CRTDTAARA  DTAARA(&LIBVARUC/DATE) TYPE(*CHAR) LEN(6)
               CRTDTAARA  DTAARA(&LIBVARUC/TIME) TYPE(*CHAR) LEN(6)
               RTVSYSVAL  SYSVAL(QDAY) RTNVAR(&DAY)
               RTVSYSVAL  SYSVAL(QMONTH) RTNVAR(&MONTH)
               RTVSYSVAL  SYSVAL(QYEAR) RTNVAR(&YEAR)
               CHGVAR &DATEVAR2 (&MONTH || &DAY || &YEAR)
               CHGDTAARA &LIBVARUC/DATE &DATEVAR2
               CHGDTAARA &LIBVARUC/TIME '000000'
             ENDDO

             /************************************************/
             /* RETRIEVE DATE/TIME INFORMATION OF THE        */
             /* PREVIOUS DSPJRN COMMAND.                     */
             /************************************************/
             RTVDTAARA  DTAARA(&LIBVARUC/TIME) RTNVAR(&TIMEVAR)
             RTVDTAARA  DTAARA(&LIBVARUC/DATE) RTNVAR(&DATEVAR)

             /************************************************/
             /* CLEAR DATA FROM THE PREVIOUS RUN OF THIS     */
             /* PROGRAM.  &LIBVARUC/AUDITDTA CONTAINS THE    */
             /* OUTPUT FROM THE DSPJRN COMMAND (AUDIT        */
             /* ENTRIES).                                    */
             /************************************************/
             DLTF       FILE(&LIBVARUC/AUDITDTA)
             MONMSG     MSGID(CPF0000)

             /************************************************/
             /* RETRIEVE CURRENT DATE AND TIME INFORMATION   */
             /************************************************/
             RTVSYSVAL  SYSVAL(QTIME) RTNVAR(&TIMERTV)
             RTVSYSVAL  SYSVAL(QDAY) RTNVAR(&DAY)
             RTVSYSVAL  SYSVAL(QMONTH) RTNVAR(&MONTH)
             RTVSYSVAL  SYSVAL(QYEAR) RTNVAR(&YEAR)

             /***************************************************/
             /* DUMP THE AUDIT ENTRIES TO THE OUTPUT FILE       */
             /* &LIBVARUC/AUDITDTA USING THE DATE/TIME FROM     */
             /* THE PREVIOUS RUN AS INPUT TO THE FROMTIME PARM. */
             /* THE VALUE *CURCHAIN IS USED FOR THE RCVRNG      */
             /* PARM IN CASE A NEW RECEIVER IS GENERATED        */
             /* FOR THE AUDIT JOURNAL IN BETWEEN RUNS OF THIS   */
             /* PROGRAM (CAN'T USE RCVRNG *CURRENT AS QAUDJRN   */
             /* ENTRIES IN PREVIOUS RECEIVERS WOULD BE MISSED). */
             /* TO SELECT SPECIFIC ENTRY TYPES FOR JRNCDE T, ADD*/
             /* AN ENTTYP PARAMETER TO THE DSPJRN COMMAND:      */
             /*     ENTTYP(AF CA CP CY SO VN PW VP VR)          */
             /***************************************************/
             CHGJOB     DATFMT(*MDY)
             DSPJRN     JRN(QSYS/QAUDJRN) RCVRNG(*CURCHAIN) +
                          FROMTIME(&DATEVAR &TIMEVAR) JRNCDE((T)) +
                          OUTPUT(*OUTFILE) OUTFILFMT(*TYPE5) +
                          OUTFILE(&LIBVARUC/AUDITDTA) ENTDTALEN(*CALC)

             MONMSG MSGID(CPF7062) EXEC(DO)
                      CHGVAR VAR(&TYPETDATA) VALUE(N)
                    ENDDO

             /***************************************************/
             /* DUMP THE QSQJRN ENTRIES TO THE OUTPUT FILE      */
             /* &LIBVARUC/AUDITDTA USING THE DATE/TIME FROM     */
             /* THE PREVIOUS RUN AS INPUT TO THE FROMTIME PARM. */
             /* THE VALUE *CURCHAIN IS USED FOR THE RCVRNG      */
             /* PARM IN CASE A NEW RECEIVER IS GENERATED        */
             /* FOR THE QSQJRN JOURNAL IN BETWEEN RUNS OF THIS  */
             /* PROGRAM (CAN'T USE RCVRNG *CURRENT AS QSQJRN    */
             /* ENTRIES IN PREVIOUS RECEIVERS WOULD BE MISSED). */
             /* TO SELECT SPECIFIC ENTRY TYPES FOR JRNCDE D OR F*/
             /* ADD AN ENTTYP PARAMETER TO THE DSPJRN COMMAND:  */
             /*     ENTTYP(CG MR MS ...)                        */
             /*                                                 */
             /* NOTE: UNCOMMENT THE FOLLOWING CHGVAR AND DSPJRN */
             /*       COMMANDS AND CHANGE 'schema/QSQJRN' TO    */
             /*       THE LIBRARY/FILE WHERE YOUR DB2           */
             /*       JOURNAL/JOURNAL RECEIVER(S) RESIDE.       */
             /***************************************************/
          /* CHGVAR     VAR(&DSPJRNDB2) VALUE(Y)                    */
          /* DSPJRN     JRN(schema/QSQJRN) RCVRNG(*CURCHAIN) +      */
          /*              FROMTIME(&DATEVAR &TIMEVAR) JRNCDE(D F) + */
          /*              OUTPUT(*OUTFILE) OUTFILFMT(*TYPE5) +      */
          /*              OUTFILE(&LIBVARUC/AUDITDTA) +             */
          /*              OUTMBR(*FIRST *ADD) ENTDTALEN(*OUTFILFMT) */
          /*                                                        */
             /************************************************/
             /* IF THERE IS NO QAUDJRN DATA AND NO QSQJRN    */
             /* DATA, STOP PROCESSING AND GO TO END OF JOB.  */
             /************************************************/
             MONMSG MSGID(CPF7062) EXEC(DO)
               IF (&TYPETDATA *EQ 'N') DO
                   GOTO EOJ
                   ENDDO
                 ENDDO

             IF (&TYPETDATA *EQ 'N' *AND &DSPJRNDB2 *EQ 'N'  ) DO
                 GOTO EOJ
               ENDDO

             /************************************************/
             /* DELETE THE AUDITFMT AUDIT DATA PHYSICAL FILE.*/
             /* CREATE THE AUDITFMT AUDIT DATA PHYSICAL FILE.*/
             /* NOTE: PRE-DETERMINE ALLOCATIONS BEFORE THE   */
             /*       CRTPF IS RUN FOR THE FIRST TIME!!!     */
             /* RUN THE JOURNAL EXTRACT / REFORMAT PROGRAM   */
             /* INPUT:  &LIBVARUC/AUDITDTA                   */
             /*   - INPUT FILE IS CREATED BY DSPJRN          */
             /* OUTPUT: &LIBVARUC/AUDITFMT                   */
             /*   - OUTPUT FILE IS INPUT TO THE CPYTOSTMF    */
             /************************************************/
             DLTF       FILE(&LIBVARUC/AUDITFMT)
             MONMSG     MSGID(CPF0000)

             CRTPF      FILE(&LIBVARUC/AUDITFMT) +
                        RCDLEN(32766) SIZE(20000 20000 20)
             MONMSG  MSGID(CPF323C CPF5702 CPF7302) EXEC(GOTO EOJ)

             /************************************************/
             /* ADD NULL TERMINATOR FOR ILE C PROGRAM.       */
             /************************************************/
             CHGVAR     VAR(&VERSIONOUT) VALUE(&VERSION *TCAT &NULL)

             CALL PGM(&LIBVARUC/AS400EXT) PARM(&VERSIONOUT)

             RMVLIBLE LIB(&LIBVARUC)

             /************************************************/
             /* DELETE THE '/home/auditlib/auditfmt.txt' FILE*/
             /* THAT CONTAINS THE RESULT OF THE PREVIOUS     */
             /* COPY TO STATEMENT FILE COMMAND.              */
             /*                                              */
             /* USE THE COPY TO STATEMENT FILE COMMAND TO    */
             /* COPY THE EBCDIC FORMATTED AUDIT FILE TO AN   */
             /* ASCII FORMATTED FILE WITH A CRLF AT THE      */
             /* END OF EACH RECORD.                          */
             /************************************************/
             RMVLNK     OBJLNK('/home/auditlib/auditfmt.txt')
             MONMSG     CPF0000

             CHGVAR     VAR(&FROMMEM) VALUE+
                            ('/QSYS.LIB/' *CAT &LIBVARUC *TCAT +
                             '.LIB/AUDITFMT.FILE/AUDITFMT.MBR')

             CPYTOSTMF FROMMBR(&FROMMEM) +
                    TOSTMF('/home/auditlib/auditfmt.txt') +
                    STMFOPT(*REPLACE) DBFCCSID(37) STMFCODPAG(*PCASCII)

             MONMSG  MSGID(CPFA085 CPFA097) EXEC(GOTO EOJ)

             /************************************************/
             /* SAVE DATE AND TIME OF THIS RUN.              */
             /* ALL PREVIOUS DATA COLLECTION STEPS HAVE      */
             /* COMPLETED BEFORE SAVING THE DATE AND TIME    */
             /************************************************/
             CHGVAR &TIMEVAR (%SST(&TIMERTV 1 6))
             CHGVAR &DATEVAR2 (&MONTH || &DAY || &YEAR)

             /************************************************/
             /* CONDITIONALLY BUILD THE SFTP COMMAND FILE    */
             /* WITH A UNIQUE FILE NAME.  REPLACE THE        */
             /* 'SA upload directory path' WITH YOUR SA      */
             /* ISERIES EVENT SOURCE UPLOAD DIRECTORY PATH,  */
             /* USUALLY THIS: 'upload/iseries/iseriestvm/'   */
             /* WITH NO LEADING FORWARD SLASH.               */
             /************************************************/
             IF (&BLDFTPFLAG *EQ 'Y') THEN(DO)
               CHGVAR VAR(&FTPPUT) VALUE+
                 ('put /home/auditlib/auditfmt.txt ' +
                       *CAT 'SA upload directory path' +
                       *TCAT '/auditfmt_' +
                       *TCAT &YEAR +
                       *TCAT &MONTH +
                       *TCAT &DAY *TCAT '_' +
                       *TCAT &TIMEVAR *TCAT '.txt')
               CHGVAR VAR(&FTPCMDS) VALUE+
                 ('/home/sftpinfodir/sftpput.txt')
               CHGVAR VAR(&CMD) VALUE('echo "' *TCAT &FTPPUT *TCAT +
                      '" > ' *CAT &FTPCMDS)
               QSH CMD(&CMD)
               CHGVAR VAR(&CMD) VALUE('echo "quit" >> ' *CAT &FTPCMDS)
               QSH CMD(&CMD)
             ENDDO

             /************************************************/
             /* REMOVE ENVIRONMENT VARIABLES                 */
             /************************************************/
             RMVENVVAR  ENVVAR(QIBM_QSH_CMD_OUTPUT)
             MONMSG MSGID(CPFA981)
             RMVENVVAR  ENVVAR(QIBM_QSH_CMD_ESCAPE_MSG)
             MONMSG MSGID(CPFA981)

             /************************************************/
             /* CREATE ENVIRONMENT VARIABLES TO CAPTURE QSH  */
             /* MESSAGES AND EXIT CODES                      */
             /************************************************/
             ADDENVVAR  ENVVAR(QIBM_QSH_CMD_OUTPUT) VALUE(NONE)
             ADDENVVAR  ENVVAR(QIBM_QSH_CMD_ESCAPE_MSG) VALUE(Y)

             /************************************************/
             /* OPEN AN SFTP SESSION TO THE TARGET SYSTEM    */
             /* AND RUN THE SFTP SCRIPT DEFINED IN THE ASCII */
             /* FORMATTED FILE LOCATED IN THE IFS DIRECTORY. */
             /* -> /home/sftpinfodir/sftpput.txt) is the SFTP*/
             /*    command file.                             */
             /* -> user@host.com is user at host computer:   */
             /*    i.e. userid@host.com or userid@ipaddress  */
             /*    NOTE: This user must have write access to */
             /*          to the 'SA upload directory path' in*/
             /*          the sftpput.txt IFS file!!          */
             /* -> /home/sftpinfodir/sftpput_msgs.txt is the */
             /*    SFTP messages output file.                */
             /************************************************/
             QSH CMD('/QOpenSys/usr/bin/sftp -v -o "batchmode yes" +
                 -b /home/sftpinfodir/sftpput.txt user@host.com +
                 > /home/sftpinfodir/sftpput_msgs.txt 2>&1')

             /************************************************/
             /* CHECK THE SFTP COMPLETION MESSAGE FOR SUCCESS*/
             /* OR FAILURE:                                  */
             /* - 'QSH0005' MESSAGE & EXIT CODE > 0: SFTP    */
             /*             FAILED.                          */
             /* - 'QSH0006' MESSAGE: SFTP FAILED.            */
             /* - 'QSH0007' MESSAGE: SFTP FAILED.            */
             /************************************************/
             MONMSG MSGID(QSH0005 QSH0006 QSH0007) EXEC(DO)
               RCVMSG  MSGTYPE(*LAST) RMV(*YES) MSGDTA(&MSGDATA) +
                      MSGID(&MSGID)
               CHGVAR VAR(&RESULT) VALUE(%SST(&MSGDATA 1 4))
               CHGVAR VAR(&STATUS) VALUE(%BIN(&RESULT))

               IF (&MSGID *EQ 'QSH0006') DO
                   CHGVAR VAR(&SIGNAL) VALUE(%BIN(&RESULT))
                   CHGVAR VAR(&STATUS) VALUE(-1)
               ENDDO

               IF (&MSGID *EQ 'QSH0007') DO
                   CHGVAR VAR(&STATUS) VALUE(-1)
                   CHGVAR VAR(&SIGNAL) VALUE(-1)
               ENDDO
             ENDDO

             /************************************************/
             /* CHECK SFTP STATUS, DO NOT UPDATE DATE & TIME */
             /* DATA AREAS IF STATUS IS GREATER THAN 0.      */
             /************************************************/
             IF (&STATUS *NE 0) THEN(DO)
                  CHGVAR    VAR(&CHARSTAT) VALUE(&STATUS)
                  CHGVAR    VAR(&CHARSIG) VALUE(&SIGNAL)
                  SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) +
                            MSGDTA('QShell failed with message id: ' +
                                   *CAT &MSGID *CAT ', status: ' +
                                   *CAT &CHARSTAT *CAT ', signal: ' +
                                   *CAT &CHARSIG)
                  SNDPGMMSG MSGID(CPF9897) MSGTYPE(*ESCAPE) +
                            MSGF(QCPFMSG) +
                            MSGDTA('See Messages in sftpput_msgs.txt')
                  GOTO      CMDLBL(EOJ)
             ENDDO

             /************************************************/
             /* SAVE DATE AND TIME IF THIS RUN IS SUCCESSFUL.*/
             /************************************************/
             CHGDTAARA &LIBVARUC/TIME &TIMEVAR
             CHGDTAARA &LIBVARUC/DATE &DATEVAR2

         EOJ:

     ENDPGM
