From 7e08d7da157294640e72c22a521ae233bad2b84c Mon Sep 17 00:00:00 2001 From: Dr Scofield Date: Thu, 22 Jan 2009 16:43:09 +0000 Subject: [PATCH] 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. --- .../Archiver/InventoryArchiveReadRequest.cs | 8 +++- .../World/Archiver/ArchiveReadRequest.cs | 10 ++-- .../World/Archiver/TarArchiveReader.cs | 48 ++++++++++++++++++- 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Environment/Modules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/Environment/Modules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index eab44614f4..e15a232632 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs @@ -187,9 +187,13 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Inventory.Archiver new FileStream(loadPath, FileMode.Open), CompressionMode.Decompress)); byte[] data; - while ((data = archive.ReadEntry(out filePath)) != null) + TarArchiveReader.TarEntryType entryType; + while ((data = archive.ReadEntry(out filePath, out entryType)) != null) { - if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) + if (entryType==TarArchiveReader.TarEntryType.TYPE_DIRECTORY) { + m_log.WarnFormat("[ARCHIVER]: Ignoring directory entry {0}", + filePath); + } else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) { if (LoadAsset(filePath, data)) successfulAssetRestores++; diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs index a5b59177f2..73fd9160a8 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 4e000cc193..5d308f06e9 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; } }