in src/managed/DiffGen/archives/CpioArchives/AsciiCpioArchive.cs [33:83]
protected override HeaderDetails ReadHeader(BinaryReader reader)
{
byte[] rawHeaderData = new byte[AsciiHeaderSize];
if (reader.Read(rawHeaderData, 0, AsciiHeaderSize) != AsciiHeaderSize)
{
throw new FormatException("Not enough data for CPIO ascii header");
}
var magicBytes = new ReadOnlySpan<byte>(rawHeaderData, 0, 6);
string magic = Encoding.ASCII.GetString(magicBytes);
if ((magic.CompareTo(AsciiMagic) != 0) && (magic.CompareTo(AsciiMagic) != 0))
{
throw new FormatException($"Found \"{magic}\" instead of expected new ascii header \"{AsciiMagic}\"");
}
var dev = AsciiData.FromOctalData(rawHeaderData, 6, 6);
var ino = AsciiData.FromOctalData(rawHeaderData, 12, 6);
var mode = AsciiData.FromOctalData(rawHeaderData, 18, 6);
var uid = AsciiData.FromOctalData(rawHeaderData, 24, 6);
var gid = AsciiData.FromOctalData(rawHeaderData, 30, 6);
var nlink = AsciiData.FromOctalData(rawHeaderData, 36, 6);
var rdev = AsciiData.FromOctalData(rawHeaderData, 42, 6);
var mtime = AsciiData.FromOctalData(rawHeaderData, 48, 11);
var namesize = AsciiData.FromOctalData(rawHeaderData, 59, 6);
var filesize = AsciiData.FromOctalData(rawHeaderData, 65, 11);
byte[] rawName = new byte[namesize];
if (namesize != (UInt64)reader.Read(rawName, 0, (int)namesize))
{
throw new FormatException("Not enough data for the name for CPIO ascii header");
}
var name = AsciiData.FromNulPaddedString(rawName, 0, (int)namesize);
var allData = new List<byte>();
allData.AddRange(rawHeaderData);
allData.AddRange(rawName);
int allDataSize = allData.Count;
if ((name.CompareTo(TrailerFileName) == 0) && (filesize == 0) && (uid == 0))
{
TrailerDetected = true;
}
var chunkName = ChunkNames.MakeHeaderChunkName(name);
var headerItem = ItemDefinition.FromByteSpan(allData.ToArray()).WithName(chunkName);
return new HeaderDetails(headerItem, null, name, filesize);
}