#! /bin/sh # # This is a kludge to fix helper apps in mozilla. See mozilla bugs #57420 # and also #78919. # # It's also useful for tar files with Netscape 4.x # # Copyright (c) 2002-2004 Paul Vojta # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF OR CONTRIBUTOR TO # THIS SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. # Some changes suggested by Thomas Esser included by # . IN_FILE= NO_RM= TMP_DIR= progname=xdvizilla do_cleanup() { exitval=$? if [ -z "$NO_RM" -a -n "$IN_FILE" ] ; then rm -f "$IN_FILE" fi test -n "$TMP_DIR" && rm -rf "$TMP_DIR" exit $exitval } do_abort() { xmessage -nearmouse "$progname: $1" do_cleanup exit 1 } usage() { xmessage -nearmouse "Usage: $progname [-no-rm] " do_cleanup exit 1 } trap 'do_cleanup' 1 2 3 7 13 15 ### create a temporary directory only read/writable by user TMP_DIR=`mktmp -d ${TMP-/tmp}/$progname.XXXXXX` (umask 077; mkdir "$TMP_DIR") || do_abort "Could not create directory \`$TMP_DIR'" if [ $# -gt 1 -a "x$1" = "x-no-rm" ]; then NO_RM=y shift fi if [ $# -ne 1 ]; then usage fi DIR=`dirname "$0"` if [ "$DIR" = . ]; then DIR= elif [ -f "$DIR"/xdvi -a -x "$DIR"/xdvi ]; then DIR="$DIR"/ else DIR= fi # need to preserve IN_FILE for eventual deletion IN_FILE="$1" TMP_FILE="$IN_FILE" while [ 1 ]; do [ -f "$TMP_FILE" ] || do_abort "$TMP_FILE: File not found." FILETYPE=`file "$TMP_FILE"` case "$FILETYPE" in *"gzip compressed data"*) out="$TMP_DIR"/tmp-gz gunzip -c "$TMP_FILE" > "$out" TMP_FILE="$out" ;; *"compressed data"* | *"compress'd data"*) out="$TMP_DIR"/tmp-compress uncompress -c "$TMP_FILE" > "$out" TMP_FILE="$out" ;; "$TMP_FILE: empty") do_abort "$TMP_FILE is an empty file (probably a bug in Mozilla?)" ;; *" tar archive") ### do sanity checks on the tar archive, to avoid overwriting user files: dangerous=`tar tf "$TMP_FILE" | egrep '^(/|.*\.\./)'` [ -z "$dangerous" ] || do_abort "Tar file contains files with absolute paths or \`../' components, which may overwrite user files. Not unpacking it." ### also check for gzipped DVI files inside the archive ... out="$TMP_DIR"/`tar tf "$TMP_FILE" | egrep '\.(dvi|dvi.gz|dvi.Z)$' | head -1` if [ -z "$out" ]; then do_abort "Tar file does not contain a dvi file." else cat "$TMP_FILE" | (cd "$TMP_DIR"; tar xf -) TMP_FILE="$out" fi ;; *"DVI file"*) "$DIR"xdvi -safer "$TMP_FILE" break ;; *) do_abort "$TMP_FILE: Unrecognized file format!" ;; esac done do_cleanup exit 0