From: Mark Wooding Date: Wed, 16 Feb 2022 10:10:05 +0000 (+0000) Subject: dvd-sector-copy.c: Support reading from a regular file. X-Git-Url: https://git.distorted.org.uk/~mdw/dvdrip/commitdiff_plain/d766561d445eb18d62264787ef21786452bf6de7 dvd-sector-copy.c: Support reading from a regular file. This will be useful for testing. I hope. --- diff --git a/dvd-sector-copy.c b/dvd-sector-copy.c index 5c09e88..654a601 100644 --- a/dvd-sector-copy.c +++ b/dvd-sector-copy.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -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);