mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Decode "SL" system area.
This commit is contained in:
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()}};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user