mc/vfs/extfs/ulha.in
Pavel Roskin d588d57360 * extfs/ulha.in: Support for "[unknown]" and other permissions
in brackets.  Pass the date unchanged - mc can now deal with it.
Use "lha lq" to list the archive and don't remove headers and
footers of the listing.
2001-12-18 22:55:21 +00:00

150 lines
4.3 KiB
Bash

#! /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
# 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.
# Another helpful thing is to temporarily remove the redirection of error
# output of awk (The '2> /dev/null' instruction near the end of mcfs_list())
# The screen will get ugly if there's an error, but some useful text shows
# at the bottom of the screen.
# Caveat emptor.
# Learn Latin.
# 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"
# Define a directory to create a temporary file for when
# running a command to be run from the archive
TMPDIR=/tmp/mc-cmd.$$
# Temporary file within the directory
TMPCMD=$TMPDIR/run
# 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` '
# Strip a leading '/' if present in a filepath
$(NF) ~ /^\// { $(NF) = substr($NF,2) }
# Print the line this way if there is no permission string
$1 ~ /^\[.*\]/ {
# Invent a generic permission
$1 = ($10 ~ /\/$/) ? "drwxr-xr-x":"-rwxr--r--";
# Print it
printf "%s 1 %-8s %-8s %-8d %s %s %s %s\n",
$1, uid, gid, $2, $4, $5, $6, $7;
# 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 ~ /\//) {
$8 = $7;
$7 = $6;
$6 = $5;
$5 = $4;
$3 = $2;
$2 = substr($1,10);
$1 = substr($1,1,9);
}
# If the permission string is missing a type
if (length($1) == 9) {
if ($NF ~ /\/$/)
$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, $8;
# Get the next line of the list
next;
}
' 2> /dev/null
}
# The 'copyout' command executive to copy displayed files to a destination
mc_lha_fs_copyout()
{
$LHA_GET $1 $2 > $3 2> /dev/null
}
# 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
[ -e ${ONE2} ] && exit
[ -e ${DIR2} ] || mkdir -p ${DIR2}
ln $3 $2 || exit
$LHA_PUT $1 $2 2> /dev/null
rm -r ${ONE2}
}
# The 'run' command executive to run a command from within an archive
mc_lha_fs_run()
{
trap "rm $TMPCMD; rmdir $TMPDIR; exit 0" 1 2 3 4 15
# FIXME: Try harder to generate a unique directory if this fails
mkdir -m 0700 $TMPDIR || exit 1
$LHA_GET $1 $2 > $TMPCMD 2> /dev/null
chmod a+x $TMPCMD 2> /dev/null
$TMPCMD 2> /dev/null
rm $TMPCMD
rmdir $TMPDIR
}
# The main routine
umask 077
case "$1" in
list) mc_lha_fs_list $2; exit $?;;
copyout) mc_lha_fs_copyout $2 $3 $4; exit $?;;
copyin) mc_lha_fs_copyin $2 $3 $4; exit $?;;
run) mc_lha_fs_run $2 $3 $4; exit $?;;
esac
exit 1