.TITLE KILLER - LOG RSX-11M USER OFF .IDENT /01/ .PSECT ; ; VERSION 01 ; ; JOHN ISAKSON 21-JUL-78 ; ; MODIFIED BY: ; ; PROGRAM TO AUTOMATICALLY LOG A USER OFF. ; ; MACRO CALLS ; .MCALL QIO$,WTSE$S,MRKT$S,DIR$,EXIT$S,CMKT$S,WTLO$S .MCALL MRKT$C,GMCR$ .MCALL DCBDF$,HWDDF$,UCBDF$,TCBDF$ ; ; DEFINE DATA STRUCTURE OFFSETS ; DCBDF$ ; DEVICE CONTROL BLOCK OFFSETS HWDDF$ ; HARDWARE AND FEATURE STATUS CODES UCBDF$ ; UNIT CONTROL BLOCK OFFSETS TCBDF$ ; TASK CONTROL BLOCK OFFSETS ; ; EQUATED SYMBOLS ; ; ; LOCAL MACROS ; ; ; LOCAL DATA ; ; MESSAGES ; .NLIST BEX .ENABL LC ERR1: .ASCIZ <7><12>/ KILLER - User not privileged/<12> ERR2: .ASCIZ <7><12>/ KILLER - TI: is a pseudo device/<12> ERR3: .ASCIZ <7><12>/ KILLER - No MCR command line/<12> ERR4: .ASCIZ <7><12>/ KILLER - Bad device name/<12> ERR5: .ASCIZ <7><12>/ KILLER - No such TT:/<12> ERR6: .ASCIZ <7><12>/ KILLER - Specified TT: not logged on/<12> ; ; COMMANDS ISSUED INTERNALLY ; CMD: .ASCIZ /BYE/<15> .EVEN .LIST BEX ; ; MISCELLANEOUS DATA ; IBUF: .BLKB 10. ;INPUT BUFFER GMCR: GMCR$ ;GET MCR COMMAND LINE DPB BUF= GMCR+2 .BLKB 80. ;MCR BUFFER .EVEN MSGDPB: QIO$ IO.WVB,1,1,,IOSTAT,,<0,0,40> IOSTAT: .BLKW 2 ;I/O STATUS BLOCK TIUCB: .WORD 0 ;TI UCB ADDRESS TRMUCB: .WORD 0 ;CURRENT TERMINAL UCB ADDRESS CO: .WORD 0 ;CO: UCB ADDRESS ;+ ; KILLER - RSX-11M JOB KILLER ; ; This task will allow the privileged user (or any user logged in at TT0:) ; to log off any logged-in user. The method is to run BYE at the targeted ; user's TI:. KILLER will temporarily redirect CO: to TI: so the logout ; message furnished by BYE will be displayed for confirmation. ; ; The command line format to KILLER is as follows: ; ; KIL TTxx ;where xx is the target tty unit number (octal). ; ; BUILD INSTRUCTIONS: ; ; >MAC KILLER=LB:[1,1]EXEMC/ML,LB:[200,200]RSXMC/PA:1,SY:''KILLER ; >TKB KILLER/PR=KILLER,LB:[1,54]RSX11M.STB ; >/ ; >TASK=...KIL ; >STACK=64 ; >UNITS=1 ; >ASG=TI:1 ; >// ;- KILLER: MOV $TKTCB,R0 ;GET OUR TCB ADDRESS MOV T.UCB(0),R0 ;GET TI UCB ADDRESS MOV R0,TIUCB ;SAVE TI UCB ADDRESS BIT #DV.PSE,U.CW1(0);IS IT A PSEUDO DEVICE? BEQ 1$ ;BR IF NO MOV #ERR2,R0 ;GET ADDRESS OF ERROR MESSAGE BR 3$ ;PRINT ERROR MESSAGE 1$: BIT #U2.PRV,U.CW2(0);IS TI: PRIVILEGED? BNE 4$ ;BR IF YES MOV U.DCB(0),R1 ;NO, GET DCB ADDRESS CMP D.NAM(1),#"TT ;IS THIS A TT? BNE 2$ ;NO TSTB D.UNIT(1) ;YES, IS IT TT0:? BNE 2$ ;BR IF NO CMP D.UCB(1),R0 ; IS OUR UCB TT0:? BEQ 4$ ;YES 2$: MOV #ERR1,R0 ;NO, ISSUE ERROR MESSAGE 3$: CALL MSGOUT ;PRINT MESSAGE EXIT$S 4$: DIR$ #GMCR ;GET MCR COMMAND LINE BCC 5$ ;BR IF WE GOT ONE MOV #ERR3,R0 ;GET ERROR MESSAGE CALL MSGOUT ;PRINT IT BR 7$ ;EXIT 5$: MOV #BUF,R0 ;POINT TO COMMAND BUFFER CMPB #40,3(0) ;SEPARATOR FOUND? BNE 8$ ;BR IF NO CMP #"TT,4(0) ;DID HE SAY "TTXX"? BEQ 6$ ;BR IF YES 8$: MOV #ERR4,R0 ;SET UP ERROR MESSAGE CALL MSGOUT ;PRINT IT BR 7$ ;EXIT 6$: ADD #6,R0 ;POINT TO DIGIT 9$: CMPB @R0,#'7 ;CHECK FOR OCTAL DIGIT BGT 10$ ;ERROR CMPB (0)+,#'0 ;CHECK FOR DIGIT OR TERMINATOR BLT 11$ ;BR IF TERMINATOR BR 9$ ;CHECK FOR MORE DIGITS 10$: MOV #ERR4,R0 ;LOAD ERROR MESSAGE CALL MSGOUT ;PRINT IT BR 7$ ;EXIT 11$: MOV #BUF+6,R0 ;RESET BUFFER POINTER TO 1ST DIGIT CALL $COTB ;CONVERT TO BINARY MOV R1,R2 ;PUT IN CORRECT REGISTER CALL LOGOFF ;TRY TO LOG HIM (HER) OFF 7$: EXIT$S ;LEAVE ;+ ; LOGOFF - LOG A USER OFF ; ; INPUT: R2 = TARGET TTY UNIT NO. ; ; OUTPUT: NONE ;- LOGOFF: BIT #FE.MUP,$FMASK ;MULTI-USER PROTECTION SUPPORTED? BEQ 40$ ;NOPE MOV $DEVHD,R0 ;GET DEVICE LISTHEAD 10$: CMP #"TT,D.NAM(0) ;IS IT A TERMINAL? BEQ 12$ ;BR IF YES CMP #"VT,D.NAM(0) ;VT'S ARE OK, TOO. BNE 35$ ;NOT TERMINAL, GET NEXT 12$: CMPB R2,D.UNIT+1(0) ;IS IT THIS DCB? BGT 35$ ;NO, GET NEXT DCB MOVB D.UNIT(0),R3 ;GET LOWEST UNIT NUMBER MOV D.UCB(0),R1 ;GET 1ST UCB 15$: CMP R2,R3 ;IS IT THIS ONE? BEQ 16$ ;FOUND IT! INC R3 ;UPDATE UNIT NUMBER BR 30$ ;GET ANOTHER UCB 16$: BIT #U2.LOG,U.CW2(1);IS IT LOGGED ON? BEQ 17$ ;YES MOV #ERR6,R0 ;GENERATE ERROR MESSAGE CALL MSGOUT ;PRINT IT BR 40$ ;EXIT 17$: MOV $COPT,R0 ;GET ADDRESS OF CO: UCB MOV U.RED(0),CO ;SAVE REDIRECT POINTER TO CO MOV TIUCB,U.RED(0) ;REDIRECT IT TO TI: MOV #CMD,R2 ;POINT TO BYE COMMAND MOV R1,TRMUCB ;SET TI: UCB FOR MCR CALL GIVMCR ;GIVE IT TO MCR 20$: BIT #U2.LOG,U.CW2(1);IS IT STILL LOGGED ON? BNE 18$ ;NO CALL W1SEC ;WAIT ONE SECOND BR 20$ ;WAIT TILL LOGGED OFF 18$: MOV $COPT,R0 ;GET CO: UCB ADDRESS MOV CO,U.RED(0) ;RESET REDIRECT POINTER BR 40$ ;EXIT 30$: ADD D.UCBL(0),R1 ;GET NEXT UCB ADDRESS CMP R0,U.DCB(1) ;SAME DCB? BEQ 15$ ;BR IF YES 35$: MOV D.LNK(0),R0 ;NO, GET NEXT DCB BNE 10$ ;TRY NEXT DEVICE MOV #ERR5,R0 ;RAN OUT OF DEVICES CALL MSGOUT ;PRINT ERROR MESSAGE 40$: RETURN ;EXIT ;+ ; MSGOUT - PRINT MESSAGE TO LUN #1 ; ; INPUT: R0=MESSAGE ADDRESS ; ; OUTPUT: R0 - UNCHANGED ; R1 - MESSED UP ;- MSGOUT: MOV R0,MSGDPB+Q.IOPL ;PUT MESSAGE ADDR IN QIO PARAM BLOCK MOV R0,R1 ;COPY ADDRESS 10$: TSTB (1)+ ;END OF MESSAGE (ASCIZ) BNE 10$ ;BR IF NOPE SUB R0,R1 ;COMPUTE LENGTH DEC R1 MOV R1,MSGDPB+Q.IOPL+2 ;PUT LENGTH IN QIO PARAM BLOCK DIR$ #MSGDPB ;ISSUE THE QIO BCS 20$ ;ERROR BRANCH MRKT$S #2,#5,#2 ;WAIT 5 SECONDS WTLO$S 0,#3 ;I/O COMPLETION OR TIMEOUT CMKT$S ;CANCEL MARK TIME CMPB #IS.SUC,IOSTAT ;SUCCESSFUL COMPLETION BEQ 20$ ;YES, EXIT MOV #IO.KIL,MSGDPB+2 ;NO, KILL IT. DIR$ #MSGDPB BCS 15$ CALL WEFN1 ;WAIT FOR EFN 1 15$: MOV #IO.WVB,MSGDPB+2 ;RESET I/O FUNCTION TO WRITE 20$: RETURN ;+ ; GIVMCR - GIVE COMMAND TO MCR ; DGIVMC - DISPLAY COMMAND AND GIVE IT TO MCR ; ; INPUT: R2 = COMMAND ADDRESS ; FOR DGIVMC - R0 = COMMAND ADDRESS ; ; OUTPUT: CARRY CLEAR = SUCCESS ; CARRY SET = ERROR ; ;- DGIVMC: CALL MSGOUT ;DISPLAY COMMAND MOV R0,R2 ;GET BUFFER ADDRESS GIVMCR: CALL $SWSTK,40$ ;INTO SYSTEM STATE MOV R2,R5 ;GET BUFFER ADDRESS MOV #84.,R1 ;SET LENGTH OF BLOCK TO ALLOCATE CALL $ALOCB ;TRY FOR DYNAMIC MEMORY BCC 10$ ;BR IF SUCCESSFUL MOV @$HEADR,R0 ;ERROR, GET H.CSP INC 6(0) ;SET USER'S CARRY BIT BR 30$ ;EXIT 10$: MOV R0,R1 ;COPY ADDRESS OF DYNAMIC STORAGE CLR (0)+ ;LINK WORD MOV TRMUCB,(0)+ ;SET TI UCB ADDRESS 20$: MOVB (5)+,(0)+ ;COPY DATA BNE 20$ ;UNTIL ZERO BYTE MOV TRMUCB,R4 ;GET TI UCB ADDRESS BIS #U2.AT.,U.CW2(4) ; SET BIT TO SYNCHRONIZE WITH MCR BIC #U2.LOG,U.CW2(4) ; MAKE SURE TERMINAL IS LOGGED ON CALL $QMCRL ;GIVE IT TO MCR 30$: RETURN ;BACK TO USER STATE 40$: BCS 50$ ;SKIP IF ERROR 45$: CALL W1SEC ;WAIT ONE SECOND MOV TRMUCB,R2 ;GET TI UCB ADDRESS BIT #U2.AT.,U.CW2(2) ;IS COMMAND PROCESSED? BNE 45$ ;NO, WAIT TILL IT IS 50$: RETURN ;+ ; W1SEC - WAIT ONE SECOND ; WEFN1 - WAIT FOR EFN 1 ;- W1SEC: MRKT$C 1,1,2 ;SET TIMER FOR ONE SECOND WEFN1: WTSE$S #1 ;WAIT FOR EFN 1 RETURN .END KILLER