6ad6857d8d
Trying to figure out how to write. Might have to keep tables uncompressed for now.
71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package squashfs
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"math"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
//WriteToFilename creates the squashfs archive with the given filepath.
|
|
func (w *Writer) WriteToFilename(filepath string) error {
|
|
newFil, err := os.Create(filepath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = w.WriteTo(newFil)
|
|
return err
|
|
}
|
|
|
|
//WriteTo attempts to write the archive to the given io.WriterAt.
|
|
//
|
|
//Not working. Yet.
|
|
func (w *Writer) WriteTo(write io.WriterAt) (int64, error) {
|
|
if w.BlockSize > 1048576 {
|
|
w.BlockSize = 1048576
|
|
} else if w.BlockSize < 4096 {
|
|
w.BlockSize = 4096
|
|
}
|
|
w.Flags.RemoveDuplicates = false
|
|
w.Flags.Exportable = false
|
|
w.Flags.NoXattr = true
|
|
w.calculateFragsAndBlockSizes()
|
|
w.superblock = superblock{
|
|
Magic: magic,
|
|
InodeCount: w.countInodes(),
|
|
CreationTime: uint32(time.Now().Unix()),
|
|
BlockSize: w.BlockSize,
|
|
CompressionType: uint16(w.compressionType),
|
|
BlockLog: uint16(math.Log2(float64(w.BlockSize))),
|
|
Flags: w.Flags.ToUint(),
|
|
IDCount: uint16(len(w.uidGUIDTable)),
|
|
MajorVersion: 4,
|
|
MinorVersion: 0,
|
|
}
|
|
w.dataOffset = 96 //superblock size
|
|
//write compression options
|
|
w.calculateInodeTableSize()
|
|
return 0, errors.New("i said don't")
|
|
}
|
|
|
|
//splits up the size of files into
|
|
func (w *Writer) calculateFragsAndBlockSizes() {
|
|
for _, files := range w.structure {
|
|
for i := range files {
|
|
files[i].fragIndex = -1
|
|
files[i].blockSizes = make([]uint32, files[i].size/uint64(w.BlockSize))
|
|
for j := range files[i].blockSizes {
|
|
files[i].blockSizes[j] = w.BlockSize
|
|
}
|
|
fragSize := uint32(files[i].size % uint64(w.BlockSize))
|
|
if fragSize > 0 {
|
|
files[i].blockSizes = append(files[i].blockSizes, fragSize)
|
|
if !w.Flags.NoFragments {
|
|
w.addToFragments(files[i])
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|