.TITLE WHO - MCR WHO COMMAND .IDENT /V01/ .ENABL LC ;+ ; WRITTEN BY: GARY L. MAXWELL ; 29-MAR-80 ; NATIONAL STRONG MOTION DATA CENTER ; OFFICE OF EARTHQUAKE STUDIES ; U.S. GEOLOGICAL SURVEY ; 345 MIDDLEFIELD ROAD ; MAIL STOP 77 ; MENLO PARK, CALIFORNIA 94025 ; ; COMMAND SYNTAX: ; ; >WHO ; >WHO LAST-NAME ; >WHO GGG,MMM -OR- >WHO [GGG,MMM] ; ; IN THE FIRST CASE, WHO, FOR EVERY LOGGED IN USER, LISTS EACH ; TERMINAL ID, THE LOGON UIC, THE USER'S NAME, THE DATE AND TIME ; OF THE USER'S MOST RECENT LOGIN, AND ALL ACTIVE TASKS WHICH ; USE THE USER'S TERMINAL AS PSEUDO-DEVICE TI:. ; ; WHO WITH A USER'S LAST NAME AS AN ARGUMENT CAUSES WHO TO SEARCH ; THE SYSTEM ACCOUNT FILE FOR ALL USERS WITH THIS LAST NAME. FOR ; EACH FIND, THE FULL NAME OF THE USER AND HIS/HER LOGON UIC ; ARE PRINTED ON THE TERMINAL. ; ; WHO WITH A UIC (WITH OR WITHOUT BRACKETS) CAUSES A SEARCH IN THE ; ACCOUNT FILE FOR ALL USER NAMES WHOSE LOGON UIC MATCHES THE ; INPUT UIC. ; ; THIS VERSION OF WHO DIFFERS FROM OTHER VERSIONS THE AUTHOR HAS ; SEEN, IN THAT ONLY ONE PASS IS MADE THROUGH BOTH THE ACTIVE ; TASK LIST (SAVING SYSTEM STATE COMPUTATION) AND THE SYSTEM ; ACCOUNT FILE (SAVING DEDICATION TIME WITH THE ACCOUNT FILE). ;- .MCALL PMSG,ERROR,PRINT .MCALL EXIT$S,GMCR$,EXTK$S,GLUN$,DIR$ .MCALL QIOW$,MRKT$,OPEN$R,CLOSE$,FDOF$L ;+ ; LOCAL MACROS ;- .MACRO WTFOR EFLG .IF DF P.STP .MCALL STSE$S STSE$S EFLG ; STOP FOR EVENT FLAG .IFF .MCALL WTSE$S WTSE$S EFLG ; WAIT FOR EVENT FLAG .ENDC .ENDM WTFOR .PSECT DATA,RW ;+ ; LOCAL AND GLOBAL SYMBOLS ;- P.STP = 0 ; V3.2 COMPATABLE CR = 15 ; CARRIAGE RETURN LF = 12 ; LINE FEED SPACE = <' > ; SPACE CHAR TSKLIM: .LIMIT ; DEFINE TASK LIMITS FDOF$L ; DECLARE FDB OFFSETS GLUNBK: GLUN$ LUNTI,GBLK GMCRBK: GMCR$ ACTDPB: QIOW$ IO.RVB,LUNLB,EFLB,,IOSB,,<$ACTBF,$BFLEN,,,1> ACTWT: MRKT$ EFMT,60.,1 GBLK: .BLKW 6 ; GLUN$ BLOCK .NLIST BEX FERMSG: .ASCII /WHO -- Error while reading account file/ .ASCII /FCS Error Code: / FERADD: .BLKB 5 .EVEN .LIST BEX .PAGE .SBTTL MAIN LINE CODE .ENABL LSB .PSECT WHO,RO $WHOEP:: BIT #FE.MUP,$FMASK ; MULTI-USER SUPPORTED? BNE 10$ ; YES, SKIP AHEAD ERROR < WHO -- Not a multi-user system?>,EXIT,WHO 10$: CLR FILOPN ; ACCOUNT FILE NOT OPEN CLR OPNERR ; CLEAR OPEN ERROR COUNTER CLR $ABFHD ; CLEAR ACCOUNT BUFFER HEADER DIR$ #GMCRBK ; GET COMMAND LINE BCC 20$ ; BRANCH IF SUCCESSFUL MOV #WH.DEF,$FLAG ; ELSE WE'LL DO DEFAULT BR 30$ ; AND SKIP THE COMMAND PARSING 20$: MOV #GMCRBK+G.MCRB,R4 ; POINT TO THE COMMAND LINE MOV $DSW,R3 ; GRAB THE BYTE COUNT CALL WHOCSI ; PARSE COMMAND (NO RETURN ON ERROR) TST $FLAG ; ANYTHING FOR US TO DO? BEQ EXIT ; NO, JUST EXIT FOR WHO /HE 30$: MOV #$ACTFL,R0 ; POINT TO ACCOUNT FILE FDB MOV F.DSPT(R0),R1 ; GET POINTER TO DATASET DESCRIPTOR CLR (R1)+ ; CLEAR LB0: DEVICE SPEC CLR (R1) OPEN$R R0,,,#FD.RWM ; OPEN ACCOUNT FILE BCC 50$ ; BRANCH IF OPEN WORKED INC OPNERR ; BUMP OPEN ERROR COUNTER CMP #OPNCNT,OPNERR ; REACHED TOLERABLE LIMIT? BLE 40$ ; YES, BRANCH TO GIVE UP DIR$ #ACTWT ; ELSE MARK A SECOND BCS 40$ ; GIVE UP IF THIS FAILS WTFOR #EFMT ; ELSE WAIT FOR COMPLETION BR 30$ ; AND GO TRY AGAIN 40$: ERROR < WHO -- Account file open failure>,EXIT,WHO 50$: MOV $FLAG,R1 ; COPY FLAG WORD BIT #WH.NAM,R1 ; >WHO LAST-NAME COMMAND? BNE NAMFND ; YES, GO SEARCH BIT #WH.UIC,R1 ; >WHO UIC COMMAND? BNE UICFND ; YES, GO SEARCH ; ; ELSE WE LIST ALL LOGGED IN USERS AND THEIR TASKS ; DIR$ #GLUNBK ; GET TI: PARAMETERS MOV GBLK+G.LUCW+6,TIBFLN ; STORE TI: BUFFER SIZE MOV TSKLIM+2,R0 ; POINT TO END OF TASK IMAGE MOV R0,$LGFHD ; STORE POINTER FOR WHOOUT MOV R0,$BUFED ; SHOW WE HAVE NO ROOM CALL LOGFIL ; GET INFO ON LOGGED IN USERS BCS 120$ ; BRANCH ON BUFFER OVERFLOW MOV R0,$TKFHD ; STORE POINTER AS LISTHEAD CALL TSKFIL ; FILL IN ACTIVE TASK INFORMATION BCS 120$ ; BRANCH ON BUFFER OVERFLOW MOV R0,$ABFHD ; STORE CURRENT POINTER CALL ACNTFL ; GO MATCH ACCOUNT ENTRIES W/ TT:'S BCS 120$ ; BRANCH AHEAD IF NO OVERFLOWS 60$: CLOSE$ #$ACTFL ; ELSE CLOSE ACCOUNT FILE CLR FILOPN ; MARK IT AS CLOSED CALL WHOOUT ; AND PRINT ALL THE DATA WE HAVE BR EXIT ; EXIT WHEN THROUGH ;+ ; >WHO LAST-NAME GO LOOK FOR UIC'S THAT MATCH NAME ;- NAMFND: CALL NLOOK ; CALL NAME SEARCHER BR EXIT ; AND EXIT WHEN THROUGH ;+ ; >WHO UIC GO LOOK FOR NAMES THAT MATCH UIC ;- UICFND: CALL ULOOK ; CALL UIC SEARCHER BR EXIT ; AND GO EXIT WHEN DONE 120$: PRINT < WHO -- Buffer overflow. Install with larger /INC value>,WHO TST $ABFHD ; OVERFLOW WHILE ACCOUNT SEARCHING? BNE 60$ ; YES, AT LEAST OUTPUT WHAT WE HAVE EXIT:: TST FILOPN ; IS ACCOUNT FILE OPEN? BEQ 130$ ; BRANCH IF NOT CLOSE$ #$ACTFL ; ELSE MAKE SURE IT'S CLOSED 130$: TST P.CEFN ; SHOULD WE WAIT FOR OUTPUT? BEQ 140$ ; NO, JUST EXIT WTFOR P.CEFN ; ELSE WAIT FOR LAST QIO 140$: EXIT$S ; EXIT TO MCR .DSABL LSB .PAGE .SBTTL UTILITY ROUTINES ;+ ; ALLOC - ATTEMPT TO PERFORM AN EXTK$S TO INCREASE BUFFER SIZE. ; CURRENTLY, NO CHECKS ARE PERFORMED TO SEE THAT THE ; I/O PAGE IS NOT OVERLAID. THIS BEING AN ALMOST IMPOSSIBLE ; PROSPECT, THE CODE WAS NOT INCLUDED. ; ; INPUTS: $BUFED IS THE CURRENT CEILING ADDRESS OF THE TASK ; ; OUTPUT: CARRY SET - UNSUCCESSFUL ALLOCATION OF MEMORY ; CARRY CLEAR - EXTK$ WAS SUCCESSFUL ; $BUFED IS ADJUSTED TO POINT TO THE NEW CEILING ;- ALLOC:: EXTK$S #BUFINC ; TRY TO GET MORE MEMORY BCS 10$ ; EXIT IF IT FAILS ADD #,$BUFED ; EXTEND THE POINTER CLC ; MAKE SURE CARRY IS CLEAR 10$: RETURN ; AND RETURN ;+ ; *** FREAD ; *** AREAD - ACCOUNT FILE READ ROUTINES ; ; FREAD AND AREAD PERFORM BLOCK READS FROM THE ACCOUNT FILE INTO ; THE STANDARD ACCOUNT FILE BUFFER. ; ; FREAD SHOULD BE CALLED WHENEVER THE FILE IS ACCESSED FOR THE ; FIRST TIME, AND AREAD SHOULD BE CALLED THEREAFTER ; ; USES REGISTERS R0,R1,R2, BUT ONLY IN CASE OF ERRORS ;- FREAD:: MOV #1,ACTDPB+Q.IOPL+10 ; VIRTUAL BLOCK 1 CLR ACTDPB+Q.IOPL+6 BR AR ; GO DO THE READ AREAD:: CMPB #IE.EOF,IOSB ; REACHED EOF YET? BEQ AOUT ; YES, EXIT WITH CARRY SET TSTB IOSB ; ANY ERRORS AT ALL? BMI FERR ; YES, GO YELL ABOUT THEM ADD #$BFLEN/512.,ACTDPB+Q.IOPL+10 ; ADVANCE BLOCK ADC ACTDPB+Q.IOPL+6 AR: DIR$ #ACTDPB ; READ THE BLOCK CLC BR AEX ; GO EXIT AOUT: SEC AEX: RETURN FERR: MOV #FERADD,R0 ; GET PLACE TO STUFF ERROR CODE MOVB IOSB,R1 ; GET ERROR CODE CLR R2 ; NO LEADING ZEROES CALL $CBDSG ; CONVERT TO ASCII MOV R0,R1 ; COPY END POINTER MOVB #<'.>,(R1)+ ; ADD THE DECIMAL POINT MOV #FERMSG,R0 ; POINT TO ERROR SUB R0,R1 ; GET THE LENGTH PMSG ,,#SPACE,0 ; WRITE ERROR WITH NO WAIT JMP EXIT ; AND GO EXIT .END $WHOEP