#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
+#include <sys/stat.h>
#include <sys/time.h>
#include <getopt.h>
size_t i;
FILE *fp;
struct buf buf = BUF_INIT;
+ struct stat st;
#ifdef DEBUG
const struct file *file;
char fn[MAXFNSZ];
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);