From 6fcb20d9fb432455bcf5f0f285aa0675a78a67cf Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Thu, 11 Nov 2021 21:08:17 +0100 Subject: [PATCH] feat: Add basic content listing code --- README.md | 11 +++++++++ go.mod | 3 +++ main.go | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 go.mod create mode 100644 main.go diff --git a/README.md b/README.md index 548d261..080eacd 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,13 @@ # stfs + Simple Tape File System, a FUSE based on tar and SQLite for tape drives + +## Overview + +🚧 This project is a work-in-progress! Instructions will be added as soon as it is usable. 🚧 + +## License + +stfs (c) 2021 Felicitas Pojtinger and contributors + +SPDX-License-Identifier: AGPL-3.0 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..6edbb5c --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/pojntfx/stfs + +go 1.17 diff --git a/main.go b/main.go new file mode 100644 index 0000000..be5456f --- /dev/null +++ b/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "archive/tar" + "bufio" + "flag" + "fmt" + "io" + "os" +) + +func main() { + file := flag.String("file", "/dev/st0", "File (tape drive or tar file) to open") + blockSize := flag.Int("blockSize", 512, "Size of a block in the tar stream") + blockSizeMulitlier := flag.Int("blockSizeMultiplier", 20, "Amount of blocks to read from the tar stream at once") + + flag.Parse() + + fileDescription, err := os.Stat(*file) + if err != nil { + panic(err) + } + + var f *os.File + if fileDescription.Mode().IsRegular() { + f, err = os.Open(*file) + if err != nil { + panic(err) + } + } else { + f, err = os.OpenFile(*file, os.O_RDONLY, os.ModeCharDevice) + if err != nil { + panic(err) + } + } + defer f.Close() + + br := bufio.NewReaderSize(f, *blockSize**blockSizeMulitlier) + tr := tar.NewReader(br) + + for { + header, err := tr.Next() + if err == io.EOF { + break + } + + if err != nil { + panic(err) + } + + fmt.Printf( + "%v %v %v %v %v %v %v %v %v\n", + header.Mode, + + header.Gname, + header.Uid, + header.Gid, + + header.Size, + + header.ModTime, + header.AccessTime, + header.ChangeTime, + + header.Name, + ) + } +}