summaryrefslogtreecommitdiff
path: root/less/lesspipe/lesspipe
diff options
context:
space:
mode:
Diffstat (limited to 'less/lesspipe/lesspipe')
-rw-r--r--less/lesspipe/lesspipe313
1 files changed, 313 insertions, 0 deletions
diff --git a/less/lesspipe/lesspipe b/less/lesspipe/lesspipe
new file mode 100644
index 0000000..85a67ab
--- /dev/null
+++ b/less/lesspipe/lesspipe
@@ -0,0 +1,313 @@
+#!/bin/sh
+#
+# lessfile/lesspipe
+# $Id: lessopen,v 1.4 1998/05/12 09:37:46 torin Exp $
+# Plus POSIX sh changes by Y.Dirson
+#
+# Less filter for viewing non text files.
+#
+# Written by: Behan Webster <behanw@pobox.com>
+# Many Modifications by Darren Stalder
+# Further Modifications by Thomas Schoepf <schoepf@debian.org>
+#
+# combined lessfile and lesspipe to avoid duplication of decode stage
+# shell is sure icky. I'm real tempted to rewrite the whole thing in Perl
+#
+# Unfortunately, this means that I have filename dependencies sprinkled
+# throughout the code. If you don't want lessfile to be called that,
+# you'll need to change the LESSFILE envar below.
+#
+# Usage: eval `lessfile` or eval `lesspipe`
+#
+# less passes in:
+# $1 filename to be viewed with less (used by LESSOPEN)
+# and possibly (if used by lessfile)
+# $2 filename that was created during LESSOPEN
+
+TMPDIR=${TMPDIR:-/tmp}
+BASENAME=`basename $0`
+LESSFILE=lessfile
+
+# Helper function to list contents of ISO files (CD images)
+iso_list() {
+ isoinfo -d -i "$1"
+ isoinfo -d -i "$1" | grep -q ^Rock\.Ridge && iiopts="$iiopts -R"
+ isoinfo -d -i "$1" | grep -q ^Joliet && iiopts="$iiopts -J"
+ echo
+ isoinfo -f $iiopts -i "$1"
+}
+
+if [ $# -eq 1 ] ; then
+ # we were called as LESSOPEN
+
+ # if the file doesn't exist, we don't do anything
+ if [ ! -r "$1" ]; then
+ exit 0
+ fi
+
+ # generate filename for possible use by lesspipe
+ umask 077
+ if [ $BASENAME = $LESSFILE ]; then
+ TMPFILE=`tempfile -d $TMPDIR -p lessf`
+ if [ -z "$TMPFILE" ]; then
+ echo >&2 "Could not find essential program 'tempfile'. Exiting"
+ exit 1
+ fi
+ fi
+
+ (
+ # possibly redirect stdout to a file for lessfile
+ if [ $BASENAME = $LESSFILE ]; then exec > $TMPFILE; fi
+
+ # Allow for user defined filters
+ #if [ -x ~/.lessfilter -a -O ~/.lessfilter ]; then
+ if [ -x ~/.lessfilter ]; then
+ ~/.lessfilter "$1"
+ if [ $? -eq 0 ]; then
+ if [ $BASENAME = $LESSFILE ]; then
+ if [ -s $TMPFILE ]; then
+ echo $TMPFILE
+ else
+ rm -f $TMPFILE
+ fi
+ fi
+ exit 0
+ fi
+ fi
+
+ # Decode file for less
+ case `echo "$1" | tr '[:upper:]' '[:lower:]'` in
+ *.a)
+ if [ -x "`which ar`" ]; then ar tv "$1"
+ else echo "No ar available"; fi ;;
+
+ *.arj)
+ if [ -x "`which unarj`" ]; then unarj l "$1"
+ else echo "No unarj available"; fi ;;
+
+ *.tar.bz2)
+ if [ -x "`which bunzip2`" ]; then
+ bunzip2 -dc "$1" | tar tvvf -
+ else echo "No bunzip2 available"; fi ;;
+
+ *.bz)
+ if [ -x "`which bunzip`" ]; then bunzip -c "$1"
+ else echo "No bunzip available"; fi ;;
+
+ *.bz2)
+ if [ -x "`which bunzip2`" ]; then bunzip2 -dc "$1"
+ else echo "No bunzip2 available"; fi ;;
+
+ *.deb|*.udeb)
+ echo "$1:"; dpkg --info "$1"
+ echo
+ echo '*** Contents:'; dpkg-deb --contents "$1"
+ ;;
+
+ *.doc)
+ if [ -x "`which catdoc`" ]; then
+ catdoc "$1"
+ else
+ # no catdoc, read normally if file is text.
+ if ( file "$1" | grep ASCII 2>/dev/null >/dev/null); then
+ cat "$1"
+ else
+ echo "No catdoc available";
+ fi
+ fi
+ ;;
+
+ *.gif|*.jpeg|*.jpg|*.pcd|*.png|*.tga|*.tiff|*.tif)
+ if [ -x "`which identify`" ]; then
+ identify "$1"
+ else
+ echo "No identify available"
+ echo "Install ImageMagick to browse images"
+ fi
+ ;;
+
+ *.iso)
+ if [ -x "`which isoinfo`" ]; then iso_list "$1"
+ else
+ echo "No isoinfo available"
+ echo "Install mkisofs to view ISO images"
+ fi
+ ;;
+
+ *.bin|*.raw)
+ if [ -x "`which isoinfo`" ]; then
+ file "$1" | grep -q ISO\.9660 && iso_list "$1"
+ else
+ echo "No isoinfo available"
+ echo "Install mkisofs to view ISO images"
+ fi
+ ;;
+
+ *.lha|*.lzh)
+ if [ -x "`which lha`" ]; then lha v "$1"
+ else echo "No lha available"; fi ;;
+
+ *.tar.lz|*.tlz)
+ if [ -x "`which lzip`" ]; then
+ lzip -dc "$1" | tar tvvf -
+ elif [ -x "`which lunzip`" ]; then
+ lunzip -dc "$1" | tar tvvf -
+ else echo "No lzip or lunzip available"; fi ;;
+
+ *.lz)
+ if [ -x "`which lzip`" ]; then lzip -dc "$1"
+ elif [ -x "`which lunzip`" ]; then lunzip -dc "$1"
+ else echo "No lzip or lunzip available"; fi ;;
+
+ *.tar.lzma)
+ if [ -x "`which lzma`" ]; then
+ lzma -dc "$1" | tar tfvv -
+ else
+ echo "No lzma available"
+ fi
+ ;;
+
+ *.lzma)
+ if [ -x "`which lzma`" ]; then
+ lzma -dc "$1"
+ else
+ echo "No lzma available"
+ fi
+ ;;
+
+ *.pdf)
+ if [ -x "`which pdftotext`" ]; then pdftotext -layout "$1" -
+ else echo "No pdftotext available"; fi ;;
+
+ *.rar|*.r[0-9][0-9])
+ if [ -x "`which rar`" ]; then rar v "$1"
+ elif [ -x "`which unrar`" ]; then unrar v "$1"
+ else echo "No rar or unrar available"; fi ;;
+
+ *.rpm)
+ if [ -x "`which rpm`" ]; then
+ echo "$1:"; rpm -q -i -p "$1"
+ echo
+ echo '*** Contents:'
+ rpm -q -l -p "$1"
+ else echo "rpm isn't available, no query on rpm package possible"; fi ;;
+
+ *.tar.gz|*.tgz|*.tar.z|*.tar.dz)
+ tar tzvf "$1" --force-local
+ ;;
+
+ *.tar.xz)
+ if [ -x "`which xz`" ]; then
+ xz -dc "$1" | tar tfvv -
+ else
+ echo "No xz available"
+ fi
+ ;;
+
+ *.xz)
+ if [ -x "`which xz`" ]; then
+ xz -dc "$1"
+ else
+ echo "No xz available"
+ fi
+ ;;
+
+ # Note that this is out of alpha order so that we don't catch
+ # the gzipped tar files.
+ *.gz|*.z|*.dz)
+ gzip -dc "$1" ;;
+
+ *.tar)
+ tar tvf "$1" --force-local
+ ;;
+
+ *.jar|*.war|*.ear|*.xpi|*.zip)
+ if [ -x "`which unzip`" ]; then unzip -v "$1";
+ elif [ -x "`which miniunzip`" ]; then miniunzip -l "$1";
+ elif [ -x "`which miniunz`" ]; then miniunz -l "$1";
+ else echo "No unzip, miniunzip or miniunz available"; fi ;;
+
+ *.7z)
+ if [ -x "`which 7za`" ]; then 7za l "$1";
+ elif [ -x "`which 7zr`" ]; then 7zr l "$1";
+ else echo "No 7za or 7zr available"; fi ;;
+
+ *.zoo)
+ if [ -x "`which zoo`" ]; then zoo v "$1";
+ elif [ -x "`which unzoo`" ]; then unzoo -l "$1";
+ else echo "No unzoo or zoo available"; fi ;;
+
+ esac
+ ) 2>/dev/null
+
+ if [ $BASENAME = $LESSFILE ]; then
+ if [ -s $TMPFILE ]; then
+ echo $TMPFILE
+ else
+ rm -f $TMPFILE
+ fi
+ fi
+
+elif [ $# -eq 2 ] ; then
+ #
+ # we were called as LESSCLOSE
+ # delete the file created if we were lessfile
+ #
+ if [ $BASENAME = $LESSFILE ]; then
+ if [ -n "$BASH" ]; then
+ if [ ! -O "$2" ]; then
+ echo "Error in deleting $2" > /dev/tty
+ fi
+ fi
+
+ if [ -f "$2" ]; then
+ rm -f "$2"
+ else
+ echo "Error in deleting $2" > /dev/tty
+ fi
+ fi
+
+elif [ $# -eq 0 ] ; then
+ #
+ # must setup shell to use LESSOPEN/LESSCLOSE
+ #
+ # I have no idea how some of the more esoteric shells (es, rc) do
+ # things. If they don't do things in a Bourne manner, send me a patch
+ # and I'll incorporate it.
+ #
+
+ # first determine the full path of lessfile/lesspipe
+ # if you can determine a better way to do this, send me a patch, I've
+ # not shell-scripted for many a year.
+ FULLPATH=`cd \`dirname $0\`;pwd`/$BASENAME
+
+ case "$SHELL" in
+ *csh)
+ if [ $BASENAME = $LESSFILE ]; then
+ echo "setenv LESSOPEN \"$FULLPATH %s\";"
+ echo "setenv LESSCLOSE \"$FULLPATH %s %s\";"
+ else
+ echo "setenv LESSOPEN \"| $FULLPATH %s\";"
+ echo "setenv LESSCLOSE \"$FULLPATH %s %s\";"
+ fi
+ ;;
+ *)
+ if [ $BASENAME = $LESSFILE ]; then
+ echo "export LESSOPEN=\"$FULLPATH %s\";"
+ echo "export LESSCLOSE=\"$FULLPATH %s %s\";"
+ else
+ echo "export LESSOPEN=\"| $FULLPATH %s\";"
+ echo "export LESSCLOSE=\"$FULLPATH %s %s\";"
+ fi
+ ;;
+ esac
+
+ #echo "# If you tried to view a file with a name that starts with '#', you"
+ #echo "# might see this message instead of the file's contents."
+ #echo "# To view the contents, try to put './' ahead of the filename when"
+ #echo "# calling less."
+
+else
+ echo "Usage: eval \`$BASENAME\`"
+ exit
+fi