From: Christopher Yeoh <yeohc@au1.ibm.com>

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.
0.6.3-post-fixes
Dr Scofield 2009-01-22 16:43:09 +00:00
parent c1e9990d82
commit 7e08d7da15
3 changed files with 59 additions and 7 deletions

View File

@ -187,9 +187,13 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Inventory.Archiver
new FileStream(loadPath, FileMode.Open), CompressionMode.Decompress)); new FileStream(loadPath, FileMode.Open), CompressionMode.Decompress));
byte[] data; 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)) if (LoadAsset(filePath, data))
successfulAssetRestores++; successfulAssetRestores++;

View File

@ -88,12 +88,16 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
int failedAssetRestores = 0; int failedAssetRestores = 0;
byte[] data; byte[] data;
while ((data = archive.ReadEntry(out filePath)) != null) TarArchiveReader.TarEntryType entryType;
while ((data = archive.ReadEntry(out filePath, out entryType)) != null)
{ {
//m_log.DebugFormat( //m_log.DebugFormat(
// "[ARCHIVER]: Successfully read {0} ({1} bytes)}", filePath, data.Length); // "[ARCHIVER]: Successfully read {0} ({1} bytes)}", filePath, data.Length);
if (entryType==TarArchiveReader.TarEntryType.TYPE_DIRECTORY) {
if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) m_log.WarnFormat("[ARCHIVER]: Ignoring directory entry {0}",
filePath);
}
else if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH))
{ {
serialisedSceneObjects.Add(m_asciiEncoding.GetString(data)); serialisedSceneObjects.Add(m_asciiEncoding.GetString(data));
} }

View File

@ -39,6 +39,18 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
public class TarArchiveReader public class TarArchiveReader
{ {
//private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); //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(); protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding();
@ -66,15 +78,16 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
/// </summary> /// </summary>
/// <param name="filePath"></param> /// <param name="filePath"></param>
/// <returns>the data for the entry. Returns null if there are no more entries</returns> /// <returns>the data for the entry. Returns null if there are no more entries</returns>
public byte[] ReadEntry(out string filePath) public byte[] ReadEntry(out string filePath, out TarEntryType entryType)
{ {
filePath = String.Empty; filePath = String.Empty;
entryType = TarEntryType.TYPE_UNKNOWN;
TarHeader header = ReadHeader(); TarHeader header = ReadHeader();
if (null == header) if (null == header)
return null; return null;
entryType = header.EntryType;
filePath = header.FilePath; filePath = header.FilePath;
byte[] data = m_br.ReadBytes(header.FileSize); 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.FilePath = tarHeader.FilePath.Trim(m_nullCharArray);
tarHeader.FileSize = ConvertOctalBytesToDecimal(header, 124, 11); 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; return tarHeader;
} }
@ -145,5 +188,6 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
{ {
public string FilePath; public string FilePath;
public int FileSize; public int FileSize;
public TarArchiveReader.TarEntryType EntryType;
} }
} }