*DECK NVFUCRS 
USETEXT TEXTNVF 
USETEXT TEXTSS
USETEXT TXTANVF 
USETEXT TXTAPSS 
USETEXT TXTSUSS 
USETEXT TXSANVF 
PROC NVFUCRS (PORD,RORD,RSTAT,CTYP);
# TITLE - NVFUCRS - CHECK REQUEST STARTABLE STATUS #
      BEGIN # NVFUCRS # 
# 
**    NVFUCRS - CHECK REQUEST STARTABLE STATUS. 
* 
*     C. BRION      83/04/13, 83/06/27, 83/08/30, 83/09/08. 
*                   83/11/09. 
* 
*     THIS PROCEDURE IS RESPONSIBLE FOR CHECKING IF AN APPLICATION
*     IS REQUEST STARTABLE OR IF AN APPLICATION HAS ALREADY BEEN
*     STARTED UP AND WE ARE AWAITING THE NETON FOR THE CONNECTION.
*     THIS PROCEDURE ALSO LOCATES THE SECONDARY APPL ENTRY FOR AN 
*     APPLICATION THAT CAN HAVE MORE THAN ONE COPY RUNNING, BUT IS
*     NOT REQUEST STARTABLE.
* 
*     PROC NVFUCRS(PORD,RORD,RSTAT,CTYP)
* 
*       ENTRY 
*         PORD = ORDINAL OF PRIMARY AST ENTRY.
*         CTYP = CONNECTION TYPE OF CALLER (AA OR TA).
*       EXIT
*         RORD = RETURN ORDINAL OF SECONDARY (OR PRIMARY) AST ENTRY.
*         RSTAT = RETURN STATUS.
# 
  
# 
****  PROC NVFUCRS XREF LIST
# 
  
      XREF
        BEGIN 
        PROC SSTETS;                     # SS - ENLARGE TABLE SPACE  #
        PROC NVFUZFW;                    # ZERO FILL WORD # 
        PROC MESSAGE;                    # ISSUE DAYFILE MESSAGE #
        PROC NVFUMQE;                    # MAKE QUEUE ENTRY # 
        PROC SSCATR;                     # START TIMER      # 
        END 
# 
****
# 
  
# 
*     DEFS, ITEMS, ARRAYS 
# 
  
      ITEM RSTAT        I;               # RETURN STATUS #
      ITEM PORD         I;               # PRIMARY AST ENTRY ORDINAL #
      ITEM MATCH        B;               # LOOP EXIT INDICATOR #
      ITEM RORD         I;               # RETURN AST ORDINAL # 
      ITEM CTYP         I;               # CONNECTION TYPE OF CALLER #
      ITEM NENTRY       I;               # NUMBER AST ENTRIES # 
      ITEM LEN          I;               # LENGTH OF ENTRY #
      ITEM LORD         I;               # LOOP AST ORDINAL # 
      ITEM POSAST       I;               # AST WORD POSITION #
      ITEM TOTALCN      I;               # TOTAL NO OF CONN. APP HAS #
  
# 
**    DSPBUF - DSP ROUTE FUNCTION PARAMETER BLOCK.
* 
*     PARAMETER BLOCK FOR TRIGGERING THE ROUTE FUNCTION DSP CALL IN 
*     NVFTICR.
# 
  
      ARRAY DSPBUF [00:00] S(DSPVSIZ$); 
        BEGIN 
        ITEM DSP$WORD   U(00,00,60);
        ITEM DSP$FC     U(00,00,06) = [DSPROUTE$];  # INTERNAL FXTION  #
        ITEM DSP$RES0   U(00,06,54) = [0];
        ITEM DSP$FNAME  C(01,00,07);              # FILE NAME # 
        ITEM DSP$ERR    U(01,42,05) = [0];
        ITEM DSP$NERR   B(01,47,01) = [TRUE];     # NO ABORT IF ERROR  #
        ITEM DSP$FSOT   B(01,48,01) = [TRUE];     # FORCE ORIGIN FLAG  #
        ITEM DSP$RES1   U(01,49,04) = [0];
        ITEM DSP$FSOC   U(01,53,06) = [0];        # SYOT ORIG CODE = 0 #
        ITEM DSP$CBIT   B(01,59,01) = [0];
        ITEM DSP$RES2   U(02,00,12) = [0];
        ITEM DSP$FORMS  U(02,12,12) = [O"0200"];  # FORCE IF JOB ERROR #
        ITEM DSP$DISP   C(02,24,02) = ["IN"];     # DISP CODE = INPUT  #
        ITEM DSP$RES4   U(02,36,03) = [0];
        ITEM DSP$SCF    B(02,39,01) = [0];        # FORCE SERV CLASS   #
        ITEM DSP$RES5   U(02,40,02) = [0];
        ITEM DSP$FLAGS  U(02,42,18) = [O"400020"]; # FLAG SETTING      #
        ITEM DSP$WORD3  U(03,00,60) = [0];
        ITEM DSP$WORD4  U(04,00,60) = [0];
        ITEM DSP$SPACE  U(05,00,12) = [0];
        ITEM DSP$SERCL  C(05,12,02) = ["NS"];     # NS SERVICE CLASS   #
        ITEM DSP$RES3   U(05,24,36) = [0];
        ITEM DSP$WORD5  U(06,00,60) = [0];
        ITEM DSP$WORD6  U(07,00,60) = [0];
        ITEM DSP$WORD7  U(08,00,60) = [0];
        END 
  
  
# 
*     XTEMP - TEMP APPLICATION NAME CELL. 
# 
      ARRAY XTEMP [00:00] S(1); 
        BEGIN 
        ITEM XTEMP$NAME C(00,00,07);
        ITEM XTEMP2     U(00,42,18) = [0];
        ITEM XTEMP10    U(00,00,60);
        END 
  
# 
**    TMBBUF - TIMER REQUEST BUFFER.
* 
*     BUFFER CONTAINING THE TIMER INFO.  SET UP TO CONTAIN
*     THE FC/INACT SM WHICH IS RETURNED TO THE ASQ WHEN THE 
*     TIMER EXPIRES 
# 
      DEF ASTIME$ #1#;
  
      ARRAY TMBBUF[00:00] S(TMBSIZ$); 
         BEGIN
         ITEM TMB$SMID    S:ASQSTAT(00,00,12) = [S"TIMEOUT"]; 
         ITEM TMB$WC      U(00,48,12) = [TMBSIZ$];
         ITEM TMB$ABT     U(01,00,06) = [APPCMD]; 
         ITEM TMB$CNUM    U(01,18,18);
         ITEM TMB$PFCSFC  U(02,00,16) = [FCINA];
         ITEM TMB$ACN     U(02,24,12) = [0];
         ITEM TMB$DELAY   U(03,24,18);
         ITEM TMB$QNUM    U(03,42,18);
         END
  
  
      CONTROL EJECT;
  
# 
*     CHECK IF REQUESTED APPLICATION IS DISABLED, DOWN. IF SO, RETURN 
*     WITH CONNECTION NOT POSSIBLE STATUS.
# 
     RSTAT = CONNOK$; 
     IF AST$DIF[PORD] OR AST$DNF[PORD]
     THEN 
        BEGIN 
        RSTAT = NOCONN$;
        RORD = PORD;
        GOTO ENDEXIT; 
        END 
  
# 
*     CHECK IF COPY OF APPLICATION ALREADY PENDING NETON. IF SO, CHECK
*     THE ORIGIN TYPE OF CALLER THEN INCREMENT THE NUMBER PENDING CON-
*     NECTIONS FOR THE AST ENTRY. 
# 
  
      IF AST$SNPF[PORD] 
      THEN
        BEGIN 
        RSTAT = NETP$;
        RORD = PORD;
        GOTO ENDEXIT; 
        END 
  
# 
*     CHECK IF COPY OF APPLICATION ALREADY NETTED ON AND ABLE TO SUP- 
*     PORT ANOTHER CONNECTION. IF SO, THEN SIMPLY EXIT SINCE RETURN 
*     STATUS ALREADY SET TO CONNECTION OK.
# 
  
      MATCH = FALSE;
      NENTRY = (ASTLNGTH/ASTSIZ$);
      FOR LORD = 0 STEP 1 WHILE 
        (LORD LS NENTRY AND NOT MATCH)
      DO
        BEGIN 
        IF (AST$PANAM[PORD] EQ AST$SANAM[LORD]) AND   #SEC APPL FOUND#
           (AST$JSN[LORD] NQ " ")               AND 
           (NOT AST$DIF[LORD])                  AND   # NOT DISABLE  #
           (NOT AST$DNF[LORD])                        # NOT DOWN     #
        THEN
          BEGIN 
  
# 
*     CHECK AST ENTRY TO SEE IF THIS SEC APPL CAN ACCEPT ANY MORE 
*     CONNECTIONS. IT CAN ACCEPT MORE CONNECTIONS IF THE FOLLOWING
*     CODITIONS ARE MET:  
*     1. THE CURRENT NUMBER OF CONNECTION IS LESS THAN THE TOTAL CONN 
*        ALLOWED. 
*     2. EITHER THE APPLICATION DOES NOT RESTRICT THE NUMBER OF 
*        CONNECTIONS, OR THE CURRENT NO OF CONNECTIONS HAS NOT
*        REACHED THE LIMIT ALLOWED. 
# 
          TOTALCN = AST$TACN[LORD] + AST$AACN[LORD] + AST$RACN[LORD]; 
          MATCH = (TOTALCN LS AST$MCN[LORD]) AND
                  ( (NOT AST$RICN[LORD]) OR 
                    (AST$ICCN[LORD] LS AST$MXICN[LORD])); 
          IF MATCH
          THEN
            BEGIN 
            RORD = LORD;
            GOTO ENDEXIT; 
            END 
          END 
        END 
# 
*     AT THIS POINT, THERE EXISTS NO SECONDARY APPLICATION COPY THAT
*     CAN SUPPORT THE CONNECTION. THEREFORE, CHECK IF THE PRIMARY 
*     APPLICATION IS REQUEST STARTABLE AND IF NOT AT MAXIMUM NUMBER OF
*     COPIES.  IF BOTH OF THESE CHECKS ARE TRUE, A NEW COPY OF THE
*     APPLICATION MUST BE CAUSED TO NETON.  IF THE NUMBER OF MAXIMUM
*     COPIES IS GREATER THAN ONE, A NEW AST ENTRY IS ALLOCATED AND
*     INITIALIZED. THE RETURN STATUS IS SET TO NETON PENDING. 
*     THE DSP PARAMETER BLOCK IS THEN SET AND THE DSP ROUTE REQUEST 
*     IS SET UP AND THE DSP REQUEST ENTRY MADE TO THE CPM/DSP/PFM RE- 
*     QUEST QUEUE.
# 
  
      IF NOT AST$RS[PORD] 
      THEN                   # NOT A REQUEST STARTABLE APPLICATION     #
        BEGIN 
        RSTAT = NOCONN$;
        RORD = PORD;
        END 
      ELSE IF AST$MXCOP[PORD] GR AST$CUCOP[PORD]
      THEN
        BEGIN 
        IF AST$MXCOP[PORD] GR 1 
        THEN
          BEGIN 
          POSAST = (PORD + 1) * ASTSIZ$;
          SSTETS(P<AST>,POSAST,ASTSIZ$);
          RORD = PORD + 1;
          NENTRY = (ASTLNGTH/ASTSIZ$);
          AST$WORD0[RORD] = 0;
          AST$WORD1[RORD] = AST$WORD1[PORD];
          AST$WORD2[RORD] = AST$WORD2[PORD];
          AST$TACN[RORD] = 0; 
          AST$AACN[RORD] = 0; 
          AST$RACN[RORD] = 0; 
          AST$RS[RORD] = FALSE; 
          AST$CUCOP[RORD] = 0;
          AST$MXCOP[RORD] = 1;
          AST$SNPF[RORD] = FALSE; 
          AST$SANAM[RORD] = AST$PANAM[PORD];
          END 
        ELSE
          RORD = PORD;
  
        AST$SNPF[PORD] = TRUE;
        RSTAT = NETP$;
        XTEMP$NAME[0] = AST$PANAM[PORD];
        NVFUZFW(XTEMP); 
        DSP$FNAME[0] = XTEMP$NAME[0]; 
        P<CRQBUF> = LOC(DSPBUF);
        LEN = DSPVSIZ$ * 10;
        NVFUMQE(P<CPMRQ>,CRQBUF[0],APPTTX$,0,LEN);
  
    #  SET AUTOSTART TIMER   #
  
        TMB$QNUM[0] = LOC(P<ASQ>);
        TMB$DELAY[0] = NETPTIME$ + ASTIME$; 
        SSCATR(TMBBUF[0]);
        AST$TCAN[RORD] = TMB$CNUM[0]; 
  
        END 
      ELSE                   # AT MAX COPY LIMIT                       #
        BEGIN 
        RSTAT = MCLIMIT$; 
        RORD = PORD;
        END 
  
ENDEXIT:  
  
      END # NVFUCRS # 
 TERM 
