diff options
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 eab4461..e15a232 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 | |||
187 | new FileStream(loadPath, FileMode.Open), CompressionMode.Decompress)); | 187 | new FileStream(loadPath, FileMode.Open), CompressionMode.Decompress)); |
188 | 188 | ||
189 | byte[] data; | 189 | byte[] data; |
190 | while ((data = archive.ReadEntry(out filePath)) != null) | 190 | TarArchiveReader.TarEntryType entryType; |
191 | while ((data = archive.ReadEntry(out filePath, out entryType)) != null) | ||
191 | { | 192 | { |
192 | if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) | 193 | if (entryType==TarArchiveReader.TarEntryType.TYPE_DIRECTORY) { |
194 | m_log.WarnFormat("[ARCHIVER]: Ignoring directory entry {0}", | ||
195 | filePath); | ||
196 | } else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) | ||
193 | { | 197 | { |
194 | if (LoadAsset(filePath, data)) | 198 | if (LoadAsset(filePath, data)) |
195 | successfulAssetRestores++; | 199 | successfulAssetRestores++; |
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs index a5b5917..73fd916 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 | |||
88 | int failedAssetRestores = 0; | 88 | int failedAssetRestores = 0; |
89 | 89 | ||
90 | byte[] data; | 90 | byte[] data; |
91 | while ((data = archive.ReadEntry(out filePath)) != null) | 91 | TarArchiveReader.TarEntryType entryType; |
92 | while ((data = archive.ReadEntry(out filePath, out entryType)) != null) | ||
92 | { | 93 | { |
93 | //m_log.DebugFormat( | 94 | //m_log.DebugFormat( |
94 | // "[ARCHIVER]: Successfully read {0} ({1} bytes)}", filePath, data.Length); | 95 | // "[ARCHIVER]: Successfully read {0} ({1} bytes)}", filePath, data.Length); |
95 | 96 | if (entryType==TarArchiveReader.TarEntryType.TYPE_DIRECTORY) { | |
96 | if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) | 97 | m_log.WarnFormat("[ARCHIVER]: Ignoring directory entry {0}", |
98 | filePath); | ||
99 | } | ||
100 | else if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) | ||
97 | { | 101 | { |
98 | serialisedSceneObjects.Add(m_asciiEncoding.GetString(data)); | 102 | serialisedSceneObjects.Add(m_asciiEncoding.GetString(data)); |
99 | } | 103 | } |
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs b/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs index 4e000cc..5d308f0 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 | |||
39 | public class TarArchiveReader | 39 | public class TarArchiveReader |
40 | { | 40 | { |
41 | //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 41 | //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
42 | public enum TarEntryType | ||
43 | { | ||
44 | TYPE_UNKNOWN = 0, | ||
45 | TYPE_NORMAL_FILE = 1, | ||
46 | TYPE_HARD_LINK = 2, | ||
47 | TYPE_SYMBOLIC_LINK = 3, | ||
48 | TYPE_CHAR_SPECIAL = 4, | ||
49 | TYPE_BLOCK_SPECIAL = 5, | ||
50 | TYPE_DIRECTORY = 6, | ||
51 | TYPE_FIFO = 7, | ||
52 | TYPE_CONTIGUOUS_FILE = 8, | ||
53 | } | ||
42 | 54 | ||
43 | protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); | 55 | protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); |
44 | 56 | ||
@@ -66,15 +78,16 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver | |||
66 | /// </summary> | 78 | /// </summary> |
67 | /// <param name="filePath"></param> | 79 | /// <param name="filePath"></param> |
68 | /// <returns>the data for the entry. Returns null if there are no more entries</returns> | 80 | /// <returns>the data for the entry. Returns null if there are no more entries</returns> |
69 | public byte[] ReadEntry(out string filePath) | 81 | public byte[] ReadEntry(out string filePath, out TarEntryType entryType) |
70 | { | 82 | { |
71 | filePath = String.Empty; | 83 | filePath = String.Empty; |
72 | 84 | entryType = TarEntryType.TYPE_UNKNOWN; | |
73 | TarHeader header = ReadHeader(); | 85 | TarHeader header = ReadHeader(); |
74 | 86 | ||
75 | if (null == header) | 87 | if (null == header) |
76 | return null; | 88 | return null; |
77 | 89 | ||
90 | entryType = header.EntryType; | ||
78 | filePath = header.FilePath; | 91 | filePath = header.FilePath; |
79 | byte[] data = m_br.ReadBytes(header.FileSize); | 92 | byte[] data = m_br.ReadBytes(header.FileSize); |
80 | 93 | ||
@@ -112,6 +125,36 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver | |||
112 | tarHeader.FilePath = tarHeader.FilePath.Trim(m_nullCharArray); | 125 | tarHeader.FilePath = tarHeader.FilePath.Trim(m_nullCharArray); |
113 | tarHeader.FileSize = ConvertOctalBytesToDecimal(header, 124, 11); | 126 | tarHeader.FileSize = ConvertOctalBytesToDecimal(header, 124, 11); |
114 | 127 | ||
128 | switch (header[156]) | ||
129 | { | ||
130 | case 0: | ||
131 | tarHeader.EntryType = TarEntryType.TYPE_NORMAL_FILE; | ||
132 | break; | ||
133 | case (byte)'0': | ||
134 | tarHeader.EntryType = TarEntryType.TYPE_NORMAL_FILE; | ||
135 | break; | ||
136 | case (byte)'1': | ||
137 | tarHeader.EntryType = TarEntryType.TYPE_HARD_LINK; | ||
138 | break; | ||
139 | case (byte)'2': | ||
140 | tarHeader.EntryType = TarEntryType.TYPE_SYMBOLIC_LINK; | ||
141 | break; | ||
142 | case (byte)'3': | ||
143 | tarHeader.EntryType = TarEntryType.TYPE_CHAR_SPECIAL; | ||
144 | break; | ||
145 | case (byte)'4': | ||
146 | tarHeader.EntryType = TarEntryType.TYPE_BLOCK_SPECIAL; | ||
147 | break; | ||
148 | case (byte)'5': | ||
149 | tarHeader.EntryType = TarEntryType.TYPE_DIRECTORY; | ||
150 | break; | ||
151 | case (byte)'6': | ||
152 | tarHeader.EntryType = TarEntryType.TYPE_FIFO; | ||
153 | break; | ||
154 | case (byte)'7': | ||
155 | tarHeader.EntryType = TarEntryType.TYPE_CONTIGUOUS_FILE; | ||
156 | break; | ||
157 | } | ||
115 | return tarHeader; | 158 | return tarHeader; |
116 | } | 159 | } |
117 | 160 | ||
@@ -145,5 +188,6 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver | |||
145 | { | 188 | { |
146 | public string FilePath; | 189 | public string FilePath; |
147 | public int FileSize; | 190 | public int FileSize; |
191 | public TarArchiveReader.TarEntryType EntryType; | ||
148 | } | 192 | } |
149 | } | 193 | } |