feat: Add re-implementation of tar tvf for tape

This commit is contained in:
Felicitas Pojtinger
2021-11-18 01:50:22 +01:00
parent 43606874be
commit b759a56a7b
+24 -51
View File
@@ -119,70 +119,43 @@ func main() {
} }
} else { } else {
br := bufio.NewReaderSize(f, blockSize**recordSize) br := bufio.NewReaderSize(f, blockSize**recordSize)
tr := tar.NewReader(br)
record := int64(0) currentRecord := 0
o:
for { for {
for currentBlock := 0; currentBlock < *recordSize; currentBlock++ {
if currentRecord%4096 == 0 {
tell, err := getCurrentRecordFromTape(f)
if err != nil {
panic(err)
}
if tell < int64(currentRecord) {
// EOD
break o
}
}
tr := tar.NewReader(br)
hdr, err := tr.Next() hdr, err := tr.Next()
if err == io.EOF {
if err := goToNextFileOnTape(f); err != nil {
panic(err)
}
br = bufio.NewReaderSize(f, blockSize**recordSize)
tr = tar.NewReader(br)
hdr, err = tr.Next()
if err != nil { if err != nil {
if err == io.EOF { continue
break
} }
panic(err) if hdr.Format == tar.FormatUnknown {
} continue
} }
if err != nil { log.Println("Record:", currentRecord, "Block:", currentBlock, "Header:", hdr)
panic(err)
// TODO: Seek to (curr + hdr.Size)/blockSize if recordToSeekTo != currentRecord, re-write `br`
} }
if record == 0 { currentRecord++
log.Println("Record:", 0, "Block:", 0, "Header:", hdr)
} else {
log.Println("Record:", record, "Block:", 0, "Header:", hdr)
}
curr, err := getCurrentRecordFromTape(f)
if err != nil {
panic(err)
}
if record == 0 {
record = ((curr * int64(*recordSize) * blockSize) + hdr.Size) / (int64(*recordSize) * blockSize) // For the first record of the file or archive, the offset of one is not needed
} else {
record = ((curr*int64(*recordSize)*blockSize)+hdr.Size)/(int64(*recordSize)*blockSize) + 2 // +2 because we need to start reading right after the last block
} }
} }
} }
}
func goToNextFileOnTape(f *os.File) error {
if _, _, err := syscall.Syscall(
syscall.SYS_IOCTL,
f.Fd(),
MTIOCTOP,
uintptr(unsafe.Pointer(
&Operation{
Op: MTFSF,
Count: 1,
},
)),
); err != 0 {
return err
}
return nil
}
func getCurrentRecordFromTape(f *os.File) (int64, error) { func getCurrentRecordFromTape(f *os.File) (int64, error) {
pos := &Position{} pos := &Position{}