BYE.MAC;5/AU=BYE.MAC;4/BF \ -2,2 .IDENT /01.4X/ -24,24 ; VERSION: 01.4X -27 ; MODIFIED: ; ; EB038 CLEAN UP A BIT ; ; JGD01 -- INSERT TOTAL LOGON TIME INTO ACCOUNT FILE ; PREVENT PRIVLEDGED USER FROM LOGING 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. THIS OPTION IS ENABLED ONLY IF BIT 6 OF ; THE PRIVLEGE MASK WORD IS SET. THE COMMAND IS PASSED TO ; ...UPD WHICH MUST BE INSTALLED. DOCUMENTATION ON ...UPD ; IS CONTAINED IN THE FILE ACCBLK.MAC ; % -29,,/; JGD01/ .MCALL GLUN$S,OPEN$U,CLOSE$,MRKT$ -31,,/; 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 ; ADRESS OF ACCOUNT ENTRY PRVFLG: .WORD 0 ; FLAG TO INDICATE TERMINAL SHOULD BE RESET PRIVLEDGED OPNERR: .WORD 0 ; ACCOUNT FILE OPEN ERROR FLAG -34,,/; EB038/ ATERS=24 -47,,/; 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>/>/ -53,,/; JGD04/ UPDAT: .ASCIZ %UPD XXXX:[GGG,MMM]PASWRD/UP%<15> -59,60,/; EB038/ FDPB: QIO$ IO.RVB,LUN2,EFN1,,IOSB,,<$ACTBF,$BFLEN,,,1> IOSB: .BLKW 2 ; I/O STATUS BLOCK ERRDPB: QIO$ IO.WVB,1,1,,IOSTAT,,<0,0,40> IOSTAT: .BLKW 2 ; I/O STATUS BLOCK MKT: MRKT$ 1,1,2 ;WAIT ONE SECOND -68,68 -75,,/; JGD01/ ; A PRIVLEGED TERMINAL MAY NOT LOGOFF IF ; LOGONS ARE DISABLED BIT #FE.NLG,$FMASK ; ARE LOGONS DISABLED BEQ 201$ ; NO, SO CONTINUE ON WITH LOGOFF BIT #U2.PRV,U.CW2(R0) ; YES, THEN BE SURE TERMINAL IS NOT PRIVLEGED BEQ 201$ ; UNPRIVLEGED, SO PROCEED TO LOGOFF MOV #MSG8,R0 ; PRIVLEGED, SO PRINT WARNING AND EXIT CALL BYEERR ; WITHOUT LOGING OFF TERMINAL EXIT$S ; EXIT -79,,/; JGD01/ BIT #U2.PRV,U.CW2(R0) ; IS TERMINAL PRIVLEGED BEQ 210$ ; IF NOT PRIVLEGED SKIP OVER INC PRVFLG ; SET PRIVLEGE FLAG FOR LATER 210$: BIS #U2.SLV,U.CW2(R0) ; TEMPORARILY SLAVE TI -154,155,/; JGD01/ GTIM$S #TIMBUF ; GET TIME AND FILL TIME BUFFER 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 MOV UCB,R0 ; ACCOUNT FILE WAS LOCKED, SO SET TERMINAL BIC #U2.SLV,U.CW2(R0) ; SO CAN TRY AGAIN, IE NON SLAVE BIS #U2.PRV,U.CW2(R0) ; TEMPORARILY MAKE TI: PRIVLEGED TST PRVFLG ; SHOULD TERMINAL BE PRIVLEDGED BGT 50$ ; YES, LEAVE PRIVLEDGED AND EXIT BIC #U2.PRV,U.CW2(R0) ; OTHERWISE SET NON PRIVLEGED 50$: EXIT$S ; LET USER TRY AGAIN TO LOG OFF BYE1: MOV TIMBUF+6,R1 ; GET HOUR -179,183,/; JGD04/ MOV UCB,R0 ; GET TI UCB ADDRESS CLR U.LUIC(R0) ; ZERO LOGIN PROTECTION UIC TST PRVFLG ; IS TERMINAL PRIVLEGED? BNE 25$ ; YES, SO DON'T UPDATE ACCOUNT FILE BIT #100,U.CW3(R0) ; IS BIT 6 OF THE PRIVLEGE MASK WORD SET BEQ 25$ ; NO, SO DON'T UPDATE THE ACCOUNT FILE MOV #UPDAT,R5 ; MOVE IN COMMAND TO UPDATE THE USER'S ACCOUNT CALL GIVMCR ; GIVE IT TO MCR 20$: MOV UCB,R0 ; GET TI UCB ADDRESS 25$: BIS #U2.LOG,U.CW2(R0) ; LOG TERMINAL OFF BIC #U2.SLV,U.CW2(R0) ; RESET TERMINAL STATUS(UNSLAVE) CLR U.UIC(R0) ; ZERO DEFAULT UIC -187,187,/; JGD04/ -218,218 -250,,/; EB038/ MOV UCB,R1 ; GET TI: UCB ADRESS BIC #201,U.CNT+2+ATERS(R1) ; FAKE A CONTROL/Q -261,261,/; EB038/ MOV #IO.WVB,ERRDPB+2 ; RESET FUNCTION CODE CALLR WAIT1 ; WAIT FOR FILLED I/O TO COMPLETE -270,270,/; 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 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 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 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 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 MINUIT 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 ; /