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
|
#! /bin/sh
#
# u7z - 7zip file archive Virtual File System for Midnight Commander ( ftp://ftp.ibiblio.org/pub/Linux/utils/file/managers/mc/ )
#
# Copyright (C) 2004 Sergiy Niskorodov (sgh at ukrpost dot net)
# Written by Sergiy Niskorodov aka SGh
#
# beta version 4.16 (11 Apr 2005)
#
# 7z for linux can be found on http://sourceforge.net/projects/p7zip/
# Thanks to urar VFS authors andrey joukov 2:5020/337.13@fidonet.org,
# christian.gennerat@alcatel.fr, Andrew V. Samoilov <sav@bcs.zp.ua>
# I use this script like example
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
SEVENZ=`which 7za`
mc7zfs_list ()
{
$SEVENZ l "$1" 2> /dev/null | @AWK@ -v uid=$(id -ru) '
BEGIN { flag=0; arr_of_month="JanFebMarAprMayJunJulAugSepOctNovDec" }
/^-------/ { flag++; if (flag > 1) exit 0; next }
{
if (flag == 0) next
year=substr($1, 1, 4)
month=substr($1, 6, 2)
day=substr($1, 9, 2)
month_name=substr(arr_of_month, (month-1)*3+1, 3)
time=substr($2, 1, 5)
if (index($3, "D") != 0)
attr="drwxr-xr-x"
else
if (index($3, ".") != 0)
attr="-rw-r--r--"
size=$4
$0=substr($0, 54)
if (NF > 1)
name=$0
else
name=$1
gsub(/\\/, "/", name)
printf "%s 1 %-8d %-8d %8d %3s %2d %4d %s %s\n", attr, uid, 0, size, month_name, day, year, time, name
}'
}
mc7zfs_copyin ()
{
# preserve pwd.
pwd=`pwd`
# Create a directory and copy in it the tmp file with the random name
dir="$3".dir
mkdir "$dir" || exit 1
cd "$dir"
mv "$1" .
arname=`basename "$1"`
di="${2%/*}"
# if file is to be written upper in the archive tree, make fake dir
if test "$di" != "${2##*/}" ; then
# echo asdsad 1>&2
mkdir -p "$di" || exit 1
fi
# pwd > /tmp/cdir
# echo "$arname $2" > /tmp/ters
cp -fp "$3" "$dir/$2"
# cp -f "$1" "$3.dir"
$SEVENZ a "$arname" "$2" -w >/dev/null 2> /dev/null
mv "$arname" "$1"
cd $pwd
rm -rf "$3.dir"
}
mc7zfs_copyout ()
{
TMPDIR=`mktemp -u "${MC_TMPDIR:-/tmp}/mctmpdir-u7z.XXXXXX"` || exit 1
trap 'rm -rf "$TMPDIR"; exit 0' 1 2 3 4 15
mkdir -m 0700 "$TMPDIR" || exit 1
# echo "$1 $2 $3" > hers
# p7zip 0.91 don't understand filename in subdir without "./"
# but in top dir it understand only without "./"
FLIST=`$SEVENZ l "$1" 2> /dev/null`
echo "$FLIST" | grep -q "[.][/]" > /dev/null 2>&1 && EXFNAME=*./"$2" || EXFNAME="$2"
EXFN=`basename "$2"`
$SEVENZ e -r- "$1" "$EXFNAME" -o"$TMPDIR" > /dev/null 2> /dev/null
cat "$TMPDIR"/"$EXFN" > "$3"
rm -rf "$TMPDIR"
}
umask 077
cmd="$1"
shift
case "$cmd" in
list) mc7zfs_list "$@" ;;
copyin) mc7zfs_copyin "$@" ;;
copyout) mc7zfs_copyout "$@" ;;
*) exit 1 ;;
esac
exit 0
|