summaryrefslogtreecommitdiffstats
path: root/src/vfs/extfs/helpers/iso9660.in
diff options
context:
space:
mode:
Diffstat (limited to 'src/vfs/extfs/helpers/iso9660.in')
-rw-r--r--src/vfs/extfs/helpers/iso9660.in235
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