(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