diff --git a/cmd/stfs-seek/main.go b/cmd/stfs-seek-disk/main.go similarity index 100% rename from cmd/stfs-seek/main.go rename to cmd/stfs-seek-disk/main.go diff --git a/cmd/stfs-seek-file/main.go b/cmd/stfs-seek-file/main.go new file mode 100644 index 0000000..20c5c81 --- /dev/null +++ b/cmd/stfs-seek-file/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "archive/tar" + "bytes" + "flag" + "fmt" + "io" + "log" + "os" +) + +const ( + blockSize = 512 +) + +type HeaderInBlock struct { + Record int + Block int + Header string +} + +func main() { + file := flag.String("file", "test.tar", "Tar file to open") + recordSize := flag.Int("recordSize", 20, "Amount of 512-bit blocks per record") + checkpoint := flag.Int("checkpoint", 0, "Log current record after checkpoint kilobytes have been read") + seek := flag.Int("seek", 0, "Record to seek too") + + flag.Parse() + + bytesToSeek := *recordSize * blockSize * *seek + + f, err := os.Open(*file) + if err != nil { + panic(err) + } + defer f.Close() + + record := 0 + for { + // Seek to requested record + if bytesToSeek > 0 && record < *seek { + if _, err := f.Seek(int64(bytesToSeek), 0); err != nil { + panic(err) + } + + record = *seek + + continue + } + + // Lock the current record if requested + if *checkpoint > 0 && record%*checkpoint == 0 { + log.Println("Checkpoint:", record) + } + + // Read exactly one record + bf := make([]byte, *recordSize*blockSize) + if _, err := io.ReadFull(f, bf); err != nil { + if err == io.EOF { + break + } + + panic(err) + } + + // Get the headers from the record + headers := []HeaderInBlock{} + for i := 0; i < *recordSize; i++ { + tr := tar.NewReader(bytes.NewReader(bf[blockSize*i : blockSize*(i+1)])) + hdr, err := tr.Next() + if err != nil { + continue + } + + if hdr.Format == tar.FormatUnknown { + // EOF + break + } + + headers = append(headers, HeaderInBlock{ + Record: record, + Block: i, + Header: fmt.Sprintf("%v", hdr), + }) + } + + if len(headers) > 0 { + fmt.Println(headers) + } + + record++ + } +} diff --git a/go.mod b/go.mod index 09d5c92..9a4fcf3 100644 --- a/go.mod +++ b/go.mod @@ -2,9 +2,9 @@ module github.com/pojntfx/stfs go 1.17 -require github.com/hanwen/go-fuse/v2 v2.1.0 - require ( - github.com/jacobsa/fuse v0.0.0-20211108140243-7c4418392f94 // indirect - golang.org/x/sys v0.0.0-20211112193437-faf0a1b62c6b // indirect + github.com/hanwen/go-fuse/v2 v2.1.0 + github.com/jacobsa/fuse v0.0.0-20211108140243-7c4418392f94 ) + +require golang.org/x/sys v0.0.0-20211112193437-faf0a1b62c6b // indirect