.TITLE FLUSH Flush recall buffer  .IDENT /1.0/ ;++ ; ; Title: ; FLUSH.MAR - Flush the recall buffer. ; ; Version: ; 1.0 ; ; Facility: ; User management tool. ; ; Abstract: ; This program flushes the recall buffer of a process. ; ; Environment: ; Change mode to executive required; ; must be linked with SYS$SYSTEM:DCLDEF.STB; ; => DON'T invoke via a LIB$DO_COMMAND, LIB$SPAWN, ; $CREPRC, in a batch job, with a CLI other than DCL, etc. ; ; Author: ; Mark Oakley Battelle Memorial Institute 09-Dec-1985 ; ; Modified: ; ; 23-May-1986 Mark Oakley Modified to use CLI and PPD symbols, instead ; of relying on R11. Also, check for job mode, ; output device, CLI, and access to buffer, to ; make sure we have a command buffer to flush. ; !;-- " # .SBTTL Symbols, Macros, and Data Structures $ .PSECT FLUSH_DATA RD,WRT,NOEXE,PAGE,SHR,PIC % & $DCDEF ; Device class (disk, terminal, etc.) symbols ' $DVIDEF ; Device information symbols ( $IODEF ; I/O symbols ) $JPIDEF ; Job process symbols * $SSDEF ; Termination symbols + ,; -; Macro to handle return codes. .; / .MACRO ON_ERR THERE,?HERE 0 BLBS R0,HERE 1 BRW THERE 2HERE: .ENDM ON_ERR 3 4MODE_ITMLST: ; JPI item list to determine if we 5 .WORD 4 ; are interactive. 6 .WORD JPI$_MODE 7 .ADDRESS MODE 8 .LONG 0 9 .LONG 0 : ;MODE: ; Mode of job (interactive, batch, etc.). < .BLKL 1 = >COMM_DEV: ; Name of device which commands come from. ? .ASCID /SYS$COMMAND/ @ ADVI_ITMLST: ; Determine what class of output device B .WORD 4 ; we have (terminal, disk, etc.). C .WORD DVI$_DEVCLASS D .ADDRESS DEVICE_CLASS E .LONG 0 F .LONG 0 G HDEVICE_CLASS: ; Terminal, disk, etc. I .BLKL 1 J KIOSB: ; Status block for I/O. L .BLKQ 1 M NDCL: ; Need to have "DCL" CLI. O .ASCII /DCL/ P Q .SBTTL Code R .PSECT FLUSH_CODE RD,NOWRT,EXE,PAGE,SHR,PIC S .ENTRY FLUSH,^M T U $GETJPI_S - ; Determine mode of this V ITMLST=MODE_ITMLST,- ; process. W IOSB=IOSB X ON_ERR FLUSH_EXIT Y MOVZWL IOSB,R0 Z ON_ERR FLUSH_EXIT [ \ CMPL #JPI$K_INTERACTIVE,MODE ; Are we running interactively? ] BEQL 20$ ^ BRW FLUSH_EXIT ; No, bail out. _ `20$: a $GETDVI_S - ; See if we are talking to a b DEVNAM=COMM_DEV,- ; terminal. c ITMLST=DVI_ITMLST,- d IOSB=IOSB e ON_ERR FLUSH_EXIT f MOVZWL IOSB,R0 g ON_ERR FLUSH_EXIT h i CMPL #DC$_TERM,- ; Are we a terminal? j DEVICE_CLASS k BEQL 40$ l MOVL #SS$_NORMAL,R0 ; No, bail out. m BRW FLUSH_EXIT n o40$: p MOVZBL CTL$GT_CLINAME,R6 q CMPC3 R6,CTL$GT_CLINAME+1,DCL ; Is the CLI "DCL"? r BEQL 60$ s MOVL #SS$_NORMAL,R0 t BRW FLUSH_EXIT ; No, bail out. u v60$: w MOVL CTL$AG_CLIDATA+PPD$Q_CLIREG+4,- ; Get addr of CLI/DCL data. x R11 ; Is greater than zero? y BGTR 80$ z BRW FLUSH_EXIT ; No, bail out. { |80$: } MOVAL PRC_L_RECALLPTR(R11),R7 ; Get addr of recall buf ptr. ~ MOVL R7,R8 ; Save this addr.  PROBER #3,#PRC_C_CMDBUFSIZ,4(R8) ; Can we access this area? BNEQ 100$ MOVL #SS$_NORMAL,R0 ; No, bail out, but return BRW FLUSH_EXIT ; success. 100$: $CMEXEC_S - ; Need to do the rest in ROUTIN=ZERO_RECALL_BUFFER ; exec mode. ON_ERR FLUSH_EXIT FLUSH_EXIT: RET ; ; This exec-mode routine actually does the zeroing-out. ; ZERO_RECALL_BUFFER: .WORD 0 MOVC5 #0,.,#0,#PRC_C_CMDBUFSIZ,4(R7) ; Zero out the command buffer. ADDL3 #4,R7,(R7) ; Set recall buf ptr to ; beginning of recall buffer. MOVL #SS$_NORMAL,R0 ; Assume success. RET .END FLUSH