fi
export TMPDIR
TMPDIR=$(mktemp -dp "$TMPDIR" mutt.XXXXXXXXXX)
-cleanup() { cd / && rm -rf "$TMPDIR"; }
+
+cleanup() {
+ cd /
+ echo Cleaning up $TMPDIR… >> $TMPDIR/output.stderr
+ notify_output
+ rm -rf "$TMPDIR"
+ trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
+}
trap cleanup 1 2 3 4 5 6 7 8 10 11 12 13 14 15
cd "$TMPDIR"
fi
}
+notify_output() {
+ if [ -s "$TMPDIR/output.stdout" ] || [ -s "$TMPDIR/output.stderr" ]; then
+ notify $TMPDIR/output.stdout $TMPDIR/output.stderr \
+ "Output from mutt/$SELF on $BASENAME"
+ fi
+}
+
+guess_extension() {
+ python -c "import mimetypes; print(mimetypes.guess_extension('$1'))"
+}
+
+launch_viewer() {
+ run-mailcap --action=view "$1":"$2" > output.stdout 2> output.stderr
+}
+
+MIMETYPE="$1"; shift
+
+get_file() {
+ local t
+ if [ -z "$1" ]; then
+ t=$(tempfile -d . -p mutt -s $(guess_extension "$MIMETYPE"))
+ cat > "$t"
+ echo "$t"
+ else
+ t="$(echo ${1##*/} | sed -re 's![^[:alnum:],.@%^+=_-]!_!gi')"
+ cp "$1" "$t"
+ echo "$t"
+ fi
+}
+
case "$SELF" in
(bgrun)
# make a copy of the file, then launch a shell process in the background
# to divert to run-mailcap, after which the temporary directory gets
# cleaned up.
- cp -a "$1" $TMPDIR
- MIMETYPE="$2"
+ FILE="$(get_file "${1:-}")"
(
- run-mailcap --action=view "$MIMETYPE":"$TEMPFILE"
- if [ -s "$TMPDIR/output.stdout" ] || [ -s "$TMPDIR/output.stderr" ]; then
- notify $TMPDIR/output.stdout $TMPDIR/output.stderr \
- "Output from mutt/$SELF on $BASENAME"
- fi
+ launch_viewer "$MIMETYPE" "$FILE"
+ sleep 1
cleanup
) &
trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
;;
- (browserrun)
- # hack to stay around until the browser has read the file: make a fifo and
+ (bgrun-fifo)
+ # hack to stay around until the viewer has read the file: make a fifo and
# wait for the cat process to finish writing to it, which means that it
# must have been consumed on the other end.
- mkfifo "$TEMPFILE"
- INPUTFILE="$1"
- cat "$INPUTFILE" > $TEMPFILE &
- sensible-browser "$TEMPFILE" > $TMPDIR/output.stdout 2> $TMPDIR/output.stderr
+ FILE="$(get_file "${1:-}")"
+ FIFO="${FILE%/*}/fifo-${FILE##*/}"
+ mkfifo "$FIFO"
+ cat "$FILE" > "$FIFO" &
+ # For some reason, we do have to write a tempfile and cannot seem to
+ # redirect stdin directly to the fifo, i.e. this does not work instead of
+ # the previous three lines:
+ ## cat > "$FIFO" &
+ launch_viewer "$MIMETYPE" "${FIFO}"
wait
cleanup
;;
+ (bgrun-delay)
+ # hack to stay around for a fixed period of time after the viewer process
+ # returns control to the caller, so that we can clean up. This is for
+ # cases when the FIFO method doesn't work, because e.g. Firefox randomly
+ # chooses it needs to read HTML files twice.
+ FILE="$(get_file "${1:-}")"
+ (launch_viewer "$MIMETYPE" "${FILE}") &
+ (
+ sleep 1m
+ echo Cleaning up $TMPDIR… > $TMPDIR/output.stderr
+ cleanup
+ ) &
+ trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
+ ;;
esac