tape::{
TAPE_STATUS_DIR,
TapeRead,
+ BlockReadError,
MediaId,
MediaSet,
MediaCatalog,
loop {
let current_file_number = drive.current_file_number()?;
- let reader = match drive.read_next_file()? {
- None => {
+ let reader = match drive.read_next_file() {
+ Err(BlockReadError::EndOfFile) => {
+ task_log!(worker, "skip unexpected filemark at pos {}", current_file_number);
+ continue;
+ }
+ Err(BlockReadError::EndOfStream) => {
task_log!(worker, "detected EOT after {} files", current_file_number);
break;
}
- Some(reader) => reader,
+ Err(BlockReadError::Error(err)) => {
+ return Err(err.into());
+ }
+ Ok(reader) => reader,
};
restore_archive(worker, reader, current_file_number, target, &mut catalog, verbose)?;
}
}
- reader.skip_to_end()?; // read all data
+ reader.skip_data()?; // read all data
if let Ok(false) = reader.is_incomplete() {
catalog.register_snapshot(Uuid::from(header.uuid), current_file_number, &datastore_name, &snapshot)?;
catalog.commit_if_large()?;
task_log!(worker, "skipping...");
}
- reader.skip_to_end()?; // read all data
+ reader.skip_data()?; // read all data
}
PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0 => {
let header_data = reader.read_exact_allocated(header.size as usize)?;
task_log!(worker, "File {}: skip catalog '{}'", current_file_number, archive_header.uuid);
- reader.skip_to_end()?; // read all data
+ reader.skip_data()?; // read all data
}
_ => bail!("unknown content magic {:?}", header.content_magic),
}
let current_file_number = drive.current_file_number()?;
{ // limit reader scope
- let mut reader = match drive.read_next_file()? {
- None => {
+ let mut reader = match drive.read_next_file() {
+ Err(BlockReadError::EndOfFile) => {
+ task_log!(worker, "skip unexpected filemark at pos {}", current_file_number);
+ continue;
+ }
+ Err(BlockReadError::EndOfStream) => {
task_log!(worker, "detected EOT after {} files", current_file_number);
break;
}
- Some(reader) => reader,
+ Err(BlockReadError::Error(err)) => {
+ return Err(err.into());
+ }
+ Ok(reader) => reader,
};
let header: MediaContentHeader = unsafe { reader.read_le_value()? };
if &archive_header.media_set_uuid != media_set.uuid() {
task_log!(worker, "skipping unrelated catalog at pos {}", current_file_number);
- reader.skip_to_end()?; // read all data
+ reader.skip_data()?; // read all data
continue;
}
if !wanted {
task_log!(worker, "skip catalog because media '{}' not inventarized", catalog_uuid);
- reader.skip_to_end()?; // read all data
+ reader.skip_data()?; // read all data
continue;
}
// only restore if catalog does not exist
if MediaCatalog::exists(status_path, catalog_uuid) {
task_log!(worker, "catalog for media '{}' already exists", catalog_uuid);
- reader.skip_to_end()?; // read all data
+ reader.skip_data()?; // read all data
continue;
}
}