Working on how to actually write the archive.

Made SuperblockFlags public so you can set options when writing
This commit is contained in:
Caleb Gardner
2021-01-16 15:42:55 -06:00
parent 4187598783
commit 69f56d6951
5 changed files with 116 additions and 40 deletions
+69 -17
View File
@@ -33,28 +33,38 @@ type superblock struct {
ExportTableStart uint64
}
//SuperblockFlags is the parsed version of Superblock.Flags
type superblockFlags struct {
UncompressedInodes bool
UncompressedData bool
Check bool
//SuperblockFlags is the series of flags describing how a squashfs archive is packed.
type SuperblockFlags struct {
//If true, inodes are stored uncompressed
UncompressedInodes bool
//If true, data is stored uncompressed
UncompressedData bool
check bool
//If true, fragments are stored uncompressed
UncompressedFragments bool
NoFragments bool
AlwaysFragments bool
Duplicates bool
Exportable bool
UncompressedXattr bool
NoXattr bool
CompressorOptions bool
UncompressedIDs bool
//If true, ALL data is stored in sequential data blocks instead of utilizing fragments
NoFragments bool
//If true, the last block of data will always be stored as a fragment if it's less then the block size.
AlwaysFragments bool
//If true, duplicate files are only stored once.
Duplicates bool
//If true, the export table is populated
Exportable bool
//If true, the xattr table is uncompressed
UncompressedXattr bool
//If true, the xattr table is not populated
NoXattr bool
compressorOptions bool
//If true, the UID/GID table is stored uncompressed
UncompressedIDs bool
}
//GetFlags returns a SuperblockFlags for a given superblock.
func (s *superblock) GetFlags() superblockFlags {
return superblockFlags{
func (s *superblock) GetFlags() SuperblockFlags {
return SuperblockFlags{
UncompressedInodes: s.Flags&0x1 == 0x1,
UncompressedData: s.Flags&0x2 == 0x2,
Check: s.Flags&0x4 == 0x4,
check: s.Flags&0x4 == 0x4,
UncompressedFragments: s.Flags&0x8 == 0x8,
NoFragments: s.Flags&0x10 == 0x10,
AlwaysFragments: s.Flags&0x20 == 0x20,
@@ -62,7 +72,49 @@ func (s *superblock) GetFlags() superblockFlags {
Exportable: s.Flags&0x80 == 0x80,
UncompressedXattr: s.Flags&0x100 == 0x100,
NoXattr: s.Flags&0x200 == 0x200,
CompressorOptions: s.Flags&0x400 == 0x400,
compressorOptions: s.Flags&0x400 == 0x400,
UncompressedIDs: s.Flags&0x800 == 0x800,
}
}
//ToUint returns the uint16 representation of the given SuperblockFlags
func (s *SuperblockFlags) ToUint() uint16 {
var out uint16
if s.UncompressedInodes {
out = out | 0x1
}
if s.UncompressedData {
out = out | 0x2
}
if s.check {
out = out | 0x4
}
if s.UncompressedFragments {
out = out | 0x8
}
if s.NoFragments {
out = out | 0x10
}
if s.AlwaysFragments {
out = out | 0x20
}
if s.Duplicates {
out = out | 0x40
}
if s.Exportable {
out = out | 0x80
}
if s.UncompressedXattr {
out = out | 0x100
}
if s.NoXattr {
out = out | 0x200
}
if s.compressorOptions {
out = out | 0x400
}
if s.UncompressedIDs {
out = out | 0x800
}
return out
}