X-Git-Url: https://git.distorted.org.uk/~mdw/dvdrip/blobdiff_plain/d79ff9c5ea483a1cdf3b96de320dcda0d8041f7c..d766561d445eb18d62264787ef21786452bf6de7:/dvd-sector-copy.c?ds=sidebyside 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);