I don't think this one quite works properly yet.
static int dvdfd = -1, outfd = -1;
static dvd_file_t *vob;
static const char *mapfile; static FILE *mapfp;
static int dvdfd = -1, outfd = -1;
static dvd_file_t *vob;
static const char *mapfile; static FILE *mapfp;
+static const char *errfile; static FILE *errfp;
struct badblock { secaddr start, end; };
DEFVEC(badblock_v, struct badblock);
struct badblock { secaddr start, end; };
DEFVEC(badblock_v, struct badblock);
}
if (n > 0) { done += n; pos += n; p += n*SECTORSZ; want -= n; }
}
if (n > 0) { done += n; pos += n; p += n*SECTORSZ; want -= n; }
- else if (!n || errno != EINTR) break;
+ else if (!n) break;
+ else if (errno == EIO && errfile) {
+ open_file_on_demand(errfile, &errfp, "bad-sector error log");
+ fprintf(errfp, "%"PRIuSEC" %"PRIuSEC"\n", pos, pos + 1);
+ check_write(errfp, "bad-sector error log");
+ break;
+ } else if (errno != EINTR) break;
}
if (fakeerr && !errno) errno = fakeerr;
return (!done && errno ? -1 : done);
}
if (fakeerr && !errno) errno = fakeerr;
return (!done && errno ? -1 : done);
p = strrchr(argv[0], '/'); prog = p ? p + 1 : argv[0];
for (;;) {
p = strrchr(argv[0], '/'); prog = p ? p + 1 : argv[0];
for (;;) {
- opt = getopt(argc, argv, "hFR:X:b:cr:"); if (opt < 0) break;
+ opt = getopt(argc, argv, "hE:FR:X:b:cr:"); if (opt < 0) break;
switch (opt) {
case 'h': usage(stderr); exit(0);
switch (opt) {
case 'h': usage(stderr); exit(0);
+ case 'E': errfile = optarg; break;
case 'F': f |= f_fixup; break;
case 'R':
fp = fopen(optarg, "r");
case 'F': f |= f_fixup; break;
case 'R':
fp = fopen(optarg, "r");
if (dvdfd >= 0) close(dvdfd);
if (outfd >= 0) close(outfd);
carefully_fclose(mapfp, "bad-sector region map");
if (dvdfd >= 0) close(dvdfd);
if (outfd >= 0) close(outfd);
carefully_fclose(mapfp, "bad-sector region map");
+ carefully_fclose(errfp, "bad-sector error log");
#undef f_bogus
#undef f_continue
#undef f_bogus
#undef f_continue