*DECK FFSIIPV 
USETEXT TEXTFFS 
      PROC FFSIIPV; 
*CALL COPYRITE
# TITLE FFSIIPV - INITIALIZE PROGRAM VARIABLES.                        #
  
      BEGIN                            # FFSIIPV                       #
# 
**    FFSIIPV  INITIALIZE PROGRAM VARIABLES.
* 
*     A. LIM                           88/01/15 
* 
*     THIS PROCEDURE INITIALIZES FILE SERVER VARIABLES AND STATIC FIELDS
*     IN ARRAYS PRIOR TO NORMAL FILE SERVER OPERATION.
* 
*     PROC FFSIIPV
* 
*     ENTRY    NONE 
* 
*     EXIT     COMMON BLOCK *CURRENT* INITIALIZED.
*              COMMON BLOCK *SITECOM* INITIALIZED.
*              COMMON BLOCK *FRMSG* INITIALIZED.
*              COMMON BLOCK *INDICAT* INITIALIZED.
*              COMMON BLOCK *REQUEST* INITIALIZED.
*              COMMON BLOCK *CTBCOM* INITIALIZED. 
*              FILE SERVER TIME INITIALIZED.
*              DABH       = OUTPUT DATA ABH INITIALIZED.
*              SABH       = OUTPUT SUPERVISORY MESSAGE ABH INITIALIZED. 
*              NAME2      = NAME2 OF CON/ACRQ/R INITIALIZED TO "H"MID.
*              PARMS[1]   = LOCAL HOST NAME INITIALIZED TO
*                           "LOCALHOST_"MID IN 8/8 ASCII. 
*              ACN        = APPLICATION CONNECTIN TABLE INITIALIZD TO 0.
* 
# 
  
# 
****  PROC FFSIIPV - XREF LIST
# 
      XREF
        BEGIN 
        PROC FFSUCLR;    # UTILITY TO CLEAR AN AREA OF MEMORY          #
        PROC GET$VP;     # GET NOS VERSION AND PSR LEVELS              #
        PROC MACHID;     # -MACREL- TO GET MACHINE ID                  #
        PROC NETUCDA;    # CONVERT FROM 6/6 DISPLAY CODE TO 8/8 ASCII  #
        END 
# 
****
# 
  
      ITEM DINDEX    U;                # INDEX OF DESTINATION ARRAY    #
      ITEM SINDEX    U;                # INDEX OF SOURCE ARRAY         #
  
      DEF LHNAME$    # 12 #;           # HOST NAME LENGTH IN CHARACTERS#
  
      ARRAY HOSTNAME [00:00] S(2);     # LOCAL HOST NAME IN 6/6 DC     #
        BEGIN 
        ITEM HNM$NAME   C(00,00,10);   # HOST NAME                     #
        ITEM HNM$MID    C(01,00,02);   # SUFFIX BY MACHINE ID          #
        END 
  
      ARRAY COMSVER$VALS [00:00] S(4);     # SPACE FOR COMSVER VALUES  #
        BEGIN 
        ITEM NOSVER C(00,00,11);    # NOS VERSION FROM DECK COMSVER    #
        ITEM NOSLVL C(02,00,03);    # NOS PSR LEVEL FROM DECK COMSVER  #
        ITEM PRDLVL C(03,00,03);    # PRODUCT SET PSR LVL FROM COMSVER #
        END 
  
      CONTROL EJECT;
  
# 
**    START MAIN PROCEDURE
# 
  
# 
*     FETCH THE NOS VERSION AND PSR LEVELS. 
# 
      GET$VP(COMSVER$VALS);         # GET NOS VERSION AND PSR LEVELS   #
  
# 
*     INITIALIZE COMMON BLOCK *CURRENT*.
# 
      FSDEBUG      = FALSE;            # TURN DEBUG OPTION OFF         #
$BEGIN
      FSDEBUG = TRUE;                  # ENABLE DEBUG MODE             #
$END
  
      NUMACN       = 0;                # NO OF CONNECTIONS CONNECTED   #
      ACNX         = 0;                # ACN INDEX                     #
      CURACN       = 0;                # CURRENT ACN ENTRY             #
      MBHX         = 0;                # MBT HOST FILE INDEX           #
      MSGOK        = TRUE;             # PRESET TO O.K. TO SEND 226 MSG#
      NOTYETSPAWN  = TRUE;             # NEW FS NOT YET SPAWNED        #
      LAST$ACRQ$RC = 0;                # LATEST CON/ACRQ/A REASON CODE #
      RNFRFN       = 0;                # RENAME FROM FILE NAME         #
      RNTOFN       = 0;                # RENAME TO FILE NAME           #
      READMODE     = TRUE;             # PRESET ACCESS MODE TO READ..  #
                                       #..FOR DEFINE, SAVE AND REPLACE #
# 
*     INITIALIZE COMMON BLOCK *SITECOM*.
*     INITIALIZE SITE PARAMETERS TO DEFAULTS. 
# 
      SITECS    = A$0;                 # CODE SET DEFAULTS TO ASCII    #
      DFLTCS    = A$0;                 # CODE SET DEFAULTS TO ASCII    #
      SITEFSC   = 0;                   # FSC = 0                       #
      SITEFT    = DA$0;                # FILE TYPE DEFAULTS TO DIRECT  #
      DFLTFT    = DA$0;                # FILE TYPE DEFAULTS TO DIRECT  #
      SITETRUNC = FALSE;
      SITERDEOI = FALSE;
      TPTMODE   = MODE$S; 
      TPTSTRU   = STRU$F; 
      TPTTYPE   = TYPE$A; 
  
# 
*     INITIALIZE COMMON BLOCK *FRMSG*.
# 
      FFSUCLR(LOC(FTPRMSG), (FTPNMSG$+1)*FMSGSIZ$); 
      FTP$MSG[MSG$110] =
        "110 RESTART MARKER REPLY.                                ";
      FTP$MSG[MSG$120] =
        "120 SERVICE READY IN NNN MINUTES.                        ";
      FTP$MSG[MSG$125] =
        "125 DATA CONNECTION ALREADY OPEN; TRANSFER STARTING.     ";
      FTP$MSG[MSG$150] =
        "150 FILE STATUS OKAY; ABOUT TO OPEN DATA CONNECTION.     ";
      FTP$MSG[MSG$200] =
        "200 COMMAND OKAY.                                        ";
      FTP$MSG[MSG$202] =
        "202 ALLO COMMAND IGNORED.                                ";
      FTP$MSG[MSG$211] =
        "211 SYSTEM STATUS, OR SYSTEM HELP REPLY.                 ";
      FTP$MSG[MSG$212] =
        "212 DIRECTORY STATUS.                                    ";
      FTP$MSG[MSG$213] =
        "213 FILE STATUS.                                         ";
      FTP$MSG[MSG$214] =
        "214 HELP MESSAGE.                                        ";
      FTP$MSG[MSG$215] =
        "215 NOS SYSTEM TYPE, NOS S.T.U - VVV/WWW, FTP X.Y - ZZZ. ";
      FTP$215NVR [MSG$215] = NOSVER;
      FTP$215NPL [MSG$215] = NOSLVL;
      FTP$215PPL [MSG$215] = PRDLVL;
      FTP$215FVR [MSG$215] = FTPVERSION;
      FTP$215FPL [MSG$215] = FTPLEVEL;
      FTP$MSG[MSG$220] =
        "220 SERVICE READY FOR NEW USER.                          ";
      FTP$MSG[MSG$221] =
        "221 SERVICE CLOSING CONTROL CONNECTION. LOGGED OUT.      ";
      FTP$MSG[MSG$225] =
        "225 DATA CONNECTION OPEN; NO TRANSFER IN PROGRESS.       ";
      FTP$MSG[MSG$226] =
        "226 CLOSING DATA CONNECTION.                             ";
      FTP$MSG[MSG$227] =
        "227 ENTERING PASSIVE MODE.                               ";
      FTP$MSG[MSG$230] =
        "230 USER LOGGED IN, PROCEED.                             ";
      FTP$MSG[MSG$250] =
        "250 REQUESTED FILE ACTION OKAY, COMPLETED.               ";
      FTP$MSG[MSG$257] =
        "257 *PATHNAME* CREATED.                                  ";
      FTP$MSG[MSG$331] =
        "331 USER NAME OKAY, NEED PASSWORD.                       ";
      FTP$MSG[MSG$332] =
        "332 NEED ACCOUNT FOR LOGIN.                              ";
      FTP$MSG[MSG$350] =
        "350 REQUESTED FILE ACTION PENDING FURTHER INFORMATION.   ";
      FTP$MSG[MSG$421] =
        "421 SERVICE NOT AVAILABLE, CLOSING CONTROL CONNECTION.   ";
      FTP$MSG[MSG$425] =
        "425 CANNOT OPEN DATA CONNECTION.                         ";
      FTP$MSG[MSG$426] =
        "426 CONNECTION CLOSED; TRANSFER ABORTED.                 ";
      FTP$MSG[MSG$450] =
        "450 REQUESTED FILE ACTION NOT TAKEN. FILE UNAVAILABLE.   ";
      FTP$MSG[MSG$451] =
        "451 REQUESTED ACTION ABORTED.  LOCAL ERROR IN PROCESSING.";
      FTP$MSG[MSG$452] =
        "452 REQUESTED ACTION NOT TAKEN.  INSUFFICIENT STORAGE.   ";
      FTP$MSG[MSG$500] =
        "500 SYNTAX ERROR, COMMAND UNRECOGNIZED.                  ";
      FTP$MSG[MSG$501] =
        "501 SYNTAX ERROR IN PARAMETERS OR ARGUMENTS.             ";
      FTP$MSG[MSG$501A] = 
        "501 TYPE COMMAND PARAMETER SYNTAX ERROR.                 ";
      FTP$MSG[MSG$502] =
        "502 COMMAND NOT IMPLEMENTED.                             ";
      FTP$MSG[MSG$503] =
        "503 BAD SEQUENCE OF COMMANDS.                            ";
      FTP$MSG[MSG$504] =
        "504 COMMAND NOT IMPLEMENTED FOR THAT PARAMETER.          ";
      FTP$MSG[MSG$504A] = 
        "504 EBCDIC TYPE NOT IMPLEMENTED.                         ";
      FTP$MSG[MSG$504B] = 
        "504 LOCAL TYPE NOT IMPLEMENTED.                          ";
      FTP$MSG[MSG$504C] = 
        "504 TELNET FORMAT NOT IMPLEMENTED.                       ";
      FTP$MSG[MSG$504D] = 
        "504 CARRIAGE CONTROL FORMAT NOT IMPLEMENTED.             ";
      FTP$MSG[MSG$530] =
        "530 NOT LOGGED IN.                                       ";
      FTP$MSG[MSG$532] =
        "532 NEED ACCOUNT FOR STORING FILES.                      ";
      FTP$MSG[MSG$550] =
        "550 REQUESTED ACTION NOT TAKEN.  FILE UNAVAILABLE.       ";
      FTP$MSG[MSG$551] =
        "551 REQUESTED ACTION ABORTED.  PAGE TYPE UNKNOWN.        ";
      FTP$MSG[MSG$552] =
        "552 REQUESTED FILE ACTION ABORTED.  EXCEEDED STORAGE.    ";
      FTP$MSG[MSG$553] =
        "553 REQUESTED ACTION NOT TAKEN.  FILE NAME NOT ALLOWED.  ";
# 
*     INITIALIZE FILE SERVER TIMER. 
# 
      CTM$FTSEC[0] = MAXTMR$;          # SET FIRE TIME TO MAXIMUM      #
# 
*     INITIALIZE FIXED FIELDS IN THE OUTPUT DATA ABH. 
# 
      P<ABH> = LOC(DABH);              # OUTPUT DATA BLOCK ABH         #
      ABHWORD[0] = 0;                  # CLEAR WHOLE ABH WORD          #
      ABHABT[0]  = APMSG;              # BLOCK TYPE IS *MSG*           #
      ABHACT[0]  = CT8ASCII;           # CHARACTER TYPE IS 8-BIT ASCII #
# 
*     INITIALIZE FIXED FIELDS IN THE OUTPUT SUPERVISORY MESSAGE ABH.
# 
      P<ABH> = LOC(SABH);              # OUTPUT SUPERVISORY MSG ABH    #
      ABHWORD[0] = 0;                  # CLEAR WHOLE ABH WORD          #
      ABHABT[0]  = APPCMD;             # BLOCK TYPE IS *CMD*           #
      ABHACT[0]  = CT60TRANS;          # CHARACTER TYPE IS 60-BIT XPT  #
# 
*     INITIALIZE NAME2 (OUTCALL ID).
*     NAME2 = H"MACHINE ID" 
# 
      MACHID(MID);                     # GET MACHINE ID                #
      NAM2$ID[0]  = "H";
      NAM2$MID[0] = MID$ID[0];
# 
*     INITIALIZE PARMS TO ZEROES. 
*     INITIALIZE PARMS[1] TO A LOCAL HOST NAME I.E. 
*     PARMS[1] = HNAME$MID IN 8/8 ASCII.
# 
      FFSUCLR(LOC(PARMS[1]),           # ZERO OUT PARMS                #
               MAXPARMS$*PARSIZ$);
      HNM$NAME[0] = HNAME$;            # HOST NAME                     #
      HNM$MID[0]  = MID$ID[0];         # MACHINE ID                    #
      DINDEX      = 0;                 # DESTINATION ARRAY STARTS AT 0 #
      SINDEX      = 0;                 # SOURCE ARRAY STARTS AT 0      #
      NETUCDA(HOSTNAME[0], SINDEX,     # CONVERT FROM 6/6 DISPLAY...   #
              LHNAME$, PARMS[1],       # ...CODE TO 8/8 ASCII          #
              DINDEX, FALSE); 
      PARAMSZ[1] = DINDEX;             # HOST NAME SIZE IN OCTETS      #
# 
*     INITIALIZE ACN TABLE. 
*       - ZERO OUT THE ENTIRE TABLE.
*       - SET SEND_NO_OUTSTANDING_DATA_REQUIRED ON DATA CONNECTION. 
*       - SET NO_DATA_DELIVERY ON CONTROL STATEMENT CONNETION.
*       - SET PROTOCOL TYPE ON ALL CONNECTIONS. 
# 
      FFSUCLR(LOC(ACN), (NCONNECT$+1)*ACNSIZ$); 
  
      ACN$PTYPE[CTYPE"CTCS"]   = PTYPE"PTXPARENT";
      ACN$NODD[CTYPE"CTCS"]    = TRUE;    # NO DATA DELIVERY INITIALLY #
      ACN$DATACN[CTYPE"CTCS"]  = FALSE;   # THIS IS NOT A DATA CONN    #
      ACN$FCBC[CTYPE"CTCS"]    = FCBC$; 
  
      ACN$PTYPE[CTYPE"CTSAP"]  = PTYPE"PTSAP";
      ACN$DATACN[CTYPE"CTSAP"] = FALSE;   # THIS IS NOT A DATA CONN    #
      ACN$FCBC[CTYPE"CTSAP"]   = FCBC$; 
  
      ACN$PTYPE[CTYPE"CTCTRL"] = PTYPE"PTTELNET"; 
      ACN$DATACN[CTYPE"CTCTRL"]= FALSE;   # THIS IS NOT A DATA CONN    #
      ACN$FCBC[CTYPE"CTCTRL"]  = FCBC$; 
  
      ACN$PTYPE[CTYPE"CTDATA"] = PTYPE"PTTCP";
      ACN$DATACN[CTYPE"CTDATA"]= TRUE;    # THIS IS A DATA CONNECTION  #
      ACN$FCBC[CTYPE"CTDATA"]  = FCBC$DATA; 
# 
*     INITIALIZE INDICATION TABLE TO ZEROES.
# 
      FFSUCLR(LOC(INDICATION), (ISIZ$+1)*ESIZ$);
# 
*     INITIALIZE REQUESTS TABLE TO ZEROES.
# 
      FFSUCLR(LOC(REQUESTS), (RSIZ$+1)*ESIZ$);
  
# 
*     INITIALIZE CTB TABLE TO ZEROES. 
# 
      FFSUCLR(LOC(CTB), (CTBSIZ$+1)*CTBESIZ$);
      CTBID   = "CTBCOM    "; 
      CTBNAME = "CTB       "; 
      CTBX    = 0;                     # FIRST AVAILABLE ENTRY         #
      BTYPE   = 0;                     # CLEAR BLOCK TYPE              #
      LNAME   = 0;                     # CLEAR LAYER NAME              #
# 
*     INITIALIZE THE VALIDATION STATE.
# 
  
      VAL$RETRY = PWRETRY ; 
      VAL$STATE = VST$STATE"VST$BEGIN" ;
  
      SST$DSUSER = FALSE ;
      JBC$VALID  = FALSE ;
  
  
# 
*     INITIALIZE THE INDICATION BLOCK FOR ALL THREE LAYERS. 
# 
      IND$IDENT         = "INDICATION" ;
  
      IND$WD0[RTCPNAM$] = 0 ; 
      IND$WD1[RTCPNAM$] = 0 ; 
      IND$WD0[RCMTCP$]  = 0 ; 
      IND$WD1[RCMTCP$]  = 0 ; 
      IND$WD0[RFTPCM$]  = 0 ; 
      IND$WD1[RFTPCM$]  = 0 ; 
  
# 
*     INITIALIZE THE REQUEST BLOCK FOR ALL THREE LAYERS.
# 
  
      REQ$IDENT         = "REQUEST-BL" ;
  
      REQ$WD0[RTCPNAM$] = 0 ; 
      REQ$WD1[RTCPNAM$] = 0 ; 
      REQ$WD0[RCMTCP$]  = 0 ; 
      REQ$WD1[RCMTCP$]  = 0 ; 
      REQ$WD0[RFTPCM$]  = 0 ; 
      REQ$WD1[RFTPCM$]  = 0 ; 
# 
*     INITIALIZE THE PARAMETER BLOCK LABEL FOR THE PARSER 
# 
      PARA$LAB = "PAR$BUF"; 
  
# 
*     INITIALIZE THE CURRENT STATES FOR CM AND FTP LAYERS 
# 
      CUR$ST$LABEL = "CUR$STATES";     # DEBUG - LABEL CURRENT STATES  #
  
      FTP$WORD   = 0 ;
      FTP$IDENT  = "FTP " ; 
      FTP$CUR$ST = FTS$CDS"FTS$IDLE" ; # FTP LAYER      STATE = IDLE   #
  
      FCM$WORD   = 0 ;
      FCM$IDENT  = "FCM " ; 
      FCM$CUR$ST = FCS$"FCS$IDLE";     # C/N MANAGEMENT STATE = IDLE   #
  
# 
*     INITIALIZE PROGRAM NAME 
# 
      IF EPTFLAG EQ FTPC$ 
      THEN
        BEGIN 
        PRGM$NAME = "FTPI"; 
        END 
      ELSE
        BEGIN 
        PRGM$NAME = "FTPS"; 
        END 
  
# 
*     INITIALIZE ALTERNATE DATA BUFFER INDEX, AND CURRENT DATA BUFFER 
*     POINTER.
# 
      DTBUFINDX = 0;
      P<CDTBUF> = LOC( DTBUF[DTBUFINDX]); 
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FFSIIPV                       #
  
      TERM
