+ /* Some sort of label? */
+ if (rec->FileIndex < 0) {
+ handle_session_record(dev, rec, &sessrec);
+ ok = record_cb(dcr, rec);
+ if (rec->FileIndex == EOS_LABEL) {
+ Dmsg2(300, "Remove rec. SI=%d ST=%d\n", rec->VolSessionId,
+ rec->VolSessionTime);
+ recs->remove(rec);
+ free_record(rec);
+ }
+ continue;
+ } /* end if label record */
+
+ /*
+ * Apply BSR filter
+ */
+ if (jcr->bsr) {
+ int stat = match_bsr(jcr->bsr, rec, &dev->VolHdr, &sessrec);
+ if (stat == -1) { /* no more possible matches */
+ done = true; /* all items found, stop */
+ Dmsg2(300, "All done=(file:block) %u:%u\n", dev->file, dev->block_num);
+ break;
+ } else if (stat == 0) { /* no match */
+ Dmsg4(300, "Clear rem=%d FI=%d before set_eof pos %u:%u\n",
+ rec->remainder, rec->FileIndex, dev->file, dev->block_num);
+ rec->remainder = 0;
+ rec->state &= ~REC_PARTIAL_RECORD;
+ if (try_repositioning(jcr, rec, dev)) {
+ break;
+ }
+ continue; /* we don't want record, read next one */
+ }
+ }
+ if (is_partial_record(rec)) {
+ Dmsg6(300, "Partial, break. recno=%d state=%s blk=%d SI=%d ST=%d FI=%d\n", record,
+ rec_state_to_str(rec), block->BlockNumber,
+ rec->VolSessionId, rec->VolSessionTime, rec->FileIndex);
+ break; /* read second part of record */
+ }
+ ok = record_cb(dcr, rec);
+ if (rec->Stream == STREAM_MD5_SIGNATURE || rec->Stream == STREAM_SHA1_SIGNATURE) {
+ Dmsg3(300, "Done FI=%u before set_eof pos %u:%u\n", rec->FileIndex,
+ dev->file, dev->block_num);
+ if (match_set_eof(jcr->bsr, rec) && try_repositioning(jcr, rec, dev)) {
+ Dmsg2(300, "Break after match_set_eof pos %u:%u\n",
+ dev->file, dev->block_num);
+ break;
+ }
+ Dmsg2(300, "After set_eof pos %u:%u\n", dev->file, dev->block_num);
+ }
+ } /* end for loop over records */
+ Dmsg2(300, "After end records position=(file:block) %u:%u\n", dev->file, dev->block_num);
+ } /* end for loop over blocks */
+// Dmsg2(300, "Position=(file:block) %u:%u\n", dev->file, dev->block_num);
+
+ /* Walk down list and free all remaining allocated recs */
+ while (!recs->empty()) {
+ rec = (DEV_RECORD *)recs->first();
+ recs->remove(rec);
+ free_record(rec);
+ }
+ delete recs;
+ print_block_read_errors(jcr, block);
+ return ok;
+}
+
+/*
+ * See if we can reposition.
+ * Returns: true if at end of volume
+ * false otherwise
+ */
+static bool try_repositioning(JCR *jcr, DEV_RECORD *rec, DEVICE *dev)
+{
+ BSR *bsr;
+ bsr = find_next_bsr(jcr->bsr, dev);
+ if (bsr == NULL && jcr->bsr->mount_next_volume) {
+ Dmsg0(300, "Would mount next volume here\n");
+ Dmsg2(300, "Current postion (file:block) %u:%u\n",
+ dev->file, dev->block_num);
+ jcr->bsr->mount_next_volume = false;
+ if (!dev->at_eot()) {
+ /* Set EOT flag to force mount of next Volume */
+ jcr->mount_next_volume = true;
+ dev->state |= ST_EOT;