.TITLE DELBFID Delete By File Id  .IDENT /1.0/ ;++ ; ; Title: ; DELBFID.MAR - Delete a file given its file id. ; ; Version: ; 1.0 ; ; Facility: ; System Management ; ; Abstract: ; This program deletes a file given a file id and device. This ; is useful when you need to delete a "lost" file (one not in a ; directory). Note that if the file is in a directory, this ; will not remove the entry from the directory, but just delete ; the file. ; ; Environment: ; Requires delete access to file. ; ; Author: ; Mark Oakley Battelle Memorial Institute ; ; Modified: ; ; ;--  .SBTTL Symbols, Macros, Data ! " $FIBDEF ; Symbols for file information block. # $IODEF ; Symbols for QIO functions. $ $DVIDEF ; Symbols for $GETDVI calls. % $TPADEF ; Symbols for LIB$TPARSE calls. & '; (; Macro to check return status of system calls. ); * .MACRO ON_ERR THERE,?HERE + BLBS R0,HERE , BRW THERE -HERE: .ENDM ON_ERR . / .PSECT DELBFID_DATA,RD,WRT,NOEXE,PAGE,SHR,PIC 0 1COMMAND_LINE_DESC: ; Data structures for command line 2 .LONG COMMAND_LINE_BUF_SIZ ; processing. 3 .ADDRESS COMMAND_LINE_BUF 4 5COMMAND_LINE_BUF_SIZ = 80 6COMMAND_LINE_BUF: 7 .BLKB COMMAND_LINE_BUF_SIZ 8 9COMMAND_LINE_LEN: : .BLKL 1 ; <TPARSE_ARG_BLK: ; Parse block for LIB$TPARSE. = .LONG TPA$K_COUNT0 > .BLKL TPA$K_COUNT0 ? @DEVNAM_DESC: ; Device on which file resides. A .LONG DEVNAM_BUF_SIZ B .ADDRESS DEVNAM_BUF C DDEVNAM_BUF_SIZ = 60 EDEVNAM_BUF: F .BLKB DEVNAM_BUF_SIZ G HDEFAULT_DEVICE: I .ASCID /SYS$DISK/ J KFILE_FIB_DESC: ; File to delete. L .LONG FIB$K_LENGTH M .ADDRESS FILE_FIB N OFILE_FIB: P .BLKB FIB$K_LENGTH Q RCHANNEL: ; Channel to disk that file is on. S .BLKW 1 T UQIO_IOSB: ; Status from a $QIO. V .BLKQ 1 W XFILE_NUM: ; Store the file id here. Y .BLKW 1 Z [FILE_SEQ: ; Store the file seq. number here. \ .BLKW 1 ] ^ .SBTTL State Table for Parsing Command line _ .PSECT DELBFID_STBL,RD,NOWRT,EXE,PAGE,SHR,PIC ` a $INIT_STATE STATE_TABLE,KEY_TABLE b c $STATE START ; Make sure we have a file d $TRAN TPA$_EOS,TPA$_FAIL ; id. e $TRAN '/',QUALS f g $STATE QUALS h $TRAN 'FID',GET_FID i $TRAN 'SEQ',GET_SEQ j k $STATE GET_FID l $TRAN '=' m $STATE n $TRAN TPA$_DECIMAL,,,,FILE_NUM o $STATE p $TRAN '/',QUALS q $TRAN TPA$_LAMBDA,GET_DEVICE r s $STATE GET_SEQ t $TRAN '=' u $STATE v $TRAN TPA$_DECIMAL,,,,FILE_SEQ w $STATE x $TRAN '/',QUALS y $TRAN TPA$_LAMBDA,GET_DEVICE z { $STATE GET_DEVICE ; See if we have a device. | $TRAN TPA$_EOS,TPA$_EXIT } $TRAN TPA$_SYMBOL,TPA$_EXIT,,,DEVNAM_DESC ~  $END_STATE .PSECT DELBFID_CODE,RD,NOWRT,EXE,PAGE,SHR,PIC .ENTRY DELBFID,^M MOVQ DEFAULT_DEVICE,DEVNAM_DESC ; Assume no disk specified. PUSHL #0 ; Get the command line. PUSHAL COMMAND_LINE_LEN PUSHL #0 PUSHAL COMMAND_LINE_DESC CALLS #4,G^LIB$GET_FOREIGN ON_ERR DELBFID_EXIT BISL2 #TPA$M_ABBREV,- ; Permit non-ambiguous TPARSE_ARG_BLK+TPA$L_OPTIONS ; abbreviations. MOVZWL COMMAND_LINE_LEN,- ; Parse the command line TPARSE_ARG_BLK+TPA$L_STRINGCNT ; for file id and device. MOVAL COMMAND_LINE_BUF,- TPARSE_ARG_BLK+TPA$L_STRINGPTR PUSHAL KEY_TABLE PUSHAL STATE_TABLE PUSHAL TPARSE_ARG_BLK CALLS #3,G^LIB$TPARSE ON_ERR DELBFID_EXIT MOVL FILE_FIB_DESC+4,R1 ; Remember where the fib is, MOVW FILE_NUM,FIB$W_FID_NUM(R1) ; and set the file id. MOVW FILE_SEQ,FIB$W_FID_SEQ(R1) ; and set the file id. $ASSIGN_S - ; Get a channel to the DEVNAM=DEVNAM_DESC,- ; device. CHAN=CHANNEL ON_ERR DELBFID_EXIT $QIOW_S CHAN=CHANNEL,- ; Delete the file (or at FUNC=#IO$_DELETE!IO$M_DELETE,- ; least, mark it for delete). IOSB=QIO_IOSB,- P1=FILE_FIB_DESC ON_ERR DELBFID_EXIT MOVL QIO_IOSB,R0 ON_ERR DELBFID_EXIT DELBFID_EXIT: RET .END DELBFID