.title deletedir delete directory and all files ; ; Author: Rodrick A. Eldridge ; 104 Computer Science ; Iowa State University ; Ames, Iowa 50011 ; (515) 294-5659 ; ; Created: July 1985 ; ; Modification History: ; ; Summer/Fall 1986 ; Converted to use the MLR Macro Language ; ; Description: This program will delete the directory and all files within the ; directory located on the device. ; ; The program will not attempt to delete any directories or files ; that are not owned by the uic; or if uic is specified as 0, ; the program will not attempt to delete any directories or files ; that are not owned by the same uic as the directory. ; ; Format: external module delete_dir - ; ; ; Arguments: device_name: character string ; (passed by descriptor) ; ; Device name. ; ; directory: character string ; (passed by descriptor) ; ; Directory name. ; ; uic: longword ; (passed by reference) ; ; User identification code. ; ; If =0 then use the owner uic of the directory. ; ; flag: longword ; (passed by reference) ; ; Delete flags. ; ; If =0 then do not delete mfd. ; If <>0 then delete mfd. ; global module delete_dir - mask= - psect=delete_dir const $atrdef ; file attribute definitions $dscdef ; descriptor definitions $fchdef ; file characteristics definitions $fibdef ; file information block definitions $fscndef ; file scan definitions $iodef ; i/o defintions $lnmdef ; logical name definitions $namdef ; name block definitions $rmsdef ; record managament system defintions $ssdef ; system status definitions directory_table_length = nam$c_maxrss + 8 file_table_length = nam$c_maxrss + 8 did_table_length = fib$s_did var fab_search: $fab nam=nam_search nam_search: $nam ess=nam$c_maxrss,- esa=nam,- rss=nam$c_maxrss,- rsa=string nam: .blkb nam$c_maxrss fib_list: item atr$s_uic,atr$c_uic,uic item atr$s_uchar,atr$c_uchar,uchar .long 0 translate_attribute: .long lnm$m_case_blind translate_list: item lnm$c_namlength,lnm$_string,- disk,disk_descr .long 0 create_attribute: .long lnm$m_concealed create_list: item lnm$c_namlength,lnm$_string,string,0 item lnm$s_lnmdef,lnm$_attributes,- create_attribute,0 .long 0 filescan_list: item 0,fscn$_name item 0,fscn$_type item 0,fscn$_version .long 0 fib_descr: descr .blkb fib$k_length fib * string_descr: stdescr .blkb nam$c_maxrss string * disk_descr: stdescr .blkb lnm$c_namlength disk * save_descr: stdescr .blkb nam$c_maxrss save * directory_descr: stdescr .blkb nam$c_maxrss directory * file_descr: stdescr .blkb nam$c_maxrss file * process_table_descr: .ascid /LNM$PROCESS_TABLE/ sysdisk_descr: .ascid /SYS$DISK/ wild_card_descr: .ascid /*.*;*/ mfd_descr: .ascid /[-]/ directory_table: .repeat 10 stdescr .blkb nam$c_maxrss * .endr file_table: .repeat 10 stdescr .blkb nam$c_maxrss * .endr did_table: .repeat 10 .blkb fib$s_did .endr dir_length: .word 5 dir_string: .ascii /.DIR;/ owner_uic: .blkl 1 uic: .blkb atr$s_uic uchar: .blkb atr$s_uchar fib_chan: .blkw 1 nesting_level: .word 0 status: .blkq 1 procedure scan_file - psect=delete_dir begin movzbw nam_search+nam$b_rsl,string_descr $filescan_s - string_descr,filescan_list exit_if_error moval filescan_list,r6 ; r6=filescan list address moval file,r7 ; r7=buffer address movl fscn$l_addr(r6),r8 ; r8=file name address movc3 fscn$w_length(r6),(r8),(r7) ; move file name to buffer movw fscn$w_length(r6),file_descr ; update length addw fscn$w_length(r6),r7 ; r7=end of string addw #fscn$s_fscndef,r6 ; r6=next item in filescan list movl fscn$l_addr(r6),r8 ; r8=file type address movc3 fscn$w_length(r6),(r8),(r7) ; move file type to buffer addw fscn$w_length(r6),file_descr ; update length addw fscn$w_length(r6),r7 ; r7=end of string addw #fscn$s_fscndef,r6 ; r6=next item in filescan list movl fscn$l_addr(r6),r8 ; r8=file version address movc3 fscn$w_length(r6),(r8),(r7) ; move file version to buffer addw fscn$w_length(r6),file_descr ; update length return end procedure access_file - psect=delete_dir begin $qiow_s - chan=fib_chan,- func=#io$_access,- iosb=status,- p1=fib_descr,- p2=#file_descr,- p5=#fib_list exit_if_error movzwl status,r0 exit_if_error return end procedure delete_file - psect=delete_dir begin if eql then $qiow_s - chan=fib_chan,- func=#io$_delete!io$m_delete,- iosb=status,- p1=fib_descr,- p2=#file_descr else $qiow_s - chan=fib_chan,- func=#io$_delete,- iosb=status,- p1=fib_descr,- p2=#file_descr end exit_if_error movzwl status,r0 exit_if_error return end procedure initialize - psect=delete_dir begin $trnlnm_s - lognam=sysdisk_descr,- tabnam=process_table_descr,- attr=translate_attribute,- itmlst=translate_list exit_if_error movq @delete_dir.device_descr(ap),r6 movc3 r6,(r7),string ; move argument to buffer movw r6,string_descr ; update length movw r6,create_list ; set length in create list $crelnm_s - lognam=sysdisk_descr,- tabnam=process_table_descr,- itmlst=create_list exit_if_error $assign_s - chan=fib_chan,- devnam=string_descr exit_if_error sys$setddir - new_dir_addr= q^mfd_descr,- length_addr= w^save_descr,- cur_dir_addr= q^save_descr exit_if_error movq @delete_dir.directory_descr(ap),r6 moval string,r9 ; r9=address subw #2,r6 ; don't move leading incl r7 ; and trailing "[]"s movc3 r6,(r7),(r9) ; move argument to string addw r6,r9 ; r9=end of string movc3 dir_length,dir_string,(r9) ; append ".DIR;" addw3 dir_length,r6,string_descr ; update length $fab_store - ; set file to search fab=fab_search,- fns=string_descr,- fna=string $parse - ; initialize name blk fab=fab_search exit_if_error $search - ; search for directory fab=fab_search exit_if_error scan_file movc5 #0,(r0),#0,#fib$k_length,fib movc3 #fib$s_did,nam_search+nam$w_did,fib+fib$w_did access_file if eql then movl uic,owner_uic else movl @delete_dir.uic(ap),owner_uic end movq @delete_dir.directory_descr(ap),r6 movc3 r6,(r7),directory ; move argument to buffer movw r6,directory_descr ; buffer length sys$setddir - new_dir_addr= q^directory_descr exit_if_error moval did_table,r9 ; r9=did table moval directory_table,r10 ; r10=directory table moval file_table,r11 ; r11=file table movc3 #fib$s_did,fib+fib$w_did,(r9) movw mfd_descr,dsc$w_length(r10) movc3 mfd_descr,mfd_descr+8,dsc$a_pointer(r10) movw file_descr,dsc$w_length(r11) movc3 file_descr,file,dsc$a_pointer(r11) incw nesting_level addl #did_table_length,r9 addl #directory_table_length,r10 addl #file_table_length,r11 return end procedure delete_directory - psect=delete_dir begin delete: $fab_store - fab=fab_search,- ; set wild card file searching fns=wild_card_descr,- fna=wild_card_descr+8 $parse - fab=fab_search ; initialize name blk exit_if_error loop: $search - fab=fab_search ; search for next file if eql or - ; if no more files eql then ; or file not found movzbl #ss$_normal,r0 goto unnest end exit_if_error scan_file movc5 #0,(r0),#0,#fib$k_length,fib movc3 #fib$s_did,nam_search+nam$w_did,fib+fib$w_did access_file if neq then goto nest end delete_file goto loop nest: movc3 #fib$s_did,fib+fib$w_did,(r9) movw file_descr,dsc$w_length(r11) movc3 file_descr,file,dsc$a_pointer(r11) moval filescan_list,r6 ; r6=filescan list address moval directory,r7 ; r7=buffer address addw directory_descr,r7 ; end of string decl r7 ; string - 1 movb #^a/./,(r7) ; replace "]" with "." incl r7 ; end of string movl fscn$l_addr(r6),r8 ; r8=file name address movc3 fscn$w_length(r6),(r8),(r7) ; move file name to buffer addw fscn$w_length(r6),r7 ; end of string movb #^a/]/,(r7) ; append "]" incw directory_descr addw fscn$w_length(r6),directory_descr sys$setddir - new_dir_addr= q^directory_descr,- length_addr= w^string_descr,- cur_dir_addr= q^string_descr exit_if_error movw string_descr,dsc$w_length(r10) movc3 string_descr,string,dsc$a_pointer(r10) incw nesting_level addl #did_table_length,r9 addl #directory_table_length,r10 addl #file_table_length,r11 goto delete unnest: decw nesting_level subl #did_table_length,r9 subl #directory_table_length,r10 subl #file_table_length,r11 movw dsc$w_length(r10),directory_descr movc3 directory_descr,dsc$a_pointer(r10),directory sys$setddir - new_dir_addr= q^directory_descr exit_if_error movw dsc$w_length(r11),file_descr movc3 file_descr,dsc$a_pointer(r11),file movc5 #0,(r0),#0,#fib$k_length,fib movc3 #fib$s_did,(r9),fib+fib$w_did access_file if eql then if neq then delete_file end goto exit end delete_file goto delete end begin if gtr then movl #ss$_insfarg,r0 return end initialize delete_directory exit: movl r0,status $dassgn_s - chan=fib_chan ; deassign channel movc3 disk_descr,disk,string ; move SYS$DISK to buffer movw disk_descr,string_descr ; update length movw disk_descr,create_list ; set length in create list $crelnm_s - lognam=sysdisk_descr,- ; create orginal SYS$DISK tabnam=process_table_descr,- itmlst=create_list sys$setddir - new_dir_addr= q^save_descr movl status,r0 return .end