1 ! ! L O G O U T 2! PROGRAM : LOGOUT.BAS 5! VERSION : 6B 6! EDIT : 03 7! EDIT DATE : 22-NOV-76 9! AUTHOR : JMM 11 ! ! C O P Y R I G H T ! Copyright (C) 1974, 1975, 1976 ! Digital Equipment Corporation, Maynard, Massachusetts ! ! ! This software is furnished under a license for use only on a ! single computer system and may be copied only with the ! inclusion of the above copyright notice. This software, or ! any other copies thereof, may not be provided or otherwise ! made available to any other person except for use on such ! system and to one who agrees to these license terms. Title to ! and ownership of the software shall at all times remain in ! DIGITAL. ! ! The information in this software is subject to change without ! notice and should not be construed as a commitment by Digital ! Equipment Corporation. ! ! DIGITAL assumes no responsibility for the use or reliability ! of its software on equipment that is not supplied by DIGITAL. ! !******************************************************************** 20 ! ! M O D I F I C A T I O N H I S T O R Y 21! VER/ED EDIT DATE REASON 100 ! ! G E N E R A L D E S C R I P T I O N 101! THIS ROUTINE: 102! CLOSES ALL OPEN CHANNELS; 103! DEASSIGNS ALL DEVICES; 104! UPDATES STATISTICS ON DISK; 105! CLEARS THE JOB FROM MONITOR MESSAGE TABLE; 106! DISASSOCIATES THE PROJECT,PROGRAMMER NUMBER FROM ! THE JOB NUMBER. 110! IT IS INVOKED BY THE USER TYPING "BYE" AT A LOGGED-IN TERMINAL. 115! IF THE USER TYPES "BYE", A RESPONSE TO "CONFIRM:" IS REQUESTED ! AND THE RESPONSE SIGNALS THE TYPE OF LOGOUT. 120! IF THE USER TYPES "BYEX", WHERE "X" IS ANY LEGAL CHARACTER, ! CORE COMMON CONTAINS "/X" AND "CONFIRM:" IS NOT ASKED. 300 ! ! I / O C H A N N E L S 301! CHANNEL # USED FOR ! 310! 1 KB INPUT 400 ! ! V A R I A B L E D E F I N I T I O N S 401! VARIABLE NAME USED FOR ! 410! A$ FILENAME AND EXT FOR INDIVIDUAL FILE DELETION 420! I% ACTIVE JOB COUNTER; ELAPSED TIME STORAGE 430! I0% ELAPSED TIME CALCULATION ! J% USER'S JOB # 440! L$ READS CORE COMMON; ACCEPTS KB INPUT 450! L9% INDICATOR FOR NORMAL(0%) OR FAST(-1%) LOGOUT 460! M() ACCOUNTING INFORMATION STORED HERE 470! N() DIRECTORY LOOKUP INFORMATION STORED HERE 480! Q CALCULATES DISK QUOTA; HOLDS TIME IN SECONDS 490! Q0 JOB CONNECT TIME IN MINUTES 500! T CALCULATES BLOCKS OWNED; JOB CPU TIME 800 ! ! F U N C T I O N / S U B R O U T I N E D E S C . 801! FUNCTION/SUBROUTINE USE ! 810! LINE 10010 DISPLAYS TIME: HOURS, MINUTES, SECONDS. 855! SYS(6,4) LOG-IN 860! SYS(6,5) LOG-OUT 865! SYS(6,9,0) SYSTEM HEADER LINE 870! SYS(6,14) USER'S ACCOUNTING DATA 875! SYS(6,15) DIRECTORY LOOK-UP 880! SYS(7) READS CORE COMMON 885! SYS(5) EXIT AND CLEAR PROGRAM FROM MEMORY 900 ! ! D I M E N S I O N S T A T E M E N T S 910 DIM M%(30) ! ACCOUNTING INFO READ INTO THIS STRING. 920 DIM N%(30) ! WORK AREA TO PROCESS DIRECTORY LOOKUP. 930 DIM #12%, U% (63%), U0% (63%, 6%), U$ (63%) = 9% ! LEA1.DAT DECLARATION 999 ! ! M A I N C O D I N G 1000 ON ERROR GOTO 19000% \ PRINT IF POS(0%)<>0% ! SET UP STANDARD ERROR TRAP; RETURN KB TO LEFT MARGIN. 1010 L$=CVT$$(SYS(CHR$(7%)),-1%) \ FOR I%=6% TO 1% STEP -1% \ IF LEFT(L$,I%)=LEFT("LOGOUT",I%) THEN L$=RIGHT(L$,I%+1%) \ GOTO 1040 1020 NEXT I% \ FOR I%=3% TO 1% STEP -1% \ IF LEFT(L$,I%)=LEFT("BYE",I%) THEN L$=RIGHT(L$,I%+1%) \ GOTO 1040% 1030 NEXT I% 1040 L5% = 4% : A% = PEEK(PEEK(PEEK(520%)+8%)+24%) : L5% = L5% OR 3% IF (SWAP%(A%) AND 255%) = 1% : L$=RIGHT(L$,2%) IF ASCII(L$)=47% AND LEN(L$) <> 1% 1050 ON ERROR GOTO 19000% ! RE-SET STANDARD ERROR TRAP. 1060 PRINT "Confirm: "; IF LEN(L$)=0% ! IF USER TYPED JUST "BYE" DO THE CONFIRM BIT. 1070 J%,U%=(PEEK(518%) AND 255%)/2% \ CHANGE SYS(CHR$(6%)+CHR$(-10%)+ "????"+RIGHT(NUM1$(100%+J%),2%)+".TMP") TO M% \ M%(1%)=6% \ M%(2%)=17% \ M%(3%),M%(4%)=0% \ CHANGE M% TO A$ ! GET THE USER'S JOB # ! SET UP TO DELETE THE TEMP FILE: "TEMPNN.TMP" (WHERE NN IS THE ! USER'S JOB NUMBER) FROM THE USER'S FILE DATA AS WELL AS ALL ! OTHER "????NN.TMP" FILES. 1075 CHANGE SYS(A$) TO M% \ KILL RAD$(M%(7%)+SWAP%(M%(8%)))+RAD$(M%(9%)+SWAP%(M%(10%)))+ "."+RAD$(M%(11%)+SWAP%(M%(12%))) \ GOTO 1075 ! PLOW THROUGH USER'S "????NN.TMP" FILES, KILLING EACH. 1080 CHANGE SYS(CHR$(6%)+CHR$(14%)) TO M% ! READS THE USER'S ACCOUNTING DATA INTO ARRAY M. 1090 Q=256.*M%(28%)+M%(27%) \ T=256.*M%(6%)+M%(5%) ! CALCULATES DISK QUOTA, Q, AND DISK USED, T. 1100 IF LEN(L$)=0% THEN OPEN "KB:LOGOUT.CMD" FOR INPUT AS FILE 1% \ INPUT #1%,L$ \ L$=CVT$$(L$,-1%) \ CLOSE 1% ! IF "CONFIRM:" WAS DISPLAYED, READ THE USER'S RESPONSE ! TO IT; STRIP OFF ALL BUT THE DATA BITS. 1110 IF ASCII(L$)=78% THEN GOTO 19030% ELSE IF L$="I" THEN GOTO 1200% ELSE IF L$="?" THEN GOTO 1150% ELSE L9%=0% \ IF ASCII(L$)=89% THEN GOTO 1410% ELSE IF L$="F" THEN L9%=-1% \ GOTO 1410% ! L$ CONTAINS THE TYPE OF LOGOUT EITHER ENTERED WITH ! "BYEX" OR IN RESPONSE TO "CONFIRM:" ! (78="N", 89="Y"). 1120 PRINT "Type '?' for help" \ L$="" \ GOTO 1050% ! IF ILLEGAL RESPONSE, TELL THE USER TO ASK FOR HELP; ! INITIALIZE L$ FOR THE INPUT, AND RESTART. 1140 ! ! " ? " = R E S P O N S E P R O C E S S I N G 1150 PRINT "Options for 'Confirm:' are:" \ PRINT " ? This help message" \ PRINT " Y Log me out" \ PRINT " N Don't log me out" 1160 PRINT " I Individual file deletion" \ PRINT " K to delete" \ PRINT " to save" \ PRINT " F Fast logout" ! SHOW USER THE HELP LIST. 1170 L$="" \ GOTO 1050% ! INITIALIZE L$ FOR USER'S NEXT INPUT; RESTART. 1190 ! ! " I " - R E S P O N S E P R O C E S S I N G 1200 ON ERROR GOTO 1320% ! SET ERROR TRAP FOR THIS PROCESSING. 1210 N%(I%)=0% FOR I%=0% TO 30% ! CLEARS ARRAY N(30) TO ZEROES. 1220 N%(3%)=-1% ! SETS THIRD ELEMENT OF ARRAY N. 1240 N%(3%)=N%(3%)+1% \ IF N%(3%)>255% THEN N%(3%)=0% \ N%(4%)=N%(4%)+1% ! N(3) USED TO STEP THRU THE DIRECTORY INDEX; FIRST ! FILE = 0; IF OVERFLOW INCREMENTS N(4). 1250 N%(0%)=30% \ N%(1%)=6% \ N%(2%)=15% ! SETS UP ARRAY N TO CONVERT TO STRING FORMAT AND THEN ! USED TO DO DIRECTORY LOOKUP. 1260 CHANGE N% TO L$ \ CHANGE SYS(L$) TO N% ! DIRECTORY LOOKUP FOR USER'S FILES. 1270 A$=RAD$(N%(7%)+SWAP%(N%(8%)))+RAD$(N%(9%)+SWAP%(N%(10%))) +"."+RAD$(N%(11%)+SWAP%(N%(12%))) ! FILENAME AND EXTENSION STORED IN RADIX 50. 1280 PRINT A$;" ";256.*N%(14%)+N%(13%);" ";N%(15%); " ";DATE$(N%(17%)+SWAP%(N%(18%)));" "; ! PRINTS THE FILENAME AND EXTENSION, BLOCKS USED, ! PROTECTION, AND DATE OF LAST ACCESS. 1290 INPUT L$ \ L$=CVT$$(L$,-1%) ! GET RESPONSE TO THIS FILE, STRIP ALL BUT DATA BITS. 1300 IF L$<>"K" THEN GOTO 1240% ! ANY RESPONSE OTHER THAN "K" WILL SAVE THE FILE. 1310 KILL A$ \ GOTO 1250% ! DELETE THE FILE. 1320 IF ERL=1310% THEN PRINT "Error deleting file - ";A$ \ RESUME 1240% 1330 IF ERL=1260% AND ERR=5% THEN L$="" \ RESUME 1050% 1340 RESUME 19010% ! TAKE CARE OF END OF DIRECTORY. 1400 ! ! " Y " - A N D " F " - R E S P O N S E P R O C. 1410 CHANGE M% TO L$ \ L$=RIGHT(L$,7%) ! TO STRING FORMAT AND TRUNCATE FIRST SIX CHARACTERS. 1420 CHANGE SYS(CHR$(6%)+CHR$(4%)+" "+L$) TO N% ! SETS UP FIRST SIX CHARACTERS AND DOES A LOGIN FOR ! THIS USER IF NOT ALREADY LOGGED-IN. 1430 I%=N%(3%)-1 ! DECREMENTS NUMBER OF JOBS. 1440 IF I% <> 0% THEN GOTO 1500% ELSE IF Q=0 THEN GOTO 1500% ELSE IF T<=Q THEN GOTO 1500% ! I=0 MEANS NO OTHER JOBS LOGGED-IN; Q=0 MEANS UNLIMITED QUOTA. 1450 PRINT "Disk quota of";Q;"exceeded by";T-Q;"blocks" \ PRINT "Some file(s) must be deleted before logging out" \ GOTO 1050% 1500 CHANGE SYS(CHR$(6%)+CHR$(9%)+CHR$(0%)) TO N% \ IF L9%=0% THEN PRINT "Saved all disk files;";T;"block"; \ PRINT "s"; UNLESS T=1. \ PRINT " in use"; \ PRINT ",";Q-T;"free"; IF Q-T>=0 AND Q<>0 \ PRINT \ Q=TIME(0%) \ T=TIME(1%) \ Q0=TIME(2%) ! Q: SECONDS SINCE MIDNIGHT; T: JOB CPU TIME; ! Q0: JOB CONNECT TIME IN MINUTES. 1520 L5% = L5% OR 256% UNLESS L5% AND 2% : OPEN 'LEA1.DAT#' FOR INPUT AS FILE 12%, MODE 5% : L5% = (L5% AND NOT 256%) OR 1% IF U%(U%) : U%(U%) = 0% : U0%(0%,0%) = 0% IF U0%(0%,0%) = U% : U% (0%) = U% (0%) - 1% UNLESS U% (0%) = 0% : U0% (U%, I8%) = 0% FOR I8% = 0% TO 6% : U$ (U%) = FNK1$ (SPACE$ (9%), 0%) : CLOSE 12% 1530 L$ = FNL$ ('logged out') : L$=SYS(CHR$(6%)+CHR$(5%)) \ IF L9% <> 0% THEN PRINT \ GOTO 9020% ! IF FAST LOGOUT SPACE ONE LINE AND GO FINISH. 1560 PRINT "Job";J%;"User ";NUM1$(M%(8%));",";NUM1$(M%(7%)); " logged off KB";NUM1$(N%(2%)/2%);" at ";DATE$(0%);" ";TIME$(0%) ! JOB #, USER #, KB#, CURRENT DATE AND TIME. 1570 IF I%<>0% THEN PRINT NUM1$(I%);" other user"; \ PRINT "s"; UNLESS I%=1% \ PRINT " still logged in under this account" ! # OF OTHER USERS, IF ANY. 1580 PRINT "System "; \ PRINT CHR$(N%(I%)); IF N%(I%) <> 0% FOR I%=3% TO 30% ! SYSTEM HEADER LINE. 1600 PRINT \ PRINT "Run time was"; \ GOSUB 10010% ! T = CPU TIME IN .1 SECS. 1630 PRINT "Elapsed time was"; \ T=Q0*600.+10.*(Q-60.*INT(Q/60.)) \ GOSUB 10010% ! T = CONNECT TIME IN .1 SECS. 2000 DEF FNK1$ (C$, C%) : C% = -1% IF C% = 0% : C$ = LEFT (C$, I8%) + CHR$ (ASCII (MID (C$, I8%+1%, 1%)) XOR (I8%-C%)^2%) + RIGHT (C$, I8%+2%) FOR I8% = 0% TO LEN (C$)-1% : FNK1$ = C$ : FNEND 2100 DEF FNL$ (M$) : FNL$ = SYS (CHR$(6%)+CHR$(22%)+CHR$(-1%)+CHR$(0%) + 'SYSLOG' + STRING$ (10%,0%) + CVT%$ (L5%) + M$ + ' from KB' + NUM1$(ASCII(MID(SYS(CHR$(6%)+CHR$(9%)), 2%,1%))/2%) + ': (LOGOUT)') 2101 FNEND 9000 PRINT "Good "; \ IF Q<43200 THEN PRINT "morning" ELSE IF Q<64800 THEN PRINT "afternoon" ELSE PRINT "evening" 9020 PRINT CHR$(10%); FOR I%=1% TO 12% ! DO THE TWELVE LINE FEEDS. 9030 CLOSE 1% \ L$=SYS(CHR$(5%)) ! EXIT AND CLEAR PROGRAM OUT OF MEMORY. 9040 STOP 10000 ! ! S U B R O U T I N E 10010 I%=T/36000. ! CALCULATES # OF HOURS. 10020 IF I%<>0% THEN PRINT I%;"hour"; \ IF I%=1% THEN PRINT ","; ELSE PRINT "s,"; 10050 T=T-36000.*I% \ I0%=T/600. ! CALCULATES # OF MINUTES. 10070 IF I%<>0% OR I0%<>0% THEN PRINT I0%;"minute"; \ IF I0%=1% THEN PRINT ","; ELSE PRINT "s,"; 10100 T=INT(T-600.*I0%) \ PRINT T/10;"second"; \ IF T/10==1 THEN PRINT ELSE PRINT "s" ! CALCULATES # OF SECONDS. 10130 RETURN 18999 ! ! E R R O R H A N D L I N G 19000 IF ERR = 19% THEN SLEEP 5% : RESUME 19005 IF ERR = 5% AND ERL = 1520% THEN RESUME 1530% ELSE IF ERL = 2100% THEN RESUME 2101 ELSE RESUME 19010% 19010 IF ERR=27% THEN CLOSE 1% \ M$=SYS(CHR$(5%)) \ STOP ! DETACHED KB, SO EXIT AND CLEAR PROGRAM FROM MEMORY. 19020 IF ERL=1075% THEN GOTO 1080% 19030 CLOSE 1% 19040 PRINT \ PRINT 19050 L$=SYS(CHR$(9%)) ! EXIT AND CLEAR PROGRAM FROM MEMORY. 19060 STOP 32767 END