public TarEntry(TarHeader header) { if (header == null) { throw new ArgumentNullException(nameof(header)); } this._header = (TarHeader)header.Clone(); }
public void GetFileTarHeader(TarHeader head, string f) { if (head == null) { throw new ArgumentNullException(nameof(head)); } if (f == null) { throw new ArgumentNullException(nameof(f)); } _file = f; string str = f; if (str.IndexOf(Environment.CurrentDirectory, StringComparison.Ordinal) == 0) { str = str.Substring(Environment.CurrentDirectory.Length); } str = str.Replace(Path.DirectorySeparatorChar, '/'); while (str.StartsWith("/")) { str = str.Substring(1); } head.LinkName = string.Empty; head.Name = str; if (Directory.Exists(f)) { head.Mode = 0x3eb; head.TypeFlag = 0x35; if ((head.Name.Length == 0) || (head.Name[head.Name.Length - 1] != '/')) { head.Name = head.Name + "/"; } head.Size = 0L; } else { head.Mode = 0x81c0; head.TypeFlag = 0x30; head.Size = new FileInfo(f.Replace('/', Path.DirectorySeparatorChar)).Length; } head.ModTime = System.IO.File.GetLastWriteTime(f.Replace('/', Path.DirectorySeparatorChar)).ToUniversalTime(); head.DevMajor = 0; head.DevMinor = 0; }
public TarEntry GetNextEntry() { if (_hasHitEof) { return null; } if (_currentEntry != null) { SkipToNextEntry(); } byte[] block = _tarBuffer.ReadBlock(); if (block == null) { _hasHitEof = true; } else if (TarBuffer.IsEndOfArchiveBlock(block)) { _hasHitEof = true; } if (_hasHitEof) { _currentEntry = null; } else { try { TarHeader header = new TarHeader(); header.ParseBuffer(block); if (!header.IsChecksumValid) { throw new TarException("Header checksum is invalid"); } _entryOffset = 0L; _entrySize = header.Size; StringBuilder builder = null; if (header.TypeFlag == 0x4c) { byte[] buffer = new byte[0x200]; long size = _entrySize; builder = new StringBuilder(); while (size > 0L) { int length = Read(buffer, 0, (size > buffer.Length) ? buffer.Length : ((int)size)); if (length == -1) { throw new InvalidHeaderException("Failed to read long name entry"); } builder.Append(TarHeader.ParseName(buffer, 0, length)); size -= length; } SkipToNextEntry(); block = _tarBuffer.ReadBlock(); } else if (header.TypeFlag == 0x67) { SkipToNextEntry(); block = _tarBuffer.ReadBlock(); } else if (header.TypeFlag == 120) { SkipToNextEntry(); block = _tarBuffer.ReadBlock(); } else if (header.TypeFlag == 0x56) { SkipToNextEntry(); block = _tarBuffer.ReadBlock(); } else if (((header.TypeFlag != 0x30) && (header.TypeFlag != 0)) && (header.TypeFlag != 0x35)) { SkipToNextEntry(); block = _tarBuffer.ReadBlock(); } if (_entryFactory == null) { _currentEntry = new TarEntry(block); if (builder != null) { _currentEntry.Name = builder.ToString(); } } else { _currentEntry = _entryFactory.CreateEntry(block); } _entryOffset = 0L; _entrySize = _currentEntry.Size; } catch (InvalidHeaderException exception) { _entrySize = 0L; _entryOffset = 0L; _currentEntry = null; throw new InvalidHeaderException(string.Format("Bad header in record {0} block {1} {2}", _tarBuffer.CurrentRecord, _tarBuffer.CurrentBlock, exception.Message)); } } return _currentEntry; }
public void PutNextEntry(TarEntry entry) { if (entry == null) { throw new ArgumentNullException(nameof(entry)); } if (entry.TarHeader.Name.Length >= 100) { TarHeader header = new TarHeader { TypeFlag = 0x4c, UserId = 0, GroupId = 0, GroupName = "", UserName = "", LinkName = "", Size = entry.TarHeader.Name.Length }; header.Name += "././@LongLink"; header.WriteHeader(_blockBuffer); _buffer.WriteBlock(_blockBuffer); int nameOffset = 0; while (nameOffset < entry.TarHeader.Name.Length) { Array.Clear(_blockBuffer, 0, _blockBuffer.Length); TarHeader.GetAsciiBytes(entry.TarHeader.Name, nameOffset, _blockBuffer, 0, 0x200); nameOffset += 0x200; _buffer.WriteBlock(_blockBuffer); } } entry.WriteEntryHeader(_blockBuffer); _buffer.WriteBlock(_blockBuffer); _currBytes = 0L; _currSize = entry.IsDirectory ? 0L : entry.Size; }
public TarEntry(byte[] headerBuffer) { _header = new TarHeader(); _header.ParseBuffer(headerBuffer); }
public static void NameTarHeader(TarHeader header, string name) { if (header == null) { throw new ArgumentNullException(nameof(header)); } if (name == null) { throw new ArgumentNullException(nameof(name)); } bool flag = name.EndsWith("/"); header.Name = name; header.Mode = flag ? 0x3eb : 0x81c0; header.UserId = 0; header.GroupId = 0; header.Size = 0L; header.ModTime = DateTime.UtcNow; header.TypeFlag = flag ? ((byte)0x35) : ((byte)0x30); header.LinkName = string.Empty; header.UserName = string.Empty; header.GroupName = string.Empty; header.DevMajor = 0; header.DevMinor = 0; }
private TarEntry() { _header = new TarHeader(); }