diff --git a/DiscImageChef.Filesystems/ISO9660/Dir.cs b/DiscImageChef.Filesystems/ISO9660/Dir.cs index 32668adf3..a73d57ce5 100644 --- a/DiscImageChef.Filesystems/ISO9660/Dir.cs +++ b/DiscImageChef.Filesystems/ISO9660/Dir.cs @@ -218,13 +218,8 @@ namespace DiscImageChef.Filesystems.ISO9660 FileUnitSize = 0, Interleave = 0, VolumeSequenceNumber = record.volume_sequence_number, - Filename = joliet - ? Encoding.BigEndianUnicode.GetString(data, - entryOff + DirectoryRecordSize, - record.name_len) - : Encoding.GetString(data, entryOff + DirectoryRecordSize, - record.name_len), - Timestamp = DecodeIsoDateTime(record.date) + Filename = entry.Filename, + Timestamp = DecodeIsoDateTime(record.date) }; if(hasResourceFork) entries[entry.Filename].ResourceFork = entry; @@ -248,8 +243,8 @@ namespace DiscImageChef.Filesystems.ISO9660 return entries; } - static void DecodeSystemArea(byte[] data, int start, int end, ref DecodedDirectoryEntry entry, - out bool hasResourceFork) + void DecodeSystemArea(byte[] data, int start, int end, ref DecodedDirectoryEntry entry, + out bool hasResourceFork) { int systemAreaOff = start; hasResourceFork = false; @@ -470,6 +465,50 @@ namespace DiscImageChef.Filesystems.ISO9660 break; case RRIP_NAME: + byte nmLength = data[systemAreaOff + 2]; + + if(@namespace != Namespace.Rrip) + { + systemAreaOff += nmLength; + break; + } + + AlternateName alternateName = + Marshal.ByteArrayToStructureLittleEndian(data, systemAreaOff, + Marshal.SizeOf()); + + byte[] nm; + if(alternateName.flags.HasFlag(AlternateNameFlags.Networkname)) + nm = joliet + ? Encoding.BigEndianUnicode.GetBytes(Environment.MachineName) + : Encoding.GetBytes(Environment.MachineName); + else + { + nm = new byte[nmLength - Marshal.SizeOf()]; + + Array.Copy(data, systemAreaOff + Marshal.SizeOf(), nm, 0, nm.Length); + } + + if(entry.RockRidgeAlternateName is null) entry.RockRidgeAlternateName = new byte[0]; + + byte[] newNm = new byte[entry.RockRidgeAlternateName.Length + nm.Length]; + Array.Copy(entry.RockRidgeAlternateName, 0, newNm, 0, + entry.RockRidgeAlternateName.Length); + Array.Copy(nm, 0, newNm, entry.RockRidgeAlternateName.Length, + nm.Length); + + entry.RockRidgeAlternateName = newNm; + + if(!alternateName.flags.HasFlag(AlternateNameFlags.Continue)) + { + entry.Filename = joliet + ? Encoding.BigEndianUnicode.GetString(entry.RockRidgeAlternateName) + : Encoding.GetString(entry.RockRidgeAlternateName); + entry.RockRidgeAlternateName = null; + } + + systemAreaOff += nmLength; + break; case RRIP_CHILDLINK: case RRIP_PARENTLINK: case RRIP_RELOCATED_DIR: diff --git a/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs b/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs index c0c1095b6..032e59d78 100644 --- a/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs +++ b/DiscImageChef.Filesystems/ISO9660/Structs/Internal.cs @@ -73,6 +73,7 @@ namespace DiscImageChef.Filesystems.ISO9660 public PosixAttributesOld? PosixAttributesOld; public PosixDeviceNumber? PosixDeviceNumber; public DecodedDirectoryEntry ResourceFork; + public byte[] RockRidgeAlternateName; public uint Size; public DateTime? Timestamp; public ushort VolumeSequenceNumber; diff --git a/DiscImageChef.Filesystems/ISO9660/Super.cs b/DiscImageChef.Filesystems/ISO9660/Super.cs index ef5160019..6b8e08005 100644 --- a/DiscImageChef.Filesystems/ISO9660/Super.cs +++ b/DiscImageChef.Filesystems/ISO9660/Super.cs @@ -221,7 +221,7 @@ namespace DiscImageChef.Filesystems.ISO9660 XmlFsType.Type = fsFormat; - if(jolietvd != null && this.@namespace == Namespace.Joliet) + if(jolietvd != null && (this.@namespace == Namespace.Joliet || this.@namespace == Namespace.Rrip)) { rootLocation = jolietvd.Value.root_directory_record.extent;