Sergei Trofimovich e2f1b4991e Merge branch 'mc-4.6' 15 лет назад
..
.gitignore 173ca89fca merged jpelletier's patch for historic archive formats 16 лет назад
Makefile.am 173ca89fca merged jpelletier's patch for historic archive formats 16 лет назад
README 676c9927d6 Don't document deprecated support for two-digit years. 22 лет назад
README.it 7ec9da5952 just some minor changes in docs... 24 лет назад
README.uzip f3e22063e1 * extfs/uzip: Update to version 1.4.0. 23 лет назад
a.in 201c30624e * vfs/extfs/a.in: Quote parameters to calls to system/open that spawn a shell. 20 лет назад
apt.in 201c30624e * vfs/extfs/a.in: Quote parameters to calls to system/open that spawn a shell. 20 лет назад
audio.in e7d571c9d6 * vfs/extfs/audio.in (audiofs_copyout): Quote the track name. 18 лет назад
bpp e7d571c9d6 * vfs/extfs/audio.in (audiofs_copyout): Quote the track name. 18 лет назад
deb.in 3c713dfe18 * vfs/extfs/deb.in (mcdebfs_list): Do not skip over directory entries. 18 лет назад
deba.in 201c30624e * vfs/extfs/a.in: Quote parameters to calls to system/open that spawn a shell. 20 лет назад
debd.in 201c30624e * vfs/extfs/a.in: Quote parameters to calls to system/open that spawn a shell. 20 лет назад
dpkg.in 201c30624e * vfs/extfs/a.in: Quote parameters to calls to system/open that spawn a shell. 20 лет назад
extfs.ini 173ca89fca merged jpelletier's patch for historic archive formats 16 лет назад
hp48.in 036d995eea * extfs/hp48.in: Correct quoting from last patch. Avoid a 20 лет назад
iso9660.in e2f1b4991e Merge branch 'mc-4.6' 15 лет назад
lslR.in a5ba278729 merged in lzma patch from mandriva 16 лет назад
mailfs.in a5ba278729 merged in lzma patch from mandriva 16 лет назад
patchfs.in a5ba278729 merged in lzma patch from mandriva 16 лет назад
rpm 5f84762472 extfs/rpm,extfs/trpm: removed obsolete rpm tags 16 лет назад
rpms.in 56be0e7b88 Substitute Perl location in all extfs scripts written in Perl. 22 лет назад
sfs.ini a5ba278729 merged in lzma patch from mandriva 16 лет назад
trpm 5f84762472 extfs/rpm,extfs/trpm: removed obsolete rpm tags 16 лет назад
u7z adbe38172d added patch from #194 16 лет назад
uace.in 173ca89fca merged jpelletier's patch for historic archive formats 16 лет назад
ualz.in 23c29ab03a * extfs/ualz.in: Fix compatibility with unalz 0.51. 19 лет назад
uar.in 866d39e32c * extfs/uar.in (mcarfs_list): Parse date reported by ar back to three 18 лет назад
uarc.in 173ca89fca merged jpelletier's patch for historic archive formats 16 лет назад
uarj.in 7770bc7899 fixed some bashisms in vfs/extfs/* 16 лет назад
uc1541.in 173ca89fca merged jpelletier's patch for historic archive formats 16 лет назад
uha.in 7770bc7899 fixed some bashisms in vfs/extfs/* 16 лет назад
ulha.in 278ae44436 * extfs.c (extfs_generate_entry): Initialize inode->last_in_subdir. 20 лет назад
urar.in c2721465d7 * vfs/extfs/urar.in (mcrarfs_copyout): Do not query password 18 лет назад
uzip.in 9395167ddd * extfs/uzip.in (print_file): Use %8s instead of %8d 18 лет назад
uzoo.in 7770bc7899 fixed some bashisms in vfs/extfs/* 16 лет назад

README

Writing scripts for Midnight Commander's external vfs

IMPORTANT NOTE: There may be some bugs left in extfs. Enjoy.

Starting with version 3.1, the Midnight Commander comes with so called
extfs, which is one of the virtual filesystems. This system makes it
possible to create new virtual filesystems for the GNU MC very easily.

Such work has two basic steps:

Editing $(libdir)/extfs/extfs.ini.
Creating a shell script/program to handle requests.
(Note: $(libdir) should be substituted for actual libdir path stored when
configured or compiled, like /usr/local/lib/mc or /usr/lib/mc).

The first one is very easy:
You assign a vfs suffix. For example, if you have .zip file, and would
like to see what's inside it, path will be

/anypath/my.zip#uzip/some_path/...

Then you add a line extfs.ini file containing just that extension. If
your vfs does not require file to work on, add ':' to the end of name.

In this example, .zip is suffix, but I call vfs 'uzip'. Why? Well,
what this vfs essentially does is UNzip. UN is too long, so I choosed
U. Note that sometime in future filesystem like zip may exist: It will
take whole tree and create .zip file from it. So /usr#zip will be
zipfile containing whole /usr tree.

The second one may require some your knowledge of shell/c programming:
You have to create a program (with executable permissions) prefix in
$(libdir)/extfs (in our example $(libdir)/extfs/uzip).

* Commands that should be implemented by your shell script
----------------------------------------------------------

Return zero from your script upon completion of the command, otherwise
nonzero for failure or in case of an unsupported command.

$libdir/extfs/prefix command [arguments]

* Command: list archivename

This command should list the complete archive content in the following format
(a little modified ls -l listing):

AAAAAAA NNN OOOOOOOO GGGGGGGG SSSSSSSS DATETIME [PATH/]FILENAME [-> [PATH/]FILENAME[/]]]

where (things in [] are optional):

AAAAAAA is the permission string like in ls -l
NNN is the number of links
OOOOOOOO is the owner (either UID or name)
GGGGGGGG is the group (either GID or name)
SSSSSSSS is the file size
FILENAME is the filename
PATH is the path from the archive's root without the leading slash (/)
DATETIME has one of the following formats:
Mon DD hh:mm, Mon DD YYYY, Mon DD YYYY hh:mm, MM-DD-YYYY hh:mm

where Mon is a three letter English month name, DD is day
1-31, MM is month 01-12, YYYY is four digit year, hh hour is
and mm is minute.

If the -> [PATH/]FILENAME part is present, it means:

If permissions start with an l (ell), then it is the name that symlink
points to. (If this PATH starts with a MC vfs prefix, then it is a symlink
somewhere to the other virtual filesystem (if you want to specify path from
the local root, use local:/path_name instead of /path_name, since /path_name
means from root of the archive listed).

If permissions do not start with l, but number of links is greater than one,
then it says that this file should be a hardlinked with the other file.

* Command: copyout archivename storedfilename extractto

This should extract from archive archivename the file called
storedfilename (possibly with path if not located in archive's root
[this is wrong. current extfs strips paths! -- pavel@ucw.cz])
to file extractto.

* Command: copyin archivename storedfilename sourcefile

This should add to the archivename the sourcefile with the name
storedfilename inside the archive.

Important note: archivename in the above examples may not have the
extension you are expecting to have, like it may happen that
archivename will be something like /tmp/f43513254 or just
anything. Some archivers do not like it, so you'll have to find some
workaround.

* Command: rm archivename storedfilename

This should remove storedfilename from archivename.

* Command: mkdir archivename dirname

This should create a new directory called dirname inside archivename.

* Command: rmdir archivename dirname

This should remove an existing directory dirname. If the directory is
not empty, mc will recursively delete it (possibly prompting).

* Command: run

Undocumented :-)

---------------------------------------------------------

Don't forget to mark this file executable (chmod 755 ThisFile, for example)

For skeleton structure of executable, look at some of filesystems
similar to yours.

---------------------------------------------------------

In constructing these routines, errors will be made, and mc will not display
a malformed printing line. That can lead the programmer down many false
trails in search of the bug. Since this routine is an executable shell script
it can be run from the command line independently of mc, and its output will
show on the console or can be redirected to a file.

* Putting it to use
----------------------------------------------------------
The file .mc.ext in a home directory, and in mc's user directory (commonly
/usr/local/lib/mc), contains instructions for operations on files depending
on filename extensions. It is well documented in other files in this
distribution, so here are just a few notes specifically on use of the
Virtual File System you just built.

There are entries in .mc.ext defining a few operations that can be done on a
file from an mc panel. Typically they are annotated with a hash mark and a
file extension like this:

# zip

There must be a way to find the file by extension, so the next line does
that. In essence it says "identify the string ".zip" or (|) ".ZIP" at the
end ($) of a filename":

regex/\.(zip|ZIP)$

The operations themselves follow that. They must be indented by at least a
space, and a tab works as well. In particular, the Open operation will
now use your new virtual file system by cd'ing to it like this:

Open=%cd zip:%d/%p

This is the line used when a file is highlighted in a panel and the user
presses or . The contents of the archive should show just
as if they were in a real directory, and can be manipulated as such.
The rest of the entry pertains to use of the F3 View key:

View=%view{ascii} unzip -v %f

And perhaps an optional icon for X:

Icon=zip.xpm

And perhaps an operation to extract the contents of the file, called from
a menu selection:

Extract=unzip %f '*'

This is just an example. The current entry for .zip files has a menu selection
of 'Unzip' which could be used in place of 'Extract'. What goes here depends
on what items you have in, or add to, the menu system, and that's another
subject. The sum of this is the .mc.ext entry:

# zip
regex/\.(zip|ZIP)$
Open=%cd zip:%d/%p
View=%view{ascii} unzip -v %f
Icon=zip.xpm
Extract=unzip %f '*'

Add an entry like this to the .mc.ext file in a user's home directory, If you
want others to have it, add it to the mc.ext file in the mc system directory,
often /usr/local/lib/mc/mc.ext. Notice this file is not prepended with a dot.

Once all this is done, and things are in their proper places, exit mc if you
were using it, and restart it so it picks up the new information.

That's all there is to it. The hardest part is making a listing function
that sorts the output of a system listing command and turns it into a form
that mc can use. Currently awk (or gawk) is used because nearly all systems
have it. If another scripting language is available, like perl, that could
also be used.