diff --git a/cmd/stbak/cmd/index.go b/cmd/stbak/cmd/index.go index ae3ac0e..9e91ba7 100644 --- a/cmd/stbak/cmd/index.go +++ b/cmd/stbak/cmd/index.go @@ -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 +} diff --git a/cmd/stbak/cmd/list.go b/cmd/stbak/cmd/list.go index a05ffcf..57ce718 100644 --- a/cmd/stbak/cmd/list.go +++ b/cmd/stbak/cmd/list.go @@ -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 diff --git a/cmd/stbak/cmd/remove.go b/cmd/stbak/cmd/remove.go index 8f94c6f..7974f32 100644 --- a/cmd/stbak/cmd/remove.go +++ b/cmd/stbak/cmd/remove.go @@ -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 } diff --git a/cmd/stbak/cmd/restore.go b/cmd/stbak/cmd/restore.go index aad8eac..5b4964f 100644 --- a/cmd/stbak/cmd/restore.go +++ b/cmd/stbak/cmd/restore.go @@ -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