diff --git a/cmd/stfs/cmd/recovery_query.go b/cmd/stfs/cmd/recovery_query.go index 9a64dd1..08ead32 100644 --- a/cmd/stfs/cmd/recovery_query.go +++ b/cmd/stfs/cmd/recovery_query.go @@ -56,6 +56,10 @@ var recoveryQueryCmd = &cobra.Command{ defer reader.Close() if _, err := recovery.Query( + config.DriveReaderConfig{ + Drive: reader, + DriveIsRegular: readerIsRegular, + }, config.DriveConfig{ Drive: reader, DriveIsRegular: readerIsRegular, diff --git a/pkg/config/config.go b/pkg/config/config.go index 3c2ca4f..b1c9aa4 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -18,7 +18,6 @@ type DriveWriterConfig struct { } type Drive interface { - io.ReadSeeker Fd() uintptr } diff --git a/pkg/fs/filesystem.go b/pkg/fs/filesystem.go index 31ba58c..7f3d430 100644 --- a/pkg/fs/filesystem.go +++ b/pkg/fs/filesystem.go @@ -217,13 +217,15 @@ func (f *STFS) Initialize(rootProposal string, rootPerm os.FileMode) (root strin existingRoot, err := f.metadata.Metadata.GetRootPath(context.Background()) if err == config.ErrNoRootDirectory { - drive, err := f.readOps.GetBackend().GetDrive() - mkdirRoot := func() (string, error) { if err := f.readOps.GetBackend().CloseDrive(); err != nil { return "", err } + if err := f.readOps.GetBackend().CloseReader(); err != nil { + return "", err + } + if f.readOnly { return "", os.ErrPermission } @@ -236,15 +238,18 @@ func (f *STFS) Initialize(rootProposal string, rootPerm os.FileMode) (root strin return f.metadata.Metadata.GetRootPath(context.Background()) } + drive, err := f.readOps.GetBackend().GetDrive() + if err != nil { + return mkdirRoot() + } + + reader, err := f.readOps.GetBackend().GetReader() if err != nil { return mkdirRoot() } if err := recovery.Index( - config.DriveReaderConfig{ - Drive: drive.Drive, - DriveIsRegular: drive.DriveIsRegular, - }, + reader, drive, f.readOps.GetMetadata(), f.readOps.GetPipes(), diff --git a/pkg/recovery/fetch.go b/pkg/recovery/fetch.go index 7c54a2c..6fbf1eb 100644 --- a/pkg/recovery/fetch.go +++ b/pkg/recovery/fetch.go @@ -50,7 +50,7 @@ func Fetch( } // Seek to block - br := bufio.NewReaderSize(drive.Drive, mtio.BlockSize*pipes.RecordSize) + br := bufio.NewReaderSize(reader.Drive, mtio.BlockSize*pipes.RecordSize) if _, err := br.Read(make([]byte, block*mtio.BlockSize)); err != nil { return err } diff --git a/pkg/recovery/index.go b/pkg/recovery/index.go index 69d3b7d..e4c8fc3 100644 --- a/pkg/recovery/index.go +++ b/pkg/recovery/index.go @@ -155,7 +155,7 @@ func Index( } // Seek to block - br := bufio.NewReaderSize(drive.Drive, mtio.BlockSize*pipes.RecordSize) + br := bufio.NewReaderSize(reader.Drive, mtio.BlockSize*pipes.RecordSize) if _, err := br.Read(make([]byte, block*mtio.BlockSize)); err != nil { return err } @@ -184,7 +184,7 @@ func Index( } block = 0 - br = bufio.NewReaderSize(drive.Drive, mtio.BlockSize*pipes.RecordSize) + br = bufio.NewReaderSize(reader.Drive, mtio.BlockSize*pipes.RecordSize) curr = int64(int64(pipes.RecordSize) * mtio.BlockSize * record) counter = &ioext.CounterReader{Reader: br, BytesRead: int(curr)} tr = tar.NewReader(counter) diff --git a/pkg/recovery/query.go b/pkg/recovery/query.go index 4f6381f..6d26990 100644 --- a/pkg/recovery/query.go +++ b/pkg/recovery/query.go @@ -16,7 +16,8 @@ import ( ) func Query( - state config.DriveConfig, + reader config.DriveReaderConfig, + drive config.DriveConfig, pipes config.PipeConfig, crypto config.CryptoConfig, @@ -27,13 +28,13 @@ func Query( ) ([]*tar.Header, error) { headers := []*tar.Header{} - if state.DriveIsRegular { + if reader.DriveIsRegular { // Seek to record and block - if _, err := state.Drive.Seek(int64((pipes.RecordSize*mtio.BlockSize*record)+block*mtio.BlockSize), 0); err != nil { + if _, err := reader.Drive.Seek(int64((pipes.RecordSize*mtio.BlockSize*record)+block*mtio.BlockSize), 0); err != nil { return []*tar.Header{}, err } - tr := tar.NewReader(state.Drive) + tr := tar.NewReader(reader.Drive) record := int64(record) block := int64(block) @@ -42,7 +43,7 @@ func Query( hdr, err := tr.Next() if err != nil { for { - curr, err := state.Drive.Seek(0, io.SeekCurrent) + curr, err := reader.Drive.Seek(0, io.SeekCurrent) if err != nil { return []*tar.Header{}, err } @@ -60,11 +61,11 @@ func Query( } // Seek to record and block - if _, err := state.Drive.Seek(int64((pipes.RecordSize*mtio.BlockSize*int(record))+int(block)*mtio.BlockSize), io.SeekStart); err != nil { + if _, err := reader.Drive.Seek(int64((pipes.RecordSize*mtio.BlockSize*int(record))+int(block)*mtio.BlockSize), io.SeekStart); err != nil { return []*tar.Header{}, err } - tr = tar.NewReader(state.Drive) + tr = tar.NewReader(reader.Drive) hdr, err = tr.Next() if err != nil { @@ -91,7 +92,7 @@ func Query( return []*tar.Header{}, err } - if err := signature.VerifyHeader(hdr, state.DriveIsRegular, pipes.Signature, crypto.Recipient); err != nil { + if err := signature.VerifyHeader(hdr, reader.DriveIsRegular, pipes.Signature, crypto.Recipient); err != nil { return []*tar.Header{}, err } @@ -106,7 +107,7 @@ func Query( headers = append(headers, hdr) - curr, err := state.Drive.Seek(0, io.SeekCurrent) + curr, err := reader.Drive.Seek(0, io.SeekCurrent) if err != nil { return []*tar.Header{}, err } @@ -115,7 +116,7 @@ func Query( return []*tar.Header{}, err } - currAndSize, err := state.Drive.Seek(0, io.SeekCurrent) + currAndSize, err := reader.Drive.Seek(0, io.SeekCurrent) if err != nil { return []*tar.Header{}, err } @@ -131,12 +132,12 @@ func Query( } } else { // Seek to record - if err := mtio.SeekToRecordOnTape(state.Drive.Fd(), int32(record)); err != nil { + if err := mtio.SeekToRecordOnTape(drive.Drive.Fd(), int32(record)); err != nil { return []*tar.Header{}, err } // Seek to block - br := bufio.NewReaderSize(state.Drive, mtio.BlockSize*pipes.RecordSize) + br := bufio.NewReaderSize(reader.Drive, mtio.BlockSize*pipes.RecordSize) if _, err := br.Read(make([]byte, block*mtio.BlockSize)); err != nil { return []*tar.Header{}, err } @@ -152,19 +153,19 @@ func Query( hdr, err := tr.Next() if err != nil { if err == io.EOF { - if err := mtio.GoToNextFileOnTape(state.Drive.Fd()); err != nil { + if err := mtio.GoToNextFileOnTape(drive.Drive.Fd()); err != nil { // EOD break } - record, err = mtio.GetCurrentRecordFromTape(state.Drive.Fd()) + record, err = mtio.GetCurrentRecordFromTape(drive.Drive.Fd()) if err != nil { return []*tar.Header{}, err } block = 0 - br = bufio.NewReaderSize(state.Drive, mtio.BlockSize*pipes.RecordSize) + br = bufio.NewReaderSize(reader.Drive, mtio.BlockSize*pipes.RecordSize) curr := int64(int64(pipes.RecordSize) * mtio.BlockSize * record) counter := &ioext.CounterReader{Reader: br, BytesRead: int(curr)} tr = tar.NewReader(counter) @@ -179,7 +180,7 @@ func Query( return []*tar.Header{}, err } - if err := signature.VerifyHeader(hdr, state.DriveIsRegular, pipes.Signature, crypto.Recipient); err != nil { + if err := signature.VerifyHeader(hdr, reader.DriveIsRegular, pipes.Signature, crypto.Recipient); err != nil { return []*tar.Header{}, err }