uarc, ucab, uadf, uimg

G Jansman gjansman1 at hotmail.com
Mon Jan 20 15:47:46 UTC 2003


Hello Pavel,

Thanks for the reaction!

...
>
>Looks good, but can you post it as diff -u? No need for tar balls,
>diff can create new files, too.
Below are 'diff -u' files for lib/mc.ext.in, vfs/extfs/extfs.ini, and the 
actual vfs scripts. The differences are compared with mc-4.6.0-pre2.tar.gz.
I can't put the changes in the CVS repository: the only way I can get on the 
Internet is by a Windows machine (I'm not even sure whether I'm allowed to 
make any changes).

>>I have a proposal for future extfs feature:
>>Would it be a good idea to include a "test" function in every extfs 
>>script?
>>This way one could open any archive with whatever extension with the same
>>keystroke (something like Total Commander's Control-PageDown). This would
>>be useful for e.g. archives that are made executable or disk images with
>>the extension .img that can have FAT, ext2, or whatever.
>
>Well, you can cd file.exe#uzip...
True, and it works fine but it's not very userfriendly.

Anyhow, here are the diff's:
--- old/vfs/extfs/extfs.ini	Mon Dec  9 15:15:48 2002
+++ new/vfs/extfs/extfs.ini	Mon Jan 20 16:14:39 2003
@@ -7,8 +7,9 @@
ulha
urar
uha
-# For arj usage you need a special patch to unarj (see unarj.diff)
uarj
+ucab
+uarc

# ar is used for static libraries
uar
@@ -49,3 +50,7 @@

# Package of Bad Penguin (an Italian GNU/Linux distribution)
bpp
+
+# Diskimage files
+uimg
+uadf

--- old/lib/mc.ext.in	Wed Dec 25 01:26:23 2002
+++ new/lib/mc.ext.in	Mon Jan 20 16:17:48 2003
@@ -432,6 +432,16 @@
	Open=%cd %p#urar
	View=%view{ascii} rar v -c- %f

+# cab
+type/^Microsoft\ CAB\ file
+	Open=%cd %p#ucab
+	View=%view{ascii} cabextract -l %f
+
+# arc
+regex/\.(arc|ARC|pak|PAK)
+	Open=%cd %p#uarc
+	View=%view{ascii} nomarch -lv %f
+
# cpio
shell/.cpio.Z
	Open=%cd %p#ucpio
@@ -444,6 +454,13 @@
shell/.cpio
	Open=%cd %p#ucpio
	View=%view{ascii} cpio -itv <'%f' 2>/dev/null
+
+regex/\.(img|IMG|ima|IMA|st|ST)
+	Open=%cd %p#uimg
+
+regex/\.(adf|ADF)
+	Open=%cd %p#uadf
+	View=%view{ascii} unadf -lr %f

# ls-lR
regex/(^|\.)ls-?lR$

--- old/vfs/extfs/uadf	Mon Jan 20 17:00:34 2003
+++ new/vfs/extfs/uadf	Thu Jan 09 09:01:26 2003
@@ -0,0 +1,101 @@
+#!/bin/sh
+
+# Description:
+# Midnight Commander extfs script to read Amiga ADF disk images.
+
+# 2003-01-06   Version 0.1    G. Jansman
+
+# Limitations:
+# Files can only be added as root (under Linux only so disabled now).
+# File attributes are not preserved.
+
+# Used programs:
+# unADF v1.0 (part of adflib.zip, Laurent Clevy and Dan Sutherland)
+
+# Alternative programs (not supported by this script):
+# AdfOpus (win32, Dan Sutherland and Gary Harris)
+# readdisk (part of UAE)
+
+# Purposes:
+# Emulators (UAE, WinUAE, etc.)
+
+# Settings:
+LISTADF="unadf -lr"
+EXTRACTADF="unadf -p"
+TESTADF="unadf -l"
+TEMPDIR=/tmp/mctmpdir-mcadf.$USER.${RANDOM}
+
+mcadffs_list ()
+{
+    $LISTADF "$1" 2>/dev/null | gawk -v uid=${UID-0} '
+    BEGIN { emptycnt=0; date="JanFebMarAprMayJunJulAugSepOctNovDec" }
+    /^$/ { emptycnt++; next }
+    // { if (emptycnt != 1) next }
+    {
+        slashpos=index($0, "/")
+        str=substr($0, slashpos+18)
+        if (substr(str, length(str)) == "/")
+        {
+            attr="drwxr-xr-x"
+            str=substr(str, 1, length(str)-1)
+			sz=0
+        }
+        else
+        {
+            attr="-rw-r--r--"
+			sz=substr($0, 1, slashpos-5)
+        }
+        tm=substr($0, slashpos+8, 5)
+        dt=substr($0, slashpos-4, 10)
+        split(dt, a, "/")
+        printf "%s   1 %-8d %-8d %8d %3s %2d %4d %s %s\n", attr, uid, 0, 
sz, substr(date, (a[2]-1)*3+1, 3), a[3], a[1], tm, str
+    }'
+}
+
+mcadffs_copyout ()
+{
+    $EXTRACTADF "$1" "$2" 2>/dev/null > "$3"
+}
+
+mcadffs_test ()
+{
+    if $TESTADF "$1" >/dev/null 2>&1; then
+        echo "OK"
+    else
+        echo "UNKNOWN"
+    fi
+}
+
+# This can usually only be performed as root (Linux only).
+mcadffs_copyin ()
+{
+    mkdir $3.mnt
+    mount -n -w "$1" $3.mnt -t affs -o loop
+    cp -a -f $3 "$3.mnt/$2"
+    umount -n $3.mnt
+    rmdir $3.mnt
+}
+
+# This can usually only be performed as root (Linux only).
+mcadffs_rm ()
+{
+    mkdir $TEMPDIR
+    mount -n -w "$1" $TEMPDIR -t affs -o loop
+    rm -f "$TEMPDIR/$2"
+    umount -n $TEMPDIR
+    rmdir $TEMPDIR
+}
+
+umask 077
+
+cmd=$1
+shift
+case "$cmd" in
+    list)    mcadffs_list    "$@" ;;
+    copyout) mcadffs_copyout "$@" ;;
+#    copyin)  mcadffs_copyin  "$@" ;;        # Can only be performed as 
root
+#    rm)      mcadffs_rm      "$@" ;;        # Can only be performed as 
root
+#    test)    mcadffs_test    "$@" ;;        # Not supported by MC extfs
+    *)       exit 1 ;;
+esac
+exit 0

--- old/vfs/extfs/uarc	Mon Jan 20 17:00:34 2003
+++ new/vfs/extfs/uarc	Thu Jan 09 09:00:48 2003
@@ -0,0 +1,46 @@
+#!/bin/sh
+
+# Description:
+# Midnight Commander extfs script to read ARC archive files.
+
+# 2003-01-03   Version 0.1    G. Jansman
+
+# Used programs:
+# nomarch (Unix, Russell Marks)
+
+# Settings:
+LISTARC="nomarch -lv"
+EXTRACTARC="nomarch -p"
+
+mcarcfs_list ()
+{
+    $LISTARC "$1" | gawk -v uid=${UID-0} '
+    BEGIN { date="JanFebMarAprMayJunJulAugSepOctNovDec" }
+    {
+        split(substr($0, 14), t)
+        str=substr($0, 1, 13)
+        while (length(str) != 0 && substr(str, length(str), 1) == " ")
+        {
+            str=substr(str, 1, length(str) - 1)
+        }
+        split(t[5], a, "-")
+        attr="-rw-r--r--"
+        printf "%s   1 %-8d %-8d %8d %3s %2d %4d %s %s\n", attr, uid, 0, 
t[4], substr(date, (a[2]-1)*3+1, 3), a[3], a[1], t[6], str
+    }'
+}
+
+mcarcfs_copyout ()
+{
+    $EXTRACTARC "$1" "$2" > "$3"
+}
+
+umask 077
+
+cmd="$1"
+shift
+case "$cmd" in
+    list)       mcarcfs_list    "$@" ;;
+    copyout)    mcarcfs_copyout "$@" ;;
+    *)          exit 1 ;;
+esac
+exit 0

--- old/vfs/extfs/ucab	Mon Jan 20 17:00:34 2003
+++ new/vfs/extfs/ucab	Thu Jan 09 09:01:46 2003
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+# Description:
+# Midnight Commander extfs script to read Microsoft Cabinet files.
+
+# 2003-01-03   Version 0.1    G. Jansman
+
+# Limitations:
+# No files can be added to CAB files.
+# File attributes are not preserved.
+
+# Used programs:
+# cabextract (Unix, Stuart Caie)
+
+# Alternative programs (not supported by this script):
+# cablinux (Linux, Rien, seems buggy and no compression)
+# 7-Zip (win32, list/unpack only)
+# MultiArc MsCab 0.61 (win32, plug-in for Total Commander)
+# extract (dos, on Windows CD, list/unpack only)
+# extrac32 (win32, on Windows CD, list/unpack only)
+
+# Settings:
+LISTCAB="cabextract -l"
+EXTRACTCAB="cabextract -q"
+TESTCAB="cabextract -l"
+
+mccabfs_list ()
+{
+    $LISTCAB "$1" | gawk -v uid=${UID-0} '
+    BEGIN { hyphens=0; date="JanFebMarAprMayJunJulAugSepOctNovDec" }
+    /^----/ { hyphens++; next }
+    /^$/ { next }
+    // { if (hyphens != 1) next }
+    {
+        str=substr($0, 35)
+        gsub(/\\/, "/", str)
+        if (substr(str, length(str)) == "/")
+        {
+# cabextract does not distinguish between empty directories and empty files 
yet
+# so this will never be executed. Hopefully next cabextract version...
+            attr="drwxr-xr-x"
+            str=substr(str, 1, length(str)-1)
+        }
+        else
+        {
+            attr="-rw-r--r--"
+        }
+        split($3, a, ".")
+        tm=substr($4,1,5)
+        printf "%s   1 %-8d %-8d %8d %3s %2d %4d %s %s\n", attr, uid, 0, 
$1, substr(date, (a[2]-1)*3+1, 3), a[1], a[3], tm, str
+    }'
+}
+
+# Extract all since cabextract cannot extract single files.
+mccabfs_copyout ()
+{
+    mkdir "$3.dir"
+    $EXTRACTCAB -d "$3.dir" "$1" >/dev/null
+    mv "$3.dir/$2" "$3"
+    rm -rf "$3.dir"
+}
+
+mccabfs_test ()
+{
+    if $TESTCAB "$1" >/dev/null 2>&1; then
+        echo "OK"
+    else
+        echo "UNKNOWN"
+    fi
+}
+
+umask 077
+
+cmd="$1"
+shift
+case "$cmd" in
+    list)    mccabfs_list    "$@" ;;
+    copyout) mccabfs_copyout "$@" ;;
+#    test)    mccabfs_test    "$@" ;;        # Not supported by MC extfs
+    *)       exit 1 ;;
+esac
+exit 0

--- old/vfs/extfs/uimg	Mon Jan 20 17:00:34 2003
+++ new/vfs/extfs/uimg	Thu Jan 09 09:02:04 2003
@@ -0,0 +1,227 @@
+#!/bin/sh
+
+# Description:
+# Midnight Commander extfs script to handle DOS/Atari disk images.
+
+# 2003-01-03   version 0.1    G. Jansman
+
+# Limitations:
+# Only the 1st primary harddisk partition and floppy images can be read
+# File attributes are not preserved.
+# Filenames containing non-ascii characters may cause problems (check 
mtools info).
+# Long filenames are written if needed. Some emulators/OS's might have 
problems with it (old FreeDOS?).
+# Diskimages of dosemu are not handled
+
+# Used programs:
+# Mtools, Emmet P. Gray, Viktor Dukhovni, Alain Knaff, David Niemi
+
+# Alternative programs (not supported by this script):
+# + Mounting a loop device (one has to have proper rights though).
+# + XMess's imgtool (less powerfull).
+# + Gilles Vollant's extract (DOS program, less powerful)
+# + bximage (disk image creation, part of Bochs)
+
+# Purposes:
+# Emulators (Bochs x86 emulator with e.g. FreeDOS, Hatari ST emulator, 
etc.)
+# Maybe disk image copiers (partimage, etc.)
+
+# Settings:
+SIZE=1.44m      # Only needed for creating a disk image
+TEMPRCFILE=/tmp/mctmpfile-uimg.$USER.${RANDOM}
+LISTIMG="mdir -/ -a -f"
+ATTRIBIMG="mattrib"
+ADDIMG="mcopy -pm -D o"
+DELETEIMG="mdel"
+EXTRACTIMG="mcopy"
+MKDIRIMG="mmd"
+RMDIRIMG="mrd"
+TESTIMG="minfo"
+CREATEIMG="mformat -C"
+CONFIGIMG="mtoolstest"
+
+case "$SIZE" in
+    160*)   CREATEIMG="$CREATEIMG -f 160"  # 12/40/1/8
+            ;;
+    180*)   CREATEIMG="$CREATEIMG -f 180"  # 12/40/1/9
+            ;;
+    320*)   CREATEIMG="$CREATEIMG -f 320"  # 12/40/2/8
+            ;;
+    360*)   CREATEIMG="$CREATEIMG -f 360"  # 12/40/2/9
+            ;;
+    720*)   CREATEIMG="$CREATEIMG -f 720"  # 12/80/2/9
+            ;;
+    800*)   CREATEIMG="$CREATEIMG -t 80 -h 2 -n 10" # 12/80/2/10
+            ;;
+    1.2*)   CREATEIMG="$CREATEIMG -f 1200" # 12/80/2/15
+            ;;
+    1.4*)   CREATEIMG="$CREATEIMG -f 1440" # 12/80/2/18
+            ;;
+    2.8*)   CREATEIMG="$CREATEIMG -f 2880" # 12/80/2/36
+            ;;
+    *)      CREATEIMG="$CREATEIMG -f 1440" # 12/80/2/18
+            ;;
+esac
+
+drives="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+
+createmtoolsrc ()
+{
+#   Find a free drive letter
+    useddrives="`$CONFIGIMG | grep -e '^drive [A-Z]:.*' | sed -e 's/drive 
\(.\):.*/\1/'`"
+    for (( drivenum=2 ; drivenum != 25 ; drivenum++ )) ; do
+        DRIVE=${drives:drivenum:1}
+        if [[ $useddrives == ${useddrives/$DRIVE/1} ]]; then
+            break;  # Found a free drive letter
+        fi
+    done
+    if [[ drivenum == 25 ]]; then
+        exit 1;     # Could not find a free drive letter
+    fi
+    DRIVE="${DRIVE}:"
+
+#   Create temporary settings file
+    rm -f $TEMPRCFILE ; touch $TEMPRCFILE
+    echo MTOOLS_LOWER_CASE=0 >> $TEMPRCFILE
+    echo MTOOLS_TWENTY_FOUR_HOUR_CLOCK=1 >> $TEMPRCFILE
+    echo "drive $DRIVE" >> $TEMPRCFILE
+    echo "  file=\"$1\"" >> $TEMPRCFILE
+    echo "  mformat_only" >> $TEMPRCFILE
+    if [[ -e "$1" && "`wc -c "$1" | sed -e 's/[ ]*\([^ ]*\).*$/\1/'`" -gt 
"4194304" ]]; then
+        echo "  partition=1" >> $TEMPRCFILE
+    fi
+
+#   Set environment variable
+    export MTOOLSRC=$TEMPRCFILE
+}
+
+deletemtoolsrc ()
+{
+    rm -f $TEMPRCFILE
+}
+
+mcimgfs_list ()
+{
+    createmtoolsrc "$1"
+    $LISTIMG $DRIVE/ | gawk -v uid=${UID-0} '
+    BEGIN { direntry=0; date="JanFebMarAprMayJunJulAugSepOctNovDec" }
+    /^Directory for / { direntry=1 }
+    /[ ]*[0-9][0-9]* file/ { direntry=0 ; next }
+    /^$/ { next }
+    /^\./ { next }
+    // { if (direntry == 0) next }
+    {
+        if (index($0, "Directory for ") == 1)
+        {
+            curdir=substr($0, 18)
+        }
+        else
+        {
+            tm=substr($0, 36, 5)
+            d=substr($0, 24, 10)
+            if (length($0) > 43)
+            {
+                str=substr($0, 43)
+            }
+            else
+            {
+                str=substr($0, 1, 8)
+                while (substr(str, length(str), 1) == " ")
+                {
+                    str=substr(str, 1, length(str) - 1)
+                }
+                if (substr($0, 10, 3) != "   ")
+                {
+                    str=(str "." $2)
+                }
+            }
+            if (length(curdir) != 0)
+            {
+                str=(curdir "/" str)
+            }
+            if (substr($0, 14, 5) == "<DIR>")
+            {
+                attr="drwxr-xr-x"
+                sz=0
+            }
+            else
+            {
+                attr="-rw-r--r--"
+                sz=substr($0, 14, 9)
+            }
+            split(d, a, "-")
+            printf "%s   1 %-8d %-8d %8d %3s %2d %4d %s %s\n", attr, uid, 
0, sz, substr(date, (a[1]-1)*3+1, 3), a[2], a[3], tm, str
+        }
+    }'
+    deletemtoolsrc
+}
+
+mcimgfs_copyin ()
+{
+    createmtoolsrc "$1"
+    $ADDIMG "$3" "$DRIVE/$2" >/dev/null
+    deletemtoolsrc
+}
+
+mcimgfs_copyout ()
+{
+    createmtoolsrc "$1"
+    $EXTRACTIMG "$DRIVE/$2" - > "$3"
+    deletemtoolsrc
+}
+
+mcimgfs_rm ()
+{
+    createmtoolsrc "$1"
+    $ATTRIBIMG -r "$DRIVE/$2" >/dev/null
+    $DELETEIMG "$DRIVE/$2" >/dev/null
+    deletemtoolsrc "$1"
+}
+
+mcimgfs_mkdir ()
+{
+    createmtoolsrc "$1"
+    $MKDIRIMG "$DRIVE/$2" >/dev/null
+    deletemtoolsrc
+}
+
+mcimgfs_rmdir ()
+{
+    createmtoolsrc "$1"
+    $RMDIRIMG "$DRIVE/$2" >/dev/null
+    deletemtoolsrc
+}
+
+mcimgfs_test ()
+{
+    createmtoolsrc "$1"
+    if $TESTIMG $DRIVE >/dev/null 2>&1; then
+        echo "OK"
+    else
+        echo "UNKNOWN"
+    fi
+    deletemtoolsrc
+}
+
+mcimgfs_create ()
+{
+    createmtoolsrc "$1"
+    $CREATEIMG $DRIVE >/dev/null
+    deletemtoolsrc
+}
+
+umask 077
+
+cmd="$1"
+shift
+case "$cmd" in
+    list)    mcimgfs_list    "$@" ;;
+    rm)      mcimgfs_rm      "$@" ;;
+    copyin)  mcimgfs_copyin  "$@" ;;
+    copyout) mcimgfs_copyout "$@" ;;
+    mkdir)   mcimgfs_mkdir   "$@" ;;
+    rmdir)   mcimgfs_rmdir   "$@" ;;
+#    test)    mcimgfs_test    "$@" ;;        # Not supported by MC extfs
+#    create)  mcimgfs_create  "$@" ;;        # Not supported by MC extfs
+    *)       exit 1 ;;
+esac
+exit 0


_________________________________________________________________
Chatten met je online vrienden via MSN Messenger. http://messenger.msn.nl/




More information about the mc-devel mailing list