From 7e08d7da157294640e72c22a521ae233bad2b84c Mon Sep 17 00:00:00 2001 From: Dr Scofield Date: Thu, 22 Jan 2009 16:43:09 +0000 Subject: From: Christopher Yeoh this patch makes load-oar a bit more tolerant to irrelevant differences in the oar file format. Directory entries are now ignored rather than trying to interpret them as files they hold which results in the load-oar failing. This change makes it easier to manually modify oar files. --- .../Modules/World/Archiver/ArchiveReadRequest.cs | 10 +++-- .../Modules/World/Archiver/TarArchiveReader.cs | 48 +++++++++++++++++++++- 2 files changed, 53 insertions(+), 5 deletions(-) (limited to 'OpenSim/Region/Environment/Modules/World/Archiver') diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs index a5b5917..73fd916 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs @@ -88,12 +88,16 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver int failedAssetRestores = 0; byte[] data; - while ((data = archive.ReadEntry(out filePath)) != null) + TarArchiveReader.TarEntryType entryType; + while ((data = archive.ReadEntry(out filePath, out entryType)) != null) { //m_log.DebugFormat( // "[ARCHIVER]: Successfully read {0} ({1} bytes)}", filePath, data.Length); - - if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) + if (entryType==TarArchiveReader.TarEntryType.TYPE_DIRECTORY) { + m_log.WarnFormat("[ARCHIVER]: Ignoring directory entry {0}", + filePath); + } + else if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) { serialisedSceneObjects.Add(m_asciiEncoding.GetString(data)); } diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs b/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs index 4e000cc..5d308f0 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs @@ -39,6 +39,18 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver public class TarArchiveReader { //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public enum TarEntryType + { + TYPE_UNKNOWN = 0, + TYPE_NORMAL_FILE = 1, + TYPE_HARD_LINK = 2, + TYPE_SYMBOLIC_LINK = 3, + TYPE_CHAR_SPECIAL = 4, + TYPE_BLOCK_SPECIAL = 5, + TYPE_DIRECTORY = 6, + TYPE_FIFO = 7, + TYPE_CONTIGUOUS_FILE = 8, + } protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); @@ -66,15 +78,16 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver /// /// /// the data for the entry. Returns null if there are no more entries - public byte[] ReadEntry(out string filePath) + public byte[] ReadEntry(out string filePath, out TarEntryType entryType) { filePath = String.Empty; - + entryType = TarEntryType.TYPE_UNKNOWN; TarHeader header = ReadHeader(); if (null == header) return null; + entryType = header.EntryType; filePath = header.FilePath; byte[] data = m_br.ReadBytes(header.FileSize); @@ -112,6 +125,36 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver tarHeader.FilePath = tarHeader.FilePath.Trim(m_nullCharArray); tarHeader.FileSize = ConvertOctalBytesToDecimal(header, 124, 11); + switch (header[156]) + { + case 0: + tarHeader.EntryType = TarEntryType.TYPE_NORMAL_FILE; + break; + case (byte)'0': + tarHeader.EntryType = TarEntryType.TYPE_NORMAL_FILE; + break; + case (byte)'1': + tarHeader.EntryType = TarEntryType.TYPE_HARD_LINK; + break; + case (byte)'2': + tarHeader.EntryType = TarEntryType.TYPE_SYMBOLIC_LINK; + break; + case (byte)'3': + tarHeader.EntryType = TarEntryType.TYPE_CHAR_SPECIAL; + break; + case (byte)'4': + tarHeader.EntryType = TarEntryType.TYPE_BLOCK_SPECIAL; + break; + case (byte)'5': + tarHeader.EntryType = TarEntryType.TYPE_DIRECTORY; + break; + case (byte)'6': + tarHeader.EntryType = TarEntryType.TYPE_FIFO; + break; + case (byte)'7': + tarHeader.EntryType = TarEntryType.TYPE_CONTIGUOUS_FILE; + break; + } return tarHeader; } @@ -145,5 +188,6 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver { public string FilePath; public int FileSize; + public TarArchiveReader.TarEntryType EntryType; } } -- cgit v1.1