*DECK FFSSPSM 
USETEXT TEXTFFS 
      PROC FFSSPSM; 
*CALL COPYRITE
# TITLE FFSSPSM - PROCESS SUPERVISORY MESSAGE.                         #
  
      BEGIN                            # FFSSPSM                       #
# 
**    FFSSPSM  PROCESS SUPERVISORY MESSAGE. 
* 
*     A. LIM                           88/01/18 
* 
*     THIS PROCEDURE PROCESSES ALL SUPERVISORY MESSAGES RECEIVED BY 
*     VALIDATING THE SUPERVISORY MESSAGE AND PASSING IT ON TO THE 
*     APPROPRIATE PROCESSOR.
* 
*     PROC FFSSPSM
* 
*     ENTRY    INPBUF = ARRAY CONTAINING SUPERVISORY MESSAGE. 
*              P<ABH> = PTR TO INPUT APPLICATION BLOCK HEADER.
* 
*     EXIT     SUPERVISORY MESSAGE PROCESSED. 
*              P<ABH> AND P<APSM> MAY POINT TO OUTGOING INFORMATION.
* 
*     NOTES    IT IS ASSUMED THAT THE POSITION OF THE APPLICATION 
*              CONNECTION NUMBER FIELD IS THE SAME IN ALL SUPERVISORY 
*              MESSAGES RECEIVED. 
* 
*     METHOD   THE PRIMARY FUNCTION CODE AND SECONDARY FUNCTION CODE
*              ARE EXAMINED TO DETERMINE WHICH SUPERVISORY MESSAGE
*              PROCESSOR IS TO BE CALLED. 
*              SOME SUPERVISORY MESSAGES ARE IGNORED AS THEY HAVE NO
*              EFFECT ON FILE SERVER OPERATION. 
* 
# 
  
# 
****  PROC FFSSPSM - XREF LIST
# 
      XREF
        BEGIN 
        PROC ABORT;      # ABORT THE APPLICATION                       #
        PROC MESSAGE;    # DISPLAY AND DAYFILE A MESSAGE               #
        PROC FFSEEFS;    # END FILE SERVER                             #
        PROC FFSEESC;    # END SINGLE CONNECTION                       #
        PROC FFSSPCA;    # PROCESS CON/ACRQ/A SUPERVISORY MESSAGE      #
        PROC FFSSPCB;    # PROCESS CON/CB SUPERVISORY MESSAGE          #
        PROC FFSSPCE;    # PROCESS CON/END/N SUPERVISORY MESSAGE       #
        PROC FFSSPCR;    # PROCESS CON/REQ/R SUPERVISORY MESSAGE       #
        PROC FFSSPFA;    # PROCESS FC/ACK SUPERVISORY MESSAGE          #
        PROC FFSSPFI;    # PROCESS FC/INIT SUPERVISORY MESSAGE         #
        PROC FFSSPSI;    # PROCESS SHUT/INSD SUPERVISORY MESSAGE       #
        FUNC FFSUFCE B;  # FIND CONNECTION ENTRY                       #
        END 
# 
****
# 
      ITEM SMPFCSFC      U;            # PRIMARY + SECONDARY FUNCT CODE#
  
  
#     THIS ARRAY DEFINES THE ERROR MESSAGE FOR AN UNRECOGNIZED SM      #
  
      ARRAY SMINVMSG[00:00] S(4); 
        BEGIN 
        ITEM INV$TXT1    C(00,00,34)   =
     [" FTPS-INVALID SUPERVISORY MESSAGE."];
        ITEM INV$ID      C(00,06,04); 
        ITEM INV$ZBYTE   U(03,24,36)   = [0]; 
        END 
  
#     THIS ARRAY DEFINES THE ERROR MESSAGE FOR A FNT/DSM/A RESPONSE.   #
  
      ARRAY FDSMA[00:00] S(5);
        BEGIN 
        ITEM FDS$TXT1    C(00,00,45)   =
       [" FTPS-FNT/DSM/A SUPERVISORY MESSAGE RECEIVED."]; 
        ITEM FDS$ID      C(00,06,04); 
        ITEM FDS$ZBYTE   U(04,30,30)   = [0]; 
        END 
  
#     THIS ARRAY DEFINES THE ERROR MESSAGE FOR A SAF/SAR/A RESPONSE.   #
  
      ARRAY SSARA[00:00] S(5);
        BEGIN 
        ITEM SSA$TXT1    C(00,00,45)   =
       [" FTPS-SAF/SAR/A SUPERVISORY MESSAGE RECEIVED."]; 
        ITEM SSA$ID      C(00,06,04); 
        ITEM SSA$ZBYTE   U(04,30,30)   = [0]; 
        END 
  
      CONTROL EJECT;
  
#     START MAIN PROCEDURE                                             #
  
      P<APSM>  = LOC(INPBUF);          # BASE SUPERVISORY MESSAGE      #
      SMPFCSFC = PFCSFC[0];            # PRIMARY + SECONDARY FUNCT CODE#
      CURACN   = SPACN[0];             # GET FFS CONNECTION NUMBER     #
  
      IF EPTFLAG EQ FTPC$ 
      THEN
        BEGIN                          # CLIENT MODE                   #
        INV$ID[0] = FTPI$;             # MESSAGE ID = FTPI             #
        FDS$ID[0] = FTPI$;
        SSA$ID[0] = FTPI$;
        END 
  
#     FC/ACK SUPERVISORY MESSAGE                                       #
  
      IF SMPFCSFC EQ FCACK
      THEN
        BEGIN                          # PROCESS BLOCK DELIVERED       #
        FFSSPFA;
        END 
  
#     CON/REQ/R SUPERVISORY MESSAGE                                    #
  
      ELSE IF SMPFCSFC EQ CONREQ
      THEN
        BEGIN                          # PROCESS CONNECTION REQUEST    #
        FFSSPCR;
        END 
  
#    CON/END/N SUPERVISORY MESSAGE                                     #
  
      ELSE IF SMPFCSFC EQ CONENDN 
      THEN
        BEGIN                          # PROCESS CONNECTION ENDED      #
        FFSSPCE;
        END 
  
#     FC/INIT SUPERVISORY MESSAGE                                      #
  
      ELSE IF SMPFCSFC EQ FCINIT
      THEN
        BEGIN                          # PROCESS CONNECTION INITIALIZED#
        FFSSPFI;
        END 
  
#     FC/INA SUPERVISORY MESSAGE                                       #
  
      ELSE IF SMPFCSFC EQ FCINA 
      THEN
        BEGIN                          # IGNORE CONNECTION INACTIVE    #
        END 
  
#     SHUT/INSD SUPERVISORY MESSAGE                                    #
  
      ELSE IF SMPFCSFC EQ SHUINS
      THEN
        BEGIN                          # PROCESS SHUTDOWN REQUEST      #
        FFSSPSI;
        END 
  
#     CON/ACRQ/A SUPERVISORY MESSAGE                                   #
  
      ELSE IF SMPFCSFC EQ CONACRA 
      THEN
        BEGIN                          # PROCESS CON/ACRQ/A            #
        FFSSPCA;
        END 
  
#     CON/CB SUPERVISORY MESSAGE                                       #
  
      ELSE IF SMPFCSFC EQ CONCB 
      THEN
        BEGIN                          # PROCESS CONNECTION BROKEN     #
        FFSSPCB;
        END 
  
#     FC/NAK SUPERVISORY MESSAGE                                       #
  
      ELSE IF SMPFCSFC EQ FCNAK 
      THEN
        BEGIN                          # PROCESS BLOCK NOT DELIVERED   #
        FFSEEFS (NNAKERR);             # NAM PROTOCOL ERROR            #
        END 
  
#     ERR/LGL SUPERVISORY MESSAGE                                      #
  
      ELSE IF SMPFCSFC EQ ERRLGL
      THEN
        BEGIN                          # PROCESS ERROR LOGICAL         #
        FFSEEFS(NERRLGL);              # NAM PROTOCOL ERROR            #
        END 
  
#     FNT/DSM/A SUPERVISORY MESSAGE                                    #
  
      ELSE IF SMPFCSFC EQ FNTDSMA 
      THEN
        BEGIN 
        MESSAGE(FDSMA, 0);             # DAYFILE MESSAGE               #
        ABORT;                         # ABORT                         #
        END 
  
#     FNT/DSM/N SUPERVISORY MESSAGE                                    #
  
      ELSE IF SMPFCSFC EQ FNTDSMN 
      THEN
        BEGIN 
        RETURN;                        # IGNORE                        #
        END 
  
#     SAF/SAR/A SUPERVISORY MESSAGE                                    #
  
      ELSE IF SMPFCSFC EQ SAFSARA 
      THEN
        BEGIN 
        MESSAGE(SSARA, 0);             # DAYFILE MESSAGE               #
        ABORT;                         # ABORT                         #
        END 
  
#     SAF/SAR/N SUPERVISORY MESSAGE                                    #
  
      ELSE IF SMPFCSFC EQ SAFSARN 
      THEN
        BEGIN 
        RETURN;                        # IGNORE                        #
        END 
  
#     ALL OTHER SUPERVISORY MESSAGES                                   #
  
      ELSE
        BEGIN                          # PROCESS OTHER TYPES           #
        MESSAGE(SMINVMSG,0);           # DAYFILE INVALID SM MESSAGE    #
        END;
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FFSSPSM                       #
  
      TERM
