store_filename(fn, id);
start = UDFFindFile(dvd, fn, &len); if (!start) return;
#ifdef DEBUG
- printf(";; %8"PRIuSEC" .. %-8"PRIuSEC": %s\n",
- start, start + SECTORS(len), fn);
+ printf(";; %8"PRIuSEC" .. %-8"PRIuSEC": %s\n",
+ start, start + SECTORS(len), fn);
#endif
put_file(id, start, start + SECTORS(len));
}
if (best && pos + want > best->start)
{ want = best->start - pos; fakeerr = EIO; sit(bad_block_delay); }
}
- done = 0;
+
+ done = 0; errno = 0;
while (want) {
if (vob)
{ errno = 0; n = DVDReadBlocks(vob, pos - file->start, want, p); }
return (!done && errno ? -1 : done);
}
-static void record_bad_sectors(secaddr bad_lo, secaddr bad_hi)
-{
- char fn[MAXFNSZ];
-
- if (!mapfile) return;
-
- open_file_on_demand(mapfile, &mapfp, "bad-sector region map");
- fprintf(mapfp, "%"PRIuSEC" %"PRIuSEC" # %"PRIuSEC" sectors",
- bad_lo, bad_hi, bad_hi - bad_lo);
-
- if (file && id_kind(file->id) != RAW) {
- store_filename(fn, file->id);
- fprintf(mapfp, "; `%s' %"PRIuSEC" .. %"PRIuSEC" of %"PRIuSEC"",
- fn, bad_lo - file->start, bad_hi - file->start,
- file->end - file->start);
- }
-
- fputc('\n', mapfp);
- check_write(mapfp, "bad-sector region map");
-}
-
static void recovered(secaddr bad_lo, secaddr bad_hi)
{
char fn[MAXFNSZ];
file->end - file->start);
}
- record_bad_sectors(bad_lo, bad_hi);
+ if (mapfile) {
+ open_file_on_demand(mapfile, &mapfp, "bad-sector region map");
+ fprintf(mapfp, "%"PRIuSEC" %"PRIuSEC" # %"PRIuSEC" sectors",
+ bad_lo, bad_hi, bad_hi - bad_lo);
+
+ if (file && id_kind(file->id) != RAW)
+ fprintf(mapfp, "; `%s' %"PRIuSEC" .. %"PRIuSEC" of %"PRIuSEC"",
+ fn, bad_lo - file->start, bad_hi - file->start,
+ file->end - file->start);
+
+ fputc('\n', mapfp);
+ check_write(mapfp, "bad-sector region map");
+ }
if (lseek(outfd, (off_t)(bad_hi - bad_lo)*SECTORSZ, SEEK_CUR) < 0)
bail_syserr(errno, "failed to seek past bad sectors");
ssize_t n;
assert(off <= r->sz); assert(want <= r->sz - off);
+ assert(pos == r->pos + off);
n = read_sectors(pos, r->buf + off*SECTORSZ, want);
return (n);
}
#endif
}
} else if (pos > r->pos + r->end) {
- r->pos = pos; r->start = r->end = 0;
+ r->pos = pos; r->start = r->end = 0;
#ifdef DEBUG
- show_recovery_buffer_map(r, "cleared; beyond previous region");
+ show_recovery_buffer_map(r, "cleared; beyond previous region");
#endif
} else if (pos + want > r->pos + r->sz) {
diff = (pos + want) - (r->pos + r->sz);
{
secaddr want;
- want = clear_factor*badlen;
+ want = ceil(clear_factor*badlen);
if (want < clear_min) want = clear_min;
if (want > end - pos) want = end - pos;
if (clear_max && want > clear_max) want = clear_max;
badblock_progress.render = render_badblock_progress;
progress_additem(&progress, &badblock_progress);
- r.buf = buf; r.sz = sz; r.pos = r.start = r.end = 0;
- r.good_lo = r.good_hi = 0;
-
want = sz; if (want > end - pos) want = end - pos;
for (retry = 0; retry < max_retries; retry++) {
report_bad_blocks_progress(pos, errno);
- n = recovery_read(&r, pos, want);
+ n = read_sectors(pos, buf, want);
#ifdef DEBUG
progress_clear(&progress);
printf(";; [retry] try reading %"PRIuSEC" .. %"PRIuSEC" -> %zd\n",
}
}
+ r.buf = buf; r.sz = sz; r.pos = r.start = r.end = 0;
+ r.good_lo = r.good_hi = 0;
+
bad_lo = pos; bad_hi = pos + 1;
for (;;) {
report_bad_blocks_progress(bad_hi, errno);
#endif
}
- open_dvd(device, O_RDONLY, &dvdfd, &dvd);
+ if (open_dvd(device, O_RDONLY, &dvdfd, &dvd)) exit(2);
blksz = SECTORSZ; volsz = device_size(dvdfd, device, &blksz);
if (blksz != SECTORSZ)
device, volsz, SECTORSZ);
if (f&f_checkid) {
- open_dvd(outfile, O_RDONLY, 0, &dvd_out);
+ if (open_dvd(outfile, O_RDONLY, 0, &dvd_out)) exit(2);
if (dvd_id(id_in, dvd, DIF_MUSTIFOHASH, device) ||
dvd_id(id_out, dvd_out, DIF_MUSTIFOHASH, device))
exit(2);