mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-23 12:56:51 +03:00
144 lines
3.0 KiB
Bash
144 lines
3.0 KiB
Bash
#! /bin/sh
|
|
#
|
|
# Written by Jakub Jelinek 1995
|
|
# Updated by Christian Gennerat 1999
|
|
#
|
|
# (C) 1995,1999 The Free Software Foundation.
|
|
#
|
|
#
|
|
|
|
DZIP=/usr/bin
|
|
XZIP="$DZIP/zip -g"
|
|
XDZIP="$DZIP/zip -d"
|
|
XUNZIP="$DZIP/unzip"
|
|
XZIPINFO="$DZIP/unzip -Z"
|
|
#
|
|
#If you don't have zipinfo, set ZIPINFO=
|
|
#
|
|
|
|
mczipfs_list ()
|
|
{
|
|
DOZIPINFO=no
|
|
if test -n "$XZIPINFO"; then
|
|
DOZIPINFO=
|
|
$XZIPINFO -l "$1" | @AWK@ -v uid=${UID-0} -v zipfile="$1" -v xunzip=${XUNZIP-unzip} '
|
|
/^Archive/ { next }
|
|
/^[0-9]*\ file/ { next }
|
|
/(unx|fat|ntf)/ {
|
|
split($0,a,":")
|
|
nam = substr(a[2],4)
|
|
if ($1 ~ /^l/ ) {
|
|
arrow=" -> "
|
|
linkname=""
|
|
cmd=xunzip " -p " zipfile " " nam
|
|
cmd | getline linkname
|
|
} else {
|
|
arrow=""
|
|
linkname=""
|
|
}
|
|
#if ($1 ~ /^d/ ) -- not okay -- this would break empty directories --pavel
|
|
# next
|
|
|
|
if (length($1) == 7)
|
|
$1 = "-rw-r--r--"
|
|
|
|
if (nam ~ /^\^/)
|
|
nam=substr(nam, 2)
|
|
split($8, a, "-")
|
|
if (a[3] < 50)
|
|
a[3] = 2000 + a[3]
|
|
else
|
|
a[3] = 1900 + a[3]
|
|
printf "%s 1 %-8d %-8d %8d %3s %2d %4d %s %s%s%s\n", $1, uid, 0, $4, a[2], a[1], a[3], $9, nam, arrow, linkname
|
|
next
|
|
}
|
|
{
|
|
exit 214
|
|
}' 2>/dev/null
|
|
if test $? = 214; then
|
|
DOZIPINFO=no
|
|
fi
|
|
fi
|
|
if test -n "$DOZIPINFO"; then
|
|
$XUNZIP -v "$1" | @AWK@ -v uid=${UID-0} '
|
|
BEGIN { hyphens=0 }
|
|
/^Archive/ { next }
|
|
/^\ Length/ { next }
|
|
/^\ ?------/ { if (hyphens > 0) exit 0; hyphens=1; next }
|
|
{
|
|
if (hyphens < 1) next;
|
|
if ($8 ~ /^\^/)
|
|
$8=substr($8, 2)
|
|
## Y2K patch. if Year>=2000, unzip returns Year>=100
|
|
split($5, a, "-")
|
|
if (a[3] > 99)
|
|
a[3] = substr(a[3],2)
|
|
if ($8 ~ /\/$/)
|
|
printf "drwxr-xr-x 1 %-8d %-8d %8d %s-%s-%s %s %s\n", uid, 0, $1, a[1],a[2],a[3], $6, $8
|
|
else
|
|
printf "-rw-r--r-- 1 %-8d %-8d %8d %s-%s-%s %s %s\n", uid, 0, $1, a[1],a[2],a[3], $6, $8
|
|
}' 2>/dev/null
|
|
fi
|
|
}
|
|
|
|
mczipfs_mkdir ()
|
|
{
|
|
# preserve pwd. It is clean, but is it necessary?
|
|
pwd=`pwd`
|
|
# Create a directory and create in it a tmp directory with the good name
|
|
dir=tmpdir.${RANDOM}
|
|
mkdir $dir
|
|
cd $dir
|
|
mkdir -p "$2"
|
|
$XZIP "$1" "$2" &>/dev/null
|
|
cd $pwd
|
|
rm -rf $dir
|
|
}
|
|
|
|
mczipfs_copyin ()
|
|
{
|
|
# preserve pwd. It is clean, but is it necessary?
|
|
pwd=`pwd`
|
|
# Create a directory and copy in it the tmp file with the good name
|
|
mkdir $3.dir
|
|
cd $3.dir
|
|
di="${2%/*}"
|
|
# if file is to be written upper in the archive tree, make fake dir
|
|
if test "$di" != "${2##*/}" ; then
|
|
mkdir -p "$di"
|
|
fi
|
|
# (cp -p) to preserve date, but $2 is dated now!
|
|
cp -p $3 "$3.dir/$2"
|
|
$XZIP "$1" "$2" >/dev/null
|
|
cd $pwd
|
|
rm -rf $3.dir
|
|
}
|
|
|
|
mczipfs_copyout ()
|
|
{
|
|
$XUNZIP -p "$1" "$2" > "$3" 2>/dev/null
|
|
}
|
|
|
|
mczipfs_rm ()
|
|
{
|
|
$XDZIP "$1" "$2" &>/dev/null
|
|
}
|
|
|
|
mczipfs_rmdir ()
|
|
{
|
|
$XDZIP "$1" "$2"/ &>/dev/null
|
|
}
|
|
|
|
umask 077
|
|
|
|
#echo "`date +%T` ${0##*/} $1 $2 to=$3 tmp=$4" >>~/tmp/${0##*/}.log
|
|
case "$1" in
|
|
list) mczipfs_list "$2"; exit 0;;
|
|
rm) mczipfs_rm "$2" "$3" ; exit 0;;
|
|
rmdir) mczipfs_rmdir "$2" "$3" ; exit 0;;
|
|
mkdir) mczipfs_mkdir "$2" "$3" ; exit 0;;
|
|
copyin) mczipfs_copyin "$2" "$3" "$4" ; exit 0;;
|
|
copyout) mczipfs_copyout "$2" "$3" "$4" ; exit 0;;
|
|
esac
|
|
exit 1
|