refactor: Decompose tape opening

This commit is contained in:
Felicitas Pojtinger
2021-11-26 17:20:19 +01:00
parent 1fe518b933
commit cd44a4e699
4 changed files with 34 additions and 50 deletions

View File

@@ -66,26 +66,13 @@ func index(
return err
}
fileDescription, err := os.Stat(tape)
f, isRegular, err := openTapeReadOnly(tape)
if err != nil {
return err
}
var f *os.File
if fileDescription.Mode().IsRegular() {
f, err = os.Open(tape)
if err != nil {
return err
}
} else {
f, err = os.OpenFile(tape, os.O_RDONLY, os.ModeCharDevice)
if err != nil {
return err
}
}
defer f.Close()
if fileDescription.Mode().IsRegular() {
if isRegular {
// Seek to record and block
if _, err := f.Seek(int64((recordSize*controllers.BlockSize*record)+block*controllers.BlockSize), 0); err != nil {
return err
@@ -300,3 +287,27 @@ func indexHeader(record, block int64, hdr *tar.Header, metadataPersister *persis
return nil
}
func openTapeReadOnly(tape string) (f *os.File, isRegular bool, err error) {
fileDescription, err := os.Stat(tape)
if err != nil {
return nil, false, err
}
isRegular = fileDescription.Mode().IsRegular()
if isRegular {
f, err = os.Open(tape)
if err != nil {
return f, isRegular, err
}
return f, isRegular, nil
}
f, err = os.OpenFile(tape, os.O_RDONLY, os.ModeCharDevice)
if err != nil {
return f, isRegular, err
}
return f, isRegular, nil
}

View File

@@ -5,7 +5,6 @@ import (
"bufio"
"io"
"math"
"os"
"github.com/pojntfx/stfs/pkg/controllers"
"github.com/pojntfx/stfs/pkg/counters"
@@ -23,26 +22,13 @@ var listCmd = &cobra.Command{
return err
}
fileDescription, err := os.Stat(viper.GetString(tapeFlag))
f, isRegular, err := openTapeReadOnly(viper.GetString(tapeFlag))
if err != nil {
return err
}
var f *os.File
if fileDescription.Mode().IsRegular() {
f, err = os.Open(viper.GetString(tapeFlag))
if err != nil {
return err
}
} else {
f, err = os.OpenFile(viper.GetString(tapeFlag), os.O_RDONLY, os.ModeCharDevice)
if err != nil {
return err
}
}
defer f.Close()
if fileDescription.Mode().IsRegular() {
if isRegular {
// Seek to record and block
if _, err := f.Seek(int64((viper.GetInt(recordSizeFlag)*controllers.BlockSize*viper.GetInt(recordFlag))+viper.GetInt(blockFlag)*controllers.BlockSize), 0); err != nil {
return err

View File

@@ -94,8 +94,8 @@ var removeCmd = &cobra.Command{
},
}
func openTapeWriter(path string) (tw *tar.Writer, isRegular bool, cleanup func(dirty bool) error, err error) {
stat, err := os.Stat(path)
func openTapeWriter(tape string) (tw *tar.Writer, isRegular bool, cleanup func(dirty bool) error, err error) {
stat, err := os.Stat(tape)
if err == nil {
isRegular = stat.Mode().IsRegular()
} else {
@@ -108,14 +108,14 @@ func openTapeWriter(path string) (tw *tar.Writer, isRegular bool, cleanup func(d
var f *os.File
if isRegular {
f, err = os.OpenFile(path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
f, err = os.OpenFile(tape, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
return nil, false, nil, err
}
// No need to go to end manually due to `os.O_APPEND`
} else {
f, err = os.OpenFile(path, os.O_APPEND|os.O_WRONLY, os.ModeCharDevice)
f, err = os.OpenFile(tape, os.O_APPEND|os.O_WRONLY, os.ModeCharDevice)
if err != nil {
return nil, false, nil, err
}

View File

@@ -29,27 +29,14 @@ var restoreCmd = &cobra.Command{
return err
}
fileDescription, err := os.Stat(viper.GetString(tapeFlag))
f, isRegular, err := openTapeReadOnly(viper.GetString(tapeFlag))
if err != nil {
return err
}
var f *os.File
if fileDescription.Mode().IsRegular() {
f, err = os.Open(viper.GetString(tapeFlag))
if err != nil {
return err
}
} else {
f, err = os.OpenFile(viper.GetString(tapeFlag), os.O_RDONLY, os.ModeCharDevice)
if err != nil {
return err
}
}
defer f.Close()
var tr *tar.Reader
if fileDescription.Mode().IsRegular() {
if isRegular {
// Seek to record and block
if _, err := f.Seek(int64((viper.GetInt(recordSizeFlag)*controllers.BlockSize*viper.GetInt(recordFlag))+viper.GetInt(blockFlag)*controllers.BlockSize), io.SeekStart); err != nil {
return err