*DECK FCSNPSM 
USETEXT TEXTFCS;
      PROC FCSNPSM; 
*CALL COPYRITE
# TITLE FCSNPSM - PROCESS SUPERVISORY MESSAGE.                         #
  
      BEGIN                            # FCSNPSM                       #
  
# 
**    FCSNPSM - PROCESS SUPERVISORY MESSAGE.
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE PROCESSES THE SUPERVISORY MESSAGES RECEIVED. 
* 
*     PROC FCSNPSM
* 
*     ENTRY   INPBUF     = BUFFER CONTAINING SUPERVISORY MESSAGE. 
*             P<APSM>    = PTR TO INPUT BUFFER (INPBUF).
*             P<ABH>     = PTR TO INPUT APPLICATION BLOCK HEADER (IABH).
*             ACN        = APPLICATION CONNECTION TABLE.
*             FTPSTATE   = CURRENT FTP STATE. 
* 
*     EXIT    ACN        = APPLICATION CONNECTION TABLE.
*             FTPSTATE   = CURRENT FTP STATE. 
* 
*     METHOD  PROCESSING IS BASED ON THE PRIMARY FUNCTION CODE AND
*             SECONDARY FUNCTION CODE OF THE SUPERVISORY MESSAGE. 
*             SOME SUPERVISORY MESSAGES ARE IGNORED IF THEY HAVE NO 
*             EFFECT ON FTP CONTROL STATEMENT OPERATION.
* 
# 
  
# 
****  PROC FCSNPSM - XREF LIST
# 
      XREF
        BEGIN 
        PROC ABORT;                    # ABORT JOB                     #
        PROC FCSMDTS;                  # DEALLOCATE TABLE SPACE        #
        PROC NETPUT;                   # OUTPUT A NETWORK BLOCK        #
        END 
# 
****
# 
      CONTROL EJECT;
      PROC FCS2CFS (STATES);
      BEGIN                            # FCS2CFS                       #
# 
**    THIS EMBEDDED PROCEDURE CHECKS THE FTP STATE. IT ABORTS THE 
*     PROGRAM IF WE ARE NOT IN ONE OF THE SPECIFIED STATES. 
# 
      ITEM STATES        U;            # MASK OF LEGAL STATES          #
  
      IF (FTPSTATE LAN STATES) EQ 0 
      THEN
        BEGIN                          # UNEXPECTED SM FOR THIS STATE  #
        FTPABORT = EUNEXSM;            # SET UP ABORT CODE             #
        ABORT;                         # ABORT JOB                     #
        END 
  
      END                              # FCS2CFS                       #
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
# 
*     FC/ACK OR FC/NAK SUPERVISORY MESSAGE. 
# 
      IF (PFCSFC[0] EQ FCACK) OR
         (PFCSFC[0] EQ FCNAK) 
      THEN
        BEGIN 
        ACN$OBC[0] = ACN$OBC[0] - 1;   # DECREMENT OUTSTANDING BLOCKS  #
        IF ACN$WBC[0] NQ 0
        THEN
          BEGIN                        # WAITING BLOCK QUEUED          #
          NETPUT(WBQ[ABH$],WBQ[TXT$]); # OUTPUT THE DATA BLOCK         #
          FCSMDTS(P<WBQ>,0,WBQ[SIZ$]); # DELETE BLOCK FROM QUEUE       #
          ACN$WBC[0] = ACN$WBC[0] - 1; # DECREMENT WAITING BLOCKS      #
          ACN$OBC[0] = ACN$OBC[0] + 1; # INCREMENT OUTSTANDING BLOCKS  #
          END 
        END 
# 
*     FNT/IFL/N SUPERVISORY MESSAGE.
# 
      ELSE IF PFCSFC[0] EQ FNTIFLN
      THEN
        BEGIN 
        FCS2CFS (FTPUFILE);            # CHECK FTP STATE               #
        FTPSTATE = FTPULENT;           # FTP STATE IS FNT ENTRY LENT   #
        END 
# 
*     FNT/IFL/A SUPERVISORY MESSAGE.
# 
      ELSE IF PFCSFC[0] EQ FNTIFLA
      THEN
        BEGIN 
        FCS2CFS (FTPUFILE);            # CHECK FTP STATE               #
        FTPSTATE = FTPUOPEN;           # DONT RETRIEVE IN REPRIEVE     #
        FTPABORT = EUNLEND;            # SET UP ABORT CODE             #
        ABORT;                         # ABORT JOB                     #
        END 
# 
*     FNT/IFR/N SUPERVISORY MESSAGE.
# 
      ELSE IF PFCSFC[0] EQ FNTIFRN
      THEN
        BEGIN 
        FCS2CFS (FTPULENT);            # CHECK FTP STATE               #
        FTPSTATE = FTPUOPEN;           # FTP STATE IS CONNECTED TO HOST#
        END 
# 
*     FNT/IFR/A SUPERVISORY MESSAGE.
# 
      ELSE IF PFCSFC[0] EQ FNTIFRA
      THEN
        BEGIN 
        FCS2CFS (FTPULENT);            # CHECK FTP STATE               #
        FTPSTATE = FTPUOPEN;           # DONT RETRIEVE IN REPRIEVE     #
        FTPABORT = EUNRETR;            # SET UP ABORT CODE             #
        ABORT;                         # ABORT JOB                     #
        END 
# 
*     FNT/IAR/N SUPERVISORY MESSAGE.
# 
      ELSE IF PFCSFC[0] EQ FNTIARN
      THEN
        BEGIN 
        FCS2CFS (FTPUFILE + FTPULENT); # CHECK FTP STATE               #
        FTPSTATE = FTPUOPEN;           # FTP STATE IS CONNECTED TO HOST#
        END 
# 
*     FNT/IAR/A SUPERVISORY MESSAGE.
# 
      ELSE IF PFCSFC[0] EQ FNTIARA
      THEN
        BEGIN 
        FCS2CFS (FTPUFILE + FTPULENT); # CHECK FTP STATE               #
        FTPSTATE = FTPUOPEN;           # FTP STATE IS CONNECTED TO HOST#
        END 
# 
*     SHUT/INSD , CON/CB , FC/INAC OR HOP/XX SUPERVISORY MESSAGE. 
# 
      ELSE IF (PFCSFC[0] EQ SHUINS) OR
              (PFCSFC[0] EQ CONCB) OR 
              (PFCSFC[0] EQ FCINA) OR 
              (PFC[0] EQ HOP) 
      THEN
        BEGIN                          # IGNORE THESE ONES             #
        END 
# 
*     ALL OTHER SUPERVISORY MESSAGES. 
# 
      ELSE
        BEGIN                          # UNEXPECTED SM RECEIVED        #
        FTPABORT = EUNEXSM;            # SET UP ABORT CODE             #
        ABORT;                         # ABORT JOB                     #
        END 
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FCSNPSM                       #
  
      TERM
