dvd-sector-copy.c: Support reading from a regular file.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 16 Feb 2022 10:10:05 +0000 (10:10 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Wed, 16 Feb 2022 10:10:05 +0000 (10:10 +0000)
This will be useful for testing.  I hope.

dvd-sector-copy.c

index 5c09e88..654a601 100644 (file)
@@ -16,6 +16,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
+#include <sys/stat.h>
 #include <sys/time.h>
 
 #include <getopt.h>
@@ -602,6 +603,7 @@ int main(int argc, char *argv[])
   size_t i;
   FILE *fp;
   struct buf buf = BUF_INIT;
+  struct stat st;
 #ifdef DEBUG
   const struct file *file;
   char fn[MAXFNSZ];
@@ -690,11 +692,20 @@ int main(int argc, char *argv[])
   if (f&f_bogus) { usage(stderr); exit(2); }
 
   src.dvdfd = open(device, O_RDONLY);
-  if (src.dvdfd < 0) bail_syserr(errno, "failed to open device `%s'", device);
-  if (ioctl(src.dvdfd, BLKSSZGET, &blksz))
-    bail_syserr(errno, "failed to get block size for `%s'", device);
-  if (ioctl(src.dvdfd, BLKGETSIZE64, &volsz))
-    bail_syserr(errno, "failed to get volume size for `%s'", device);
+  if (src.dvdfd < 0)
+    bail_syserr(errno, "failed to open device `%s'", device);
+  if (fstat(src.dvdfd, &st))
+    bail_syserr(errno, "failed to stat device `%s'", device);
+  if (S_ISREG(st.st_mode)) {
+    blksz = SECTORSZ;
+    volsz = st.st_size;
+  } else if (S_ISBLK(st.st_mode)) {
+    if (ioctl(src.dvdfd, BLKSSZGET, &blksz))
+      bail_syserr(errno, "failed to get block size for `%s'", device);
+    if (ioctl(src.dvdfd, BLKGETSIZE64, &volsz))
+      bail_syserr(errno, "failed to get volume size for `%s'", device);
+  } else
+    bail("can't use `%s' as source: expected file or block device", device);
 
   if (blksz != SECTORSZ)
     bail("device `%s' block size %d /= %d", device, blksz, SECTORSZ);