- 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);