From: jamese@beast.dtsw.army.mil Sent: Monday, May 08, 2000 8:31 AM To: Info-VAX@Mvb.Saic.Com Subject: Re: wich list: DIRECTORY limitation kaplow_r@eisner.decus.org.mars2 (Bob Kaplow) wrote in <4csRJCMO2ycW@eisner.decus.org> on Sat, 6 May 2000 15:00:08 GMT: > Does anyone have a good workaround for this. A few weeks ago, I was trying > to figure out what a PURGE on a particular disk would get me back. I > couldn't find any easy way to get a directory listing with sizes of what a > given PURGE command would delete. Surely if PURGE can figure out what to > delete, there must be a DIRECTORY syntax to list the same files? Attached is WILLPURGE.MAR that will show files to be purged. It will also list the blocks allocated to the file(s). It's an oldie but a goodie. Please ignore the compile time option for CLD based code. That option was never fully implemented. The default generates foreign command code. Set up a symbol to point to the executable: $ will*purge :== ${executable_directory}willpurge.exe Then call the program with a file specification of the files to check. Wildcarding is allowed. The defaults are *.*;*. $ will ! check all files in this directory $ will [...] ! check all files from here down To get the file allocation size listed, prefix the command line file specification with a backslash. $ will \*.dat ! check all .dat files and show allocation size $ will \ ! check all files and show allocation size Let me know if you have any trouble, bugs, fixes, suggestions, or comments. .TITLE WILLPURGE ;LIST FILES THAT MIGHT BE PURGED ; Ed James ed.james@telecomsys.com ; TeleCommunications Systems, Inc. voice 410-295-1919 ; 275 West Street, Suite 400 fax 410-280-1094 ; Annapolis, MD 21401-1740 .IDENT /06200004271522/ ;VER,DATE,TIME CLD_BASED = 1 ;=0 GENERATE CLD BASED CLI$PRESENT CODE ;=1 GENERATE FOREIGN COMMAND CODE ; ALL BRANCH SYMBOLS ARE ALIGNED BY PREFIX OF: ; .ALIGN LONG,CNOP ; TO MAKE BRANCH FASTER. .SHOW BINARY ;SHOW MACRO GENERATED CODE $DSCDEF ;DEFINE DESCRIPTOR CODES $RMSDEF ;DEFINE RMS CODES .PSECT DATA,NOEXE,WRT,QUAD ;DATA, NO CODE, READ/WRITE, QUAD ALIGN CNOP = 01 ;NOP INSTRUCTION OPCODE VALUE FOR ; BRANCH DESTINATION ALIGNMENT BLANK = 32 ;DECIMAL EQUIV OF BLANK BACKSLASH = 92 ;DECIMAL EQUIV OF BACK SLASH MAX_OUT = 160 ;MAX OUTPUT REC LEN MAX_ERR = 57 ;MAX ERROR MESSAGE LEN FAB: $FAB FOP=,- ;FILE ACCESS BLOCK NAM=NAM,- DNM=<*.*;*>,- DNS=5,- FNA=FNA_STR NAM: $NAM RSA=RES_STR,- ;NAME BLOCK RSS=255,- ESA=EXP_STR,- ESS=255 RES_STR_D: ;RESULTANT FILE NAME STRING DESCRIPTOR .BLKL 1 .ADDRESS RES_STR FNA_STR_D: ;FILE NAME STRING DESCRIPTOR .WORD 255 ; MAX LEN .BYTE DSC$K_DTYPE_T ; TEXT STRING .BYTE DSC$K_CLASS_S ; FIXED STRING .ADDRESS FNA_STR ; ADDR OF RETURN STR FNA_STR_LEN: ;FILE NAME STRING LENGTH .WORD 5 ; length of default (*.*;*) FAO_O_D: ;FAO OUTPUT STRING DESCRIPTOR .WORD MAX_OUT ; STRING LEN .BYTE DSC$K_DTYPE_T ; TEXT STRING .BYTE DSC$K_CLASS_S ; FIXED STRING .ADDRESS FAO_O ; STR ADDR FAO_OL: .BLKL 1 ;FAO OUTPUT STRING LENGTH ERR_MSG_D: ;ERROR MESSAGE STRING DESCRIPTOR .WORD 256 ; MAX LEN .BYTE DSC$K_DTYPE_T ; TEXT STRING .BYTE DSC$K_CLASS_S ; FIXED STRING .ADDRESS ERR_MSG ; ADDR OF RETURN STR ERR_OL: .BLKL 1 ;GETMSG OUTPUT STRING LENGTH RETSTAT:.LONG ^X18008001 ;EXIT STATUS. MAY BE ALTERED IF NO ; FILES FOUND WAS_FILE: ;WAS ANY FILE LISTED SWITCH .LONG 0 ; =1 AT LEAST ONE FILE LISTED ALQ: .LONG 0 ;FILE ALLOCATION QUANTITY TOT_ALQ:.LONG 0 ;TOTAL FILE ALLOCATION QUANTITY CUR_DEV_W: ;CURRENT DEVICE NAME LEN .BLKW 1 CUR_DIR_W: ;CURRENT DIRECTORY NAME LEN .BLKW 1 CUR_NAM_W: ;CURRENT FILE NAME LEN .BLKW 1 CUR_TYP_W: ;CURRENT FILE TYPE LEN .BLKW 1 SAV_DEV_W: ;SAVED DEVICE NAME LEN .WORD 0 ; WHEN .NE. 0, NAME SAVED SAV_DIR_W: ;SAVED DIRECTORY NAME LEN .WORD 0 ; WHEN .NE. 0, TYPE SAVED SAV_NAM_W: ;SAVED FILE NAME LEN .WORD 0 ; WHEN .NE. 0, NAME SAVED SAV_TYP_W: ;SAVED FILE TYPE LEN .WORD 0 ; WHEN .NE. 0, TYPE SAVED NULL: .BYTE 0 ;NULL BYTE FOR CMPC5 FILLER ERR_SW: .BYTE 0 ;=1 ERROR ON OPEN FOR FAO ROUTINE DO_ALQ: .BYTE 0 ;=1 SHOW BLOCKS ALLOCATED (TOTAL ; BLOCKS TO BE DELETED IF PURGE) .IF EQUAL CLD_BASED ; if = 0 GENERATE CLD BASED CODE ; CLD BASED CODE TO .ENDC .ALIGN LONG INPNAM: .ASCID /INPUT/ ;INPUT OPERAND NAME STR DESCR .ALIGN LONG BLKNAM: .ASCID /BLOCKS/ ;BLOCKS ALLOCATED OPERAND NAME STR DESCR .ENDC .ALIGN LONG FAO_TOT_D: ;FAO CONTROL STR DESCR & STR .ASCID /!7UL Total blocks to be purged/ .ALIGN LONG FAO_STR_D: ;FAO CONTROL STR DESCR & STR .ASCID /!7UL !#AS/ .ALIGN LONG FAO_ERR_STR_D: ;FAO ERROR CONTROL STR DESCR & STR .ASCID \ !#AS!/ !57AS\ .ALIGN LONG FAO_O: .BYTE BLANK[MAX_OUT] ;FAO OUTPUT STR .ALIGN LONG EXP_STR:.BLKB 255 ;EXPANDED FILE NAME STRING .ALIGN LONG RES_STR:.BLKB 255 ;RESULTANT FILE NAME STRING .ALIGN LONG SAV_DEV:.BLKB 255 ;SAVED DEVICE NAME STRING .ALIGN LONG SAV_DIR:.BLKB 255 ;SAVED DIRECTORY NAME STRING .ALIGN LONG SAV_NAM:.BLKB 255 ;SAVED FILE NAME STRING .ALIGN LONG SAV_TYP:.BLKB 255 ;SAVED FILE TYPE STRING .ALIGN LONG FNA_STR: ; FILE NAME STRING - INPUT PARAMETER .ASCII /*.*;*/ ; DEFAULT IF ZERO LEN RETURNED BY ; LIB$GET_FOREIGN .BLKB 250 ; TOTAL SIZE TO 255 .ALIGN LONG ERR_MSG:.BLKB 256 ;FILE OPEN ERROR MESSAGE .ALIGN LONG NO_FILES: ;NO FILES LISTED DESCR .ASCID /** No files to be purged **/ .PSECT CODE,EXE,NOWRT,QUAD ;NO DATA, CODE, READ ONLY, QUAD ALIGN .DISABLE GLOBAL ;FLAG UNDEFINED SYMBOLS .IF EQUAL CLD_BASED ; if = 0 GENERATE CLD BASED CODE ; CLD BASED CODE TO .ENDC ;DEFINE CALLED EXTERNAL PROCEDURES .EXTERNAL LIB$GET_INPUT,LIB$PUT_OUTPUT,LIB$SIGNAL .EXTERNAL SYS$FAO,CLI$PRESENT,CLI$GET_VALUE ;DEFINE EXTERNAL PROCEDURE RETURN CODES .EXTERNAL CLI$_PRESENT,CLI$_ABSENT,CLI$_NEGATED,CLI$_DEFAULTED .ENDC .IF NOT_EQUAL CLD_BASED ;if <> 0 GENERATE FOREIGN COMMAND CODE ; FOREIGN COMMAND BASED CODE TO .ENDC ;DEFINE CALLED EXTERNAL PROCEDURES .EXTERNAL LIB$GET_INPUT,LIB$PUT_OUTPUT,LIB$SIGNAL,LIB$GET_FOREIGN .EXTERNAL SYS$FAO .ENDC .ENTRY WILLPURGE,^M ;REGISTERS 1-5 USED BY CHAR STR INSTRS ;REGISTERS 6-9 INPUT TO CHAR STR INSTRS MOVL #RMS$_NORMAL,RETSTAT ;SET OK EXIT .IF EQUAL CLD_BASED ; if = 0 GENERATE CLD BASED CODE ; CLD BASED CODE TO .ENDC PUSHAL FNA_STR_LEN ;INPUT FILE NAME LEN ADDR TO STACK PUSHAQ FNA_STR_D ;INPUT FILE NAME DESCR ADDR TO STACK PUSHAQ INPNAM ;OPERAND NAME DESCR ADDR CALLS #3,G^CLI$GET_VALUE ;GET FILE NAME & LEN BLBS R0,MOVE ;BRANCH IF NOT OK STATUS CMPL R0,#CLI$_ABSENT ;IF WAS ABSENT, BEQLU MOVE ; OK - USE *.*;* .ALIGN LONG,CNOP S_ERR_1: BRW S_ERR ;SHOW ERR IN CLI$GET_VALUE .ALIGN LONG,CNOP MOVE: MOVW FNA_STR_LEN,FNA_STR_D ;SET INPUT FILE NAME LEN IN STR DESCR PUSHAL BLKNAM ;OPERAND NAME DESCR ADDR TO STACK CALLS #1,G^CLI$PRESENT ;SEE IF OPERAND PRESENT CMPL R0,#CLI$_ABSENT ;IF WAS ABSENT, BEQLU NO_ALQ ; CHECK NEXT OPERAND. CMPL R0,#CLI$_NEGATED ;CHECK IF WAS PRESENT WITH /NO BEQLU NO_ALQ ; CHECK NEXT OPERAND. CMPL R0,#CLI$_PRESENT ;IF WAS PRESENT, BNEQU S_ERR_1 ;BR IF UNKNOWN RETURN, SIGNAL ERROR. MOVB #1,DO_ALQ ;DO SHOW ALLOCATED .ALIGN LONG,CNOP NO_ALQ: .ENDC .IF NOT_EQUAL CLD_BASED ;if <> 0 GENERATE FOREIGN COMMAND CODE ; FOREIGN COMMAND BASED CODE TO .ENDC PUSHAL ERR_OL ;FILE NAME LEN ADDR TO STACK PUSHL #0 ;DUMMY PROMPT DESCR ADDR TO STACK PUSHAQ ERR_MSG_D ;FILE NAME DESCR ADDR TO STACK CALLS #3,G^LIB$GET_FOREIGN ;GET FILE NAME & LEN BLBS R0,MOVE ;BRANCH IF NO STATUS BRW EXIT ;EXIT IF ERR IN LIB$GET_FOREIGN ; .ALIGN LONG,CNOP ;NO_FNM: ; MOVB #5,FNA_STR_LEN ;SET DEFAULT FILENAME LENGTH ; BRW NO_ALQ ;SET FAB FILENAME LENGTH .ALIGN LONG,CNOP MOVE: TSTB ERR_OL ;CHECK IF FILENAME RECEIVED BEQLU NO_ALQ ;BR IF NO FILENAME MOVAL ERR_MSG,R1 ;START OF FILENAME CMPB #BACKSLASH,ERR_MSG ;IS SHOW ALLOCATED REQUESTED? BNEQ MOV_FNM ;BR IF NOT REQUESTED MOVB #1,DO_ALQ ;DO SHOW ALLOCATED INCL R1 ;BYPASS BACKSLASH DECW ERR_OL ;REMOVE BACK SLASH FROM LENGTH BEQL NO_ALQ ;BR IF ONLY BACKSLASH .ALIGN LONG,CNOP MOV_FNM: MOVB ERR_OL,FNA_STR_LEN ;SET ACTUAL FILENAME LENGTH MOVC3 FNA_STR_LEN,- ;MOVE FILENAME OVER ONE (R1),FNA_STR .ALIGN LONG,CNOP NO_ALQ: .ENDC MOVB FNA_STR_LEN,- ;FILE NAME LEN TO FAB FAB+FAB$B_FNS $PARSE FAB=FAB ;PARSE INPUT NAME BLBC R0,F_ERR1 ;BR IF RMS ERR BBS #NAM$V_WILDCARD,- ;DO SEARCH IF WILDCARD SET NAM$L_FNB+NAM,SEARCH BBS #NAM$V_SEARCH_LIST,- ;DO SEARCH IF SEARCH_LIST SET NAM$L_FNB+NAM,SEARCH BRW OK ;ONE FILE - NO WILDCARDS - EXIT .ALIGN LONG,CNOP F_ERR1: BRW F_ERR .ALIGN LONG,CNOP SEARCH: $SEARCH FAB=FAB ;SEARCH WILDCARDED FILE NAME BLBS R0,SRCHOK ;BR IF SEARCH OK CMPL R0,#RMS$_NMF ;CHECK NO MORE FILES BEQLU SEARCH_END ;BR IF NO MORE FILES CMPL R0,#RMS$_FNF ;CHECK FILE NOT FOUND BEQLU SEARCH_END ;BR IF FILE NOT FOUND BRW F_ERR ;SHOW SEARCH ERROR .ALIGN LONG,CNOP SEARCH_END: BRW OK ;BR IF NO MORE FILES OR FILE NOT FOUND .ALIGN LONG,CNOP SRCHOK: MOVL NAM+NAM$L_DEV,- ;ADDR OF DEVICE NAME TO REG R8 MOVZBW NAM+NAM$B_DEV,- ;LEN OF DEVICE NAME TO WORD CUR_DEV_W MOVL NAM+NAM$L_DIR,- ;ADDR OF DIRECTORY TO REG R9 MOVZBW NAM+NAM$B_DIR,- ;LEN OF DIRECTORY TO WORD CUR_DIR_W MOVL NAM+NAM$L_NAME,- ;ADDR OF FILE NAME TO REG R6 MOVZBW NAM+NAM$B_NAME,- ;LEN OF FILE NAME TO WORD CUR_NAM_W MOVL NAM+NAM$L_TYPE,- ;ADDR OF FILE TYPE TO REG R7 MOVZBW NAM+NAM$B_TYPE,- ;LEN OF FILE TYPE TO WORD CUR_TYP_W CMPC5 CUR_DEV_W,(R8),NULL,- ;CHECK IF SAME DEV NAME SAV_DEV_W,SAV_DEV BNEQU SET_BR ;BR IF NOT - NO PURGE CMPC5 CUR_DIR_W,(R9),NULL,- ;CHECK IF SAME FILE DIR SAV_DIR_W,SAV_DIR BNEQU SET_BR ;BR IF NOT - NO PURGE CMPC5 CUR_NAM_W,(R6),NULL,- ;CHECK IF SAME FILE NAME SAV_NAM_W,SAV_NAM BNEQU SET_BR ;BR IF NOT - NO PURGE CMPC5 CUR_TYP_W,(R7),NULL,- ;CHECK IF SAME FILE TYPE SAV_TYP_W,SAV_TYP BEQLU HAVEONE ;DEVICE, DIRECTORY, NAME, TYPE EQUAL .ALIGN LONG,CNOP SET_BR: BRW SET_SAV ;NO PURGE .ALIGN LONG,CNOP HAVEONE: MOVL #1,WAS_FILE ;ONE FILE LISTED MOVZBL NAM+NAM$B_RSL,- ;LEN OF RESULTANT FILE NAME TO DESCR RES_STR_D BBC #0,DO_ALQ,PUT_BR ;BRANCH IF NO SHOW ALLOCATED CLRL ALQ ;CLEAR IF NO SHOW ALLOC $OPEN FAB=FAB ;OPEN CURRENT FILE BLBS R0,CLOSE ;BR IF OPEN OK MOVL R0,R2 ;SAVE STATUS CODE $GETMSG_S - ;GET ERROR MESSAGE MSGID=R2,MSGLEN=ERR_OL,BUFADR=ERR_MSG_D MOVB #1,ERR_SW ;SET ERROR FAO OUTPUT BRW DOFAO ;SHOW ERROR WITH FILE NAME .ALIGN LONG,CNOP PUT_BR: BRW PUT_OUT ;PUT FILE NAME W/O ALLOCATE SIZE .ALIGN LONG,CNOP CLOSE: $CLOSE FAB=FAB ;CLOSE THIS FILE BLBS R0,CLOSOK ;BR IF NO CLOSE ERROR BRW F_ERR ;BR ON ERR ON CLOSE .ALIGN LONG,CNOP CLOSOK: MOVL FAB+FAB$L_ALQ,ALQ ;SAVE ALLOC QTY ADDL2 ALQ,TOT_ALQ ;ADD TO TOTAL BLOCKS .ALIGN LONG,CNOP DOFAO: MOVC5 #0,FAO_O,#BLANK,- ;CLEAR FAO OUT TO SPACES FAO_O_D,FAO_O BBC #0,ERR_SW,OK_FAO ;BR IF NOT SHOW ERROR $FAO_S CTRSTR=FAO_ERR_STR_D,- ;FORMAT ERROR OUTPUT LINE OUTLEN=FAO_OL,- OUTBUF=FAO_O_D,- P1=RES_STR_D,- P2=#RES_STR_D,- P3=#ERR_MSG_D BRB FAO_CK ;CHECK IF ERROR ON FAO OK_FAO: $FAO_S CTRSTR=FAO_STR_D,- ;FORMAT OUTPUT LINE OUTLEN=FAO_OL,- OUTBUF=FAO_O_D,- P1=ALQ,- P2=RES_STR_D,- P3=#RES_STR_D FAO_CK: BLBC R0,S_ERR ;BR IF ERR ON FAO MOVW FAO_OL,FAO_O_D ;SET ACTUAL OUTPUT LENGTH PUSHAQ FAO_O_D ;DESCR ADDR TO STACK CALLS #1,G^LIB$PUT_OUTPUT ;WRITE OUTPUT STR TO SYS$OUTPUT BLBC R0,S_ERR ;BR IF ERR ON PUT_OUT MOVW #MAX_OUT,FAO_O_D ;RESET MAX LEN BRB SET_SAV .ALIGN LONG,CNOP PUT_OUT: PUSHAQ RES_STR_D ;DESCR ADDR TO STACK CALLS #1,G^LIB$PUT_OUTPUT ;WRITE RESULTANT FILE NAME TO SYS$OUTPUT .ALIGN LONG,CNOP SET_SAV: MOVC3 CUR_DEV_W,(R8),- ;SAVE CURRENT DEVICE NAME SAV_DEV MOVW CUR_DEV_W,SAV_DEV_W ;SAVE CURRENT DEVICE NAME LEN MOVC3 CUR_DIR_W,(R9),- ;SAVE CURRENT DIRECTORY SAV_DIR MOVW CUR_DIR_W,SAV_DIR_W ;SAVE CURRENT DIRECTORY LEN MOVC3 CUR_NAM_W,(R6),- ;SAVE CURRENT FILE NAME SAV_NAM MOVW CUR_NAM_W,SAV_NAM_W ;SAVE CURRENT FILE NAME LEN MOVC3 CUR_TYP_W,(R7),- ;SAVE CURRENT FILE TYPE SAV_TYP MOVW CUR_TYP_W,SAV_TYP_W ;SAVE CURRENT FILE TYPE LEN CLRB ERR_SW ;SET NOT ERROR FAO OUTPUT BRW SEARCH ;GET NEXT FILE NAME .ALIGN LONG,CNOP S_ERR: PUSHL R0 ;CONDITION STATUS TO STACK CALLS #1,G^LIB$SIGNAL ;SIGNAL ERROR .ALIGN LONG,CNOP F_ERR: PUSHL FAB+FAB$L_STV ;STATUS VALUES TO STACK PUSHL FAB+FAB$L_STS ;CONDITION STATUS TO STACK CALLS #2,G^LIB$SIGNAL ;SIGNAL ERROR .ALIGN LONG,CNOP OK: BLBS WAS_FILE,SET_OK ;BR IF ANY WAS ANY LISTED MOVB #3,RETSTAT ;WARNING - NO FILES FOUND PUSHAB NO_FILES ;DESCR ADDR TO STACK CALLS #1,G^LIB$PUT_OUTPUT ;WRITE NO FILES LISTED TO SYS$OUTPUT BRW DONORM ;BYPASS 0 BLOCKS ALLOCATED MESSAGE .ALIGN LONG,CNOP SET_OK: BBC #0,DO_ALQ,DONORM ;BRANCH IF NO SHOW ALLOCATED $FAO_S CTRSTR=FAO_TOT_D,- ;FORMAT OUTPUT LINE OUTLEN=FAO_OL,- OUTBUF=FAO_O_D,- P1=TOT_ALQ BLBC R0,S_ERR_2 ;BR IF ERR ON FAO MOVW FAO_OL,FAO_O_D ;SET ACTUAL OUTPUT LENGTH PUSHAQ FAO_O_D ;DESCR ADDR TO STACK CALLS #1,G^LIB$PUT_OUTPUT ;WRITE OUTPUT STR TO SYS$OUTPUT BLBC R0,S_ERR_2 ;BR IF ERR ON PUT_OUT MOVW #MAX_OUT,FAO_O_D ;RESET MAX LEN .ALIGN LONG,CNOP DONORM: MOVL RETSTAT,R0 ;SET RETURN CODE FOR SYSTEM .ALIGN LONG,CNOP EXIT: RET ;RETURN TO SYSTEM .ALIGN LONG,CNOP S_ERR_2: BRW S_ERR ;ERROR IN SYS SERVICE .END WILLPURGE