*DECK FCSEPES 
USETEXT TEXTFCS;
      PROC FCSEPES; 
*CALL COPYRITE
# TITLE FCSEPES - EXIT PROGRAM EXECUTION SEQUENCER.                    #
  
      BEGIN                            # FCSEPES                       #
  
# 
**    FCSEPES - EXIT PROGRAM EXECUTION SEQUENCER. 
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE EXITS THE FTP CONTROL STATEMENT PROCESSOR. 
* 
*     PROC FCSEPES
* 
*     ENTRY   FTPSTATE   = FTP USER STATE.
*             FTPABORT   = ABORT CODE.
*             FTPOUTPUT  = OUTPUT FILE NAME.
*             FTPINTER   = INTERACTIVE JOB FLAG.
* 
*     EXIT    LOCAL FILES RETRIEVED, FLUSHED OR RETURNED. 
*             APPLICATION NETTED OFF. 
* 
*     NOTES   THIS PROCEDURE IS CALLED BY *FCSXPES* WHEN A QUIT 
*             COMMAND IS PROCESSED AND BY REPRIEVE PROCESSING 
*             WHEN THE FTP CONTROL STATEMENT IS ABORTED.
* 
*     METHOD  WRITE ANY EXIT MESSAGE TO OUTPUT FILE AND DAYFILE.
*             IF TRANSFERRING FILE THEN RESCUE LOCAL FILE.
*             FLUSH OUTPUT FILE.
*             RETURN INTERACTIVE PROMPT FILE. 
*             RETURN INTERNAL TRANSFER FILE.
*             DISCONNECT FROM NETWORK.
*             DAYFILE COMPLETION OR ABORT MESSAGE.
* 
# 
  
# 
****  PROC FCSEPES - XREF LIST
# 
      XREF
        BEGIN 
        PROC FCSNOSM;                  # OUTPUT SUPERVISORY MESSAGE    #
        PROC FCSNWFS;                  # WAIT FOR FTP STATE            #
        PROC FCSOWOF;                  # WRITE TO OUTPUT FILE          #
        PROC FSTATUS;                  # CHECK IF LOCAL FILE EXISTS    #
        PROC MESSAGE;                  # DAYFILE A MESSAGE             #
        PROC NETOFF;                   # DISCONNECT FROM NETWORK       #
        PROC NETRR;                    # NETWORK RESET ON REPRIEVE     #
        PROC RETERN;                   # RETURN A LOCAL FILE           #
        PROC WRITER;                   # WRITE END OF RECORD           #
        END 
# 
****
# 
      ITEM SPACING       U = O"55550000000000000000"; 
  
      ARRAY EXMSG [01:ELAST] S(6);
        BEGIN 
        ITEM EXIT$TEXT   C(00,00,51) =
       ["--FATAL--  UNABLE TO CONNECT TO TCP/IP NETWORK.    ",
        "--FATAL--  DISCONNECTED FROM TCP/IP NETWORK.       ",
        "--FATAL--  MAXIMUM FIELD LENGTH EXCEEDED.          ",
        "--FATAL--  UNEXPECTED DATA BLOCK RECEIVED.         ",
        "--FATAL--  UNEXPECTED SUPERVISORY MESSAGE RECEIVED.",
        "--FATAL--  INVALID DATA BLOCK FORMAT RECEIVED.     ",
        "--FATAL--  INVALID RESPONSE FROM FTP CONNECTION.   ",
        "--FATAL--  UNABLE TO LEND FNT ENTRY.               ",
        "--FATAL--  UNABLE TO RETRIEVE FNT ENTRY.           "]; 
        ITEM EXIT$ZBYTE  U(05,06,54) = [ELAST(0)];
        END 
  
      ARRAY CMPMSG [00:00] S(2);
        BEGIN 
        ITEM CMP$TEXT    C(00,00,14) =
       [" FTP COMPLETE."];
        ITEM CMP$ZBYTE   U(01,24,36) = [0]; 
        END 
  
      ARRAY ABTMSG [00:00] S(2);
        BEGIN 
        ITEM ABT$TEXT    C(00,00,14) =
       [" FTP ABORTED. "];
        ITEM ABT$ZBYTE   U(01,24,36) = [0]; 
        END 
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
      IF FTPSTATE LAN FTPUINIT NQ 0 
      THEN
        BEGIN                          # CONTROL STATEMENT ERROR       #
        RETURN;                        # GET OUT OF HERE QUICKLY       #
        END 
  
      IF FTPSTATE LAN FTPUPARSED NQ 0 
      THEN
        BEGIN                          # INPUT + OUTPUT NOT SET UP     #
        MESSAGE (CMPMSG, 0);           # DAYFILE COMPLETION MESSAGE    #
        RETURN;                        # GET OUT OF HERE QUICKLY       #
        END 
# 
*     WRITE ANY EXIT MESSAGE TO OUTPUT FILE.
# 
      IF FTPABORT NQ ENORMAL
      THEN
        BEGIN                          # ABNORMAL EXIT CONDITION       #
        FCSOWOF (EXMSG[FTPABORT], 
                 INTERNAL$);           # WRITE MESSAGE TO OUTPUT FILE  #
        FCSOWOF (SPACING, INTERNAL$);  # WRITE BLANK LINE              #
        MESSAGE (EXMSG[FTPABORT], 0);  # WRITE MESSAGE TO DAYFILES     #
        END 
# 
*     IF FILE TRANSFER IN PROGRESS THEN RETRIEVE FNT ENTRY FROM *FTPI*. 
# 
      IF FTPSTATE LAN (FTPUFILE + FTPULENT) NQ 0
      THEN
        BEGIN                          # FILE TRANSFER IN PROGRESS     #
        NETRR;                         # RESET AIP WORKLIST PROCESSING #
        P<APSM>    = LOC(OUTBUF);      # BASE SUPERVISORY MESSAGE PTR  #
        SPMSG0[0]  = 0;                # CLEAR FIRST WORD              #
        SACSHCD[0] = FALSE;            # DO NOT ABORT ON SHUT/INSD     #
        SACINCD[0] = FALSE;            # DO NOT ABORT ON FC/INAC       #
        SACCBCD[0] = FALSE;            # DO NOT ABORT ON CON/CB        #
        FCSNOSM (SACNCL, LSAC);        # SEND SAC/NCL SM               #
        P<APSM>    = LOC(OUTBUF);      # BASE SUPERVISORY MESSAGE PTR  #
        SPMSG0[0]  = 0;                # CLEAR FIRST WORD              #
        SPMSG1[0]  = 0;                # CLEAR SECOND WORD             #
        FCSNOSM (FNTIAR, LFNTS);       # SEND FNT/IAR/R SM             #
        FCSNWFS (FTPUOPEN);            # WAIT TILL FILE IS RETURNED    #
        FSTATUS (MBT[MBXX]);           # CHECK IF FILE EXISTS          #
        IF MBT$FSTAT[MBXX] EQ 0 
        THEN
          BEGIN                        # LOCAL FILE DOES NOT EXIST     #
          FCSOWOF (EXMSG[EUNRETR],
                   INTERNAL$);         # WRITE MESSAGE TO OUTPUT FILE  #
          END 
        END 
# 
*     FLUSH OUTPUT FILE.
# 
      IF FTPOUTPUT NQ "0" 
      THEN
        BEGIN                          # OUTPUT FILE EXISTS            #
        WRITER (MBT[MBOX]);            # FLUSH OUTPUT FILE             #
        END 
# 
*     RETURN INTERACTIVE PROMPT FILE. 
# 
      IF FTPINTER 
      THEN
        BEGIN                          # JOB ORIGIN IS INTERACTIVE     #
        RETERN (MBT[MBMX]);            # RETURN PROMPT FILE            #
        END 
# 
*     RETURN INTERNAL TRANSFER FILE. (THIS FILE WOULD ONLY BE LOCAL 
*     IF WE ABORTED WHILE PROCESSING A COMMAND WHICH USES THIS FILE). 
# 
      IF (FTPSTATE LAN FTPUOPEN NQ 0) AND 
         (MBT$LFN[MBXX] EQ XFERLFN[0])
      THEN
        BEGIN                          # TRANSFER FILE MAY BE LOCAL    #
        RETERN (MBT[MBXX]);            # RETURN INTERNAL TRANSFER FILE #
        END 
# 
*     DISCONNECT FTP CONTROL STATEMENT FROM NETWORK.
# 
      NETOFF;                          # DISCONNECT FROM NETWORK       #
  
      IF FTPABORT EQ ENORMAL
      THEN
        BEGIN 
        MESSAGE (CMPMSG, 0);           # DAYFILE COMPLETION MESSAGE    #
        END 
      ELSE
        BEGIN 
        MESSAGE (ABTMSG, 0);           # DAYFILE ABORTED MESSAGE       #
        END 
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FCSEPES                       #
  
      TERM
