*DECK     NVFTRVD 
USETEXT          TEXTNVF
USETEXT          TEXTSS 
USETEXT          TXTANVF
USETEXT          TXTAPSS
USETEXT          TXSMNVF
PROC NVFTRVD; 
# TITLE NVFTRVD - RECEIVE VCB DATA                                     #
  
      BEGIN  # NVFTRVD #
# 
**    NVFTRVD - RECEIVE VCB DATA. 
* 
*     E. THAVIKULWAT    81/11/13
*     C. BRION          82/04/11. 83/05/10. 
* 
*     THIS PROCEDURE'S MAIN FUNCTION IS TO PROCESS VCB DATA AND DETERMIN
*     APPROPRIATE ACTIONS TO TAKE DEPENDING ON WHAT PROCESS REQUESTED TH
*     DATA.  IT IS CALLED INTO EXECUTION BY PROCEDURE *NVFTDQE*.
* 
*     PROC NVFTRVD
* 
*     ENTRY:  
*       VCB DATA IN *MSGBUF*
* 
*     EXIT: 
*       ONE OF THE FOLLOWING: 
*         1) APPLICATION PROMPT REISSUED. 
*         2) CONNECTION SWITCHED TO APPROPRIATE APPLICATION.
*         3) CONNECTION TERMINATED. 
*         4) A TIMER IS STARTED FOR NVF TO REATTEMPT TO SWITCH TO THE 
*            APPROPRIATE APPLICATION. 
* 
*     NOTES:  
*       1) IF THE RECONNECT PROCESS REQUESTED THE DATA BECAUSE OF AN
*          APPLICATION FAILURE, APPLICATION PROMPT IS NOT REISSUED IF 
*          THE FAILED APPLICATION IS A MANDATORY/IMPLIED MANDATORY
*          APPLICATION. 
*       2) FOR A NORMAL RECONNECT, THE USER IS REVALIDATED, WITHOUT 
*          INCREMENTING FAMILY COUNT, WHETHER OR NOT A NEW APPLICATION
*          IS SPECIFIED.
* 
*     METHOD: 
*       CALL *NVFTURT* TO GET A *PTAC* ENTRY THAT MATCHES ON VCB AND
*       UPDATE *RAU* TABLE IF NEEDED.  SAVE VCB DATA IN APPROPRIATE 
*       FIELDS OF THE *PTAC* AND ISSUE *AEAP* ACCOUNT DAYFILE MESSAGE.
*       IF DEVICE IS A PASSIVE DEVICE OR VCB DATA WAS REQUESTED BY THE
*       CONNECTION BROKEN PROCESS, THEN TERMINATE THE CONNECTION. 
*       OTHERWISE, DATA WAS REQUESTED BY THE RECONNECT PROCESS.  IF THE 
*       RECONNECT IS DUE TO APPLICATION FAILED CONDITION AND THE FAILED 
*       APPLICATION IS A MANDATORY/IMPLIED MANDATORY APPLICATION, THEN
*       CHECK IF THIS IS A CONSOLE WITH ALL MANDATORY LOGIN PARAMETERS. 
*       IF SO, START UP A 30-SECOND TIMER, AT THE END OF WHICH NVF WILL 
*       REATTEMPT TO CONNECT TO THE FAILED APPLICATION.  IF NOT, THEN 
*       TERMINATE THE CONNECTION.  IF THE RECONNECT IS NOT DUE TO THE 
*       APPLICATION FAILED CONDITION, OR IF THE FAILED APPL IS NOT
*       MANDATORY OR IMPLIED MANDATORY, THEN REVALIDATE THE USER WITHOUT
*       INCREMENTING THE FAMILY COUNT.
# 
  
# 
****  PROC NVFTRVD - XREF LIST. 
# 
  
      XREF
        BEGIN 
        PROC NVFSCAD;        # COMPLETE APPLICATION DEPARTURE          #
        PROC NVFTCCT;        # CALCULATE CONNECT TIME                  #
        PROC NVFTCRN;        # CHECK FOR RESERVED APPLICATION NAME     #
        PROC NVFTETC;        # END TERMINAL CONNECTION                 #
        PROC NVFTIAM;        # ISSUE ACCOUNT DAYFILE MESSAGE           #
        PROC NVFTILP;        # ISSUE LOGIN PROMPT                      #
        PROC NVFTRLC;        # REFUSE LOANED CONNECTION                #
        PROC NVFTURT;        # UPDATE *RAU* TABLE IF NEEDED            #
        PROC NVFUMQE;        # TRANSFER TEXT TO QUEUE                  #
        PROC SSCATR;         # ACCEPT TIMER REQUEST                    #
        PROC SSTRTS;         # REMOVE TABLE SPACE                      #
        FUNC XCDD;           # MACREL CONVERT INTEGER TO DISPLAY DEC   #
        END 
  
# 
****
# 
      $BEGIN
      XREF
        BEGIN 
        PROC MESSAGE;        # SEND MESSAGE TO SYSTEM AND USER DAYFILE #
        END 
      $END
# 
****
# 
  
*CALL TMSGNVF 
  
*CALL TERMCLS 
# 
**    DAYMSG - TERMINAL CLASS CHANGED MESSAGE BUFFER
# 
      ARRAY DAYMSG[00:00] S(8); 
        BEGIN 
        ITEM DAY$MSG1 C(00,00,33) = 
             ["INVALID TERMINAL CLASS TRANSITION"]; 
        ITEM DAY$MSG2 C(03,18,10) = [" OLD TC = "]; 
        ITEM DAY$OLDT U(04,18,18);  # OLD TERMINAL CLASS               #
        ITEM DAY$MSG3 C(04,36,10) = [" NEW TC = "]; 
        ITEM DAY$NEWT U(05,36,18);  # NEW TERMINAL CLASS               #
        ITEM DAY$MSG4 C(05,54,12) = [" TERMNAME = "]; 
        ITEM DAY$TNAM C(07,06,07);  # TERMINAL NAME                    #
        ITEM DAY$DOT  C(07,48,01) = ["."];
        END 
  
  
# 
**    CABBUF - CONNECTION ABORTED MESSAGE BUFFER. 
# 
      ARRAY CABBUF [00:00] S(3);
        BEGIN 
        ITEM CAB$MSG C(00,00,21) = [".CONNECTION ABORTED. "]; 
        END 
  
  
# 
**    TRBBUF - TIMER REQUEST BUFFER 
* 
*     BUFFER CONTAINING TIMER INFORMATION.  BUFFER IS SET UP TO CONTAIN 
*     THE FC/INACT SM WHICH IS RETURNED TO THE *TAINPQ* WHEN THE TIMER
*     EXPIRES.
# 
      ARRAY TRBBUF [00:00] S(TMBSIZ$);
        BEGIN 
        ITEM TRB$SMID    S:CTQSTAT(00,00,12) = [S"SINA"];  #INTERNAL ID#
        ITEM TRB$WC      U(00,48,12) = [TMBSIZ$];  # ENTRY SIZE        #
        ITEM TRB$ABT     U(01,00,06) = [APPCMD];   # APPL BLOCK TYPE   #
        ITEM TRB$CNUM    U(01,18,18);              # CANCELLATION NUM  #
        ITEM TRB$PFCSFC  U(02,00,16) = [FCINA];    # FC/INACT PFCSFC   #
        ITEM TRB$ACN     U(02,24,12);              # APPL CONN NUMBER  #
        ITEM TRB$DELAY   U(03,24,18) = [RTRYTIME$];# DELAY TIME IN SEC #
        ITEM TRB$QNUM    U(03,42,18);              # Q NUM FOR FC/INACT#
        END 
  
      ITEM ADDR       I;     # ADDRESSING INFORMATION FOR ABH          #
      ITEM AS         I;     # APPLICATION STATUS TABLE ORDINAL        #
      ITEM ASENTRY    I;     # NUMBER OF AST ENTRIES                   #
      ITEM CNTIME     C(10); # VARIABLE TO RECEIVE CONNECT TIME        #
      ITEM CNTYP      I;     # CONNECTION TYPE INDICATOR #
      ITEM MATCH      B;     # EXIT LOOP VARIABLE                      #
      ITEM NENTRY     I;     # NUMBER OF ENTRIES IN TABLE              #
      ITEM PORD       I;     # PRIMARY AST ENTRY ORDINAL               #
      ITEM PRIAPP     B;     # PRIMARY APPLICATION INDICATOR           #
      ITEM PT         I;     # SUBSCRIPT FOR ARRAY PTAC                #
      ITEM RNAME      I;     # RESERVED NAME INDICATOR                 #
      ITEM SMOUT      B;     # SM OUTPUT TYPE FOR NVFTRLC CALL         #
      ITEM VCBLOC     I;     # LOCAL VCB ORDINAL #
  
  
      CONTROL EJECT;
  
# 
*     DETERMINE NUMBER OF AST ENTRIES 
# 
      ASENTRY = ASTLNGTH/ASTSIZ$; 
  
# 
*     CALL *NVFTURT* TO FIND THE *PTAC* ENTRY AND UPDATE *RAU* TABLE IF 
*     NEEDED.  SAVE VCB DATA THAT APPLIES TO BOTH PASSIVE AND INTERACTIV
*     DEVICE IN THE *PTAC*. 
# 
      P<VCBBUF> = LOC(MSGBUF[0]);      # LOCATION OF VCB DATA BUFFER   #
# 
*     SEARCH PTAC TABLE FOR ENTRY THAT MATCHES ON VCB.
# 
      MATCH  = FALSE; 
      NENTRY = PTALNGTH / PTACSIZ$;    # CALCULATE NUMBER OF ENTRIES   #
      FOR PT = 0 STEP 1 WHILE (NOT MATCH AND PT LS NENTRY)
      DO
        BEGIN 
        IF PTA$VCB[PT] EQ VCB$VCB[0]
        THEN                           # PTAC ENTRY FOUND              #
          BEGIN 
          MATCH = TRUE;                # EXIT LOOP                     #
          END 
        END 
  
      PT = PT - 1;
  
  
      PTA$TN[PT]     = VCB$TN[0]; 
      PTA$HW[PT]     = VCB$HW[0]; 
      PTA$VTP[PT]    = VCB$VTP[0];
      PTA$CACA[PT]   = VCB$CACA[0]; 
      PTA$ICF[PT]    = VCB$ICF[0];
      PTA$RCNA[PT]   = VCB$RCNA[0]; 
      PTA$NET[PT]    = VCB$NET[0];
      PTA$LCF[PT]    = VCB$LCF[0];
      PTA$ALIF[PT]   = VCB$ALIF[0]; 
      PTA$SDT[PT]    = VCB$SDT[0];
      PTA$DO[PT]     = VCB$DO[0]; 
      PTA$XBZ[PT]    = VCB$XBZ[0];
      PTA$SL[PT]     = VCB$SL[0]; 
      PTA$DBZ[PT]    = VCB$DBZ[0];
      PTA$UBZ[PT]    = VCB$UBZ[0];
      PTA$CNTIME[PT] = VCB$CNTIME[0]; 
      PTA$SWTIME[PT] = VCB$SWTIME[0]; 
      PTA$FWORD[PT]  = VCB$FWORD[0];
      PTA$UWORD[PT]  = VCB$UWORD[0];
      PTA$PROMPT[PT] = AWTAPP$; 
  
# 
*     IF VCB DATA WAS REQUESTED BECAUSE OF CONNECTION BROKEN, USE 
*     THE ORIGINAL TERMINAL CLASS FROM VCB TO AVOID THE SEARCH FOR
*     PDCT ENTRY IN CASE THE TERMINAL CLASS HAS BEEN CHANGED
*     ERRONEOUSLY FROM AN ASYN TYPE TO A SYNCHRONOUS ONE. 
# 
      IF PTA$STATE[PT] EQ PTACST"AWTVCBC" 
      THEN
        PTA$TC[PT] = VCB$TC[0]; 
  
# 
*     IF VCB DATA WAS REQUESTED BECAUSE OF CR/RCN, COMPARE THE
*     ORGINAL TERMINAL CLASS WITH THE ONE FROM CR/RCN SM. IF
*     TC IS CHANGED FROM ASYNC TO SYNC, SEND OUT THE MESSAGE
*     AND END TERMINAL CONNECTION.
# 
      IF PTA$STATE[PT] EQ PTACST"AWTVCBR" 
         AND PTA$TC[PT] GQ TC9$ 
         AND VCB$TC[0] LS TC9$
      THEN
        BEGIN 
  
        $BEGIN
        DAY$OLDT[0] = XCDD(VCB$TC[0]+1000); 
        DAY$NEWT[0] = XCDD(PTA$TC[PT]+1000);
        DAY$TNAM[0] = PTA$TN[PT]; 
        MESSAGE(DAYMSG,0);
        $END
  
        PTA$TC[PT] = VCB$TC[0]; 
        NVFTETC(PT);
        RETURN; 
        END 
  
# 
*     IF THE PRIMARY APPL NUMBER IN THE *PTAC* IS ZERO, THEN MOVE THE 
*     PRIMARY APPL NUMBER FROM THE *VCB* TO THE *PTAC*.  (IF PTA$PRIAN
*     IS NON-ZERO, IT MAY HAVE JUST BEEN SET, AND WE DON'T WANT TO
*     OVERWRITE IT.)
# 
      IF PTA$PRIAN[PT] EQ 0 
      THEN
        BEGIN 
        PTA$PRIAN[PT] = VCB$PRIAN[0]; 
        END 
# 
*     ISSUE *AEAP* ACCOUNT DAYFILE MESSAGE. 
# 
      NVFTIAM(PT,AEAP$);
# 
*     IF THIS CR/RCN IS NOT THE RESULT OF A PREVIOUS CR/RCN/A BEING 
*     SENT, THEN THE NUMBER OF T-A CONNECTIONS FOR THE APPLICATION TO 
*     WHICH THIS TERMINAL WAS CONNECTED MUST BE DECREMENTED.  IF THE
*     NUMBER OF CONNECTIONS TO THAT APPLICATION IS NOW ZERO AND THAT
*     APPLICATION HAS FAILED OR NETTED OFF, THE APPROPRIATE RESPONSE
*     SM (FAIL/APPL/N OR NET/OFF/N) MUST BE ISSUED. 
# 
      IF NOT PTA$RCNA[PT] 
      THEN
        BEGIN 
        PRIAPP = FALSE; 
        NVFTURT(VCB$VCB[0],PT,PRIAPP);  # UPDATE *RAU* TABLE           #
  
        FOR AS = 0 STEP 1 WHILE 
          (AS LS ASENTRY AND
           AST$PANAM[AS] NQ PTA$SWTAPP[PT]) 
        DO
          BEGIN 
          END 
        AST$TACN[AS] = AST$TACN[AS] - 1;
        AST$ICCN[AS] = AST$ICCN[AS] - 1;
        NVFSCAD(AS);
# 
*     IF THIS IS AN INITIAL LOAN AND THE CONNECTION HAS NOT BEEN BROKEN,
*     INCREMENT THE NUMBER OF RESERVED CONNECTIONS FOR THIS APPL. 
# 
        IF (PTA$LRC[PT] EQ RCRC"LSA") AND 
           (PTA$STATE[PT] NQ PTACST"AWTVCBC") 
        THEN
          BEGIN 
          AST$RACN[AS] = AST$RACN[AS] + 1;
          END 
        END 
# 
*     CLEAR THE CR/RCN/A FLAG IN THE PTAC.  THIS FLAG HELPS NVF TO
*     DISTINGUISH BETWEEN A NORMAL CR/RCN AND A CR/RCN THAT IS THE
*     RESULT OF NVF SENDING A CR/RCN/A TO NIP.
# 
      PTA$RCNA[PT] = FALSE; 
# 
*     DETERMINE PROCESS (CONNECTION BROKEN OR RECONNECT) THAT REQUESTED 
*     THE DATA. 
# 
      IF ((PTA$DT[PT] NQ DT$CONS) AND (PTA$DT[PT] NQ DT$USER))
        OR (PTA$STATE[PT] EQ PTACST"AWTVCBC") 
      THEN                   # PASSIVE DEVICE OR CONNECTION BROKEN     #
        BEGIN 
# 
*     CHECK IF CONNECTION THAT WAS LOANED.
*     IF SO, THEN THE CONNECTION COUNT FOR THE PRIMARY APPL MUST
*     BE DECREMENTED. 
# 
        IF PTA$LCF[PT]                 # IF LOAN CONNECTION            #
        THEN
          BEGIN 
          PRIAPP = TRUE;
          NVFTURT(VCB$VCB[0],PT,PRIAPP);  # UPDATE *RAU* TABLE         #
  
          FOR AS = 0 STEP 1 WHILE 
            ((AS LS ASENTRY) AND
             (AST$AN[AS] NQ PTA$PRIAN[PT])) 
          DO
            BEGIN 
            END 
          IF AS LS ASENTRY
          THEN
            BEGIN 
            AST$RACN[AS] = AST$RACN[AS] - 1;
            PTA$LCF[PT] = FALSE;       # CLEAR THE LCF FLAG            #
            NVFSCAD(AS);
            END 
          END 
  
# 
*       CONNECTION BROKEN AND/OR PASSIVE DEVICE, TERMINATE THE
*       CONNECTION. 
# 
        NVFTETC(PT);
        END 
      ELSE                   # RECONNECT FOR INTERACTIVE DEVICE        #
        BEGIN 
        ADDR = PTA$ACN[PT]; 
        VCBLOC = PTA$VCB[PT]; 
# 
*       DATA REQUESTED BY THE RECONNECT PROCESS.  SAVE VCB DATA THAT
*       APPLIES TO INTERACTIVE DEVICES IN THE *PTAC*. 
# 
        PTA$ALIFAM[PT] = VCB$ALIFAM[0]; 
        PTA$FAMIND[PT] = VCB$FAMIND[0]; 
        PTA$ALIUSR[PT] = VCB$ALIUSR[0]; 
        PTA$USRIND[PT] = VCB$USRIND[0]; 
        PTA$ALIAPP[PT] = VCB$ALIAPP[0]; 
        PTA$APPIND[PT] = VCB$APPIND[0]; 
# 
*       SETUP APPLICATION CONNECT TIME MESSAGE. 
# 
        CTM$ANAME[0] = PTA$SWTAPP[PT];  # APPLICATION NAME             #
        CNTYP =TATIME$; 
        NVFTCCT(PT,1,CNTIME,CNTYP);    # CALC CONNECT TIME      # 
        CTM$TIME[0]  = CNTIME;         # SAVE CONNECT TIME             #
# 
*     DETERMINE IF RECONNECT IS DUE TO APPLICATION FAILED CONDITION.
*     ON A NON-LOANED TYPE OF RECONNECTION. 
# 
        IF PTA$AFF[PT]
        THEN                 # APPL FAILED WITH OUTSTANDING CONN       #
          BEGIN 
# 
*         APPLICATION FAILED.  SEND "APPLICATION FAILED" MESSAGE. 
# 
          NVFUMQE(P<CTQ>,APFBUF[0],APPTTX$,ADDR,LMSG30$); 
# 
*         CHECK TERMINAL CLASS TO SEE IF NVF SHOULD SEND A CTR/CHAR.
# 
          GOTO TERMCLS [PTA$TC[PT]];
  
SENDCTRCHAR:  
  
# 
*         SEND CTR/CHAR TO FORCE TERMINAL TO BE IN NON-TRANSPARENT
*         INPUT MODE. 
# 
          PFCSFC[1] = CTRCHAR;
          CTRSTR[1] = 0;               # CLEAR REST OF WORD 0          #
          B<0,16>CTRSTR[1] = NOXPAR$;  # ADD FN/FV PAIR FOR NON-XPARENT#
          NVFUMQE(P<CTQ>,APSM[1],APPPR$,ADDR,LCTRLO$);  # TRANSFER TO Q#
  
NOCTRCHAR:  
  
# 
*         IF FAILED APPLICATION IS MANDATORY/IMPLIED MANDATORY, 
*         TERMINATE THE CONNECTION.  OTHERWISE, PROCEED TO REVALIDATE 
*         THE USER AND ISSUE APPLICATION PROMPT.
# 
          IF (((PTA$APPIND[PT] EQ MNDATRY$) 
            OR (VCB$VDSF[0])) AND PTA$LRC[PT] LS RCRC"LSA") 
          THEN   # MANDATORY/IMPLIED MANDATORY APPL FAILED             #
            BEGIN 
# 
*           SEND "CONNECT TIME" MESSAGE.
# 
            NVFUMQE(P<CTQ>,CTMEBUF[0],APPTTX$,ADDR,LMSG40$);
# 
*           IF THIS IS A CONSOLE DEVICE TYPE WITH ALL MANDATORY LOGIN 
*           PARAMETERS, START A 30 SECOND TIMER SO THAT NVF CAN TRY TO
*           RECONNECT THE CONSOLE TO THE DESIRED APPLICATION. 
# 
            IF (PTA$DT[PT] EQ DT$CONS) AND
               (PTA$FAMIND[PT] EQ MNDATRY$) AND 
               (PTA$USRIND[PT] EQ MNDATRY$) AND 
               (PTA$APPIND[PT] EQ MNDATRY$) 
            THEN
              BEGIN 
              TRB$ACN[0] = PTA$ACN[PT]; 
              TRB$QNUM[0] = LOC(P<TAINPQ>); 
              SSCATR(TRBBUF[0]);
              PTA$CNUM[PT] = TRB$CNUM[0]; 
              PTA$STATE[PT] = PTACST"AWTAPPL";
              END 
# 
*           IF NON-CONSOLE OR NON-MANDATORY LOGIN PARAMETERS, SEND THE
*           LOGGED OUT MESSAGE AND END TERMINAL CONNECTION. 
# 
            ELSE
              BEGIN 
              NVFUMQE(P<CTQ>,LOMBUF[0],APPTTX$,ADDR,LMSG20$); 
              NVFTETC(PT);             # END TERMINAL CONNECTION       #
              END 
            RETURN;                    # EXIT                          #
            END 
          END 
  
# 
*     CHECK STATE OF PTAC. IF DUE TO LOANED REQUEST TYPE OF 
*     RECONNECT, CHECK THE DIFFERENT REASON CODES TO DETERMINE
*     NEXT ACTION.
# 
  
        IF PTA$STATE[PT] EQ PTACST"AWTVCBL" 
        THEN
          BEGIN 
          PTA$LCF[PT] = TRUE;          # SET LCF FIRST                 #
# 
*     IF THE PRIMARY APPL FAILED OR THE SECONDARY APPL ABORTED THE
*     CONNECTION, CLEAR THE LOAN CONNECTION FIELD IN THE PTAC, SINCE
*     THIS IS NO LONGER A LOANED CONNECTION.   CLEAR THE VOLUNTEERED
*     APPL FLAG SO THE APPLICATION PROMPT WILL BE SENT.  SEND EITHER
*     THE "CONNECTION ABORTED" OR "APPLICATION FAILED" MESSAGE. 
# 
          IF (PTA$LRC[PT] EQ RCRC"PAF") OR
             (PTA$LRC[PT] EQ RCRC"SAC") 
          THEN
            BEGIN 
            PTA$LRC[PT] = 0;
            PTA$LCF[PT] = FALSE;
            PTA$VAF[PT] = FALSE;
            IF PTA$LRC[PT] EQ RCRC"SAC" 
            THEN
              BEGIN 
# 
*     LOCATE THE PRIMARY AST ENTRY AND DECREMENT THE RESERVED 
*     CONNECTION COUNT.  UPDATE THE *RAU* TABLE, IF NEEDED. 
# 
              PRIAPP = TRUE;
              NVFTURT(VCB$VCB[0],PT,PRIAPP);  # UPDATE *RAU* TABLE     #
  
              FOR AS = 0 STEP 1 WHILE 
                (AS LS ASENTRY AND
                 AST$AN[AS] NQ PTA$PRIAN[PT]) 
              DO
                BEGIN 
                END 
              IF AS LS ASENTRY
              THEN
                BEGIN 
                AST$RACN[AS] = AST$RACN[AS] - 1;
                NVFSCAD(AS);
                END 
              NVFUMQE(P<CTQ>,CABBUF[0],APPTTX$,ADDR,LMSG30$); 
              END 
            ELSE
              BEGIN 
              NVFUMQE(P<CTQ>,APFBUF[0],APPTTX$,ADDR,LMSG30$); 
              END 
            END 
  
# 
*     IF SWITCHING BACK TO PRIMARY, BUT THE PRIMARY APPLICATION NAME
*     IS NOT SPECIFIED, THE PRIMARY APPL MUST HAVE FAILED.  IN THIS 
*     CASE, THE LOAN CONNECTION IS ENDED.  DECREMENT THE NUMBER OF
*     RESERVED CONNECTIONS FOR THE PRIMARY APPL.  UPDATE THE *RAU*
*     TABLE, IF NECESSARY.
# 
          IF (PTA$LRC[PT] GQ RCRC"UVS" AND
              PTA$LRC[PT] LQ RCRC"SLE") AND 
              NOT PTA$VAF[PT] 
          THEN
            BEGIN 
            PTA$LRC[PT] = 0;
            PTA$LCF[PT] = FALSE;
            PRIAPP = TRUE;
            NVFTURT(VCB$VCB[0],PT,PRIAPP);
  
            FOR AS = 0 STEP 1 WHILE 
              ((AS LS ASENTRY) AND
               (AST$AN[AS] NQ PTA$PRIAN[PT])) 
            DO
              BEGIN 
              END 
            IF AS LS ASENTRY
            THEN
              BEGIN 
              AST$RACN[AS] = AST$RACN[AS] - 1;
              NVFSCAD(AS);
              END 
            END 
          END 
# 
*       NORMAL RECONNECT OR NON-MANDATORY APPLICATION FAILED.  SEND 
*       "CONNECT TIME" MESSAGE.  DETERMINE IF NEW APPLICATION SPECIFIED.
*       IF NO NEW APPLICATION SPECIFIED AND THE PREVIOUS APPLICATION
*       IS A MANDATORY/IMPLIED MANDATORY APPLICATION, TERMINATE THE 
*       CONNECTION. 
# 
        IF PTA$LRC[PT] LS RCRC"LSA" 
        THEN
          NVFUMQE(P<CTQ>,CTMEBUF[0],APPTTX$,ADDR,LMSG40$);
        IF PTA$VAF[PT]
        THEN
          BEGIN 
          NVFTCRN(PT,RNAME);
          IF (RNAME NQ NORESNAM$) 
          THEN
            BEGIN 
            IF RNAME EQ LOGIN$
            THEN
              BEGIN 
# 
*     HAVE RESERVED APPLICATION NAME OF "HELLO" OR "LOGIN". 
*     CHECK IF LOAN REQUEST TYPE OF CONNECTION IN WHICH CASE THE
*     RESERVED APPL NAMES ARE NOT ALLOWED.
*     SET UP TO ISSUE CR/RCN/A SM VIA CALL TO NVFTRLC.
# 
              IF PTA$LRC[PT] EQ RCRC"LSA" 
              THEN
                BEGIN 
                SMOUT = TRUE; 
                PTA$LRC[PT] = RCRC"SNA";
                NVFTRLC(PT,SMOUT,PTA$LRC[PT]);
                RETURN; 
                END 
              IF PTA$LRC[PT] LS RCRC"LSA" 
              THEN
                BEGIN 
                NVFTILP(PT);
                END 
              END 
# 
*     FOR ALL RESERVED APPLICATION NAMES, RETURN.  IF THE APPLICATION 
*     NAME WAS "BYE" OR "LOGOUT", NVF WILL HAVE ALREADY TERMINATED
*     THE CONNECTION. 
# 
            RETURN; 
            END 
          END 
        ELSE
          BEGIN 
# 
*     NO NEW APPLICATION SPECIFIED. 
*     IF A LOAN REQUEST TYPE OF RECONNECT, THEN INVALID RECONNECT 
*     FROM PRIMARY TO SECONDARY APPLICATION.
*     SET UP TO ISSUE A CR/RCN/A SM VIA CALL TO NVFTRLC.
# 
          IF PTA$LRC[PT] EQ RCRC"LSA" 
          THEN
            BEGIN 
            SMOUT = TRUE; 
            PTA$LRC[PT] = RCRC"SNA";
            NVFTRLC(PT,SMOUT,PTA$LRC[PT]);
            RETURN; 
            END 
          ELSE
            BEGIN 
            IF (PTA$APPIND[PT] EQ MNDATRY$) 
              OR (VCB$VDSF[0])
            THEN
              BEGIN 
              NVFUMQE(P<CTQ>,LOMBUF[0],APPTTX$,ADDR,LMSG20$); 
              NVFTETC(PT);
              RETURN; 
              END 
            END 
          END 
  
  
# 
*       WHETHER OR NOT NEW APPLICATION IS SPECIFIED, REVALIDATE THE USER
*       (CPM 56B REQUEST) WITHOUT INCREMENTING THE FAMILY COUNT.
# 
        P<CRQBUF> = LOC(MSGBUF[0]) + ((NMSGBUF$ + 1) / 2);
        CRQ$FCWORD[0] = 0;   # CLEAR OUTPUT HALF OF *MSGBUF*           #
        CRQ$FWORD[0]  = 0;
        CRQ$PWORD[0]  = 0;
        CRQ$UWORD[0]  = 0;
  
        CRQ$FC[0]     = CPM56B$;
        CRQ$ACN[0]    = VCBLOC; 
        CRQ$FNAM[0]   = PTA$FNAM[PT]; 
        CRQ$VPWF[0]   = TRUE; 
        CRQ$IFCTF[0]  = FALSE;
        CRQ$UNUM[0]   = PTA$UNUM[PT]; 
        CRQ$QNUM[0] = LOC(P<VDATAQ>); 
        NVFUMQE(P<CPMRQ>,CRQBUF[0],APPTTX$,0,LMSG40$);
        PTA$STATE[PT]  = PTACST"AWTVAL";  # AWAIT VALIDATION STATE     #
        PTA$PROMPT[PT] = AWTFAM$;      # SET TO AWAIT FAMILY           #
        PTA$USERCT[PT] = LLVAL;        # FORCE LOGOUT IF UNSUCCESSFUL  #
        PTA$PWEXPF[PT] = TRUE;         # DO NOT REISSUE PW EXP MESSAGE #
        END 
  
      END  # END NVFTRVD #
  
TERM
