.TITLE WHO .IDENT /01X/ ; THIS PROGRAM IS TO PROVIDE AN MCR COMMAND 'WHO' WHICH WILL TELL ANY USER ; WHO IS ON THE SYSTEM, THE TERMINAL WHICH THEY ARE USING, AND ; THE UIC THEY LOGGED ON WITH. AT PRESENT IT GETS ALL ITS INFORMATION FROM ; THE ACCOUNT FILE LB:[0,0]RSX11.SYS. IT IS A PRIVLEGED(BUT NOT MAPPED TO ; THE EXEC) TASK. ; ; >WHO ; [GGG,MMM] TTN FIRSTNAME LASTNAME [] ; " " " " " " " ; ETC ; ; ; JAMES G. DOWNWARD 7/3/77 ; KMS FUSION, INC ; 3941 RESEARCH PARK DR ; ANN ARBOR, MICH 48104 ; 313-769-8500 ; ; ; MODIFIED: ; 15-JUN-79 MODIFIED TO SHOW WHO IS USING BATCH. THIS CHANGE ; OCCURED BECAUSE THERE IS NOW A FLAG IN RSX11.SYS ; TO SHOW WHEN A USER IS LOGGED ONTO A VT: ; EVENTUALLY, IF A MULTI-STREAM BATCH IS IMPLEMENTED ; WE WILL BE ABLE TO SHOW WHICH BATCH STREAM A USER ; IS USING. ; ; .MCALL QIO$,DIR$,WTSE$S,OPEN$R,CLOSE$,READ$ .MCALL EXIT$S,GTIM$S,MRKT$,GMCR$ ; ; CONSTANTS ; LUN1 = 1 ; TI: LUN LUN2 = 2 ; ACCOUNT FILE LUN EFN1 = 1 ; EVENT FLAG FOR ALL I/O EFN2 = 2 ; EVENT FLAG FOR MARK TIME ; ; LOCAL DATA -- MESSAGES AND ERROR MESSAGES ; .NLIST BEX ACNT: UIC: .ASCII /[ , ] / TFLAG: .ASCII / / FNAME: .ASCII / / LNAME: .ASCII / / BATCH: .ASCIZ // ; ; ER1: .ASCIZ <15><12>/WHO -- ACCOUNT FILE OPEN FAILURE/ ER2: .ASCIZ <15><12>/WHO -- ACCOUNT FILE READ ERROR/ .LIST BEX .EVEN ; ; FILE DPB'S ; ODPB: QIO$ IO.WVB,LUN1,EFN1,,,, ; TI: OUTPUT DPB FDPB: QIO$ IO.RVB,LUN2,EFN1,,IOSB,,<$ACTBF,$BFLEN,,,1> ; DBP FOR [0,0]RSX11.SYS IOSB: .BLKW 2 ; I/O STATUS BLOCK BUF: .BLKW 66. ; BUFFER FOR ALL TI: I/O MKT: MRKT$ EFN2,100.,1 ; WAIT 100 TICKS PRTFLG: .WORD 0 ; IF >0 PRINT, ELSE SKIP PRINT ; ; VARIABLES ; COUNT: .WORD 0 FILOPN: .WORD 0 ; FILE OPEN FLAG ENTRY: .WORD 0 ; CURRENT ENTRY POINT TO ACCOUNT OPNERR: .WORD 0 ; ERROR FLAG FOR OPEN ACCOUNT TEMP: .WORD 0 ; TEMPORARY STORAGE ; ; .SBTTL MAIN LINE CODE ; + ; ; $WHOEP - ACCOUNT FILE REPORT GENERATOR ; ; - $WHOEP: CALL OPEN ; OPEN ACCOUNT FILE FOR READ ONLY BCS 50$ ; OPEN ERROR PRINT MESSAGE, CLOSE FILE, AND EXIT CALL DISPLY ; GO DISPLAY FILE INFORMATION BCC 40$ ; CLOSE FILE AND EXIT IF NO ERROR MOV #ER2,R0 ; GET READY TO PRINT A ACCOUNT FILE READ CALL WRIT ; ERROR MESSAGE, NOW PRINT IT 40$: CLOSE$ #$ACTFL ; CLOSE FILE EXIT$S ; AND EXIT 50$: CLOSE$ #$ACTFL ; CLOSE FILE MOV #ER1,R0 ; PRINT ACCOUNT FILE OPEN ERROR CALL WRIT ; MESSAGE ON TI: EXIT$S ; AND EXIT .SBTTL SUBROUTINES ;+ ; *** - OPEN - OPEN FILE ; ;- OPEN: OPEN$R #$ACTFL,,,#FD.RWM ; OPEN FILE BCS 10$ ; ERROR INC FILOPN ; SET FILE IS OPEN 10$: RETURN ; ;+ ; *** - WRIT - WRITE OUT BUFFER ; ;- WRIT: MOV R0,R1 ; COPY BUFFER ADDRESS 10$: TSTB (R1)+ ; END OF MESSAGE? BNE 10$ ; NO, LOOP TILL END SUB R0,R1 ; COMPUTE LENGTH MOV #ODPB,R4 ; GET OUTPUT DPB ADDRESS MOV R0,Q.IOPL(R4) ; SET BUFFER ADDRESS MOV R1,Q.IOPL+2(R4) ; SET BUFFER LENGTH CALLR QIO ; WRITE IT OUT ;+ ; *** - 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 ; AND WAIT 10$: RETURN ; ;+ ; ***DISPLY - READ ACCOUNT INFORMATION INTO THE BUFFER AND ; WRITE IT ONTO THE TERMINAL ; EACH BUFFER(ACTBF) IS 512 BYTES LONG AND CONTAINS 4 ; USER ACCOUNT BLOCKS ; ;- DISPLY: MOV #FDPB,R4 ; GET FILE DPB ADDRESS MOV R4,TEMP ; SAVE R4 FOR LATER MOV #1,Q.IOPL+10(R4) ; SET TO START AT VBN 1 CLR Q.IOPL+6(R4) ; 5$: CALL QIO ; READ IN THE BLOCK MOV IOSB+2,COUNT ; GET COUNT OF WORDS READ BEQ 50$ ; IF ZERO WORDS READ, TEST FOR END OF FILE MOV #$ACTBF,R0 ; GET BUFFER ADDRESS 10$: MOV R0,ENTRY ; SAVE ENTRY ADRESS FOR LATER, WE'LL NEED IT CALL PRINT ; WE ARE AT THE START OF A 128 BYTE ACCOUNT BLOCK ; GO AND PRINT THE INFORMATION MOV ENTRY,R0 ; RESTORE ENTRY, SO WE CAN STEP THROUGH THE ACCOUNT ; BUFFER. ADD #A.LEN,R0 ; POINT TO NEXT ENTRY SUB #A.LEN,COUNT ; COMPUTE WORDS LEFT IN BUFFER BHI 10$ ; IF STILL MORE TO PROCESS IN THIS BUFFER ; LOOP BACK AND PRINT SOME MORE 50$: CMPB #IE.EOF,IOSB ; OTHERWISE CHECK FOR END OF FILE BEQ 60$ ; YES, EOF FOUND AND WE ARE DONE FOR NOW TSTB IOSB ; BE SURE WE DON'T HAVE ANY READ ERRORS BMI 55$ ; A READ ERROR FOUND, SET CARRY BEFORE EXITING MOV TEMP,R4 ; RESTORE R4 ADD #$BFLEN/512.,Q.IOPL+10(R4) ; NO ERRORS, SO POINT TO NEXT VBN ADC Q.IOPL+6(R4) ; BR 5$ ; READ IN A NEW BUFFER 55$: SEC ; SET CARRY AS AN ERROR FLAG 60$: RETURN ; ;+ ; ; ***PRINT -- PRINT OUT THE INFORMATION AT TI: ; ; ;- PRINT: CLR PRTFLG ; ASSUME WE WILL NOT PRINT CLRB BATCH ; ASSME WE WILL NOT PRINT '' ADD #A.TERM,R0 ; POINT TO LOGIN TERMINAL ENTRY MOVB #40,TFLAG ; CLEAR OUT OLD STUFF MOVB #40,TFLAG+1 ; BY PUTTING IN SPACES MOVB #40,TFLAG+2 ; AND STILL ANOTHER SPACE MOVB #40,TFLAG+3 ; AND AGAIN TSTB (R0) ; BE SURE TT IS PRESENT, OTHERWISE FILLING TFLAG WITH BEQ 11$ ; NOT LOGGED ON, CHECK IF USING BATCH INC PRTFLG ; FOUND IT, SO PRINT IT OUT MOVB (R0)+,TFLAG ; MOVE IN TERMINAL ENTRY MOVB (R0)+,TFLAG+1 ; THE SECOND T MOV (R0),R1 ; POINT TO TERMINAL NUMBER BIC #177400,R1 ; CLEAR ALL BITS IN HI BYTE MOV #TFLAG,R0 ; POINT TO START OF BUFFER ADD #2,R0 ; POINT TO POINT FOR NUMBER ENTRY CLR R2 ; SUPRESS LEADIING ZEROS 10$: CALL $CBOMG ; CONVERT THE NUMBER TO OCTAL 11$: ; REF LABLE MOV ENTRY,R0 ; CHECK TO SEE IF USER IN BATCH ADD #A.VTRM,R0 ; POINT TO BATCH FLAG CMPB #'V,(R0) ; IS IT A 'V' BNE 12$ ; NO, DON'T DISPLAY BATCH INC PRTFLG ; WE WILL PRINT IT OUT MOVB #'<,BATCH ; AND PRINT '' AFTER NAME 12$: ; REF LABLE MOV ENTRY,R0 ; RESTORE ENTRY POINT ADD #A.GRP,R0 ; POINT TO GROUP CODE(IN ASCII) MOVB (R0)+,UIC+1 ; FILL UP THE UIC MOVB (R0)+,UIC+2 ; MOVB (R0)+,UIC+3 MOVB (R0)+,UIC+5 ; NOW MOVE IN THE MEMBER CODE MOVB (R0)+,UIC+6 ; MOVB (R0),UIC+7 ; MOV ENTRY,R0 ; RESTORE ENTRY POINTER ADD #A.LNM,R0 ; POINT TO LAST NAME MOV #14.,R3 ; SET UP # BYTES TO TRASNFER MOV #LNAME,R1 ; INSERT ASCII CHARACTERS INTO LNAME CALL LOOP ; GO FILL UP LNAME MOV ENTRY,R0 ; RESTORE ENTRY ADRESS ADD #A.FNM,R0 ; POINT TO FIRST NAME ENTRY MOV #FNAME,R1 ; PUT ADDRESS OF FNAME INTO R1 MOV #12.,R3 ; TRANSFER 12 BYTES CALL LOOP ; GO FILL UP FNAME TST PRTFLG ; SHOULD WE PRINT IT OUT BEQ 15$ ; IF EQ, NO, DON'T PRINT MOV #ACNT,R0 ; GET READY TO PRINT INFO CALL WRIT ; PRINT IT 15$: RETURN ; ;+ ; ***LOOP -- COMMON LOOP TO FILL IN CHARACTERS ; ; R0 - ADDRESS OF BUFFER CONTAINING CHARACTER ; R1 - ADDRESS OF BUFFER TO FILL ; R3 - NUMBER OF CHARACTERS TO TRANSFER ;- LOOP: MOVB (R0)+,(R1)+ ; MOVE CHARACTER INTO NAME DEC R3 ; DECREMENT COUNT BGT LOOP ; KEEP LOOPING IF MORE CHARACTERS LEFT RETURN ; OTHERWISE , RETURN .END $WHOEP