(FILECREATED " 2-Nov-84 16:27:44" {ERIS}<STANSBURY>HARMONYDFS>DLIONFSSCAVENGE.;5 4797 changes to: (FNS \SVFILENAME SCAVENGEVOLUME \SVVERSION) (VARS DLIONFSSCAVENGECOMS) previous date: " 1-Nov-84 14:29:47" {ERIS}<STANSBURY>HARMONYDFS>DLIONFSSCAVENGE.;4) (* Copyright (c) 1984 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT DLIONFSSCAVENGECOMS) (RPAQQ DLIONFSSCAVENGECOMS ((DECLARE: EVAL@COMPILE DONTCOPY (FILES (LOADCOMP) DLIONFS)) (DECLARE: (LOCALVARS . T)) (FNS SCAVENGEVOLUME \SVFILENAME \SVVERSION))) (DECLARE: EVAL@COMPILE DONTCOPY (FILESLOAD (LOADCOMP) DLIONFS) ) (DECLARE: (DECLARE: DOEVAL@COMPILE DONTCOPY (LOCALVARS) ) ) (DEFINEQ (SCAVENGEVOLUME [LAMBDA (volName) (* hts: " 1-Nov-84 14:28") (* VOL: atom (which is a lisp logical volume name)) (* If your BTree is intact but your directory is smashed, this routine will scavenge your volume by building a new directory which associates all fileIDs in the BTree with a gensym filename) (WITH.MONITOR \DFStopMonitor (\DFSEnsureDlion) (\DFSEnsureInitialized) (Assert (EQ (\DFSVolumeType volName) (QUOTE LISPFILE))) (PROG ((vol (\DFSGetLVPage volName)) DIRECTORY) (UNINTERRUPTABLY (* * Get rid of old (screwed up) directory) (Assert (SETQ DIRECTORY (GetDirectory vol))) (FORGETPAGES DIRECTORY) (\DFSTrimHelper vol (create FileDescriptor fileID ←(fetch (LogicalVolumeDescriptor volumeRootDirectory) of vol) volumeID ←(fetch (LogicalVolumeDescriptor vID) of vol) location ←(QUOTE local) immutable ← NIL temporary ← NIL size ← 50 type ← 0) 0) (* * Create a fresh directory) (\DFSMakeVolumeDirectory vol) (\DFSOpenDirectory vol) (SETQ DIRECTORY (GetDirectory vol)) (* * For each file in volume file map, if it is not the directory file, then enter this fileID into the directory with a gensym filename) [bind (DIRECTORYID ←(fetch (LogicalVolumeDescriptor volumeRootDirectory) of vol)) NAME&VERSION for fileID in (\DFSVFMGenerateFileIDs vol) do (if (NOT (EQP fileID DIRECTORYID)) then (PROG [(stream (create DLIONSTREAM FILEDESC ←(create FileDescriptor fileID ← fileID volumeID ←(fetch (LogicalVolumeDescriptor vID) of vol) location ←(QUOTE local) type ← 0] (\DFSMakeDirEntry stream (create UNAME CHARPAIRS ←[\SVFILENAME (SETQ NAME&VERSION (fetch (LeaderPage fileName) of (\LvGetPage vol (\DFSFindPageAddr vol (fetch FILEDESC of stream) 0] VERSION ←(\SVVERSION NAME&VERSION fileID)) DIRECTORY])]) (\SVFILENAME [LAMBDA (NAME&VERSION) (* hts: " 2-Nov-84 16:27") (* * Extract the filename part of NAME&VERSION (ignore version nuber) and return it as a list of charcode cons's) (PROG [(NAME (for C in (CHCON NAME&VERSION) until (EQ C (CHARCODE ;)) collect (CONS C] (RETURN (if [for C in NAME thereis (AND (NOT (EQ (CAR C) (CHARCODE >))) (ZEROP (\GETBASEBYTE (fetch (ARRAYP BASE) of \DISKNAMECASEARRAY) (CAR C] then (* If there is an illegal char in the filename, gin up a random filename) (for C in (CHCON (GENSYM (QUOTE TRASHEDFILENAME))) collect (CONS C)) else NAME]) (\SVVERSION [LAMBDA (NAME&VERSION FILEID) (* hts: " 1-Nov-84 14:28") (* * Fetch the version number from NAME&VERSION. If it's garbled (ie, isn't a fixp) use the fileID as a version number instead (the fileID will at least give the file a unique version number and so avoid version number clashes)) (OR [FIXP (PACKC (for C on (CHCON NAME&VERSION) when (EQ (CAR C) (CHARCODE ;)) do (RETURN (CDR C] FILEID]) ) (PUTPROPS DLIONFSSCAVENGE COPYRIGHT ("Xerox Corporation" 1984)) (DECLARE: DONTCOPY (FILEMAP (NIL (711 4711 (SCAVENGEVOLUME 721 . 3265) (\SVFILENAME 3267 . 4167) (\SVVERSION 4169 . 4709) )))) STOP