123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #! /bin/sh
- # ISO9660 VFS for MC by Michael Shigorin <mike@altlinux.org>,
- # modifications by Grigory Milev <week@altlinux.org>
- # and Kachalov Anton <mouse@linux.ru.net> April 2003
- # based on lslR by Tomas Novak <tnovak@ipex.cz> April 2000
- # -- look there for additional parsing comments if needed
- # tested to comply with isoinfo 2.0's output
- test_iso () {
- CHARSET=`locale charmap 2>/dev/null`
- if test -z "$CHARSET"; then
- CHARSET=`locale 2>/dev/null | @GREP@ LC_CTYPE | sed -n -e 's/.*\.\(.*\)"$/\1/p'`
- fi
- if test -n "$CHARSET"; then
- CHARSET=`echo "$CHARSET" | tr '[A-Z]' '[a-z]' | sed -e 's/^iso-/iso/'`
- isoinfo -j $CHARSET -i /dev/null 2>&1 | @GREP@ "Iconv not yet supported\|Unknown charset" >/dev/null && CHARSET=
- fi
- if test -n "$CHARSET"; then
- JOLIET_OPT="-j $CHARSET -J"
- else
- JOLIET_OPT="-J"
- fi
- ISOINFO="isoinfo -R"
- ISOINFO_D_I="`isoinfo -d -i "$1" 2>/dev/null`"
- echo "$ISOINFO_D_I" | @GREP@ "UCS level 1\|NO Joliet" > /dev/null || ISOINFO="$ISOINFO $JOLIET_OPT"
- if [ `echo "$ISOINFO_D_I" | @GREP@ "Joliet with UCS level 3 found" | wc -l` = 1 \
- -a `echo "$ISOINFO_D_I" | @GREP@ "NO Rock Ridge" | wc -l` = 1 ] ; then
- SEMICOLON="YES"
- fi
- }
- mcisofs_list () {
- # left as a reminder to implement compressed image support =)
- case "$1" in
- *.lzma) MYCAT="lzma -dc";;
- *.xz) MYCAT="xz -dc";;
- *.bz2) MYCAT="bzip2 -dc";;
- *.gz) MYCAT="gzip -dc";;
- *.z) MYCAT="gzip -dc";;
- *.Z) MYCAT="gzip -dc";;
- *) MYCAT="cat";;
- esac
- $ISOINFO -l -i "$1" 2>/dev/null | @AWK@ -v SEMICOLON=$SEMICOLON '
- BEGIN {
- dir="";
- # Pattern to match 8 first fields.
- rx = "[^ ]+[ ]+";
- rx = "^" rx rx rx rx rx rx rx rx;
- irx = "^\\[ *-?[0-9]* *[0-9]+\\] +";
- }
- /^$/ { next }
- /^d---------/ { next }
- /^Directory listing of [^ ].*$/ {
- dir=substr($0, 23);
- next;
- }
- { $11 != "" } {
- name=$0
- sub(rx, "", name)
- attr=substr($0, 1, length($0)-length(name))
- # strip inodes and extra dir entries; fix perms
- sub(irx, "", name)
- sub("^---------- 0 0 0", "-r--r--r-- 1 root root", attr)
- sub(" $", "", name)
- # for Joliet UCS level 3
- if (SEMICOLON = "YES") sub(";1$", "", name);
- ## sub(";[0-9]+$", "", name) ## would break copyout
- # skip . and ..
- if (name ~ /^\.\.?/) next;
- printf "%s%s%s\n", attr, dir, name
- }'
- }
- mcisofs_copyout () {
- if [ "x$SEMICOLON" == "xYES" ]; then
- $ISOINFO -i "$1" -x "/$2;1" 2>/dev/null > "$3"
- else
- $ISOINFO -i "$1" -x "/$2" 2>/dev/null > "$3"
- fi
- }
- LC_ALL=C
- cmd="$1"
- shift
- case "$cmd" in
- list)
- test_iso "$@";
- mcisofs_list "$@";
- exit 0;;
- copyout)
- test_iso "$@";
- mcisofs_copyout "$@";
- exit 0;;
- esac
- exit 1
|