*DECK FCSIINI 
USETEXT TEXTFCS;
      PROC FCSIINI; 
*CALL COPYRITE
# TITLE FCSIINI - INITIALIZE NETWORK INTERFACE.                        #
  
      BEGIN                            # FCSIINI                       #
  
# 
**    FCSIINI - INITIALIZE NETWORK INTERFACE. 
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE INITIALIZES THE NETWORK INTERFACE. 
* 
*     PROC FCSIINI
* 
*     ENTRY   MANAGED TABLES MUST BE INITIALIZED. 
* 
*     EXIT    A-A CONNECTION WITH *FTPI* SET UP AND INITIALIZED.
* 
*     METHOD  INITIALIZE CONNECTION TABLE.
*             INITIALIZE FIXED FIELDS IN APPLICATION BLOCK HEADERS. 
*             CONNECT APPLICATION TO NETWORK. 
*             ESTABLISH A-A CONNECTION WITH *FTPI*. 
*             EXCHANGE CONNECT BLOCKS WITH *FTPI*.
*             DEFINE FNT MASTER/SLAVE OPERATION.
*             SET UP APPLICATION ABORT CONDITIONS.
* 
# 
  
# 
****  PROC FCSIINI - XREF LIST
# 
      XREF
        BEGIN 
        PROC ABORT;                    # ABORT JOB                     #
        FUNC CBTZ U;                   # CONVERT BLANKS TO ZERO        #
        PROC FCSNODB;                  # OUTPUT DATA BLOCK             #
        PROC FCSNOSM;                  # OUTPUT SUPERVISORY MESSAGE    #
        PROC FCSNWDB;                  # WAIT FOR DATA BLOCK           #
        PROC FCSNWSM;                  # WAIT FOR SUPERVISORY MESSAGE  #
        PROC FCSOFTO;                  # FLUSH TERMINAL OUTPUT         #
        PROC FCSOWOF;                  # WRITE TO OUTPUT FILE          #
        PROC GETCN;                    # GET CHARGE AND PROJECT NUMBER #
        FUNC GETJSN U;                 # GET JOB SEQUENCE NUMBER       #
        PROC GETPFP;                   # GET PERMANENT FILE PARAMETERS #
        PROC MESSAGE;                  # DISPLAY AND DAYFILE A MESSAGE #
        PROC NETFUNC;                  # ISSUE SPECIAL AIP FUNCTION    #
        PROC NETON;                    # CONNECT APPLICATION TO NETWORK#
        PROC NETUCLR;                  # CLEAR AN AREA OF MEMORY       #
        PROC WAIT;                     # RELINQUISH CPU FOR A WHILE    #
        END 
# 
****
# 
      DEF RETRYMAX$        #  60 #;    # ATTEMPTS TO CONNECT TO *FTPI* #
  
      STATUS NETONST     SUCCESS,      # NETON SUCCESSFUL              #
                         UNAVAIL,      # NAM UNAVAILABLE               #
                         DUPLICATE,    # DUPLICATE NETON ATTEMPT       #
                         DISABLED;     # APPLICATION DISABLED          #
  
      ITEM FTPIANM       C(7) = "FTPI";# APPLICATION NAME OF *FTPI*    #
      ITEM FTPIJSN       U;            # JOB SEQUENCE NUMBER OF *FTPI* #
      ITEM I             I;            # LOOP INDUCTION VARIABLE       #
      ITEM NSTAT         S:NETONST;    # STATUS RETURNED FROM *NETON*  #
      ITEM SPACING       U = O"55550000000000000000"; 
  
      ARRAY ATTMSG [00:00] S(5);
        BEGIN 
        ITEM ATT$TEXT    C(00,00,46) =
       ["--INFORMATIVE--  CONNECTING TO TCP/IP NETWORK."];
        ITEM ATT$ZBYTE   U(04,36,24) = [0]; 
        END 
  
      ARRAY CONMSG [00:00] S(5);
        BEGIN 
        ITEM CON$TEXT    C(00,00,45) =
       ["--INFORMATIVE--  CONNECTED TO TCP/IP NETWORK."]; 
        ITEM CON$ZBYTE   U(04,30,30) = [0]; 
        END 
  
      ARRAY JSNMSG [00:00] S(5);
        BEGIN 
        ITEM JSN$TEXT1   C(00,00,36) =
       [" FTP CONNECTED TO LOCAL HOST, JSN = "];
        ITEM JSN$JSN     U(03,36,24); 
        ITEM JSN$TEXT2   C(04,00,01) = ["."]; 
        ITEM JSN$ZBYTE   U(04,06,54) = [0]; 
        END 
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
      FCSOWOF (ATTMSG[0], INTERNAL$);  # WRITE CONNECTING MESSAGE      #
      FCSOFTO;                         # FLUSH TERMINAL OUTPUT         #
# 
*     INITIALIZE CONNECTION TABLE.
# 
      NETUCLR (LOC(ACN$WORD[0]),
                   ACNSIZ$);           # CLEAR CONNECTION TABLE        #
# 
*     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  #
# 
*     CONNECT APPLICATION TO NETWORK
# 
      FOR NSTAT = S"DUPLICATE"
        WHILE NSTAT EQ S"DUPLICATE" DO
        BEGIN                          # LOOP IF MAX COPIES REACHED    #
        NETON ("FTP", NSUP, NSTAT,
               MINACN$, MAXACN$);      # ATTEMPT TO CONNECT TO NETWORK #
        IF NSTAT EQ S"DUPLICATE"
        THEN
          BEGIN                        # MAXIMUM COPIES REACHED        #
          WAIT (2000);                 # RELINQUISH THE CPU            #
          END 
        END 
      IF NSTAT NQ S"SUCCESS"
      THEN
        BEGIN                          # NETON UNSUCCESSFUL            #
        FTPABORT = ECONNECT;           # SET UP FTP ABORT CODE         #
        ABORT;                         # ABORT JOB                     #
        END 
      NETFUNC (1, 1);                  # SWAP ME OUT ON *NETWAIT*      #
# 
*     SET UP APPLICATION ABORT CONDITIONS.
# 
      P<APSM>    = LOC(OUTBUF);        # BASE SUPERVISORY MESSAGE PTR  #
      SPMSG0[0]  = 0;                  # CLEAR FIRST WORD              #
      SACSHCD[0] = TRUE;               # ABORT ON SHUT/INSD            #
      SACINCD[0] = TRUE;               # ABORT ON FC/INAC              #
      SACCBCD[0] = TRUE;               # ABORT ON CON/CB               #
      FCSNOSM (SACNCL, LSAC);          # SEND SAC/NCL SM               #
# 
*     ESTABLISH A-A CONNECTION WITH FTPI. 
# 
      P<APSM>   = LOC(INPBUF);         # BASE SUPERVISORY MESSAGE PTR  #
      PFCSFC[0] = CONACRA;             # FAKE CON/ACRQ/A SM            #
      FOR I = 1 STEP 1
        WHILE (I LQ RETRYMAX$) AND
              (PFCSFC[0] EQ CONACRA) DO 
        BEGIN                          # TILL CONNECTED OR MAX RETRIES #
        P<APSM>   = LOC(OUTBUF);       # BASE SUPERVISORY MESSAGE PTR  #
        SPMSG0[0] = 0;                 # CLEAR FIRST WORD              #
        SPMSG1[0] = 0;                 # CLEAR SECOND WORD             #
        CONANM[0] = FTPIANM;           # *FTPI* APPLICATION NAME       #
        FCSNOSM (CONACR, LCONAC);      # SEND CON/ACRQ SM              #
        FCSNWSM;                       # WAIT FOR SUPERVISRY MESSAGE   #
        IF PFCSFC[0] EQ CONACRA 
        THEN
          BEGIN                        # CON/ACRQ/A RECEIVED           #
          WAIT (1000);                 # RELINQUISH THE CPU            #
          END 
        END 
# 
*     PROCESS CON/REQ/R 
# 
      IF PFCSFC[0] NQ CONREQ
      THEN
        BEGIN                          # CON/REQ/R NOT SEEN            #
        FTPABORT = ECONNECT;           # SET UP FTP ABORT CODE         #
        ABORT;                         # ABORT JOB                     #
        END 
      ACN$ACN[0] = SPACN[0];           # CONNECTION NUMBER             #
      ACN$ABN[0] = 1;                  # APPLICATION BLOCK NUMBER      #
      ACN$DBZ[0] = CONDBZ[0];          # DOWNLINE BLOCK SIZE           #
      ACN$ABL[0] = CONABL[0];          # APPLICATION BLOCK LIMIT       #
  
      P<APSM>   = LOC(OUTBUF);         # BASE SUPERVISORY MESSAGE PTR  #
      SPMSG0[0] = 0;                   # CLEAR FIRST WORD              #
      SPACN[0]  = ACN$ACN[0];          # STORE CONNECTION NUMBER IN SM #
      CONNXP[0] = TRUE;                # SET NO TRANSPARENT DATA FLAG  #
      CONACT[0] = CT8ASCII;            # SET CHARACTER TYPE EXPECTED   #
      FCSNOSM (CONREQN, LCORQR);       # SEND CON/REQ/N SM             #
      FCSNWSM;                         # WAIT FOR SUPERVISRY MESSAGE   #
# 
*     PROCESS FC/INIT 
# 
      IF PFCSFC[0] NQ FCINIT
      THEN
        BEGIN                          # FC/INIT NOT SEEN              #
        FTPABORT = ECONNECT;           # SET UP FTP ABORT CODE         #
        ABORT;                         # ABORT JOB                     #
        END 
      P<APSM>   = LOC(OUTBUF);         # BASE SUPERVISORY MESSAGE PTR  #
      SPMSG0[0] = 0;                   # CLEAR FIRST WORD              #
      SPACN[0]  = ACN$ACN[0];          # STORE CONNECTION NUMBER IN SM #
      FCSNOSM (FCINITN, LFCINTN);      # SEND FC/INIT/N SM             #
# 
*     IDENTIFY OURSELVES TO FTPI
# 
      P<APDT> = LOC(OUTBUF);           # BASE DATA BLOCK POINTER       #
      AIPI$JSN[0] = GETJSN;            # STORE JOB SEQUENCE NUMBER     #
      P<TBUF> = LOC(AIPI$PFP[0]); 
      GETPFP (TBUF);                   # STORE PERMANENT FILE PARAMS   #
      P<TBUF> = LOC(AIPI$CN[0]);
      GETCN (TBUF);                    # STORE CHARGE + PROJECT NUMBER #
      OUTLEN = AIPIHDR$ + 60;          # INITIALIZE OUTPUT LENGTH      #
      FCSNODB (AIPIC, LOCALID);        # CONNECT TO FTPI               #
      FCSNWDB (AIPICR, LOCALID);       # WAIT FOR CONNECT RESPONSE     #
# 
*     PROCESS RESPONSE FROM FTPI
# 
      IF NOT AIPI$NORM[0] 
      THEN
        BEGIN                          # ABNORMAL RESPONSE FROM *FTPI* #
        FTPABORT = ECONNECT;           # SET UP FTP ABORT CODE         #
        ABORT;                         # ABORT JOB                     #
        END 
      FTPIJSN = AIPI$JSN[0];           # PICK UP JSN OF *FTPI*         #
      JSN$JSN[0] = FTPIJSN;            # STORE JSN IN DAYFILE MESSAGE  #
      MESSAGE (JSNMSG[0], 0);          # DAYFILE CONNECTED MESSAGE     #
# 
*     DEFINE FNT MASTER/SLAVE OPERATION.
# 
      P<APSM>    = LOC(OUTBUF);        # BASE SUPERVISORY MESSAGE PTR  #
      SPMSG0[0]  = 0;                  # CLEAR FIRST WORD              #
      SPMSG1[0]  = 0;                  # CLEAR SECOND WORD             #
      FNTJSN[0]  = FTPIJSN;            # JSN OF *FTPI*                 #
      FNTMSAP[0] = FTPIANM;            # APPLICATION NAME OF *FTPI*    #
      FCSNOSM (FNTDMS, LFNTS);         # SEND FNT/DMS/R SM             #
      FCSNWSM;                         # WAIT FOR SUPERVISRY MESSAGE   #
# 
*     PROCESS FNT/DMS/N 
# 
      IF PFCSFC[0] NQ FNTDMSN 
      THEN
        BEGIN                          # FNT/DMS/N NOT SEEN            #
        FTPABORT = ECONNECT;           # SET UP FTP ABORT CODE         #
        ABORT;                         # ABORT JOB                     #
        END 
# 
*     NETWORK INTERFACE INITIALIZED 
# 
      FCSOWOF (CONMSG[0], INTERNAL$);  # WRITE CONNECTED MESSAGE       #
      FCSOWOF (SPACING, INTERNAL$);    # WRITE BLANK LINE              #
      FCSOFTO;                         # FLUSH TERMINAL OUTPUT         #
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FCSIINI                       #
  
      TERM
