*DECK FFSXPES 
USETEXT TEXTFFS 
      PROC FFSXPES; 
*CALL COPYRITE
# TITLE FFSXPES - FTP FS PROGRAM EXECUTION SEQUENCER.                  #
  
      BEGIN                            # FFSXPES                       #
# 
**    FFSXPES  FTP FS PROGRAM EXECUTION SEQUENCER.
* 
*     A. LIM                           88/01/08 
* 
*     THIS PROCEDURE IS THE EXECUTIVE OF THE FTP FILE SERVER. 
*     IT PROVIDES A DEMAND DRIVEN ENVIRONMENT WHERE THE FUNCTIONS OF
*     THE FTP FS CAN BE PERFORMED IN AN ORDERLY MANNER. 
*     IT CONSISTS PRIMARY OF A MAIN LOOP.  EACH TIME THROUGH THE LOOP 
*     THE NAM TRAFFIC HANDLER IS CALLED TO PROCESS ANY INCOMING 
*     SUPERVISORY OR DATA MESSAGE.  AND EACH HIGHER LAYER IS ONLY 
*     CALLED WHEN INDICATION IS GENERATED BY THE LAYER BELOW. 
* 
*     PROC FFSXPES
* 
*     ENTRY    FTPS INITIALIZED.
*              LOADBASE = ADDRESS OF OVERLAY AREA 
*              AVAIL    = AVAILABLE WORDS FOR TABLE EXPANSION.
*              TSTART   = START ADDRESS OF DUMMY FIRST TABLE. 
* 
*     EXIT     THERE IS NO EXIT FROM THIS PROCEDURE.
* 
*     METHOD   RELOCATE MANAGED TABLE.
* 
*              LOOP:  
*                  CALL NAM TRAFFIC HANDLER *FFSLNTH*.
*                  IF *FFSLNTH* HAS NO INDICATIONS GENERATED: 
*                    GOTO LOOP. 
*                  CALL TCP LAYER HANDLER *FFSLTLH*.
*                  IF *FFSLTLH* HAS NO INDICATIONS GENERATED: 
*                    GOTO LOOP. 
*                  CALL CONNECTION MANAGEMENT LAYER HANDLER *FFSLCLH*.
*                  IF *FFSLCLH* HAS NO INDICATIONS GENERATED: 
*                    GOTO LOOP. 
*                  CALL FTP LAYER HANDLER *FFSLFLH*.
*                  ATTEMPT TO REDUCE FTPS FIELD LENGTH. 
*                  GOTO LOOP. 
* 
# 
  
# 
****  PROC FFSXPES - XREF LIST
# 
      XREF
        BEGIN 
        PROC FFSLCIP;    # CONNECTION MANAGEMENT LAYER HANDLER         #
        PROC FFSLCRP;    # CONNECTION MANAGEMENT REQUEST PROCESSOR     #
        PROC FFSLFLH;    # FTP LAYER HANDLER                           #
        PROC FFSLNTH;    # NAM TRAFFIC HANDLER                         #
        PROC FFSLTIP;    # TCP LAYER HANDLER                           #
        PROC FFSMDTS;    # DEALLOCATE MANAGED TABLE                    #
        PROC FFSMRMT;    # RELOCATE MANAGED TABLE                      #
        PROC FFSMRFL;    # REQUEST FIELD LENGTH CHANGE                 #
        FUNC FFSUMOD I;  # UTILITY TO PERFORM MODULUS FUNCTION         #
        END 
# 
****
# 
      ITEM EXTRA         I;            # NUMBER OF EXTRA TABLE WORDS   #
      ITEM SPARE         I;            # NUMBER OF SPARE TABLE WORDS   #
  
      CONTROL EJECT;
  
# 
**    START MAIN PROCEDURE
# 
  
# 
**    RELOCATE MANAGED TABLES TO START AT THE BEGINNING OF THE
*     INITIALIZATION OVERLAY.  (ONCE INITIALIZATION IS DONE,
*     THIS OVERLAY AREA IS GIVEN UP TO THE MANAGED TABLE).
* 
# 
      AVAIL = AVAIL + TSTART - LOADBASE; # UPDATE AVAILABLE TABLE WORDS#
      TSTART = LOADBASE;                 # GIVE OVERLAY AREA TO TABLES #
      FFSMRMT (AVAIL, 1, 0);             # RELOCATE MANAGED TABLES     #
# 
**    CALL CONNECTION MANAGEMENT TO PROCESS THE REQUEST TO INITIATE 
*     FILE SERVER.
# 
  
      REQ$RCODE[RFTPCM$] = RCM"RCINITP"; #REQUEST TO INITIATE FTPS/FTPI#
      FFSLCRP;                           # CALL C/M REQUEST PROCESSOR  #
  
# 
************************************************************************
*     CODE BELOW THIS LINE CONSISTS OF A DEMAND DRIVEN ENDLESS LOOP.   *
************************************************************************
# 
  
TOP:  
  
      FFSLNTH;                         # CALL NAM TRAFFIC HANDLER      #
      IF IND$ICODE[INAMTCP$] EQ INAM"NULL"
      THEN                             # THERE'S NO INDICATION FROM..  #
        BEGIN                          #..NAM TO TCP                   #
        GOTO TOP;                      # LOOP FOR NEW INPUT FROM NIP   #
        END 
  
      FFSLTIP;                         # WORK FOR TCP LAYER HANDLER    #
      IF IND$ICODE[ITCPCM$] EQ ITCP"NULL" 
      THEN                             # THERE'S NO INDICATION FROM..  #
        BEGIN                          #..TCP TO CONNECTION MANAGEMENT #
        GOTO TOP;                      # LOOP FOR NEW INPUT FROM NIP   #
        END 
  
      FFSLCIP;                         # WORK FOR CM LAYER HANDLER     #
      IF IND$ICODE[ICMFTP$] EQ ICM"NULL"
      THEN                             # THERE'S NO INDICATION FROM..  #
        BEGIN                          #..CONNECTION MANAGEMENT TO FTP #
        GOTO TOP;                      # LOOP FOR NEW INPUT FROM NIP   #
        END 
  
      FFSLFLH ;                        # WORK FOR FTP LAYER HANDLER    #
# 
*     ATTEMPT TO REDUCE FILE SERVER FIELD LENGTH. 
# 
      IF AVAIL GR (FLMUL + FLMUL/2) 
      THEN
        BEGIN                          # NEED TO REDUCE FIELD LENGTH   #
        SPARE = FFSUMOD(AVAIL, FLMUL); # SPARE WORDS FOR EXPANSION     #
        EXTRA = AVAIL - SPARE;         # NUMBER OF EXTRA WORDS         #
        FFSMRMT (SPARE, 1, 0);         # RELOCATE MANAGED TABLES       #
        FFSMRFL (-EXTRA);              # REQUEST FIELD LENGTH CHANGE   #
        END;
  
      GOTO TOP;                        # RESTART THE MAIN LOOP         #
  
      END                              # FFSXPES                       #
  
      TERM
