BYE.MAC;2/AU=BYE.VGN -2,2 .IDENT /01.8X/ -24,24 ; VERSION: 01.8X -32,38 -51 ; EB044 3-MAY-77 IMPROVE ABORT SUBROUTINE ; BLS012 12-JUN-77 IF NOT LOGGING OFF OF CO: OUTPUT ; MESSAGE WITH UIC AND TIME TO CO: ; ; BLS018 21-JUN-77 FIX BUG IF NOT MULTI-USER SYSTEM ; ; PL015 10-NOV-77 ADD SUPPORT FOR 3 DIGIT UNIT NUMBERS ; ; JGD01 INSERT TOTAL LOGONTIME INTO ACCOUNT FILE ; PREVENT PRIVLEDGED USER FROM LOGGING OFF ; IF LOGONS DISSABLED. DON'T LOG OFF USER ; IF ACCOUNT FILE BUSY. ; ; JGD04 PASS A REQUEST TO MCR TO UPDATE THE ACCOUNT ; FILE WITH THE NUMBER OF FILES AND DISK BLOCKS ; USED BY THE USER. THECOMMAND IS PASSED TO ...UPD ; WHICH MUST BE INSTALLED. DOCUMENTATION ON ; ...UPD IS CONTAINED IN THE FILE ACCBLK.MAC ; ; JGD05 IF BIT 4 IN U.PRV1 IS SET, TO NOT ABORT NON ; PRIVLEGED TASKS. ; ; JGD06 CHANGE ALL REFERENCES TO U.CW3 TO U.PRV1=U.LUIC-2 ; ; JGD07 MODIFICATIONS TO ALLOW ...SUB, BAT...(PSEUDO BATCH ; USING A VIRTUAL TERMINAL) TO WORK. ; 1) IF CAN'T FIND LOGIN FLAG OR ACCOUNT FILE ERROR ; DON'T PASS MESSAGE TO UPDATE DISK BLOCK USAGE ; SO THAT THE ACCOUNTING PACKAGE MAY BE USED ON ; SYSTEMS WITH MULTIPLEXERS. ; % -54,56,/; JGD01/ .MCALL CMKT$S,WTLO$S,GTIM$S,MTADF$,UCBDF$ .MCALL GLUN$S,OPEN$U,CLOSE$,MRKT$ -,,/;MGL006/ .MCALL QIOW$ MTADF$ ; DEFINE ANSI MAGTAPE DATA STRUCTURES -58,,/; JGD06/ UCBDF$ ; DEFINE TERMINAL UCB OFFSETS .IFNDF D$$H11&D$$J11&D$$M11&D$$ZMD&D$$Z11 U.PRV1=U.CW3 ; FOR SYSTEMS WITH ONLY DL11'S .IFF U.PRV1=U.LUIC-2 ; FOR SYSTEMS WITH MULTIPLEXERS .ENDC -,,/; JGD01/ ; ;CONSTANTS ; LUN1=1 ; TI: LUN LUN2=2 ; ACNT FILE LUN EFN1=1 ; EVENT FLAG FOR ALL I/O GLNBUF: .BLKW 6. ; GET LUN BUFFER ENTRY: .WORD 0 ; ADDRESS OF ACCOUNT ENTRY PRVFLG: .WORD 0 ; FLAG TO INDICATE TERMINAL SHOULD BE RESET PRIVLEGED OPNERR: .WORD 0 ; ACCOUNT FILE OPEN ERROR FLAG -,,/; JGD07/ SKPFLG: .WORD 0 ; =0 ->UPDATE DISK BLOCK USAGE, =1->SKIP UPDATE -71,,/; JGD07/ MSG1B: .ASCIZ <15><12>/>/ ; TO SIGNAL BATCH ALL IS DONE -76,,/; JGD01/ MSG6: .ASCIZ <15><12>/BYE -- STILL LOGGED ONTO FIRST TERMINAL?/<15><12><7>/>/ MSG7: .ASCIZ <15><12>/BYE -- ACCOUNT FILE BUSY -- TRY AGAIN/<15><12><7>/>/ MSG8: .ASCIZ <15><12>/BYE -- PRIVILEGED LOGOFFS DISABLED/<15><12><7> MSG9: .ASCIZ <15><12>/BYE -- ACCOUNT READ ERROR -- GET HELP!/<15><12><7>/>/ MSG10: .ASCIZ <15><12>/BYE -- ACCOUNT FILE LOCKED -- TRY AGAIN!/<15><12><7>/>/ -82,,/; JGD01/ UPDAT: .ASCIZ %UPD XXXX:[GGG,MMM]PASWRD/UP%<15> .EVEN -88,,/; JGD01/ FDPB: QIO$ IO.RVB,LUN2,EFN1,,IOSB,,<$ACTBF,$BFLEN,,,1> IOSB: .BLKW 2 ; IOSTATUS BLOCK -89,,/; JGD021/ MKT: MRKT$ 1,1,2 ; WAIT 1 SECOND -107,,/; JGD01/ BIT #FE.NLG,$FMASK ; ARE LOGONS DISABLED BEQ 201$ ; NO, SO CONTINUE ON WITH LOGOFF BIT #U2.PRV,U.CW2(R0) ; IS TERMINAL PRIVLEGED BEQ 201$ ; NO , SO CONTINUE WITH LOGOF MOV #MSG8,R0 ; PRIVLEDGED, SO PRINT WARNING AND EXIT CALL BYEERR ; WITHOUT LOGING OFF TERMINAL EXIT$S ; EXIT -112,113,/; JGD01/ BIT #U2.PRV,U.CW2(R0) ; IS TERMINAL PRIVLEDGED BEQ 210$ ; IF NOT PRIVLEDGED SKIP OVER INC PRVFLG ; SET PRIVLEGE FLAG FOR LATER 210$: BIS #U2.SLV,U.CW2(R0) ; TEMPORARILY SLAVE TI BIT #U2.HLD,U.CW2(R0) ; IS TERMINAL IN HOLD SCREEN MODE? -195,203,/; JGD01/ GTIM$S #TIMBUF ; GET TIME AND FILL TIME BUFFER MOV TIMBUF+6,R1 ; GET HOUR CALL LOGOFF ; FIND ACCOUNT FOR TERMINAL AND UPDATE ; THE TOTAL LOGON TIME IN MINUTES TST OPNERR ; IF THE ACCOUNT FILE IS BUSY DON'T LOG OFF ; USER. LET HIM TRY AGAIN BEQ BYE1 ; ENTRY MADE INTO ACCOUNT FILE, SO PROCEED ; TO LOG OFF TERMINAL DIR$ #SLVDPB ; ACCOUNT FILE WAS LOCKED ,ATTEMPT QIO$ TO UNSLAVE TI: MOV UCB,R0 ; IN CASE QIO FAILS DO IT DIRECTLY BIC #U2.SLV,U.CW2(R0) ; SO USER CAN TRY AGAIN, IE NON SLAVE BIS #U2.PRV,U.CW2(R0) ; TEMPORARILY MAKE PRIVLEGE TST PRVFLG ; SHOULD TERMINAL BE PRIVLEDGED BGT 50$ ; YES, LEAVE PRIVLEGED AND EXIT BIC #U2.PRV,U.CW2(R0) ; OTHERWISE SET NON PRIVLEDGED 50$: EXIT$S ; LET USER TRY AGAIN TO LOG OFF BYE1: ;CALL LGOLOG ; LOG LOGOUT ON CO: ;BLS012 ; ROL -(SP) ; SAVE C-BIT FOR WAIT-CHECK ;BLS012 -,,/;MLG008/ TST #$USRSB ; SUBROUTINE PRESENT? BEQ 1$ ; IF EQ, NO CALL $USRSB ; CALL USER SUBROUTINE 1$: ; REF LABLE -,,/; JGD07/ TST SKPFLG ; IF>0, TI: IS VT:,MUST SKIP PRINTING EXIT MESSA ; BGT 12$ ; IF GT, SKIP PRINTING BEQ 8$ ; IF EQ, PRINT EXIT MESSAGES MOV #MSG1B,R0 ; IS VT, SO PRINT '>' ON EXIT BR 11$ ; CALL BYEERR TO PRINT MESSAGE 8$: MOV TIMBUF+6,R1 ; GET HOUR MOV #MSG5,R0 ; DEFAULT TO 0-6AM -225,229,/; JGD07 11$: CALL BYEERR ; ISSUE IT 12$: MOV UCB,R0 ; GET TI UCB ADDRESS CLR U.LUIC(R0) ; ZERO LOGIN PROTECTION UIC -,,/; JGD04/ BIT #100,U.PRV1(R0) ; IS BIT 6 OF THE PRIVLEGE MASK WORD SET BEQ 25$ ; NO, SO DON'T UPDATE DISK BLOCK USAGE -,,/; JGD04/ TST SKPFLG ; SHOULD WE SKIP DISK BLOCK USAGE UPDATE ANYWAY BNE 15$ ; IF NE, YES , DON'T SEND A MESSAGE TO ...UPD MOV #UPDAT,R5 ; MOVE IN COMMAND TO UPDATE THE USERS ACCOUNT FI CALL GIVMCR ; GIVE IT TO MCR 15$: MOV UCB,R0 ; GET TI UCB ADDRESS BIS #U2.LOG,U.CW2(R0) ; LOG TERMINAL OFF DIR$ #SLVDPB ; ATTEMPT QIO$ TO UNSLAVE TI: BIC #U2.SLV,U.CW2(R0) ; RESET TERMINAL STATUS DIRECTLY IN CASE QIO FAILS -232,241,/; JGD04/ ; ROR (SP)+ ; NEED TO WAIT ON CO:? ;BLS012 ; BCS 20$ ; IF CS NO ;BLS012 ; CALL $COWAT ; YES--WAIT FOR IT ;BLS012 20$: ;BLS012 MOV UCB,R0 ; GET TI: UCB ADDRESS 25$: BIS #U2.LOG,U.CW2(R0) ; LOG TERMINAL OFF DIR$ #SLVDPB ; ATTEMPT QIO$ TO UNSLAVE TI: BIC #U2.SLV,U.CW2(R0) ; RESET TERMINAL STATUS DIRECTLY IN CASE QIO FAILS MOV $TKTCB,R1 ; GET OUR TCB ADDRESS BIC #T3.MCR,T.ST3(R1) ; INHIBIT PROMPT FROM MCR -,,/; BLS018/ BYEXIT: ; REF LABEL -,,/; EB044/ 30$: EXIT$S ; EXIT BIT #T3.PRV!T3.SLV,T.ST3(R5) ; NO, PRIVILEGED OR SLAVED TASK? -342,343,/; / DIR$ #ERRDPB ; ISSUE MESSAGE BCS 20$ ; ERROR -427,,/; JGD01/ ;+ ; *** -LOGOFF - OPEN ACCOUNT FILE, COMPUTE LOGON TIME FOR THIS TERMINAL ; SESSION(MINUTES), AND ADD TO ACCOUNT FILE VALUE ;- LOGOFF: CLR ENTRY ; ZERO ACCOUNT FILE ENTRY POINT CLR OPNERR ; SET OPEN ERROR FLAG INITIALLY TO "NO ERROR" GLUN$S #LUN1,#GLNBUF ; GET TERMINAL NUMBER CMP #"VT,GLNBUF ; ARE WE TRYING TO LOG OFF OF VIRTUAL TERMINAL? BNE 50$ ; NO, PROCEED AS ALWAYS INC SKPFLG ; YES, SET FLAG SO AS NOT TO UPDATE ACCOUNT BR 100$ ; AND RETURN, POSTHASTE 50$: CALL OPEN ; OPEN [0,0]RSX11.SYS--THE ACCOUNT FILE BCS 100$ ; SKIP ALL THE REST IF THE FILE WON'T OPEN CALL SEARCH ; SEARCH ACCOUNT FILE FOR CURRENT ACCOUNT ; LOGGED ONTO THIS TERMINAL BCS 100$ ; DIDN'T FIND TI# IN ACNT CALL UPDATE ; COMPUTE LOGON TIME FOR THIS TERMINAL ; AND ADD IT TO TOTAL IN ACCOUNT FILE BCS 100$ ; DON'T CLOSE HERE IF FILE LOCKED CALL CLOSE ; CLOSE THE FILE 100$: RETURN ; RETURN AND FINISH LOGGING OFF ;+ ; *** - OPEN - OPEN [0,0]RSX11.SYS FOR UPDATE ;- OPEN: OPEN$U #$ACTFL,,,#FD.RWM ;OPEN [0,0]RSX11.SYS FOR UPDATE BCC 50$ ; CARRY CLEAR IMPLIES FILE OPEN ; IF SET-->FILE LOCKED, BUSY,OR FCS ERROR CMP OPNERR,#5 ; FIVE FAILURES? BLT 25$ ; NO, LETS TRY OPENING IT AGAIN 20$: MOV #MSG7,R0 ; YES, LOOKS LIKE ACCOUNT FILE BUSY CALL BYEERR ; PRINT MESSAGE TO TRY LOGGING OFF AGAIN ; UNLESS LOGGING OFF SUCESSFUL, A NONPRIVLEDGED ; USER CAN'T LOG ON AGAIN(VIA HELLO) SEC ; SET "CARRY" TO DECLARE FAILURE RETURN ; TRYING TO UPDATE THE ACCOUNT FILE 25$: DIR$ #MKT ; MAYBE FILE IS BUSY, WAIT ONE SECOND BCS 20$ ; ERROR?, TRY LOGGING OFF LATER, MARK TIMES ; SHOULD WORK! WTSE$S #1 ; WAIT FOR MARK TIME TO COMPLETE AND SET EFN 1 INC OPNERR ; INCREMENT # OF TIMES TRIED BR OPEN ; LETS TRY AGAIN 50$: CLR OPNERR ; RESET ERROR FLAG TO NO ERROR RETURN ; ALL DONE GO BACK ;+ ; *** - QIO - ISSUE QIO ; ; INPUT: ; R4 - DPB ADDRESS ; ;- QIO: DIR$ R4 ; ISSUE QIO BCS 10$ ; ERROR MOVB Q.IOEF(R4),R5 ; GET EVENT FLAG TO WAIT ON WTSE$S R5 ; WAIT FOR I/O COMPLETION 10$: RETURN ; ;+ ; ** - CLOSE - CLOSE THE ACCOUNT FILE ;- CLOSE: CLOSE$ #$ACTFL ; CLOSE ACCOUNT FILE RETURN ; ;+ ; *** - SEARCH - SEARCH FILE FOR LOGED ON TERMINAL ; ; OUTPUT: ; R0 - ADDRESS OF ACCOUNT ENTRY ; ENTRY - ADDRESS OF START OF ACCOUNT BLOCK IN BUFFER ; CARRY CLEAR - ACCOUNT FOUND ; CARRY SET - ACCOUNT NOT FOUND ;- SEARCH: MOV #FDPB,R4 ; GET FILE DPB ADDRESS MOV #1,Q.IOPL+10(R4) ; SET TO START AT VBN 1 CLR Q.IOPL+6(R4) ; 5$: CALL QIO ; READ NEXT BLOCK MOV IOSB+2,R2 ; GET COUNT OF WORDS READ BEQ 25$ ; ZERO, NO WORDS READ MOV #$ACTBF,R0 ; GET BUFFER ADDRESS 10$: MOV R0,ENTRY ; YES, SAVE ENTRY ADDRESS ADD #A.TERM,R0 ; POINT ADDRESS AT TT ENTRY INC R0 ; POINT ADDRESS AT TERMINAL # INC R0 ; CMP GLNBUF+2,(R0) ; IS ACNT ENTRY THE SAME AS TI'S #? BNE 20$ ; NO, KEEP GOING MOV ENTRY,R0 ; YES, THEN RESTORE ENTRY ADDRESS JMP 40$ ; FOUND TERMINAL NUMBER 20$: MOV ENTRY,R0 ; RESTORE ENTRY POINTER ADD #A.LEN,R0 ; POINT TO NEXT ENTRY SUB #A.LEN,R2 ; COMPUTE WORDS LEFT IN BUFFER BHI 10$ ; LOOP, MORE LEFT 25$: CMPB #IE.EOF,IOSB ; END OF FILE? BEQ 50$ ; YES(MUST HAVE LOGGED OFF BEFORE) ; BUT PRIVLEDGED USERS MAY DO THIS TSTB IOSB ; ANY ERRORS? BMI 60$ ; YES(A READ ERROR?) ADD #$BFLEN/512.,Q.IOPL+10(R4) ; NO, POINT TO NEXT VBN ADC Q.IOPL+6(R4) ; JMP 5$ ; READ IN NEXT BUFFER 40$: RETURN ; 50$: CALL CLOSE ; CLOSE THE ACCOUNT FILE MOV #MSG6,R0 ; USER COULD BE LOGGED ONTO OTHER TERMINAL ALSO ; OR ACCOUNT FILE GOT SCRAMBLED 55$: CALL BYEERR ; WARN USER -,,/; JGD07/ INC SKPFLG ; IF ANY ERROR, OR ACCOUNT NOT FOUND DO NOT ; TRY AND UPDATE DISK BLOCK USAGE -,,/; JGD01/ SEC ; BE SURE TO SKIP UPDATE PART("TTN" NOT ZEROED) ; IF A READ ERROR FOUND OR IF THE "TTN" ENTRY ; INTO THE ACCOUNT FILE IS NOT FOUND, LOG OFF ; THE USER. A PRIVLEDGED USER CAN GET BACK ON ; AND UNLOCK A NONPRIVLEDGED ACCOUNT RETURN ; RETURN 60$: CALL CLOSE ; ACCOUNT FILE READ FAILURE, LOG OFF AND ; GET HELP MOV #MSG9,R0 ; PRINT -- FILE READ FAILURE BR 55$ ; PRINT ERROR MESSAGE AND EXIT ;+ ; *** - UPDATE -- ADD CURRENT TERMINAL LOGON TIME TO TOTAL TIME ; IN DATA FILE ;- UPDATE: MOV #FDPB,R4 ; GET THE FILE DPB ADDRESS MOV #IO.WVB,2(R4) ; SET QIO FOR WRITE TO FILE MOV IOSB+2,Q.IOPL+2(R4) ; SET COUNT OF BYTES TO WRITE -,,/; JGD04/ MOV ENTRY,R0 ; POINT TO START OF ACCOUNT FILE ADD #A.SYDV,R0 ; POINT TO DEVICE NAME MOVB (R0)+,UPDAT+4 ; MOVE IN THE DEVICE NAME MOVB (R0)+,UPDAT+5 ; MOVB (R0)+,UPDAT+6 ; MOVB (R0)+,UPDAT+7 ; ALL 4 CHARACTERS MOV ENTRY,R0 ; RESTORE POINTER ADD #A.GRP,R0 ; POINT TO GROUP ENTRY MOVB (R0)+,UPDAT+10. ; MOVE IN THE GROUP CODE MOVB (R0)+,UPDAT+11. ; MOVB (R0)+,UPDAT+12. ; MOVB (R0)+,UPDAT+14. ; MOVE IN THE MEMBER CODE MOVB (R0)+,UPDAT+15. ; MOVB (R0)+,UPDAT+16. ; ALL DONE MOV ENTRY,R0 ; RESET POINTER TO START OF ACCOUNT BLOCK ADD #A.PSWD,R0 ; POINT TO PASSWORD ENTRY MOVB (R0)+,UPDAT+18. ; MOVE IN THE 6 LETTER PASSWORD MOVB (R0)+,UPDAT+19. ; MOVB (R0)+,UPDAT+20. ; MOVB (R0)+,UPDAT+21. ; MOVB (R0)+,UPDAT+22. ; MOVB (R0)+,UPDAT+23. ; ALL DONE -,,/; JGD01/ MOV ENTRY,R0 ; GET ADDRESS OF ACCOUNT ENTRY ADD #A.TERM,R0 ; POINT TO TERMINAL NUMBER ENTRY CLR (R0)+ ; REMOVE "TT" ENTRY FROM FILE CLR (R0) ; REMOVE TERMINAL NUMBER FROM FILE MOVB TIMBUF+4,R1 ; GET DAY, TO BE SURE LOGOFF IS ON SAME DAY MOV ENTRY,R0 ; AS LOGON. GET ADDRESS OF ACCOUNT ENTRY ADD #A.LDAT,R0 ; POINT TO DATE ENTRY CMPB (R0),R1 ; IF DATES NOT EQUAL, DON'T ADD TIME TO ACNT BNE 10$ ; NOT EQUAL SO ONLY ZERO TERMINAL NUMBER ; AND LOG OFF MOVB TIMBUF+6,R1 ; GET HOUR AT WHICH TERMINAL LOGGED OFF MUL #74,R1 ; MULTIPLY BY 60 TO PUT IN MINUITS MOVB TIMBUF+10,R0 ; GET MINUITES AT LOGOFF ADD R0,R1 ; ADD TO GET THE TOTAL CLOCK MINUITS MOV ENTRY,R0 ; GET ADDRESS OF ACCOUNT FILE ENTRY ADD #A.LDAT+2,R0 ; POINT TO THE HOUR/YEAR WORD INC R0 ; POINT TO HOUR-THE HIGH BYTE MOVB (R0)+,R3 ; SAVE THE HOUR MUL #74,R3 ; CONVERT TO MINUITS MOVB (R0),R2 ; GET MINUITS AT LOGON TIME ADD R2,R3 ; COMPUTE TOTAL CLOCK MINUITS AT LOGON SUB R3,R1 ; GET TOTAL TIME LOGGED AT TERMINAL THIS TIME MOV ENTRY,R0 ; RESTORE FILE ADDRESS ADD #A.CTIM,R0 ; POINT TO TOTAL CONNECT TIME ENTRY ADD (R0),R1 ; ADD LOGON TIME TO TOTAL CONNECT TIME BVS 10$ ; IF ACCOUNT WOULD OVERFLOW DON'T ADD MORE IN MOV R1,(R0) ; OTHERWISE, INSERT INTO THE ACCOUNT FILE 10$: CALL QIO ; WRITE OUT THE UPDATED ACCOUNT BLOCK TSTB IOSB ; CHECK TO SEE IF ERROR ON WRITE TO ACNT ; THIS GUARDS AGAINST DK0: BEING WRITE LOCKED BGT 20$ ; NO ERROR IF >0, SO SKIP OVER THE NEXT LINES INC OPNERR ; SET OPNERR AS FLAG SO WON'T LOG OFF TERMINAL CALL CLOSE ; CLOSE THE FILE FAST, THE DISK IS WRITE LOCKED MOV #MSG10,R0 ; WARN THE USER THAT ACCOUNT IS WRITE LOCKED CALL BYEERR ; PRINT OUT THE MESSAGE SEC ; SET CARRY TO FLAG ERROR 20$: MOV #IO.RVB,2(R4) ; RESTORE THE DPB MOV #$BFLEN,Q.IOPL+2(R4) ; AND THE BUFFER LENGTH RETURN ; /