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));
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++;

View File

@ -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));
}

View File

@ -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
/// </summary>
/// <param name="filePath"></param>
/// <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;
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;
}
}