chkdvdimg.c: Retrieve device size using the new function.
authorMark Wooding <mdw@distorted.org.uk>
Sun, 6 Mar 2022 23:57:20 +0000 (23:57 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 6 Mar 2022 23:57:20 +0000 (23:57 +0000)
... which works on block devices as well as ordinary files.

chkdvdimg.c

index 0fbb48e..0adc6df 100644 (file)
@@ -96,23 +96,23 @@ static int all_zero_p(const unsigned char *p, size_t sz)
 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) {
+  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))