diff options
Diffstat (limited to 'src/vfs/extfs/helpers/iso9660.in')
-rw-r--r-- | src/vfs/extfs/helpers/iso9660.in | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/src/vfs/extfs/helpers/iso9660.in b/src/vfs/extfs/helpers/iso9660.in new file mode 100644 index 0000000..5a6f1d5 --- /dev/null +++ b/src/vfs/extfs/helpers/iso9660.in @@ -0,0 +1,235 @@ +#! /bin/sh +# Midnight Commander - ISO9660 VFS for MC +# based on lslR by Tomas Novak <tnovak@ipex.cz> April 2000 +# +# Copyright (C) 2000, 2003 +# The Free Software Foundation, Inc. +# +# Written by: +# Michael Shigorin <mike@altlinux.org>, +# Grigory Milev <week@altlinux.org>, +# Kachalov Anton <mouse@linux.ru.net>, 2003 +# Victor Ananjevsky <ananasik@gmail.com>, 2013 +# slava zanko <slavazanko@gmail.com>, 2013 +# +# This file is part of the Midnight Commander. +# +# The Midnight Commander 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 3 of the License, +# or (at your option) any later version. +# +# The Midnight Commander 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, see <http://www.gnu.org/licenses/>. + +#*** include section (source functions, for example) ******************* + +#*** file scope functions ********************************************** + +XORRISO=$(which xorriso 2>/dev/null) + +xorriso_list() { + if test -z "$XORRISO"; then + return 1 + fi + local dir attr ln usr gr sz dt1 dt2 dt3 nm len name lsl r + dir="${2:-/}" + lsl=$( $XORRISO -abort_on FATAL -dev stdio:"$1" -cd "$dir" -lsl 2> /dev/null ) + r=$? + test $r -gt 0 && return $r + + echo "$lsl" | grep "^[-d]" | \ + while read attr ln usr gr sz dt1 dt2 dt3 nm ; do + len=$((${#nm} - 1)) + name=$(printf -- "$nm" | cut -c2-$len) # remove quotes + + if test $(printf -- "$attr" | cut -c1-1) != "d"; then + printf -- "%s %s %s %s %s %s %s %s %s/%s\n" "$attr" "$ln" "$usr" "$gr" "$sz" "$dt1" "$dt2" "$dt3" "$dir" "$name" + else + xorriso_list "$1" "$dir/$name" + fi + done +} + +xorriso_copyout() { + if test -z "$XORRISO"; then + return 1 + fi + $XORRISO -dev stdio:"$1" -osirrox on -extract "$2" "$3" >/dev/null 2>&1 +} + +xorriso_copyin() { + if test -z "$XORRISO"; then + return 1 + fi + $XORRISO -dev stdio:"$1" -cpr "$3" "$2" >/dev/null 2>&1 +} + +xorriso_mkdir() { + if test -z "$XORRISO"; then + return 1 + fi + $XORRISO -dev stdio:"$1" -mkdir "$2" >/dev/null 2>&1 +} + +xorriso_rmdir() { + if test -z "$XORRISO"; then + return 1 + fi + $XORRISO -dev stdio:"$1" -rmdir "$2" >/dev/null 2>&1 +} + +xorriso_rm() { + if test -z "$XORRISO"; then + return 1 + fi + $XORRISO -dev stdio:"$1" -rm "$2" >/dev/null 2>&1 +} + +# tested to comply with isoinfo 2.0's output +test_iso () { + ISOINFO=$(which isoinfo 2>/dev/null) + if test -z "$ISOINFO"; then + echo "isoinfo not found" >&2 + return 1 + fi + + 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_D_I="$($ISOINFO -d -i "$1" 2>/dev/null)" + ISOINFO="$ISOINFO -R" + + 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 () { + local lsl r + + # left as a reminder to implement compressed image support =) + case "$1" in + *.lz) MYCAT="lzip -dc";; + *.lz4) MYCAT="lz4 -dc";; + *.lzma) MYCAT="lzma -dc";; + *.xz) MYCAT="xz -dc";; + *.zst) MYCAT="zstd -dc";; + *.bz2) MYCAT="bzip2 -dc";; + *.gz) MYCAT="gzip -dc";; + *.z) MYCAT="gzip -dc";; + *.Z) MYCAT="gzip -dc";; + *) MYCAT="cat";; + esac + + lsl=$($ISOINFO -l -i "$1" 2>/dev/null) + r=$? + test $r -gt 0 && return $r + + echo "$lsl" | @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; + 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 +} + +#*** main code ********************************************************* + +LC_ALL=C + +cmd="$1" +shift + +case "$cmd" in + list) + xorriso_list "$@" || { + test_iso "$@" || exit 1 + mcisofs_list "$@" || exit 1 + } + exit 0 + ;; + rm) + xorriso_rm "$@" || { + exit 1 + } + exit 0 + ;; + rmdir) + xorriso_rmdir "$@" || { + exit 1 + } + exit 0 + ;; + mkdir) + xorriso_mkdir "$@" || { + exit 1 + } + exit 0 + ;; + copyin) + xorriso_copyin "$@" || { + exit 1 + } + exit 0 + ;; + copyout) + xorriso_copyout "$@" || { + test_iso "$@" || exit 1 + mcisofs_copyout "$@" || exit 1 + } + exit 0 + ;; +esac +exit 1 |