1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
#! /bin/sh
#
# LHa Virtual filesystem executive v0.1
# Copyright (C) 1996, 1997 Joseph M. Hinkle
# May be distributed under the terms of the GNU Public License
# <jhinkle@rockisland.com>
#
# Code for mc_lha_fs_run() suggested by:
# Jan 97 Zdenek Kabelac <kabi@informatics.muni.cz>
# Tested with mc 3.5.18 and gawk 3.0.0 on Linux 2.0.0
# Tested with lha v1.01 and lharc v1.02
# Information and sources for other forms of lha/lzh appreciated
# Additional changes for file names with spaces by
# 2006-01-17 Ralf Hoffmann <ralf@boomerangsworld.de>
# Nota bene:
# There are several compression utilities which produce *.lha files.
# LHArc and LHa in exist several versions, and their listing output varies.
# Another variable is the architecture on which the compressed file was made.
# This program attempts to sort out the variables known to me, but it is likely
# to display an empty panel if it encounters a mystery.
# In that case it will be useful to execute this file from the command line:
# ./lha list Mystery.lha
# to examine the output directly on the console. The output string must be
# precisely in the format described in the README in this directory.
# Caveat emptor.
# Learn Latin.
export LC_ALL=C
# Define your awk
AWK=@AWK@
# Define which archiver you are using with appropriate options
LHA_LIST="lha lq"
LHA_GET="lha pq"
LHA_PUT="lha aq"
# The 'list' command executive
mc_lha_fs_list()
{
# List the contents of the archive and sort it out
$LHA_LIST "$1" | $AWK -v uid=`id -nu` -v gid=`id -ng` '
# Print the line this way if there is no permission string
$1 ~ /^\[.*\]/ {
# Get the filename, everything from seventh field to the end
filename = gensub("^[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* (.*)$","\\1","g");
# Strip a leading '/' if present in a filepath
if (filename ~ /^\//) { filename = substr(filename,2) }
# Invent a generic permission
$1 = (filename ~ /\/$/) ? "drwxr-xr-x":"-rwxr--r--";
# Print it
if (length(filename) > 0) {
printf "%s 1 %-8s %-8s %-8d %s %s %s %s\n",
$1, uid, gid, $2, $4, $5, $6, filename;
}
# Get the next line of the list
next;
}
# Do it this way for a defined permission
$1 !~ /^\[.*\]/ {
# If the permissions and UID run together
if ($1 ~ /\//) {
# Get the filename, everything from seventh field to the end
filename = gensub("^[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* (.*)$","\\1","g");
$8 = $7;
$7 = $6;
$6 = $5;
$5 = $4;
$3 = $2;
# Test whether permission is 9 or 10 characters
# it wont always work if UID is not numerical
if (substr($1,10,1) ~ /[-tTx]/) {
$2 = substr($1,11);
$1 = substr($1,1,10);
} else {
$2 = substr($1,10);
$1 = substr($1,1,9);
}
} else {
# Get the filename, everything from eighth field to the end
filename = gensub("^[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* (.*)$","\\1","g");
}
# Strip a leading '/' if present in a filepath
if (filename ~ /^\//) { filename = substr(filename,2) }
# If the permission string is missing a type
if (length($1) == 9) {
if (filename ~ /\/$/)
$1 = ("d" $1);
else
$1 = ("-" $1);
}
# UID:GID might not be the same as on your system so print numbers
# Well, that is the intent. At the moment mc is translating them.
split($2, id, "/");
printf "%s 1 %-8d %-8d %-8d %s %s %s %s\n",
$1, id[1], id[2], $3, $5, $6, $7, filename;
# Get the next line of the list
next;
}
'
}
# The 'copyout' command executive to copy displayed files to a destination
mc_lha_fs_copyout()
{
$LHA_GET "$1" "$2" > "$3"
}
# The 'copyin' command executive to add something to the archive
mc_lha_fs_copyin ()
{
NAME2=`basename "$2"`; DIR2=${2%$NAME2}
NAME3=`basename "$3"`; DIR3=${3%$NAME3}
cd "${DIR3}"
ONE2=${2%%/*}
[ -n "${ONE2}" ] || exit 1
[ -e "${ONE2}" ] && exit 1
[ -e "${DIR2}" ] || mkdir -p "${DIR2}"
ln "$3" "$2" || exit 1
$LHA_PUT "$1" "$2"
rm -r "${ONE2}"
}
# The 'run' command executive to run a command from within an archive
mc_lha_fs_run()
{
TMPDIR=`mktemp -d "${MC_TMPDIR:-/tmp}/mctmpdir-ulha.XXXXXX"` || exit 1
trap 'rm -rf "$TMPDIR"; exit 0' 1 2 3 4 15
TMPCMD=$TMPDIR/run
$LHA_GET "$1" "$2" > $TMPCMD
chmod a+x "$TMPCMD"
"$TMPCMD"
rm -rf "$TMPDIR"
}
# The main routine
umask 077
cmd="$1"
shift
case "$cmd" in
list) mc_lha_fs_list "$@" ;;
copyout) mc_lha_fs_copyout "$@" ;;
copyin) mc_lha_fs_copyin "$@" ;;
run) mc_lha_fs_run "$@" ;;
*) exit 1 ;;
esac
exit 0
|