/// <summary> /// Adds inodes for each dir. /// </summary> void addDirInodes() { inodes.Add(root.ino); foreach (var dir in allDirs) { var ino = MakeInode( Mode: InodeMode.dir | InodeMode.rx_only, Number: (uint)inodes.Count, Blocks: 1, Size: 65536, Flags: InodeFlags.@readonly, Nlink: 2 // 1 link each for its own dirent and its . dirent ); dir.ino = ino; dir.Dirents.Add(new PfsDirent { Name = ".", InodeNumber = ino.Number, Type = DirentType.Dot }); dir.Dirents.Add(new PfsDirent { Name = "..", InodeNumber = dir.Parent.ino.Number, Type = DirentType.DotDot }); var dirent = new PfsDirent { Name = dir.name, InodeNumber = (uint)inodes.Count, Type = DirentType.Directory }; dir.Parent.Dirents.Add(dirent); dir.Parent.ino.Nlink++; inodes.Add(ino); } }
public static PfsDirent ReadFromStream(Stream s) { var pos = s.Position; var d = new PfsDirent { InodeNumber = s.ReadUInt32LE(), Type = (DirentType)s.ReadInt32LE(), NameLength = s.ReadInt32LE(), EntSize = s.ReadInt32LE(), }; d.name = s.ReadASCIINullTerminated(d.NameLength); s.Position = pos + d.EntSize; return(d); }
/// <summary> /// Adds inodes for each file. /// </summary> void addFileInodes() { foreach (var file in allFiles.OrderBy(x => x.FullPath())) { var ino = MakeInode( Mode: InodeMode.file | InodeMode.rx_only, Size: file.Size, SizeCompressed: file.CompressedSize, Number: (uint)inodes.Count, Blocks: (uint)CeilDiv(file.Size, hdr.BlockSize), Flags: InodeFlags.@readonly | (file.Compress ? InodeFlags.compressed : 0) ); if (properties.Sign) // HACK: Outer PFS images don't use readonly? { ino.Flags &= ~InodeFlags.@readonly; } file.ino = ino; var dirent = new PfsDirent { Name = file.name, Type = DirentType.File, InodeNumber = (uint)inodes.Count }; file.Parent.Dirents.Add(dirent); inodes.Add(ino); } }