static unsigned flags = 0;
#define F_FIX 1u
+static void set_status(int st)
+ { if (st > status) status = st; }
static void vgripe_syserr(int st, int err, const char *fmt, va_list ap)
- { vmoan_syserr(err, fmt, ap); if (st > status) status = st; }
+ { vmoan_syserr(err, fmt, ap); set_status(st); }
static void vgripe(int st, const char *fmt, va_list ap)
{ vgripe_syserr(st, 0, fmt, ap); }
PRINTF_LIKE(3, 4)
static void check_img(const char *file)
{
int fd = -1;
- struct stat st;
unsigned char b[SECTORSZ], bb[SECTORSZ];
+ off_t volsz;
+ int blksz;
secaddr end;
unsigned i, j;
- fd = open(file, (flags&F_FIX) ? O_RDWR : O_RDONLY);
- if (fd < 0)
- { gripe_syserr(2, errno, "failed to open `%s'", file); goto end; }
- if (fstat(fd, &st)) {
- gripe_syserr(2, errno, "failed to retrieve file status for `%s'", file);
- goto end;
- }
- if (st.st_size%SECTORSZ) {
+ if (open_dvd(file, (flags&F_FIX) ? O_RDWR : O_RDONLY, &fd, 0))
+ { set_status(2); goto end; }
+ blksz = SECTORSZ; volsz = device_size(fd, file, &blksz);
+ if (SECTORSZ != 2048)
+ { gripe(2, "device sector size %d /= 2048", blksz); goto end; }
+ if (volsz%SECTORSZ) {
gripe(2, "bad length for `%s' -- not whole number of sectors", file);
goto end;
}
- end = st.st_size/SECTORSZ;
+ end = volsz/SECTORSZ;
if (carefully_read(fd, 256*SECTORSZ, b, SECTORSZ, file) ||
check_anchor_header(b, 256, CAHF_GRIPE | CAHF_FULL, file))
if (bb[0] || !all_zero_p(bb, SECTORSZ)) goto nonzero;
}
gripe(1, "too many trailing zero sectors: "
- "couldn't find backup anchor descriptor");
+ "couldn't find backup anchor descriptor in `%s'", file);
goto end;
nonzero:
j = i;
}
if (optind >= argc) f |= f_bogus;
if (f&f_bogus) { usage(stderr); exit(2); }
-
+ setlocale(LC_ALL, "");
+ progress_init(&progress);
for (i = optind; i < argc; i++) check_img(argv[i]);
+ progress_free(&progress);
return (status);
}