*DECK NVFIAST
USETEXT TEXTNVF
USETEXT TEXTSS
USETEXT TXTAPSS
USETEXT TXVCBNV
PROC NVFIAST;
#TITLE NVFIAST - INITIALIZES THE APPLICATION-STATUS-TABLE (AST). #
BEGIN # NVFIAST #
#
** NVFIAST - INITIALIZES THE AST.
*
* A. LIM. 82/01/12
* C. BRION 83/04/23. 83/05/19.
*
* THIS ROUTINE IS PART OF THE INITIALIZATION PROCESS FOR NVF.
* ITS JOB IS TO INITIALIZE THE APPLICATION-STATUS-TABLE (AST).
*
* PROC NVFIAST
*
* ENTRY NONE.
*
* EXIT AST IS INITIALIZED.
*
* METHOD READ THE NOS VALIDATION COMMON DECK - COMTNAP, AND
* TRANSFER THAT PART OF INFORMATION TO AST. THEN BUILD
* THE VALID APPLICATION MASK FROM THE APPLICATIONS IN AST.
* READ THE LOCAL-CONFIGURATION FILE - LCF, AND TRANSFER
* THAT PART OF INFORMATION TO AST.
* SAVE THE LCF VERSION IN COMMON BLOCK *LCFVRSN* DEFINED
* IN *TEXTNVF*.
#
#
**** PROC NVFIAST XREF LIST
#
XREF
BEGIN
PROC APPLS; # COMPASS INTERFACE ROUTINE TO GET COMTNAP#
PROC MESSAGE; # MACREL - SEND MESSAGE #
PROC NVFIIAP; # INITIALIZATION ABORT PROCEDURE #
PROC READ; # MACREL - READ FILE TO CIO BUFFER #
PROC READW; # MACREL - TRANSFER DATA TO WORKING BUFFER#
PROC REWIND; # MACREL - REWIND FILE #
PROC SKIPB; # MACREL - SKIP RECORDS BACKWARD #
PROC SKIPEI; # MACREL - SKIP TO EOR #
PROC SSTAQE; # SS - ACCEPT A QUEUE ENTRY #
PROC SSTATS; # ALLOCATE TABLE SPACE #
PROC SSTETS; # SS - ENLARGE TABLE SPACE #
END
#
****
#
*CALL NAMLEV
# DEFS #
DEF APESIZ$ # 1 #; # APPL ENTRY SIZE #
DEF LCFETSIZ$ # 5 #; # LCF FET SIZE #
DEF LCFPTSIZ$ # 17 #; # LCF PREFIX TBL + 2 WORDS #
DEF TRNS$OK # 0 #; # STATUS RETURNED WHEN READ IS O.K. #
DEF XTRAPPLS$ # 5 #; # NUMBER OF APPLS NOT IN COMTNAP (NS, ETC)#
DEF NVFLEVL$ # 5 #; # LENGTH OF NVF LEVEL MSG #
DEF LCFBDTL$ # 6 #; # LENGTH OF LCF BUILD DATE, TIME MSG #
DEF LCFTITL$ # 9 #; # LENGTH OF LCF TITLE MSG #
# ITEMS #
ITEM CMTNAP U; # APPLS RETURN PARM- COMTNAP ADDR #
ITEM ENDPROCG B = FALSE; # END PROCESSING LCF RECORDS #
ITEM I,II U; # AST INDEX #
ITEM J U; # INDUCTION VARIABLE #
ITEM K U; # DUMMY INDUCTION VARIABLE #
ITEM LAST$RCNAM C(7); # NAME OF THE LAST LCF-RECORD PROCESSED #
ITEM MATCH B; # LOOP EXIT INDICATOR #
ITEM NAPPLS U; # APPLS RETURN PARM- NO OF APPLS #
ITEM NENTRY U; # NUMBER OF ENTRIES IN THE AST #
ITEM STATS I; # READW RETURN PARM- STATUS #
ITEM TAPENTRY U; # TOTAL NO OF ENTRIES IN APPL RECD #
ITEM TOTAPPLS U; # TOTAL NO OF APPLS IN AST #
#
* LCFFET - LCF FET.
*
* THIS THE FET FOR LCF. IT IS DEFINED LOCALLY HERE SIMPLY BECAUSE
* ONLY THIS INITIALIZATION PROC MANIPULATES IT.
#
ARRAY LCFFET[00:00] S(LCFETSIZ$);
BEGIN
ITEM LCF$WORD U(00,00,60); #FIRST WORD OF FET #
ITEM LCF$LFN C(00,00,03) = ["LCF"];
ITEM LCF$ZERO U(00,18,24) = [0];
ITEM LCF$LNAT U(00,42,08); #COMB LEVEL NR AND ABN TERM CODE#
ITEM LCF$CODE U(00,50,10); #CIO FUNCTION CODE #
ITEM LCF$CBIT B(00,59,01) = [TRUE]; # CIO COMPLETE BIT #
ITEM LCF$L U(01,36,06) =[0]; # FET LEN IN EXCESS OF 5 WRDS#
ITEM LCF$FIRST U(01,42,18); #FIRST WORD ADDR OF CIO BUFF #
ITEM LCF$IN U(02,00,60); #NEXT DATA IN POINTER #
ITEM LCF$OUT U(03,00,60); #NEXT DATA OUT POINTER #
ITEM LCF$LIMIT U(04,42,18); #LAST WORD ADDR + 1 OF CIO BUF #
END
#
* LCFWSA - LCF WORKING STORAGE AREA.
*
* THIS IS THE WORKING STORAGE OF LCF RECORD.
#
ARRAY LCFWSA[00:00] S(LCFPTSIZ$);
BEGIN
ITEM LFW$RCNAM C(00,00,07); # RECORD NAME #
ITEM LFW$RCNAM1 C(01,00,07); # RECORD NAME IN LAST RECORD #
ITEM LFW$ANAM C(00,00,07); # APPL NAME #
ITEM LFW$MXCOP U(00,42,04); # MAX NUMBER COPIES #
ITEM LFW$XFERF B(00,53,01); # NETXFER FLAG #
ITEM LFW$KDSPF B(00,54,01); # K-DISPLAY FLAG #
ITEM LFW$PRUF B(00,55,01); # PRU INTERFACE FLAG #
ITEM LFW$RS B(00,56,01); # REQUEST STARTABLE INDICATOR #
ITEM LFW$PPF B(00,57,01); # PRIVILEGED PROGRAM FLAG #
ITEM LFW$UIDF B(00,58,01); # UNIQUE IDENTIFER REQUIRED FLAG#
ITEM LFW$DIF B(00,59,01); # APPL DISABLED FLAG #
ITEM LFW$RWC U(01,42,18); # RECORD WORD COUNT #
ITEM LFW$DAT C(02,00,20); # CREATION DATE AND TIME #
ITEM LFW$DATE C(02,00,10); # CREATION DATE #
ITEM LFW$TIME C(03,00,10); # CREATION TIME #
ITEM LFW$TITLE C(08,00,50); # TITLE- TRUNCATED TO 50 CHAR #
ITEM LFW$VALIDW U(16,00,60); # VALID LCF INDICATOR WORD #
END
#
* REN - RESERVED ENTRY NAME.
*
* THIS ARRAY DEFINES THE NAME USED IN COMTNAP FOR ENTRIES THAT
* ARE RESERVED FOR LATER USE.
*
#
ARRAY REN [00:00] S(1);
BEGIN
ITEM REN$ANAM U(00,00,42);
ITEM REN$AN1 U(00,00,12) = [O"7777"];
ITEM REN$AN2 U(00,12,30) = [0];
END
#
* TCMTNAP - TEMPLATE FOR COMTNAP.
*
* THIS IS A TEMPLATE FOR THE ENTRY IN THE NOS VALIDATION COMMON
* DECK - COMTNAP. EACH ENTRY REPRESENTS AN APPLICATION, AND THE
* ENTRY SIZE IS ONE WORD.
#
BASED ARRAY TCMTNAP[00:00] S(1);
BEGIN
ITEM TCM$ANAM C(00,00,07); # APPLICATION NAME #
ITEM TCM$ANAMU U(00,00,42); # APPLICATION NAME(UNSIGNED INT)#
ITEM TCM$AWBP U(00,54,06); # ACCESS-WORD-BIT-POSITION #
END
#
* BNAMLEV - BASED ARRAY FOR NAM LEVEL MESSAGE BUFFER.
#
BASED ARRAY BNAMLEV[00:00] S(2);
BEGIN
ITEM BNL$VER C(00,54,03);
ITEM BNL$LEV C(01,30,03);
END
#
* NVFLEV - NVF VERSION AND LEVEL BUFFER.
#
ARRAY NVFLEV[00:00] S(NVFLEVL$);
BEGIN
ITEM NLV$WORD0 U(00,00,60) = [0];
ITEM NLV$PSFC U(00,00,16) = [HOPLG];
ITEM NLV$MSG C(01,00,35) =
["NV/ HH.MM.SS. VER VER - LVL."];
ITEM NLV$TIM C(02,00,10);
ITEM NLV$VER C(03,30,03);
ITEM NLV$LVL C(04,06,03);
ITEM NLV$ZRO U(04,30,30) = [0];
END
#
* LCFBDT - LCF BUILD DATE AND TIME BUFFER.
#
ARRAY LCFBDT[00:00] S(LCFBDTL$);
BEGIN
ITEM LBT$WORD0 U(00,00,60) = [0];
ITEM LBT$PSFC U(00,00,16) = [HOPLG];
ITEM LBT$MSG C(01,00,44) =
["NV/ HH.MM.SS. LCF YY/MM/DD, HH.MM.SS."];
ITEM LBT$TIM C(02,00,10);
ITEM LBT$DATE C(03,30,08);
ITEM LBT$TIME C(04,30,08);
ITEM LBT$ZRO U(05,24,36) = [0];
END
#
* LCFTIT - LCF TITLE BUFFER.
#
ARRAY LCFTIT[00:00] S(LCFTITL$);
BEGIN
ITEM LTL$WORD0 U(00,00,60) = [0];
ITEM LTL$PSFC U(00,00,16) = [HOPLG];
ITEM LTL$MSG C(01,00,21) =
["NV/ HH.MM.SS. "];
ITEM LTL$TIM C(02,00,10);
ITEM LTL$TITLE C(03,06,50);
ITEM LTL$ZRO U(08,06,54) = [0];
END
#
* LCFMSG1 AND LCFMSG2 - LCF MESSAGE 1 AND 2 ARRAYS
*
* LCFMSG1 AND LCFMSG2 CONTAINS THE FOLLOWING MESSAGES TO BE
* SENT TO SYSTEM DAYFILE, LOCAL DAYFILE, AND A AND B DISPLAY.
#
ARRAY LCFMSG1[00:00] S(2);
BEGIN
ITEM L1$MSG C(00,00,09) = [" BAD LCF."];
ITEM L1$ZERO U(00,54,06) = [0]; # ZERO BYTE TERMINATOR #
ITEM L1$ZERO1 U(01,00,60) = [0];
END
ARRAY LCFMSG2[00:00] S(3);
BEGIN
ITEM L2$MSG C(00,00,20) = [" LCF DOES NOT EXIST."];
ITEM L2$ZERO U(02,00,60) = [0]; # ZERO BYTE TERMINATOR #
END
CONTROL EJECT;
VAPMASK = 0; # PRESET VALIDATION MASK TO 0 #
APPLS(CMTNAP,NAPPLS); # GET COMTNAP ADDR, AND NO OF APPLS #
P<TCMTNAP> = CMTNAP; # PLACE TEMPLATE ON THE COMMON DECK #
TOTAPPLS = NAPPLS + XTRAPPLS$; # GET TOTAL NO. OF APPLS IN AST #
SSTETS(P<AST>, 0, ASTSIZ$ * TOTAPPLS); # ENLRGE AST & PRESET 0#
#
* TRANSFER DATA FROM COMTNAP TO AST.
* SPECIAL CASE NS, SINCE AT CURRENT LEVEL OF SOFTWARE, NS CANNOT
* SUPPORT TERMINAL CONNECTION, SO IT WILL NOT BE FOUND IN COMTNAP.
#
AST$ANAM[0] = "NS";
AST$KDSPF[0] = TRUE; # K-DISPLAY ALWAYS SET FOR NS #
AST$AWBP[0] = NSAWBP$; # SET NS AWBP TO OUT OF RANGE #
AST$JSN[0] = " "; # SET JSN #
AST$MXCOP[0] = 1; # SET MAX COPY TO 1 #
AST$SANAM[0] = "NS"; # SET SEC NAME EQUAL TO PRI NAME#
#
* SPECIAL CASE PTF, PTFS, QTF, AND QTFS, AS THEY ARE NOT IN COMTNAP.
#
AST$ANAM[1] = "PTF";
AST$ANAM[2] = "PTFS";
AST$ANAM[3] = "QTF";
AST$ANAM[4] = "QTFS";
FOR I = 1 STEP 1 UNTIL 4
DO
BEGIN
AST$AWBP[I] = NSAWBP$; # SET AWBP TO OUT OF RANGE #
AST$JSN[I] = " ";
AST$MXCOP[I] = 1;
AST$SANAM[I] = AST$PANAM[I];
END
NENTRY = 5; # SET ENTRY COUNT TO ONE FOR NS #
FOR I = 1 STEP 1 UNTIL NAPPLS
DO
BEGIN
IF TCM$ANAMU[I-1] NQ REN$ANAM[0]
THEN
BEGIN
AST$ANAM[NENTRY] = TCM$ANAM[I-1];
AST$AWBP[NENTRY] = TCM$AWBP[I-1];
AST$JSN[NENTRY] = " ";
AST$MXCOP[NENTRY] = 1;
AST$SANAM[NENTRY] = AST$PANAM[NENTRY];
IF AST$ANAM[NENTRY] EQ "CS"
THEN AST$KDSPF[NENTRY] = TRUE;# K-DISPLAY ALWAYS SET FOR CS #
IF AST$ANAM[NENTRY] EQ "RBF"
OR AST$ANAM[NENTRY] EQ "PSU"
THEN
BEGIN
AST$PRUF[NENTRY] = TRUE; # PRU FLAG ALWAYS SET FOR RBF #
END # AND PSU #
NENTRY = NENTRY + 1; # INCREMENT THE ENTRY COUNT #
END
END
IF NENTRY LS TOTAPPLS
THEN # IF NOT ALL THE ENTRIES WERE STORED #
BEGIN # RELEASE UNUSED SPACE #
SSTATS(P<AST>,(NENTRY-TOTAPPLS)*ASTSIZ$);
END
#
* DETERMINE IF BIT NOT UNIQUE TO APPLICATION. (MORE THAN ONE
* APPLICATION SHARES THE SAME AWBP). IF BIT NOT UNIQUE, SET BIT
* IN BOTH THE INITIAL ENTRY AND THE CURRENT ENTRY.
#
FOR I = 1 STEP 1 UNTIL NENTRY-1
DO
BEGIN
IF NOT AST$BNUF[I]
THEN
BEGIN
MATCH = FALSE;
FOR II = I+1 STEP 1 UNTIL NENTRY-1
DO
BEGIN
IF AST$AWBP[II] EQ AST$AWBP[I] AND # ALLOW MANDATORY IAF #
AST$ANAM[II] NQ "MAIL" AND # APPL THOUGH MAIL IS #
AST$ANAM[I] NQ "MAIL" # AN EQUIVALENCE ON IT#
THEN
BEGIN
AST$BNUF[II] = TRUE; # SET BIT NOT UNIQ IN CUR APPL #
MATCH = TRUE;
END
END
IF MATCH
THEN AST$BNUF[I] = TRUE; # SET BIT NOT UNIQ IN INIT APPL #
END
END
#
* BUILD VALID APPLICATION MASK
#
FOR I = 1 STEP 1 UNTIL NENTRY-1
DO
BEGIN
B<59-AST$AWBP[I],1>VAPMASK = 1;
END
#
* INITIALIZES ADDRESS IN LCF FET.
* NOTE: VCB CIRCULAR BUFFER IS USED HERE FOR THE SAKE OF
* CONSERVING MEMORY. THIS HAS NOTHING TO DO WITH VCB FILE.
#
LCF$FIRST[0] = LOC(VCBBUFR);
LCF$IN[0] = LOC(VCBBUFR);
LCF$OUT[0] = LOC(VCBBUFR);
LCF$LIMIT[0] = LCF$FIRST[0] + VBBUFLIM$ + 1;
#
* READ THE LCF
#
SKIPEI(LCFFET); # SKIP TO END OF INFORMATION #
SKIPB(LCFFET,2); # SKIP BACKWARD 2 RECORDS #
READ(LCFFET); # READ THIS LAST RECORD TO CIO BUFF #
READW(LCFFET,LCFWSA,LCFPTSIZ$,STATS); # TRNSFR THE RECD TO WSA #
IF STATS EQ -2
THEN
BEGIN # LCF DOES NOT EXIST #
MESSAGE(LCFMSG2[0], DFILE$);
NVFIIAP;
END
IF LFW$VALIDW[0] EQ 0
THEN
BEGIN # BAD LCF #
MESSAGE(LCFMSG1[0], DFILE$);
NVFIIAP;
END
#
* SEND NVF VERSION NUMBER AND THE LCF BUILD DATE AND TIME, AND
* TITLE TO NAM DAYFILE.
#
ABHWORD[0] = 0;
ABHABT[0] = APPCMD;
ABHACT[0] = CT60TRANS;
WCB$WORD[0] = 0;
P<BNAMLEV> = LOC(NAMLEV); # NVF VERSION AND LVL MSG #
NLV$TIM[0] = CTM$CLOCK[0];
NLV$VER[0] = BNL$VER[0];
NLV$LVL[0] = BNL$LEV[0];
ABHTLC[0] = NVFLEVL$;
WCB$WC[0] = NVFLEVL$ + 2;
SSTAQE(P<OTQ>, WCBUF[0],ABHBUF[0], NVFLEV[0]);
LBT$TIM[0] = CTM$CLOCK[0]; # LCF BUILD DATE AND TIME MSG #
LBT$DATE[0] = LFW$DATE[0];
LBT$TIME[0] = LFW$TIME[0];
ABHTLC[0] = LCFBDTL$;
WCB$WC[0] = LCFBDTL$ + 2;
SSTAQE(P<OTQ>, WCBUF[0], ABHBUF[0], LCFBDT[0]);
LTL$TIM[0] = CTM$CLOCK[0]; # LCF TITLE MSG #
LTL$TITLE[0] = LFW$TITLE[0];
ABHTLC[0] = LCFTITL$;
WCB$WC[0] = LCFTITL$ + 2;
SSTAQE(P<OTQ>, WCBUF[0], ABHBUF[0], LCFTIT[0]);
# SAVE THE LCF CREATION DAY AND TIME IN *LCFVRN* #
LFV$VRN[0] = "LCF VERSION ";
LFV$DAT[0] = LFW$DAT[0];
LFV$ZERO[0] = 0;
REWIND(LCFFET); # REWIND LCF TO POINT TO BOF #
READ(LCFFET); # READ FILE HEADER RECORD TO CIO BUFF #
READW(LCFFET,LCFWSA,LCFPTSIZ$,STATS); # DISCARD THIS RECD #
#
* PROCESS THE REST OF RECORDS IN THE LCF.
#
LAST$RCNAM = " "; # INITIALIZE LAST RECORD NAME TO BLANK #
FOR K = 0 WHILE NOT ENDPROCG
DO
BEGIN # PROCESSING RECORDS IN LCF #
READ(LCFFET); # READ NEXT RECORD #
READW(LCFFET,LCFWSA,2,STATS); # TRNSFR FIRST 2 WORDS TO WSA #
# WHEN SOME RECORD SIZE IS AN EXACT MULTIPLE OF PRU. THE COMBI-#
# NATION OF READ AND READW USED IN THIS LOOP MAY NOT ALWAYS #
# FUNCTION AS EXPECTED. THESE TWO MACROS MAY HAVE COMPLETELY #
# TRANSFERED A RECORD WITHOUT DISCOVERING THE EOR MARK. IF THIS#
# HAPPENS, THE READ WILL READ, IN THE NEXT ITERATION, AN EOR #
# INSTEAD OF THE NEXT RECORD. TO AVOID THIS, WE WILL SAVE THE #
# RECORD NAM FOR THE CURRENT ITERATION, AND ASSURE THAT WE #
# PROCESS A NEW RECORD FOR EACH ITERATION. #
IF LAST$RCNAM EQ LFW$RCNAM[0]
THEN
BEGIN
# THE READ DID NOT READ IN A NEW RECORD, GO BACK DO IT OVER #
TEST K;
END
ELSE
BEGIN
LAST$RCNAM = LFW$RCNAM[0]; # SAVE CURRENT RECORD NAME #
END
IF LFW$RCNAM[0] EQ "APPL"
THEN
BEGIN
GOTO LLAPPL;
END
ELSE IF LFW$RCNAM[0] EQ "USER"
THEN
BEGIN
GOTO LLUSER;
END
ELSE IF LFW$RCNAM[0] EQ "OUTCALL"
THEN
BEGIN
GOTO LLOUTCALL;
END
ELSE IF LFW$RCNAM[0] EQ "INCALL"
THEN
BEGIN
GOTO LLINCALL;
END
ELSE IF LFW$RCNAM[0] EQ "PATHPID"
THEN
BEGIN
GOTO LLPATHPID;
END
ELSE IF LFW$RCNAM1[0] EQ "ENDLCF"
THEN
BEGIN
ENDPROCG = TRUE;
GOTO ENDCASE; # DONT CARE ABOUT LAST RECD #
END
ELSE # UNKNOWN RECORD TYPE, ABORT NVF #
BEGIN
MESSAGE(LCFMSG1[0], DFILE$);
NVFIIAP;
END
LLAPPL: # RECORD TYPE = APPLICATION #
TAPENTRY = LFW$RWC[0] - 1; # TOTAL NO OF APPL ENTRY #
IF TAPENTRY EQ 0
THEN GOTO ENDCASE; # EMPTY APPL RECORD #
FOR J = 0 STEP 1 UNTIL TAPENTRY - 1
DO # LOOP UNTIL APPL RECORD EXHAUSTED #
BEGIN
READW(LCFFET,LCFWSA,APESIZ$,STATS); # TRNSFR ENTRY TO WSA #
MATCH = FALSE;
FOR I = 0 STEP 1 WHILE I LS NENTRY AND NOT MATCH
DO # SEARCH AST FOR APPL #
BEGIN
IF LFW$ANAM[0] EQ AST$ANAM[I]
THEN
BEGIN
AST$XFERF[I] = LFW$XFERF[0];
AST$KDSPF[I] = LFW$KDSPF[0];
AST$UIDF[I] = LFW$UIDF[0];
AST$DIF[I] = LFW$DIF[0];
AST$PPF[I] = LFW$PPF[0];
AST$RS[I] = LFW$RS[0];
AST$MXCOP[I] = LFW$MXCOP[0];
IF AST$MXCOP[I] EQ 0 # 2.2 LCF HAS MXCOP = 0 #
THEN
BEGIN
AST$MXCOP[I] = 1; # CHANGE MXCOP TO 1 #
END
AST$USANAM[I] = AST$UPANAM[I];
IF AST$ANAM[I] NQ "RBF" # DO NOT SET PRU FLAG FOR #
THEN # RBF - IT IS ALREADY SET #
BEGIN
AST$PRUF[I] = LFW$PRUF[0];
END
MATCH = TRUE;
END
END
END
TEST K;
LLUSER: # RECORD TYPE = USER #
#
* ALLOCATE TABLE SPACE TO THE AUTO LOGIN TABLE. FOR EACH ENTRY IN
* THE USER RECORD, ENTER IT INTO THE ALT UNTIL AN END OF RECORD IS
* DETECTED.
#
SSTATS(P<ALTB>,LFW$RWC[0]-1);
FOR J=0 STEP 1 WHILE STATS EQ TRNS$OK
DO
BEGIN
READW(LCFFET,ALTB[J],ALTSIZ$,STATS);
END
TEST K;
LLOUTCALL: # RECORD TYPE = OUTCALL #
SSTATS(P<OUTSMQ>,LFW$RWC[0] - 1);
READW(LCFFET,OUTSMQ,OUTSMQL,STATS);
TEST K;
LLINCALL: # RECORD TYPE = INCALL #
SSTATS(P<INSMQ>,LFW$RWC[0] - 1);
READW(LCFFET,INSMQ,INSMQL,STATS);
TEST K;
LLPATHPID:
SSTATS(P<LLPID>,LFW$RWC[0] - 1);
READW(LCFFET,LLPID,LLPIDL,STATS);
TEST K;
ENDCASE:
END # PROCESS RECORDS IN LCF #
END # NVFIAST #
TERM