tmp=${DVDRIP_TMPDIR-${HOME?}/tmp/dvdrip}
archive=${DVDRIP_ARCHIVE-jem.distorted.org.uk:/mnt/dvd/archive}
: ${DVD_SECTOR_COPY=dvd-sector-copy}
+: ${DVD_ID=dvd-id}
: ${DVDRIP_UPLOAD=dvdrip-upload}
-backup=nil eject=nil force=nil retry=nil verbose=nil bogus=nil
+backup=nil ding=nil eject=nil force=nil retry=nil verbose=nil bogus=nil
+unset params
usage () {
cat <<EOF
-usage: $prog [-efrv] [-D DEV] [-a ARCH] [-t TMP] TITLE
+usage: $prog [-defrv] [-D DEV] [-a ARCH] [-t TMP] TITLE
EOF
}
-while getopts "hD:a:efrt:v" opt; do
+while getopts "hB:D:a:defrt:v" opt; do
case $opt in
h) usage; exit 0 ;;
+ B) params=${params+$params,}$OPTARG ;;
D) dev=$OPTARG ;;
a) archive=$OPTARG ;;
+ d) ding=t ;;
e) eject=t ;;
f) force=t ;;
r) retry=t ;;
0,t) warn "output file already exists; will overwrite" ;;
esac
+mkdir -p "$tmp/$tag"
+
+discid=$("$DVD_ID" -I "$dev")
+if [ -f "$tmp/$tag/discid" ]; then
+ read oldid <"$tmp/$tag/discid"
+ case $force,$oldid in
+ t,"$discid" | nil,"$discid")
+ ;;
+ nil,*)
+ fail "discid mismatch: expected \`$oldid' but drive has \`$discid'"
+ ;;
+ t,*)
+ warn "discid mismatch: expected \`$oldid' but drive has \`$discid'; continuing anway"
+ ;;
+ esac
+fi
+info "copying \`$discid'"
+echo "$discid" >"$tmp/$tag/discid.new"
+mv "$tmp/$tag/discid.new" "$tmp/$tag/discid"
+
+if [ -b "$dev" ]; then msz=$(blockdev --getsize64 "$dev")
+else msz=nil; fi
+
+echo "$dev" >"$tmp/$tag/device.new"
+mv "$tmp/$tag/device.new" "$tmp/$tag/device"
+
accumulate_badblocks () {
if [ -f "$tmp/$tag/badblocks.new" ]; then
if [ ! -f "$tmp/$tag/badblocks" ]; then
}
set --
-mkdir -p "$tmp/$tag"
any=nil
for i in "$tmp/$tag/dest.new" "$tmp/$tag/dest" "$tmp/$tag/dest.seen"; do
if [ -f "$tmp/$tag/dest.new" ]; then any=t; fi
case $any in
nil) printf "%s\n" "$title.iso" >"$tmp/$tag/dest.new" ;;
esac
+case $eject in
+ t) touch "$tmp/$tag/eject" ;;
+ nil) rm -f "$tmp/$tag/eject" ;;
+esac
+case $ding in
+ t) touch "$tmp/$tag/ding" ;;
+ nil) rm -f "$tmp/$tag/ding" ;;
+esac
accumulate_badblocks
case $retry in
;;
esac
if [ ! -f "$tmp/$tag/iso" ]; then
- run "$DVD_SECTOR_COPY" -cs -b"$tmp/$tag/badblocks.new" "$@" \
- "$dev" "$tmp/$tag/iso.new"
+ run "$DVD_SECTOR_COPY" -cs ${params+"-B$params"} \
+ -b"$tmp/$tag/badblocks.new" "$@" "$dev" "$tmp/$tag/iso.new"
run mv "$tmp/$tag/iso.new" "$tmp/$tag/iso"
accumulate_badblocks
+ rm -f "$tmp/$tag/device"
case $retry in t) rm -f "$tmp/$tag/badblocks.retry" ;; esac
if [ -f "$tmp/$tag/badblocks" ]; then
fail "bad sectors found: check \`$tmp/$tag/iso', run again if ok"
fi
+ case $msz in
+ nil) ;;
+ *)
+ newmsz=$(blockdev --getsize64 "$dev")
+ case $newmsz in
+ $msz) ;;
+ *) fail "medium size changed ($msz -> $newmsz): try again" ;;
+ esac
+ ;;
+ esac
fi
+rm -f "$tmp/$tag/device"
run mv "$tmp/$tag/dest.new" "$tmp/$tag/dest"
+if [ -f "$tmp/$tag/eject" ]; then eject=t; else eject=nil; fi
+if [ -f "$tmp/$tag/ding" ]; then ding=t; else ding=nil; fi
run "$DVDRIP_UPLOAD"
case $eject in t) run eject "$dev" ;; esac
-printf "\a"
+case $ding in
+ t)
+ if [ -t 1 ]; then exec 3>&1
+ elif [ -t 2 ]; then exec 3>&2
+ else exec 3>/dev/tty
+ fi
+ printf "\a" >&3
+ exec 3>&-
+ ;;
+esac