*DECK NVFAFAI 
USETEXT TEXTNVF 
USETEXT TEXTSS
USETEXT TXSMNVF 
USETEXT TXTANVF 
USETEXT TXTAPSS 
USETEXT TXTSUSS 
PROC NVFAFAI; 
# TITLE NVFAFAI - ADDITIONAL FAIL/APPL PROCESSING                      #
      BEGIN  # NVFAFAI #
# 
**    NVFAFAI - ADDITIONAL FAIL/APPL PROCESSING.
* 
*     P. A. MURRAY      84/08/01
* 
*     THIS PROCEDURE BREAKS ALL A-A CONNECTIONS HELD BY NVF FOR THE 
*     APPLICATION THAT FAILED OR NETTED OFF.
* 
*     PROC NVFAFAI
* 
*     ENTRY:  
*       THE FAI/APP/N SM IS IN MSGBUF, AND THE WORD COUNT AND BLOCK 
*       HEADER WORDS ARE IN WCBUF AND ABHBUF RESPECTIVELY.
* 
*     EXIT: 
*       ALL *PAAC* ENTRIES ASSOCIATED WITH THE FAILED OR NETTED OFF 
*       APPLICATION HAVE BEEN RELEASED.  A CR/TRM/R SM HAS BEEN SENT TO 
*       THE *OTQ* (OR *WBQ*) FOR EACH RELEASED *PAAC* ENTRY.
* 
*     METHOD: 
*       LOCATE THE *AST* ENTRY OF THE FAILED OR NETTED OFF APPLICATION. 
*       SEARCH THE *PAAC* TABLE FOR A MATCH ON APPLICATION NUMBER.  FOR 
*       EACH *PAAC* ENTRY THAT MATCHES THE FAILED APPL, AND THAT IS 
*       STILL CONNECTED TO NVF, AND THAT IS NOT AWAITING VCB DATA ON A
*       RECONNECT, CALL NVFCTRM TO SEND THE CR/TRM TO THE *OTQ* OR
*       *WBQ*.  IF THE CR/TRM WAS SENT TO ONE OF THE ABOVE MENTIONED
*       QUEUES, RELEASE THE *PAAC* ENTRY AND OTHER RELATED TABLES.
# 
  
# 
****  PROC NVFAFAI - XREF LIST
# 
      $BEGIN
      XREF
        BEGIN 
        PROC ABORT;                    # ABORT JOB                     #
        PROC MESSAGE;                  # SEND MESSAGE TO DAYFILE       #
        END 
      $END
  
      XREF
        BEGIN 
        PROC NVFACTC;                  # CLEAN UP TERMINATING CONN TBLS#
        PROC NVFCTRM;                  # PROCESS CR/TRM SM             #
        PROC NVFSCAD;                  # COMPLETE APPLICATION DEPARTURE#
        PROC NVFUMQE;                  # TRANSFER SM TO QUEUE          #
        END 
  
      $BEGIN
# 
*     NOPRIMSG - NO PRIMARY AST ENTRY WAS FOUND.
# 
      ARRAY NOPRIMSG [00:00] S(4);
        BEGIN 
        ITEM NO$MSG   C(00,00,32) = 
                            [" NVFAFAI - NO PRIMARY AST ENTRY."]; 
        ITEM NO$ZERO  U(03,12,48) = [0];
        END 
      $END
  
      DEF  RCAPF$   #24#;              # REASON CODE FOR APPL FAILED   #
      ITEM AORD        I;              # AST ENTRY ORDINAL             #
      ITEM NENTRY      I;              # NUMBER OF ENTRIES IN TABLE    #
      ITEM NORMTRM     B;              # FALSE, CR/TRM FROM INNER LAYER#
      ITEM PAC         I;              # PAAC ENTRY ORDINAL            #
      ITEM PORD        I;              # PRIMARY AST ENTRY ORDINAL     #
      ITEM SECFLAG     B;              # TRUE IF SEC. AST ENTRY        #
      ITEM SENT        B;              # TRUE IF CR/TRM SENT TO QUEUE  #
      ITEM VCBREL      B;              # SET TRUE TO RELEASE VCB       #
  
      CONTROL EJECT;
  
# 
*     CALCULATE NUMBER OF AST ENTRIES.
# 
      NENTRY = ASTLNGTH / ASTSIZ$;
# 
*     LOCATE AST ENTRY OF FAILED OR NETTED OFF APPL.
# 
      FOR AORD = 0 STEP 1 WHILE 
        ((AST$AN[AORD] NQ FAILAN[0]) AND
         (AORD LS NENTRY))
      DO
        BEGIN 
        END 
# 
*     IF THE AST ENTRY IS NOT FOUND, THE NET/OFF/N OR FAI/APP/N HAS 
*     ALREADY BEEN SENT.  IGNORE THIS SM AND RETURN.
# 
      IF AORD EQ NENTRY 
      THEN
        BEGIN 
        GOTO ENDEXIT; 
        END 
# 
*     CHECK IF THIS IS A SECONDARY APPLICATION.  IF SO, DETERMINE THE 
*     PRIMARY APPLICATION ORDINAL.
# 
      SECFLAG = FALSE;
      IF AST$SANAM[AORD] NQ AST$PANAM[AORD] 
      THEN
        BEGIN 
        FOR PORD = 0 STEP 1 WHILE 
          (PORD LS NENTRY) AND
          (AST$PANAM[PORD] NQ AST$SANAM[AORD])
        DO
          BEGIN 
          END 
  
        $BEGIN
        IF PORD EQ NENTRY              # IF NO PRI APPL FOUND, ABORT   #
        THEN
          BEGIN 
          MESSAGE(NOPRIMSG,0);
          ABORT;
          END 
        $END
  
        IF PORD LS NENTRY 
        THEN
          BEGIN 
          SECFLAG = TRUE; 
          END 
        END 
# 
*     WHILE A-A CONNECTIONS EXIST FOR THIS APPLICATION, SEARCH THE PAAC 
*     TABLE FOR ALL ENTRIES TRYING TO ACCESS THE FAILED APPLICATION.
# 
      NORMTRM = FALSE;
      VCBREL = TRUE;
      NENTRY = PACLNGTH / PAACSIZ$; 
      FOR PAC = 0 STEP 1 WHILE
        (PAC LS NENTRY) AND (AST$AACN[AORD] GR 0) 
      DO
        BEGIN 
# 
*       IF THIS PAAC ENTRY IS TRYING TO ACCESS THE FAILED APPLICATION,
*       AND THE CR/SWH/N HAS NOT YET BEEN RECEIVED, AND THE PAAC IS NOT 
*       AWAITING VCB DATA ON A RECONNECT, THEN UPDATE THE AST ENTRY,
*       SEND CR/TRM/R, AND RELEASE PAAC ENTRY.
# 
        IF (PA$SWAPAN[PAC] EQ AST$AN[AORD]) AND 
           (PA$NACN[PAC] NQ 0) AND
           (PA$STATE[PAC] NQ PAACST"PARCN") 
        THEN
          BEGIN 
# 
*         SET UP THE CR/TRM/R SM. 
# 
          WCB$SMID[0] = CRTRM;
          WCB$WC[0] = LCRTRM + 2; 
          ABHABT[0] = APPCMD; 
          ABHADR[0] = 0;
          ABHTLC[0] = LCRTRM; 
          ABHACT[0] = ACCR; 
  
          SPMSG0[0] = 0;
          PFCSFC[0] = CRTRM;
          RC[0] = RCAPF$; 
          CRNACN[0] = PA$NACN[PAC]; 
# 
*         SEND THE CR/TRM TO NIP (BY-PASSING THE *CTQ*).
# 
          NVFCTRM(NORMTRM, SENT); 
# 
*         IF THE CR/TRM WAS SENT (A CR/SWH/N HAS NOT COME IN AND DELETED
*         THE ACN ENTRY), CLEAN UP THE AST ENTRY AND PAAC TABLE.
# 
          IF SENT 
          THEN
            BEGIN 
# 
*           DECREMENT THE NUMBER OF A-A CONNECTIONS FOR THE SECONDARY 
*           AST ENTRY AND FOR THE PRIMARY AST ENTRY IF THEY ARE NOT THE 
*           SAME ENTRY.  ALSO DECREMENT THE NUMBER OF THE INCOMING
*           CONNECTIONS IF THIS IS AN INCOMING CONNECTION.
# 
            AST$AACN[AORD] = AST$AACN[AORD] - 1;
  
            IF PA$ICMCN[PAC]
            THEN
              BEGIN 
              AST$ICCN[AORD] = AST$ICCN[AORD] - 1;
              END 
  
            IF SECFLAG
            THEN
              BEGIN 
              AST$AACN[PORD] = AST$AACN[PORD] - 1;
              IF PA$ICMCN[PAC]
              THEN
                BEGIN 
                AST$ICCN[PORD] = AST$ICCN[PORD] - 1;
                END 
              END 
# 
*           CALL NVFACTC TO RELEASE THE PAAC ENTRY AND OTHER RELATED
*           TABLES. 
# 
            NVFACTC(PAC,VCBREL);
# 
*           DECREMENT ENTRY COUNT AND INDEX TO TAKE INTO ACCOUNT THE
*           DELETION OF THE PAAC ENTRY. 
# 
            NENTRY = NENTRY - 1;
            PAC = PAC - 1;
            END 
          END 
        END 
# 
*     COMPLETE APPLICATION DEPARTURE FOR THE FAILED APPLICATION.  IF
*     THIS IS A SECONDARY APPLICATION, THEN COMPLETE APPLICATION
*     DEPARTURE FOR THE PRIMARY APPLICATION, ALSO.
# 
      NVFSCAD(AORD);
      IF SECFLAG
      THEN
        BEGIN 
        NVFSCAD(PORD);
        END 
  
ENDEXIT:  
      END 
      TERM
