private ArHeader CloneHeader(ArHeader hdr) { return(new ArHeader { EndChar = hdr.EndChar, FileMode = hdr.FileMode, FileName = hdr.FileName, FileSize = hdr.FileSize, GroupId = hdr.GroupId, OwnerId = hdr.OwnerId, LastModified = hdr.LastModified }); }
/// <summary> /// Reads the tables info to the archive. /// </summary> private void ReadTables() { //using var mmf = MemoryMappedFile.CreateFromFile(Filepath, FileMode.Open, Mmfhash, 0, MemoryMappedFileAccess.Read); // using (var vs = mmf.CreateViewStream(0, ArHeader.SIZE, MemoryMappedFileAccess.Read)) // { // _header = new ArHeader(new BinaryReader(vs)); // } // using (var vs = mmf.CreateViewStream((long)_header.Tableoffset, (long)_header.Tablesize, // MemoryMappedFileAccess.Read)) // { // _table = new ArTable(new BinaryReader(vs), this); // } using var vs = new FileStream(Filepath, FileMode.Open, FileAccess.Read); Header = new ArHeader(new BinaryReader(vs)); vs.Seek((long)Header.Tableoffset, SeekOrigin.Begin); Table = new ArTable(new BinaryReader(vs), this); vs.Close(); }
private void AssertCompareClonedHeader(ArHeader original, ArHeader clone) { var ms = new MemoryStream(); ms.WriteStruct(clone); ms.Seek(0, SeekOrigin.Begin); clone = ms.ReadStruct <ArHeader>(); foreach (var f in typeof(ArHeader).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) { var orig = f.GetValue(original); var mod = f.GetValue(clone); if (mod is byte[] modchars) { Assert.True(modchars.SequenceEqual((byte[])orig), $"Failed check for {f.Name}"); } else { Assert.True(orig.Equals(mod), $"Failed check for {f.Name}"); } } }
public Archive() { _header = new ArHeader(); _table = new ArTable(); }
void Build() { int debberVer = 0; ini.GetValue("debber", "debber-version", ref debberVer); if (debberVer != 1) { throw new Exception("File requires a newer debber version. Please update!"); } string binVer = ini.ReadSetting("debber", "debian-binary"); if (binVer != "2.0") { throw new Exception("Invalid or unknown debian version!"); } packageVersion = SemanticVersion.Parse(ini.ReadSetting("package", "version")); packageName = ini.ReadSetting("package", "name"); packageFile = ini.ReadSetting("package", "output").Replace("{NAME}", packageName).Replace("{VERSION}", packageVersion.ToString()); FileSystem.TouchFile(packageFile); SystemConsole.WriteLine("Create <cyan>data.tar.gz<default>..."); byte[] data_tar_gz; using (MemoryStream ms = new MemoryStream()) { TarWriter tarFile = new TarWriter(ms, true); foreach (string line in ini.ReadSection("data.tgz", true)) { string[] parts = line.Split(':'); if (parts.Length < 2) { continue; } switch (parts[0].Trim()) { case "directory": PackDirectory(tarFile, parts[1]); break; case "file": PackFiles(tarFile, parts); break; default: throw new Exception(string.Format("Invalid setting {0} at [data.tgz]!", line)); } } tarFile.Close(); data_tar_gz = ms.ToArray(); } SystemConsole.WriteLine("Create <cyan>control.tar.gz<default>..."); byte[] control_tar_gz; using (MemoryStream tarStream = new MemoryStream()) { TarWriter tarFile = new TarWriter(tarStream, true); WriteControlFile(tarFile, "control", 640); #region md5sums using (MemoryStream ms = new MemoryStream()) { DataWriter writer = new DataWriter(ms); foreach (KeyValuePair <string, string> md5sum in md5sums) { writer.Write(md5sum.Value); writer.Write(" "); writer.Write(md5sum.Key); writer.Write("\n"); } writer.Close(); SystemConsole.WriteLine(" file: <cyan>md5sums"); tarFile.AddFile("md5sums", ms.ToArray()); } #endregion WriteControlFile(tarFile, "conffiles", 640); WriteControlFile(tarFile, "preinst", 700); WriteControlFile(tarFile, "postinst", 700); WriteControlFile(tarFile, "prerm", 700); WriteControlFile(tarFile, "postrm", 700); tarFile.Close(); control_tar_gz = tarStream.ToArray(); } using (MemoryStream ms = new MemoryStream()) { var arFile = ArFile.CreateNewAr(ms); arFile.WriteHeader(ArHeader.CreateFile("debian-binary", 4)); arFile.WriteData(Encoding.ASCII.GetBytes("2.0\n")); arFile.WriteHeader(ArHeader.CreateFile("control.tar.gz", control_tar_gz.Length)); arFile.WriteData(control_tar_gz); arFile.WriteHeader(ArHeader.CreateFile("data.tar.gz", data_tar_gz.Length)); arFile.WriteData(data_tar_gz); arFile.Close(); File.WriteAllBytes(packageFile, ms.ToArray()); SystemConsole.WriteLine("Completed <green>{0}<default> ...", packageFile); } }
public Archive() { Header = new ArHeader(); Table = new ArTable(); }