#! /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
