dvd-sector-copy.c: Wrap long line properly.
[dvdrip] / lib.c
diff --git a/lib.c b/lib.c
index 80b1507..521af8d 100644 (file)
--- a/lib.c
+++ b/lib.c
@@ -85,6 +85,25 @@ void carefully_fclose(FILE *fp, const char *what)
     bail_syserr(errno, "error writing %s file", what);
 }
 
+off_t device_size(int fd, const char *file, int *blksz_out)
+{
+  struct stat st;
+  uint64_t volsz;
+
+  if (fstat(fd, &st))
+    bail_syserr(errno, "failed to obtain status for `%s'", file);
+  if (S_ISREG(st.st_mode))
+    volsz = st.st_size;
+  else if (S_ISBLK(st.st_mode)) {
+    if (ioctl(fd, BLKGETSIZE64, &volsz))
+      bail_syserr(errno, "failed to get volume size for `%s'", file);
+    if (ioctl(fd, BLKSSZGET, blksz_out))
+      bail_syserr(errno, "failed to get block size for `%s'", file);
+  } else
+    bail("can't read size for `%s': expected file or block device", file);
+  return ((off_t)volsz);
+}
+
 void store_filename(char *buf, ident id)
 {
   switch (id_kind(id)) {