Decode "SL" system area.

This commit is contained in:
2019-07-28 21:33:05 +01:00
parent 5087044f32
commit a47d8e13f0
4 changed files with 64 additions and 9 deletions

View File

@@ -248,6 +248,8 @@ namespace DiscImageChef.Filesystems.ISO9660
{
int systemAreaOff = start;
hasResourceFork = false;
bool continueSymlink = false;
bool continueSymlinkComponent = false;
while(systemAreaOff + 2 <= end)
{
@@ -459,10 +461,52 @@ namespace DiscImageChef.Filesystems.ISO9660
systemAreaOff += pnLength;
break;
case RRIP_SYMLINK:
// TODO
byte slLength = data[systemAreaOff + 2];
systemAreaOff += slLength;
SymbolicLink sl =
Marshal.ByteArrayToStructureLittleEndian<SymbolicLink>(data, systemAreaOff,
Marshal.SizeOf<SymbolicLink>());
SymbolicLinkComponent slc =
Marshal.ByteArrayToStructureLittleEndian<SymbolicLinkComponent>(data,
systemAreaOff +
Marshal
.SizeOf<SymbolicLink>(),
Marshal
.SizeOf<
SymbolicLinkComponent
>());
if(!continueSymlink || entry.SymbolicLink is null) entry.SymbolicLink = "";
if(slc.flags.HasFlag(SymlinkComponentFlags.Root)) entry.SymbolicLink = "/";
if(slc.flags.HasFlag(SymlinkComponentFlags.Current)) entry.SymbolicLink += ".";
if(slc.flags.HasFlag(SymlinkComponentFlags.Parent)) entry.SymbolicLink += "..";
if(!continueSymlinkComponent && !slc.flags.HasFlag(SymlinkComponentFlags.Root))
entry.SymbolicLink += "/";
entry.SymbolicLink += slc.flags.HasFlag(SymlinkComponentFlags.Networkname)
? Environment.MachineName
: joliet
? Encoding.BigEndianUnicode.GetString(data,
systemAreaOff +
Marshal
.SizeOf<SymbolicLink>() +
Marshal
.SizeOf<
SymbolicLinkComponent
>(), slc.length)
: Encoding.GetString(data,
systemAreaOff +
Marshal.SizeOf<SymbolicLink>() +
Marshal.SizeOf<SymbolicLinkComponent>(),
slc.length);
continueSymlink = entry.Flags.HasFlag(SymlinkFlags.Continue);
continueSymlinkComponent = entry.Flags.HasFlag(SymlinkComponentFlags.Continue);
systemAreaOff += slLength;
break;
case RRIP_NAME:
byte nmLength = data[systemAreaOff + 2];

View File

@@ -40,6 +40,7 @@ namespace DiscImageChef.Filesystems.ISO9660
return Errno.NoError;
}
// TODO: Resolve symbolic link
public Errno Read(string path, long offset, long size, ref byte[] buf)
{
buf = null;
@@ -195,6 +196,8 @@ namespace DiscImageChef.Filesystems.ISO9660
if(entry.RripBackup != null) stat.BackupTimeUtc = DecodeIsoDateTime(entry.RripBackup);
if(entry.SymbolicLink != null) stat.Attributes |= FileAttributes.Symlink;
if(entry.AssociatedFile is null || entry.AssociatedFile.Extent == 0 || entry.AssociatedFile.Size == 0)
return Errno.NoError;
@@ -223,6 +226,20 @@ namespace DiscImageChef.Filesystems.ISO9660
return Errno.NoError;
}
public Errno ReadLink(string path, out string dest)
{
dest = null;
Errno err = GetFileEntry(path, out DecodedDirectoryEntry entry);
if(err != Errno.NoError) return err;
if(entry.SymbolicLink is null) return Errno.InvalidArgument;
dest = entry.SymbolicLink;
return Errno.NoError;
}
Errno GetFileEntry(string path, out DecodedDirectoryEntry entry)
{
entry = null;

View File

@@ -71,13 +71,6 @@ namespace DiscImageChef.Filesystems.ISO9660
{"romeo", "Primary Volume Descriptor using the specified encoding codepage"}
};
public Errno ReadLink(string path, out string dest)
{
dest = null;
return Errno.NotSupported;
}
static Dictionary<string, string> GetDefaultOptions() =>
new Dictionary<string, string> {{"debug", false.ToString()}};
}

View File

@@ -82,6 +82,7 @@ namespace DiscImageChef.Filesystems.ISO9660
public byte[] RripExpiration;
public byte[] RripModify;
public uint Size;
public string SymbolicLink;
public DateTime? Timestamp;
public ushort VolumeSequenceNumber;
public CdromXa? XA;