         Scrivere scripts per il vfs esterno del Midnight Commander
	(Traduzione a cura di Marco Ciampa (C) GNU 2000 - it@li.org)

NOTA IMPORTANTE: ci possono essere ancora alcuni bachi in extfs. 
Buon divertimento.

A cominciare dalla versione 3.1 il Midnight Commander comprende il
cosiddetto extfs, che altri non è che un filesystem virtuale. Questo
sistema consente di creare molto semplicemente nuovi filesystem virtuali
per MC della GNU.

Tale lavoro è composto di due parti fondamentali:

Modifica di $(libdir)/extfs/extfs.ini.
Creazione di uno script shell/programma per gestire le richieste.
(Nota: $(libdir) dovrebbe essere sostituita con il percorso libdir 
corrente memorizzato quando configurato o compilato, come
/usr/local/lib/mc o /usr/lib/mc).

La prima è molto facile:
Assegnate un suffisso vfs. Per esempio, se avete un file .zip e vorreste
vedere cosa c'è dentro di esso, il percorso sarebbe

/qualsiasipercorso/my.zip#uzip/unpercorso/...

Poi basta aggiungere una linea nel file extfs.ini contenente solo quella
estensione. Se il vostro vfs non richiede file di lavoro, aggiungete
':' alla fine del nome.

In questo esempio, .zip è il suffisso, ma è possibile chiamare vfs 'uzip'.
Perché? Beh, quello che fa vfs è essenzialmente UNzip. UN è troppo lungo
così è stato scelto U. Notare che in futuro un filesystem come zip potrà
esistere: prenderà l'intero albero e creerà un file zip da esso. Così
/usr:zip sarà un file zip contenente l'intero albero /usr.

La seconda potrebbe richiedere un po' di conoscenza di programmazione shell/c:
si deve creare un prefisso di programma (con i permessi di esecuzione) in
$(libdir)/extfs (nel nostro esempio $(libdir)/extfs/uzip).


* Comandi che dovrebbero essere implementati nello script shell
---------------------------------------------------------------

Ritorno di zero dallo script a completamento avvenuto del comando, 
altrimenti diverso da zero per fallimento o comando non supportato.

$libdir/extfs/prefix command [arguments]

* Comando: list nomearchivio

Questo comando dovrebbe elencare il contenuto completo dell'archivio nel seguente 
formato (elenco ls -l un po' modificato)

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

dove (le cose in [] sono opzionali):

AAAAAAA  è la stringa permessi come in ls -l
NNN      è il numero di collegamenti
OOOOOOOO è il proprietario (sia UID che nome)
GGGGGGGG è il gruppo (sia GID che nome)
SSSSSSSS è la dimensione del file
FILENAME è il nome del file
PATH     è il percorso dalla radice dell'archivio senza la slash iniziale (/)
DATETIME ha uno dei seguenti formati:
	    Mon DD hh:mm, Mon DD YYYY, Mon DD YYYY hh:mm, MM-DD-YY hh:mm

            dove Mon è il nome del mese a tre caratteri in inglese, DD giorno
            1-31, MM mese 01-12, YY anno a due cifre, YYYY anno a quattro cifre, 
            hh ore e mm minuti.

Se la -> [PATH/]FILENAME parte è presente, significa:

Se i permessi cominciano con l (elle) allora è il nome al quale il 
collegamento simbolico punta. Se questo percorso comincia con un prefisso
vfs di MC allora è un collegamento simbolico verso l'altro filesystem virtuale
(se si vuole specificare un percorso dalla radice locale, si usa local:/percorso
invece di /percorso perchè /percorso significa dalla radice dell'archivio
elencato).

Se i permessi non cominciano con l ma un numero di collegamenti maggiore di
uno allora significa che questo file dovrebbe essere collegato 'hard' con
l'altro file. 

* Comando: copyout nomearchivio nomefilememorizzato estraea

Questo dovrebbe estrarre dall'archivio nomearchivio nel file di
nome nomefilememorizzato (possibilmente con percorso se non collocato
nella radice dell'archivio [questo è sbagliato. l'attuale extfs toglie il
percorso! -- pavel@ucw.cz]) nel file estraea.

* Comando: copyin nomearchive nomefilememorizzato filesorgente

Questo dovrebbe aggiungere a nomearchivio il filesorgente con
nome nomefilememorizzato nell'archivio.

Nota importante: nomearchivio negli esempi suddetti può non avere
l'estensione che ci si aspetta, come potrebbe succedere che il nomearchivio
sia qualcosa del tipo /tmp/f43513254 o qualsiasi altra cosa.
Ad alcuni archiviatori non piace ciò per cui dovrò trovare qualche
artifizio.

* Comando: rm nomearchivio nomefilememorizzato

Questo dovrebbe rimuovere il nomefilememorizzato da nomearchivio.

* Comando: mkdir nomearchivio nomedir

Questo dovrebbe creare una nuova directory chiamata nomedir dentro
nomearchivio.

* Comando: rmdir nomearchivio nomedir

Questo dovrebbe rimuovere un'esistente directory nomedir. Se la directory
non è vuota, mc la cancellerà ricorsivamente (possibilmente avvertendo).

* Comando: run

Nondocumentato :-)

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

Non dimenticate di impostare questo file come eseguibile (con chmod 755 
QuestoFile per esempio)

Per una struttura generale di eseguibile vedere i filesystems simili
ai vostri.

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

Se nel costruire queste routine verranno fatti degli errori mc non mostrerà
righe di stampa maldefinite. Questo può fuorviare il programmatore nella
ricerca dei difetti. Visto che questa routine è uno script shell eseguibile
essa può essere lanciata dalla riga di comando indipendentemente da mc ed il
risultato mostrato in console o redirezionato in un file.

* Messa in uso
----------------------------------------------------------
Il file .mc.ext nella directory home e nella directory utente di mc 
(normalmente /usr/local/lib/mc), contiene le istruzioni per le operazioni 
sui files a seconda dell'estensione. E' ben documentato in altri file in 
questa distribuzione perciò qui si darà solo qualche nota specificatamente
sull'uso del File System Virtuale che si è appena creato.

Vi sono voci in .mc.ext che definiscono alcune operazioni che possono essere
svolte su un file da un pannello di mc. Tipicamente sono annotate con un
simbolo di cancelletto ed un'estensione come questa:

# zip

Vi deve essere un modo per trovare il file per estensione così la
prossima linea fa ciò. Essenzialmente dichiara: "identifica la stringa ".zip"
o (|) ".ZIP" alla fine del nome del file:

regex/\.(zip|ZIP)$

Le operazioni seguono. Esse devono essere indentate da almeno uno spazio oppure
un tabulatore. In particolare l'operazione di apertura  (Open) userà ora il nuovo
file system virtuale per fare cd su di esso come in questo:

   Open=%cd zip:%d/%p

Questa è la linea usata quando un file viene evidenziato in un pannello e
l'utente preme <Invio>. Il contenuto dell'archivio dovrebbe essere come
se si fosse in una vera directory e potesse essere manipolata in tal modo.
Il resto della linea riguarda l'uso del tasto di Vista F3:

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

con un'icona opzionale per X:

   Icon=zip.xpm

e con un'operazione per estrarre il contenuto del file preso da una selezione
file a menu:

   Extract=unzip %f '*'

Questo è solo un esempio. La voce corrente per i file .zip ha una selezione
menu di 'Unzip' che potrebbe essere usata al posto di 'Extract'. Cosa va qui
dipende da quali voci si hanno o si aggiungono al menu di sistema ed inoltre
c'è ancora un particolare. La somma di questo è nella voce .mc.ext:

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

Aggiungere una voce come questa al file .mc.ext nella directory home dell'utente.
Se volete che altri la vedano, aggiungetela nel file mc.ext nella directory di
sistema di mc spesso in /usr/local/lib/mc/mc.ext. Notare che questo file non
ha un punto iniziale.

Una volta che tutto questo è fatto e le cose sono al loro posto, uscite da mc
se lo state usando e fatelo ripartire dimodoche possa prendere le nuove
impostazioni.

Questo è tutto. La parte più dura è fare una funzione di elenco che ordini
l'uscita di un comando di listato di sistema e lo converta in un formato che
permetta ad mc di poterlo usare. Attualmente viene usato awk (o gawk) perché
quasi tutti i sistemi ne sono provvisti. Si può usare anche un'altro linguaggio
di scripting come il perl, se è disponibile.
