(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