;**************************************************************************** ;* * ;* IDLE * ;* Waits till all user jobs are idle - for use in command/do files * ;* * ;**************************************************************************** ;Use IDLE to make a system maintenance command file wait until all users are ;off of the system. ; ; .IDLE {prog1 {prog2 {prog3} } } ; ; Will wait until all jobs are: ; 1) at AMOS command level ; 2) running one of the programs on the command line (such ; as a main menu, or other programs known to be "safe" ; and non-disk accesssing such as USTAT). ; 3) running a system program (jobs running LPTSPL, TSKIDL, ; NETSER, VTSER, FAXSER, MALSER, TCPEMU, etc. are ; automatically ignored by IDLE). ; ; .IDLE /L ; ; List all active jobs by job name, program name, user name, and PPN ; and exits. ; ;[100] September 26, 1995 07:29 AM Edited by David Pallmann ; Created during 1995 West Coast VAR Conference. VMAJOR =1 VMINOR =0 VSUB =0 VEDIT =100. VWHO =0 SEARCH SYS SEARCH SYSSYM MAXPRG =64. .OFINI .OFDEF LSTFLG, 1 ; List flag (1=/L, 0= no /L). .OFDEF EXTRA, 1 ; Space hold (keep addresses even). .OFDEF BUFFER, 100. ; Conversion buffer. .OFDEF PRGCNT, 2 ; Number of program names in array. .OFDEF PROGS, MAXPRG*4 ; Program names array (RAD50). .OFSIZ MEMSIZ START: PHDR -1,0,PH$REE!PH$REU ; Program header. GETIMP MEMSIZ,A5 ; Allocate memory. ;take any program names on the command line and store in program name array CMDLIN: CLRW PRGCNT(A5) ; LEA A1,PROGS(A5) ; 10$: CALL SWITCH ; BYP ; ALF ; BEQ 20$ ; NUM ; BNE 30$ ; 20$: PACK ; PACK ; INCW PRGCNT(A5) ; CMPW PRGCNT(A5),#MAXPRG ; BLT 10$ ; 30$: MOV #-1,@A1 ; Mark end of program table. CALL SWITCH ; ;count the number of active jobs on the system CHECK: MOV JOBTBL,A0 ; MOV JOBCUR,D3 ; Get our JCB address. CLR D4 ; Clear count of active jobs. 10$: MOV (A0)+,D7 ; Get JCB address. BEQ 10$ ; Zero - deallocated job. CMP D7,#-1 ; End of JCB table? JEQ 20$ ; Yes - branch. CMP D7,D3 ; Is this OUR job? BEQ 10$ ; Yes - skip over it. MOV D7,A1 ; A1 := JCB address. MOVW JOBSTS(A1),D6 ; Get job status flags. ANDW #J.MON,D6 ; Is job at AMOS? BNE 10$ ; Yes - not an active job. MOV JOBPRG(A1),D5 ; Get job program name. LEA A2,PROGS(A5) ; Index user's program array. CALL INTABL ; Program name found? BEQ 10$ ; Yes - not an active job. LEA A2,SYSPRG ; Index system program array. CALL INTABL ; Program name found? BEQ 10$ ; Yes - not an active job. INC D4 ; Update count of active jobs. CALL LIST ; List job on screen if /L. BR 10$ ; Loop 20$: TST D4 ; JEQ EXIT ; TSTB LSTFLG(A5) ; /L? JNE EXIT ; Yes - exit. MOVB #13.,D1 ; TTY ; MOV D4,D1 ; DCVT 0,OT$TRM!OT$TSP ; TYPE ; CMP D4,#1 ; BEQ 30$ ; TYPE ; 30$: TYPE < still active> ; MOVW #-1_8.+9.,D1 ; TCRT ; SLEEP: CTRLC ABORT ; SLEEP #10000. ; Sleep for 1 second. CTRLC ABORT ; JMP CHECK ; ABORT: MOV #13.,D1 ; TCRT ; MOVW #-1_8.+9.,D1 ; TCRT ; TYPECR ; EXIT: MOV #13.,D1 ; TTY ; MOVW #-1_8.+9.,D1 ; Clear to TCRT ; end of line. EXIT ; Exit. ;************ ;* INTABL * ;************ ;Inputs: ; D5 - job program name ; A2 - address of RAD50 longword program names to search, -1 terminated. ; ;Outputs: ; Z - set if name appears in table, cleared otherwise. INTABL: MOV A2,A6 ; 10$: MOV (A6)+,D6 ; CMP D6,#-1 ; BEQ 20$ ; CMP D6,D5 ; BNE 10$ ; LCC #PS.Z ; RTN ; 20$: LCC #0 ; RTN ; ;switch processing - /L lists jobs that are still active SWITCH: BYP ; CMPB @A2,#'/ ; BEQ 10$ ; RTN ; 10$: INC A2 ; MOVB (A2)+,D1 ; UCS ; BYP ; CMPB D1,#'L ; BNE SWITCH ; MOVB #1,LSTFLG(A5) ; BR SWITCH ; LIST: TSTB LSTFLG(A5) ; BNE 10$ ; RTN ; 10$: SAVE A0-A5,D0-D5 ; CMP D4,#1 ; BNE 15$ ; TYPECR 15$: MOV A1,A4 ; LEA A1,JOBNAM(A4) ; Show job name. LEA A2,BUFFER(A5) ; CLR @A2 ; UNPACK ; UNPACK ; CLRB @A2 ; TTYL BUFFER(A5) ; TYPESP ; LEA A1,JOBPRG(A4) ; Show program name. LEA A2,BUFFER(A5) ; CLR @A2 ; UNPACK ; UNPACK ; CLRB @A2 ; TTYL BUFFER(A5) ; TYPESP ; LEA A1,JOBUSN(A4) ; Show user name. LEA A2,BUFFER(A5) ; MOV #21.,D0 ; 20$: MOVB #32.,(A2)+ ; SOB D0,20$ ; CLRB @A2 ; LEA A2,BUFFER(A5) ; MOV #20.,D0 ; 30$: MOVB (A1)+,D7 ; BEQ 40$ ; MOVB D7,(A2)+ ; SOB D0,30$ ; 40$: TTYL BUFFER(A5) ; LEA A1,JOBDEV(A4) ; Show PPN. LEA A2,BUFFER(A5) ; CLR @A2 ; UNPACK ; CLR D1 ; MOVW JOBDRV(A4),D1 ; DCVT 0,OT$MEM ; CLRB @A2 ; TTYL BUFFER(A5) ; TYPE <:[> ; PRPPN JOBUSR(A4) ; TYPECR ] ; REST A0-A5,D0-D5 ; RTN ; SYSPRG: RAD50 "TSKIDL" RAD50 "LPTSPL" RAD50 "NETSER" RAD50 "VTSER " RAD50 "ANSER " RAD50 "MALSER" RAD50 "FAXSER" RAD50 "TCPEMU" RAD50 "FTPD " RAD50 "ITCD " RAD50 "RWHOD " RAD50 "TELNED" RAD50 "SOCKS " RAD50 "LOGGER" LWORD -1 END .