Ticket #3015: extfs vfs: support unrar-5.
[midnight-commander.git] / src / vfs / extfs / helpers / urar.in
blob9c1b3c82d56ae1460f9baff189338da135704cec
1 #! /bin/sh
3 # Written by andrey joukov
4 # (C) 1996 2:5020/337.13@fidonet.org
5 # Updated by christian.gennerat@alcatel.fr 1999
6 # Andrew V. Samoilov <sav@bcs.zp.ua> 2000
7 # beta version 2.0
9 # rar and unrar can be found on http://www.rarlabs.com/
11 RAR=rar
13 # Prefer unrar (freeware).
14 UNRAR=`which unrar 2>/dev/null`
16 [ -z $UNRAR ] && UNRAR=$RAR
17 [ ! -x $UNRAR -a -x $RAR ] && UNRAR=$RAR
19 # Define $UNRAR version
20 UNRAR_VERSION=`$UNRAR -? | grep "Copyright" | sed -e 's/.*\([0-9]\)\..*/\1/'`
22 mcrar4fs_list ()
24 $UNRAR v -c- -cfg- "$1" | @AWK@ -v uid=`id -u` -v gid=`id -g` '
25 BEGIN { flag=0 }
26 /^-------/ { flag++; if (flag > 1) exit 0; next }
27 flag==1 {
28 str = substr($0, 2)
29 getline
30 split($4, a, "-")
31 if (index($6, "D") != 0)
32 $6="drwxr-xr-x"
33 else
34 if (index($6, ".") != 0)
35 $6="-rw-r--r--"
36 printf "%s 1 %s %s %d %02d/%02d/%02d %s ./%s\n", $6, uid, gid, $1, a[2], a[1], a[3], $5, str
40 mcrar5fs_list ()
42 $UNRAR v -c- -cfg- "$1" | @AWK@ -v uid=`id -u` -v gid=`id -g` '
43 BEGIN { flag=0 }
44 /^-----------/ { flag++; if (flag > 1) exit 0; next }
45 flag==1 {
46 split($5, a, "-")
47 if (index($1, "D") != 0)
48 $1="drwxr-xr-x"
49 else
50 if (index($1, ".") != 0)
51 $1="-rw-r--r--"
52 printf "%s 1 %s %s %d %02d/%02d/%02d %s ./%s\n", $1, uid, gid, $2, a[2], a[1], a[3], $6, $8
56 mcrarfs_list ()
58 [ x$UNRAR_VERSION = x5 ] && mcrar5fs_list "$@" || mcrar4fs_list "$@"
61 mcrarfs_copyin ()
63 # copyin by christian.gennerat@alcatel.fr
64 # preserve pwd. It is clean, but is it necessary?
65 pwd=`pwd`
66 # Create a directory and copy in it the tmp file with the good name
67 mkdir "$3.dir"
68 cd "$3.dir"
69 di="${2%/*}"
70 # if file is to be written upper in the archive tree, make fake dir
71 if test x"$di" != x"${2##*/}" ; then
72 mkdir -p "$di"
74 cp -fp "$3" "$3.dir/$2"
75 $RAR a "$1" "$2" >/dev/null
76 cd "$pwd"
77 rm -rf "$3.dir"
80 mcrarfs_copyout ()
82 $UNRAR p -p- -c- -cfg- -inul "$1" "$2" > "$3"
85 mcrarfs_mkdir ()
87 # preserve pwd. It is clean, but is it necessary?
88 pwd=`pwd`
89 # Create a directory and create in it a tmp directory with the good name
90 dir=`mktemp -d "${MC_TMPDIR:-/tmp}/mctmpdir-urar.XXXXXX"` || exit 1
91 cd "$dir"
92 mkdir -p "$2"
93 # rar cannot create an empty directory
94 touch "$2"/.rarfs
95 $RAR a -r "$1" "$2" >/dev/null
96 $RAR d "$1" "$2/.rarfs" >/dev/null
97 cd "$pwd"
98 rm -rf "$dir"
101 mcrarfs_rm ()
103 $RAR d "$1" "$2" >/dev/null
106 umask 077
108 cmd="$1"
109 shift
111 case "$cmd" in
112 # Workaround for a bug in mc - directories must precede files to
113 # avoid duplicate entries, so we sort output by filenames
114 list) mcrarfs_list "$@" | sort -k 8 ;;
115 rm) mcrarfs_rm "$@" ;;
116 rmdir) mcrarfs_rm "$@" ;;
117 mkdir) mcrarfs_mkdir "$@" ;;
118 copyin) mcrarfs_copyin "$@" ;;
119 copyout) mcrarfs_copyout "$@" ;;
120 *) exit 1 ;;
121 esac
122 exit 0