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