#! /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 # # # Code for mc_lha_fs_run() suggested by: # Jan 97 Zdenek Kabelac # 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