Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 /// <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);
     }
 }