dvdrip-retry-botched-vobs: Eject discs when we're done with them.
[dvdrip] / lib.c
diff --git a/lib.c b/lib.c
index 1c815d0..7fecbc4 100644 (file)
--- a/lib.c
+++ b/lib.c
@@ -49,6 +49,47 @@ void sit(double t)
   }
 }
 
+void carefully_write(int fd, const void *buf, size_t sz)
+{
+  const unsigned char *p = buf;
+  ssize_t n;
+
+  if (fd < 0) return;
+  while (sz) {
+    n = write(fd, p, sz);
+    if (n < 0) {
+      if (errno == EINTR) continue;
+      bail_syserr(errno, "failed to write to output file");
+    }
+    if (!n) bail("unexpected short write to output file");
+    p += n; sz -= n;
+  }
+}
+
+void open_file_on_demand(const char *file, FILE **fp_inout, const char *what)
+{
+  FILE *fp;
+
+  if (!*fp_inout) {
+    fp = fopen(file, "w");
+    if (!fp) bail_syserr(errno, "failed to open %s file `%s'", what, file);
+    fprintf(fp, "## %s\n\n", what);
+    *fp_inout = fp;
+  }
+}
+
+void check_write(FILE *fp, const char *what)
+{
+  fflush(fp);
+  if (ferror(fp)) bail_syserr(errno, "error writing %s file", what);
+}
+
+void carefully_fclose(FILE *fp, const char *what)
+{
+  if (fp && (ferror(fp) || fclose(fp)))
+    bail_syserr(errno, "error writing %s file", what);
+}
+
 void store_filename(char *buf, ident id)
 {
   switch (id_kind(id)) {