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
parent
c1e9990d82
commit
7e08d7da15
|
@ -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++;
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue