*DECK NVFTETC
USETEXT TEXTNVF
USETEXT TEXTSS
USETEXT TXSMNVF
USETEXT TXTANVF
USETEXT TXTAPSS
USETEXT TXTSUSS
PROC NVFTETC((PT));
# TITLE NVFTETC - END TERMINAL CONNECTION #
BEGIN # NVFTETC #
#
** NVFTETC - END TERMINAL CONNECTION.
*
* E. THAVIKULWAT 81/11/13
*
* THIS PROCEDURE'S MAIN FUNCTION IS TO TERMINATE THE CONNECTION AND
* DELETE ITS ASSOCIATED TABLE(S). IT IS CALLED INTO EXECUTION BY
* THE FOLLOWING PROCEDURES:
* *NVFTCB* *NVFTCRN* *NVFTDAD* *NVFTINA* *NVFTITE*
* *NVFTPUV* *NVFTRVD* *NVFTVVD*
*
* PROC NVFTETC((PT))
*
* ENTRY:
* PT = POINTER TO PTAC ENTRY
*
* EXIT:
* CONNECTION TERMINATED.
*
* NOTES:
* 1) NO CR/TRM SM IS ISSUED IF THE CONNECTION DOES NOT BELONG TO
* NVF (ACN = 0).
* 2) NON-ZERO USER INDEX AND INCREMENT FAMILY COUNT FLAG NOT SET
* INDICATES NON-INITIAL LOGIN.
*
* METHOD:
* DECREMENT FAMILY COUNT AND ISSUE *AEUN* ACCOUNT DAYFILE MESSAGE.
* SEND CR/TRM SM IF ACN NON-ZERO (NVF'S CONNECTION). FOR
* SYNCHRONOUS INTERACTIVE DEVICES, DELETE IT'S ENTRY FROM THE
* *PDCT* TABLE. RETURN THE VCB ORDINAL AND DELETE IT'S *PTAC*
* ENTRY. IF THE USER IS NOT ALLOWED MULTIPLE CONCURRENT LOGINS,
* REMOVE IT'S ENTRY FROM THE *RML* TABLE.
#
#
**** PROC NVFTETC - XREF LIST.
#
$BEGIN
XREF
BEGIN
PROC ABORT; # ABORT NVF JOB #
PROC MESSAGE; # SEND MESSAGE TO SYSTEM AND USER DAYFILE #
END
$END
XREF
BEGIN
PROC NVFUFVO; # FREE VCB ORDINAL #
PROC NVFTIAM; # ISSUE ACCOUNT DAYFILE MESSAGE #
PROC NVFTURL; # UPDATE THE RESTRICT LOGIN TABLE #
PROC NVFUMQE; # TRANSFER SM OR TEXT TO QUEUE #
PROC SSTRTS; # REMOVE TABLE SPACE #
END
#
****
#
ITEM LNGTH I; # LENGTH OF MESSAGE #
ITEM NAME C(7); # NAME TO SEARCH *PDCT* FOR #
ITEM ORD I; # *PDCT* ORDINAL TO REMOVE SPACE AT #
ITEM PC I; # *PDCT* ENTRY (CONSOLE) ORDINAL #
ITEM PD I; # *PDCT* PASSIVE DEVICE ORDINAL #
ITEM PT I; # SUBSCRIPT FOR ARRAY PTAC #
ITEM WC I; # NUMBER OF WORDS TO DELETE FROM *PDCT* #
$BEGIN
#
* FOLLOWING ARRAY CONTAINS MESSAGE ISSUED TO THE DAYFILE UPON NOT
* FINDING AN EXPECTED PDCT ENTRY.
#
ARRAY DAYMSG[00:00] S(5);
BEGIN
ITEM DAY$MSG1 C(00,00,27) = ["NVFTETC - CANNOT FIND PDCT "];
ITEM DAY$MSG2 C(02,42,17) = ["ENTRY FOR TERMNAM"];
ITEM DAY$TNAME C(03,42,07); # TERMINAL NAME #
END
$END
#
* SECURITY COUNT FLAG NOT SET AND USER INDEX NON-ZERO INDICATES A
* VALID USER AND THAT FAMILY COUNT HAS BEEN INCREMENTED.
* THEREFORE, FAMILY COUNT MUST BE DECREMENTED PRIOR TO TERMINATION.
#
IF (PTA$DT[PT] EQ DT$CONS)
OR (PTA$DT[PT] EQ DT$CLP)
OR (PTA$DT[PT] EQ DT$USER)
THEN # INTERACTIVE DEVICES #
BEGIN
IF (PTA$UIDX[PT] NQ 0)
AND (NOT PTA$SCEF[PT])
THEN # VALID USER #
BEGIN
P<CRQBUF> = LOC(MSGBUF[0]) + ((NMSGBUF$ + 1) / 2);
CRQ$FCWORD[0] = 0; # CLEAR CPM REQUEST BUFFER #
CRQ$FWORD[0] = 0;
CRQ$FC[0] = CPM73B$; # DECREMENT FAMILY COUNT #
CRQ$ACN[0] = 0;
CRQ$FNAM[0] = PTA$FNAM[PT];
LNGTH = CRQDSIZ$ * 10;
NVFUMQE(P<CPMRQ>,CRQBUF[0],APPTTX$,0,LNGTH); # REQ TO QUEUE #
IF (NOT PTA$CACA[PT]) AND (NOT PTA$INVPID[PT]) # MULT CONCNT #
AND (PTA$PROMPT[PT] NQ AWTPID$) # LOGINS PROHIB AND VALID#
THEN # USER AND NOT WAITING FOR PID #
NVFTURL(PT); # REMOVE THE *RML* ENTRY #
#
* DETERMINE IF *AEUN* ACCOUNT DAYFILE MESSAGE MUST BE ISSUED.
* MESSAGE IS ISSUED ONLY IF THE *ABUN* (SUCCESSFUL USER LOGIN)
* ACCOUNT DAYFILE MESSAGE HAS BEEN ISSUED.
#
IF (PTA$PROMPT[PT] EQ AWTAPP$)
OR (NOT PTA$IUVF[PT])
THEN # MUST ISSUE *AEUN* ACOUNT MSG #
BEGIN
NVFTIAM(PT,AEUN$); # ISSUE *AEUN* ACCOUNT MESSAGE #
END
END
END
#
* BUILD CR/TRM SM ONLY IF ACN IS NON-ZERO (NVF'S CONNECTIONS).
#
IF PTA$ACN[PT] NQ 0
THEN # MUST SEND CR/TRM SM #
BEGIN
SPMSG0[1] = 0; # CLEAR RESPONSE AREA #
PFCSFC[1] = CRTRM;
CRRTRM[1] = PTA$RC[PT];
CRACN[1] = PTA$ACN[PT];
NVFUMQE(P<CTQ>,APSM[1],APPPR$,0,LCRTRM); # TRANSFER SM TO Q #
END
#
* FOR SYNCHRONOUS DEVICES, DELETE ITS ENTRY FROM THE *PDCT* TABLE.
* FOR CONSOLES THIS MEANS DELETE THE ENTIRE ENTRY. FOR PASSIVE
* DEVICES THIS MEANS DELETE THE SINGLE WORD FOR THE PASSIVE DEVICE.
#
IF PTA$TC[PT] GQ TC9$ # SYNCHRONOUS DEVICE #
THEN
BEGIN
IF PTA$DT[PT] NQ DT$CONS
AND PTA$DT[PT] NQ DT$USER
THEN # PASSIVE DEVICE #
NAME = PTA$OCN[PT]; # WILL SEARCH FOR OWNING CONSOLE#
ELSE # CONSOLE #
NAME = PTA$TN[PT];
PDT$CN[PDTLNGTH] = NAME; # INSURE LOOP TERMINATION #
FOR PC=0 STEP PDT$WC[PC]
WHILE PDT$CN[PC] NQ NAME
DO # FIND CORRECT *PDCT* ENTRY #
BEGIN END
ORD = PC;
WC = PDT$WC[PC];
PD = 0;
IF PC LS PDTLNGTH
AND PTA$DT[PT] NQ DT$CONS
AND PTA$DT[PT] NQ DT$USER
THEN # MUST SEARCH FOR PASS DEV WORD #
BEGIN
FOR PD = PC+PDCTSIZ$ STEP 1
WHILE PDT$PN[PD] NQ PTA$TN[PT]
AND PD LS PC+WC
DO # FIND PASS DEV WD IN PDCT NTRY #
BEGIN END
ORD = PD;
WC = 1;
END
$BEGIN
IF PC GQ PDTLNGTH
AND (PTA$DT[PT] EQ DT$CONS OR PTA$DT[PT] EQ DT$USER)
THEN # NO *PDCT* ENTRY FOR CONSOLE #
BEGIN
DAY$TNAME[0] = PTA$TN[PT];
MESSAGE (DAYMSG, 0);
ABORT;
END
$END
IF PC LS PDTLNGTH
AND PD LS PC+PDT$WC[PC]
THEN # MUST DELETE SPACE IN *PDCT* #
BEGIN
SSTRTS (P<PDCT>, ORD, WC);
IF WC EQ 1
THEN
PDT$WC[PC] = PDT$WC[PC] - 1;
END
END # SYNCHRONOUS DEVICE LOGIC #
#
* RETURN THE VCB ORDINAL AND DELETE *PTAC* ENTRY.
#
NVFUFVO(PTA$VCB[PT]); # FREE UP THE VCB ORDINAL #
PT = PT * PTACSIZ$;
SSTRTS(P<PTAC>,PT,PTACSIZ$); # DELETE PTAC ENTRY #
END # END NVFTETC #
TERM