Altre piccole correzioni
[gapil.git] / filedir.tex
index f2255b1f497ff24e991fec7898b78175f5472ab4..e84514dcd2933c862d9742431bea2779939df3e9 100644 (file)
@@ -4113,7 +4113,7 @@ disattivare questi attributi,\footnote{più precisamente un processo con la
 rimuoverli è comunque capace di tornare in grado di eseguire qualunque
 operazione su un file immutabile o \textit{append-only}.
 
-\itindbeg{file~attributes}
+\itindend{file~attributes}
 
 
 
@@ -4533,39 +4533,45 @@ prevede due diverse possibilità:
 \item che il \ids{GID} del file corrisponda al \ids{GID} della directory in
   cui esso è creato.
 \end{itemize*}
-in genere BSD usa sempre la seconda possibilità, che viene per questo chiamata
-semantica BSD. Linux invece segue quella che viene chiamata semantica SVr4; di
-norma cioè il nuovo file viene creato, seguendo la prima opzione, con il
-\ids{GID} del processo, se però la directory in cui viene creato il file ha il
-bit \acr{sgid} impostato allora viene usata la seconda opzione.
+
+In genere BSD usa sempre la seconda possibilità, che viene per questo chiamata
+semantica BSD. Linux invece segue normalmente quella che viene chiamata
+semantica SVr4: di norma un nuovo file viene creato, seguendo la prima
+opzione, con il \ids{GID} del processo, se però la directory in cui viene
+creato ha il bit \acr{sgid} impostato allora viene usata la seconda
+opzione. L'adozione di questa semantica però può essere controllata,
+all'interno di alcuni filesystem,\footnote{con il kernel 2.6.25 questi erano
+  \acr{ext2}, \acr{ext3}, \acr{ext4}, e XFS.}  con l'uso dell'opzione di
+montaggio \texttt{grpid}, che se attivata fa passare all'uso della semantica
+BSD.
 
 Usare la semantica BSD ha il vantaggio che il \ids{GID} viene sempre
 automaticamente propagato, restando coerente a quello della directory di
-partenza, in tutte le sotto-directory. 
-
-La semantica SVr4 offre la possibilità di scegliere, ma per ottenere lo stesso
-risultato di coerenza che si ha con BSD necessita che quando si creano nuove
-directory venga anche propagato anche il bit \acr{sgid}. Questo è il
-comportamento predefinito del comando \cmd{mkdir}, ed è in questo modo ad
-esempio che le varie distribuzioni assicurano che le sotto-directory create
-nella home di un utente restino sempre con il \ids{GID} del gruppo primario
-dello stesso.
+partenza, in tutte le sotto-directory. La semantica SVr4 offre la possibilità
+di scegliere, ma per ottenere lo stesso risultato di coerenza che si ha con
+quella di BSD necessita che quando si creano nuove directory venga propagato
+il bit \acr{sgid}. Questo è il comportamento predefinito del comando
+\cmd{mkdir}, ed è in questo modo ad esempio che le varie distribuzioni
+assicurano che le sotto-directory create nella home di un utente restino
+sempre con il \ids{GID} del gruppo primario dello stesso.
 
 La presenza del bit \acr{sgid} è inoltre molto comoda quando si hanno
-directory contenenti file condivisi all'intero di un gruppo in cui possono
+directory contenenti file condivisi da un gruppo di utenti in cui possono
 scrivere tutti i membri dello stesso, dato che assicura che i file che gli
-utenti vi creano appartengano sempre allo stesso gruppo. Questo non risolve
-però completamente i problemi di accesso da parte di altri utenti dello stesso
-gruppo, in quanto i permessi assegnati al gruppo potrebbero non essere
-sufficienti; in tal caso si deve aver cura di usare un valore di
-\itindex{umask} \textit{umask} che ne lasci di sufficienti.\footnote{in tal
-  caso si può assegnare agli utenti del gruppo una \textit{umask} di $002$,
-  anche se la soluzione migliore in questo caso è usare una ACL di default
-  (vedi sez.~\ref{sec:file_ACL}).}
-
-Come avviene nel caso dei permessi il sistema fornisce anche delle funzioni,
-\funcd{chown}, \funcd{fchown} e \funcd{lchown}, che permettono di cambiare sia
-l'utente che il gruppo a cui un file appartiene; i rispettivi prototipi sono:
+utenti vi creano appartengano allo gruppo stesso. Questo non risolve però
+completamente i problemi di accesso da parte di altri utenti dello stesso
+gruppo, in quanto di default i permessi assegnati al gruppo non sono
+sufficienti per un accesso in scrittura; in questo caso si deve aver cura di
+usare prima della creazione dei file un valore per \itindex{umask}
+\textit{umask} lasci il permesso di scrittura.\footnote{in tal caso si può
+  assegnare agli utenti del gruppo una \textit{umask} di $002$, anche se la
+  soluzione migliore in questo caso è usare una ACL di default (vedi
+  sez.~\ref{sec:file_ACL}).}
+
+Come avviene nel caso dei permessi esistono anche delle appropriate funzioni
+di sistema, \funcd{chown} \funcd{fchown} e \funcd{lchown}, che permettono di
+cambiare sia l'utente che il gruppo a cui un file appartiene; i rispettivi
+prototipi sono:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -4580,11 +4586,11 @@ l'utente che il gruppo a cui un file appartiene; i rispettivi prototipi sono:
   caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EPERM}] l'\ids{UID} effettivo non corrisponde a quello del
-    proprietario del file o non è zero, o utente e gruppo non sono validi
+    proprietario del file o non è zero, o utente e gruppo non sono validi.
   \end{errlist}
   ed inoltre per tutte \errval{EROFS} e \errval{EIO}, per \func{chown}
-  \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM},
-  \errval{ENOTDIR}, \errval{EACCES}, \errval{ELOOP}, per \func{fchown}
+  \errval{EACCES}, \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, per \func{fchown}
   \errval{EBADF} nel loro significato generico.}
 \end{funcproto}
 
@@ -4611,7 +4617,7 @@ rispetto allo standard POSIX è che specificando -1 come valore
 per \param{owner} e \param{group} i valori restano immutati.
 
 Quando queste funzioni sono chiamate con successo da un processo senza i
-privilegi di root entrambi i bit \itindex{suid~bit} \acr{suid} e
+privilegi di amministratore entrambi i bit \itindex{suid~bit} \acr{suid} e
 \itindex{sgid~bit} \acr{sgid} vengono cancellati. Questo non avviene per il
 bit \acr{sgid} nel caso in cui esso sia usato (in assenza del corrispondente
 permesso di esecuzione) per indicare che per il file è attivo il
@@ -4740,18 +4746,20 @@ informazioni siano estremamente ridotte.  Questo è dovuto al fatto che Unix
 origina negli anni '70, quando le risorse di calcolo e di spazio disco erano
 minime. Con il venir meno di queste restrizioni è incominciata ad emergere
 l'esigenza di poter associare ai file delle ulteriori informazioni astratte
-(quelli che vengono chiamati i \textsl{meta-dati}) che però non potevano
-trovare spazio nei dati classici mantenuti negli \itindex{inode}
+(quelli che abbiam chiamato genericamente \textsl{metadati}) che però non
+potevano trovare spazio nei dati classici mantenuti negli \itindex{inode}
 \textit{inode}.
 
 Per risolvere questo problema alcuni sistemi unix-like (e fra questi anche
 Linux) hanno introdotto un meccanismo generico, detto \textit{Extended
-  Attributes} che consenta di associare delle informazioni ai singoli
-file.\footnote{l'uso più comune è quello della ACL, che tratteremo nella
-  prossima sezione.} Gli \textsl{attributi estesi} non sono altro che delle
-coppie nome/valore che sono associate permanentemente ad un oggetto sul
-filesystem, analoghi di quello che sono le variabili di ambiente (vedi
-sez.~\ref{sec:proc_environ}) per un processo.
+  Attributes} che consente di associare delle informazioni ulteriori ai
+singoli file.\footnote{essi ad esempio vengono usati per le ACL, che
+  tratteremo in sez.~\ref{sec:file_ACL} e le \itindex{file~capabilities}
+  \textit{file capabilities}, che vedremo in
+  sez.~\ref{sec:proc_capabilities}.} Gli \textsl{attributi estesi} non sono
+altro che delle coppie nome/valore che sono associate permanentemente ad un
+oggetto sul filesystem, analoghi di quello che sono le variabili di ambiente
+(vedi sez.~\ref{sec:proc_environ}) per un processo.
 
 Altri sistemi (come Solaris, MacOS e Windows) hanno adottato un meccanismo
 diverso in cui ad un file sono associati diversi flussi di dati, su cui
@@ -4777,9 +4785,9 @@ presenti solo sui vari \textsl{extN}, \textsl{ReiserFS}, \textsl{JFS},
 Inoltre a seconda della implementazione ci possono essere dei limiti sulla
 quantità di attributi che si possono utilizzare.\footnote{ad esempio nel caso
   di \textsl{ext2} ed \textsl{ext3} è richiesto che essi siano contenuti
-  all'interno di un singolo blocco (pertanto con dimensioni massime pari a
+  all'interno di un singolo bloccopertanto con dimensioni massime pari a
   1024, 2048 o 4096 byte a seconda delle dimensioni di quest'ultimo impostate
-  in fase di creazione del filesystem), mentre con \textsl{XFS} non ci sono
+  in fase di creazione del filesystem, mentre con \textsl{XFS} non ci sono
   limiti ed i dati vengono memorizzati in maniera diversa (nell'\textit{inode}
   stesso, in un blocco a parte, o in una struttura ad albero dedicata) per
   mantenerne la scalabilità.} Infine lo spazio utilizzato per mantenere gli
@@ -4801,7 +4809,7 @@ classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}.
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}{|l|p{12cm}|}
+  \begin{tabular}{|l|p{8cm}|}
     \hline
     \textbf{Nome} & \textbf{Descrizione} \\
     \hline
@@ -4836,14 +4844,14 @@ classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}.
 \end{table}
 
 
-Dato che uno degli usi degli \textit{Extended Attributes} è quello che li
-impiega per realizzare delle estensioni (come le
-\itindex{Access~Control~List~(ACL)} ACL, \index{SELinux} SELinux, ecc.) al
-tradizionale meccanismo dei controlli di accesso di Unix, l'accesso ai loro
-valori viene regolato in maniera diversa a seconda sia della loro classe sia
-di quali, fra le estensioni che li utilizzano, sono poste in uso. In
-particolare, per ciascuna delle classi riportate in
-tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
+Dato che uno degli usi degli \textit{Extended Attributes} è di impiegarli per
+realizzare delle estensioni (come le \itindex{Access~Control~List~(ACL)} ACL,
+\index{SELinux} SELinux, ecc.) al tradizionale meccanismo dei controlli di
+accesso di Unix, l'accesso ai loro valori viene regolato in maniera diversa a
+seconda sia della loro classe che di quali, fra le estensioni che li
+utilizzano, sono poste in uso. In particolare, per ciascuna delle classi
+riportate in tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti
+casi:
 \begin{basedescript}{\desclabelwidth{1.7cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{security}] L'accesso agli \textit{extended security attributes}
   dipende dalle politiche di sicurezza stabilite da loro stessi tramite
@@ -4912,7 +4920,7 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
   per evitare eventuali abusi, se una directory ha lo \itindex{sticky~bit}
   \textit{sticky bit} attivo sarà consentito scrivere i suoi \textit{extended
     user attributes} soltanto se si è proprietari della stessa, o si hanno i
-  privilegi amministrativi della capability \itindex{capabilities}
+  privilegi amministrativi della capacità \itindex{capabilities}
   \const{CAP\_FOWNER}.
 \end{basedescript}
 
@@ -4924,10 +4932,11 @@ installata a parte;\footnote{la versione corrente della libreria è
 esplicitamente l'uso della suddetta libreria invocando il compilatore con
 l'opzione \texttt{-lattr}.  
 
-Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni,
-\funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che consentono
-rispettivamente di richiedere gli attributi relativi a un file, a un
-collegamento simbolico e ad un file descriptor; i rispettivi prototipi sono:
+Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni
+di sistema, \funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che
+consentono rispettivamente di richiedere gli attributi relativi a un file, a
+un collegamento simbolico e ad un file descriptor; i rispettivi prototipi
+sono:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -4946,13 +4955,13 @@ collegamento simbolico e ad un file descriptor; i rispettivi prototipi sono:
   caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{ENOATTR}] l'attributo richiesto non esiste.
-  \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
-    non è sufficiente per contenere il risultato.
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
+  \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
+    non è sufficiente per contenere il risultato.
   \end{errlist}
   ed inoltre tutti gli errori delle analoghe della famiglia \func{stat} con lo
-  stesso significato ed in particolare \errcode{EPERM} se non si hanno i
+  stesso significato, ed in particolare \errcode{EPERM} se non si hanno i
   permessi di accesso all'attributo.}
 \end{funcproto}
 
@@ -5004,10 +5013,10 @@ collegamento simbolico o specificando un file descriptor; i loro prototipi sono:
 {Le funzioni ritornano un $0$ in caso di successo e $-1$ per un errore, nel qual
   caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{ENOATTR}] si è usato il flag \const{XATTR\_REPLACE} e
-    l'attributo richiesto non esiste.
   \item[\errcode{EEXIST}] si è usato il flag \const{XATTR\_CREATE} ma
     l'attributo esiste già.
+  \item[\errcode{ENOATTR}] si è usato il flag \const{XATTR\_REPLACE} e
+    l'attributo richiesto non esiste.
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
   \end{errlist}
@@ -5036,7 +5045,7 @@ modificato se è già presente, o creato se non c'è.
 
 Le funzioni finora illustrate permettono di leggere o scrivere gli attributi
 estesi, ma sarebbe altrettanto utile poter vedere quali sono gli attributi
-presenti; a questo provvedono le funzioni \funcd{listxattr},
+presenti; a questo provvedono le funzioni di sistema \funcd{listxattr},
 \funcd{llistxattr} e \funcd{flistxattr} i cui prototipi sono:
 
 \begin{funcproto}{
@@ -5052,10 +5061,10 @@ presenti; a questo provvedono le funzioni \funcd{listxattr},
   in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà
   uno dei valori:
   \begin{errlist}
-  \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
-    non è sufficiente per contenere il risultato.
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
+  \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
+    non è sufficiente per contenere il risultato.
   \end{errlist}
   ed inoltre tutti gli errori delle analoghe della famiglia \func{stat} con lo
   stesso significato ed in particolare \errcode{EPERM} se non si hanno i
@@ -5080,8 +5089,8 @@ valore di ritorno della funzione una stima della dimensione totale della lista
 usando per \param{size} un valore nullo. 
 
 Infine per rimuovere semplicemente un attributo esteso, si ha a disposizione
-un ultimo gruppo di funzioni: \funcd{removexattr}, \funcd{lremovexattr} e
-\funcd{fremovexattr}; i rispettivi prototipi sono:
+un ultimo gruppo di funzioni di sistema: \funcd{removexattr},
+\funcd{lremovexattr} e \funcd{fremovexattr}; i rispettivi prototipi sono:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -5104,12 +5113,13 @@ un ultimo gruppo di funzioni: \funcd{removexattr}, \funcd{lremovexattr} e
   permessi di accesso all'attributo.}
 \end{funcproto}
 
-Le tre funzioni rimuovono l'attributo esteso indicato dall'argomento
-\param{name} rispettivamente di un file, un collegamento simbolico o
-specificando un file descriptor, da specificare con il loro primo argomento.
-Anche in questo caso l'argomento \param{name} deve essere specificato con le
-modalità già illustrate in precedenza per le altre funzioni relative agli
-attributi estesi.
+Le tre funzioni rimuovono un attributo esteso operando rispettivamente su di
+un file, su un collegamento simbolico o un file descriptor, che vengono
+specificati dal valore passato con il loro primo argomento.  L'attributo da
+rimuovere deve essere anchein questo caso indicato con
+l'argomento \param{name} secondo le stesse modalità già illustrate in
+precedenza per le altre funzioni relative alla gestione degli attributi
+estesi.
 
 \itindend{Extended~Attributes}
 
@@ -5138,15 +5148,15 @@ creato un gruppo di lavoro il cui scopo era estendere lo standard POSIX 1003
 attraverso due nuovi insiemi di specifiche, la POSIX 1003.1e per l'interfaccia
 di programmazione e la POSIX 1003.2c per i comandi di shell.
 
-Gli obiettivi erano però forse troppo ambizioni, e nel gennaio del 1998 i
-finanziamenti vennero ritirati senza che si fosse arrivati alla definizione di
-uno standard, dato però che una parte della documentazione prodotta era di
-alta qualità venne deciso di rilasciare al pubblico la diciassettesima bozza
-del documento, quella che va sotto il nome di \textit{POSIX 1003.1e Draft 17},
-che è divenuta la base sulla quale si definiscono le cosiddette \textit{Posix
-  ACL}.
+Gli obiettivi del gruppo di lavoro erano però forse troppo ambizioni, e nel
+gennaio del 1998 i finanziamenti vennero ritirati senza che si fosse arrivati
+alla definizione dello standard richiesto. Dato però che una parte della
+documentazione prodotta era di alta qualità venne deciso di rilasciare al
+pubblico la diciassettesima bozza del documento, quella che va sotto il nome
+di \textit{POSIX 1003.1e Draft 17}, che è divenuta la base sulla quale si
+definiscono le cosiddette \textit{Posix ACL}.
 
-A differenza di altri sistemi (ad esempio FreeBSD) nel caso di Linux si è
+A differenza di altri sistemi, come ad esempio FreeBSD, nel caso di Linux si è
 scelto di realizzare le ACL attraverso l'uso degli
 \itindex{Extended~Attributes} \textit{Extended Attributes} (appena trattati in
 sez.~\ref{sec:file_xattr}), e fornire tutte le relative funzioni di gestione
@@ -5160,13 +5170,13 @@ Anche in questo caso le funzioni di questa libreria non fanno parte della
   installare con il pacchetto omonimo e con il collegato \texttt{libacl1-dev}
   per i file di sviluppo.}  pertanto se un programma le utilizza si dovrà
 indicare esplicitamente l'uso della libreria \texttt{libacl} invocando il
-compilatore con l'opzione \texttt{-lacl}. Si tenga presente inoltre che per
-poterle utilizzare le ACL devono essere attivate esplicitamente montando il
-filesystem\footnote{che deve supportarle, ma questo è ormai vero per
-  praticamente tutti i filesystem più comuni, con l'eccezione di NFS per il
-  quale esiste però un supporto sperimentale.} su cui le si vogliono
-utilizzare con l'opzione \texttt{acl} attiva. Dato che si tratta di una
-estensione è infatti opportuno utilizzarle soltanto laddove siano necessarie.
+compilatore con l'opzione \texttt{-lacl}. Si tenga presente inoltre che le ACL
+devono essere attivate esplicitamente montando il filesystem\footnote{che deve
+  supportarle, ma questo è ormai vero per praticamente tutti i filesystem più
+  comuni, con l'eccezione di NFS per il quale esiste però un supporto
+  sperimentale.} su cui le si vogliono utilizzare con l'opzione \texttt{acl}
+attiva. Dato che si tratta di una estensione è infatti opportuno utilizzarle
+soltanto laddove siano necessarie.
 
 Una ACL è composta da un insieme di voci, e ciascuna voce è a sua volta
 costituita da un \textsl{tipo}, da un eventuale
@@ -5178,7 +5188,7 @@ può impostare una ACL aggiuntiva, detta \textit{default ACL}, che serve ad
 indicare quale dovrà essere la ACL assegnata di default nella creazione di un
 file all'interno della directory stessa. Come avviene per i permessi le ACL
 possono essere impostate solo del proprietario del file, o da un processo con
-la capability \itindex{capabilities} \const{CAP\_FOWNER}.
+la capacità \itindex{capabilities} \const{CAP\_FOWNER}.
 
 \begin{table}[htb]
   \centering
@@ -5220,22 +5230,23 @@ tipi.
 
 Una ACL può poi contenere un numero arbitrario di voci di tipo
 \const{ACL\_USER} e \const{ACL\_GROUP}, ciascuna delle quali indicherà i
-permessi assegnati all'utente e al gruppo indicato dal relativo qualificatore;
-ovviamente ciascuna di queste voci dovrà fare riferimento ad un utente o ad un
+permessi assegnati all'utente e al gruppo indicato dal relativo qualificatore.
+Ovviamente ciascuna di queste voci dovrà fare riferimento ad un utente o ad un
 gruppo diverso, e non corrispondenti a quelli proprietari del file. Inoltre se
-in una ACL esiste una voce di uno di questi due tipi è obbligatoria anche la
+in una ACL esiste una voce di uno di questi due tipi, è obbligatoria anche la
 presenza di una ed una sola voce di tipo \const{ACL\_MASK}, che negli altri
 casi è opzionale.
 
-Quest'ultimo tipo di voce contiene la maschera dei permessi che possono essere
-assegnati tramite voci di tipo \const{ACL\_USER}, \const{ACL\_GROUP} e
-\const{ACL\_GROUP\_OBJ}; se in una di queste voci si fosse specificato un
-permesso non presente in \const{ACL\_MASK} questo verrebbe ignorato. L'uso di
-una ACL di tipo \const{ACL\_MASK} è di particolare utilità quando essa
-associata ad una \textit{default ACL} su una directory, in quanto i permessi
-così specificati verranno ereditati da tutti i file creati nella stessa
-directory. Si ottiene così una sorta di \itindex{umask} \textit{umask}
-associata ad un oggetto sul filesystem piuttosto che a un processo.
+Una voce di tipo \const{ACL\_MASK} serve a mantenere la maschera dei permessi
+che possono essere assegnati tramite voci di tipo \const{ACL\_USER},
+\const{ACL\_GROUP} e \const{ACL\_GROUP\_OBJ}. Se in una di queste voci si
+fosse specificato un permesso non presente in \const{ACL\_MASK} questo
+verrebbe ignorato. L'uso di una ACL di tipo \const{ACL\_MASK} è di particolare
+utilità quando essa associata ad una \textit{default ACL} su una directory, in
+quanto i permessi così specificati verranno ereditati da tutti i file creati
+nella stessa directory. Si ottiene così una sorta di \itindex{umask}
+\textit{umask} associata ad un oggetto sul filesystem piuttosto che a un
+processo.
 
 Dato che le ACL vengono a costituire una estensione dei permessi ordinari, uno
 dei problemi che si erano posti nella loro standardizzazione era appunto
@@ -5243,19 +5254,23 @@ quello della corrispondenza fra questi e le ACL. Come accennato i permessi
 ordinari vengono mappati le tre voci di tipo \const{ACL\_USER\_OBJ},
 \const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER} che devono essere presenti in
 qualunque ACL; un cambiamento ad una di queste voci viene automaticamente
-riflesso sui permessi ordinari dei file\footnote{per permessi ordinari si
-  intende quelli mantenuti \itindex{inode} nell'\textit{inode}, che devono
-  restare dato che un filesystem può essere montato senza abilitare le ACL.} e
-viceversa. In realtà la mappatura è diretta solo per le voci
-\const{ACL\_USER\_OBJ} e \const{ACL\_OTHER}, nel caso di
-\const{ACL\_GROUP\_OBJ} questo vale soltanto se non è presente una voce di
-tipo \const{ACL\_MASK}, se invece questa è presente verranno tolti dai
-permessi di \const{ACL\_GROUP\_OBJ} tutti quelli non presenti in
-\const{ACL\_MASK}.\footnote{questo diverso comportamento a seconda delle
-  condizioni è stato introdotto dalla standardizzazione \textit{POSIX 1003.1e
-    Draft 17} per mantenere il comportamento invariato sui sistemi dotati di
-  ACL per tutte quelle applicazioni che sono conformi soltanto all'ordinario
-  standard \textit{POSIX 1003.1}.}
+riflesso sui permessi ordinari dei file e viceversa.\footnote{per permessi
+  ordinari si intende quelli mantenuti \itindex{inode} nell'\textit{inode},
+  che devono restare dato che un filesystem può essere montato senza abilitare
+  le ACL.}
+
+In realtà la mappatura è diretta solo per le voci \const{ACL\_USER\_OBJ} e
+\const{ACL\_OTHER}, nel caso di \const{ACL\_GROUP\_OBJ} questo vale soltanto
+se non è presente una voce di tipo \const{ACL\_MASK}, che è quanto avviene
+normalmente se non sono presenti ACL aggiuntive rispetto ai permessi
+ordinari.za Se invece questa è presente verranno tolti dai permessi di
+\const{ACL\_GROUP\_OBJ} (cioè dai permessi per il gruppo proprietario del
+file) tutti quelli non presenti in \const{ACL\_MASK}.\footnote{questo diverso
+  comportamento a seconda delle condizioni è stato introdotto dalla
+  standardizzazione \textit{POSIX 1003.1e Draft 17} per mantenere il
+  comportamento invariato sui sistemi dotati di ACL per tutte quelle
+  applicazioni che sono conformi soltanto all'ordinario standard \textit{POSIX
+    1003.1}.}
 
 Un secondo aspetto dell'incidenza delle ACL sul comportamento del sistema è
 quello relativo alla creazione di nuovi file,\footnote{o oggetti sul
@@ -5263,7 +5278,7 @@ quello relativo alla creazione di nuovi file,\footnote{o oggetti sul
   \func{creat} (vedi sez.~\ref{sec:file_open}), \func{mkdir} (vedi
   sez.~\ref{sec:file_dir_creat_rem}), \func{mknod} e \func{mkfifo} (vedi
   sez.~\ref{sec:file_mknod}).} che come accennato può essere modificato dalla
-presenza di una \textit{default ACL} sulla directory che contiene quel file.
+presenza di una \textit{default ACL} sulla directory che andrà a contenerli.
 Se questa non c'è valgono le regole usuali illustrate in
 sez.~\ref{sec:file_perm_management}, per cui essi sono determinati dalla
 \itindex{umask} \textit{umask} del processo, e la sola differenza è che i
@@ -5273,23 +5288,27 @@ soltanto le tre corrispondenti voci di tipo \const{ACL\_USER\_OBJ},
 \const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER}.
 
 Se invece è presente una ACL di default sulla directory che contiene il nuovo
-file questa diventerà automaticamente la sua ACL di accesso, a meno di non
-aver indicato, nelle funzioni di creazione che lo consentono, uno specifico
-valore per i permessi ordinari;\footnote{tutte le funzioni citate in
-  precedenza supportano un argomento \var{mode} che indichi un insieme di
-  permessi iniziale.} in tal caso saranno eliminati dalle voci corrispondenti
-nella ACL tutti quelli non presenti in tale indicazione.
+file, essa diventerà automaticamente anche la ACL di accesso di quest'ultimo,
+a meno di non aver indicato, nelle funzioni di creazione che lo consentono,
+uno specifico valore per i permessi ordinari.\footnote{tutte le funzioni
+  citate in precedenza supportano un argomento \var{mode} che indichi un
+  insieme di permessi iniziale.} In tal caso saranno eliminati dalle voci
+corrispondenti che deriverebbero dalla ACL di default, tutti i permessi non
+presenti in tale indicazione.
 
 Dato che questa è la ragione che ha portato alla loro creazione, la principale
-modifica introdotta con la presenza della ACL è quella alle regole del
-controllo di accesso ai file illustrate in sez.~\ref{sec:file_perm_overview}.
-Come nel caso ordinario per il controllo vengono sempre utilizzati gli
-identificatori del gruppo \textit{effective} del processo, ma in presenza di
-ACL i passi attraverso i quali viene stabilito se esso ha diritto di accesso
-sono i seguenti:
-\begin{enumerate*}
-\item Se l'\ids{UID} del processo è nullo l'accesso è sempre garantito senza
-  nessun controllo.
+modifica introdotta nel sistema con la presenza della ACL è quella alle regole
+del controllo di accesso ai file che si sono illustrate in
+sez.~\ref{sec:file_perm_overview}.  Come nel caso ordinario per il controllo
+vengono sempre utilizzati gli identificatori del gruppo \textit{effective} del
+processo, ma in caso di presenza di una ACL sul file, i passi attraverso i
+quali viene stabilito se il processo ha il diritto di accesso sono i seguenti:
+\begin{enumerate}
+\item Se l'\ids{UID} del processo è nullo (se cioè si è l'amministratore)
+  l'accesso è sempre garantito senza nessun controllo.\footnote{più
+    precisamente se si devono avere le \itindex{capabilities} capacità
+    \const{CAP\_DAC\_OVERRIDE} per i file e \const{CAP\_DAC\_READ\_SEARCH} per
+    le directory, vedi sez.~\ref{sec:proc_capabilities}.}
 \item Se l'\ids{UID} del processo corrisponde al proprietario del file allora:
   \begin{itemize*}
   \item se la voce \const{ACL\_USER\_OBJ} contiene il permesso richiesto,
@@ -5324,7 +5343,7 @@ sono i seguenti:
   \end{itemize*}
 \item Se la voce \const{ACL\_USER\_OBJ} contiene il permesso richiesto,
   l'accesso è consentito, altrimenti l'accesso è negato.
-\end{enumerate*}
+\end{enumerate}
 
 I passi di controllo vengono eseguiti esattamente in questa sequenza, e la
 decisione viene presa non appena viene trovata una corrispondenza con gli
@@ -5341,79 +5360,87 @@ tutte le operazioni devono essere effettuate attraverso tramite questi tipi di
 dati, che incapsulano tutte le informazioni contenute nelle ACL. La prima di
 queste funzioni che prendiamo in esame è \funcd{acl\_init}, il cui prototipo
 è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{acl\_t acl\_init(int count)}
 
-  Inizializza un'area di lavoro per una ACL di \param{count} voci.
-  
-  \bodydesc{La funzione restituisce un puntatore all'area di lavoro in caso di
-    successo e \val{NULL} in caso di errore, nel qual caso \var{errno}
-    assumerà uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_init(int count)}
+\fdesc{Inizializza un'area di lavoro per una ACL.} 
+}
+
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] il valore di \param{count} è negativo.
   \item[\errcode{ENOMEM}] non c'è sufficiente memoria disponibile.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione alloca ed inizializza un'area di memoria che verrà usata per
 mantenere i dati di una ACL contenente fino ad un massimo di \param{count}
-voci. La funzione ritorna un valore di tipo \type{acl\_t}, da usare in tutte
-le altre funzioni che operano sulla ACL. La funzione si limita alla
-allocazione iniziale e non inserisce nessun valore nella ACL che resta vuota.
+voci. La funzione ritorna un valore di tipo \type{acl\_t} da usare in tutte le
+altre funzioni che operano sulla ACL. La funzione si limita alla allocazione
+iniziale e non inserisce nessun valore nella ACL che resta vuota. 
+
 Si tenga presente che pur essendo \type{acl\_t} un \index{tipo!opaco} tipo
 opaco che identifica ``\textsl{l'oggetto}'' ACL, il valore restituito dalla
 funzione non è altro che un puntatore all'area di memoria allocata per i dati
-richiesti; pertanto in caso di fallimento verrà restituito un puntatore nullo
-e si dovrà confrontare il valore di ritorno della funzione con
-``\code{(acl\_t) NULL}''.
+richiesti. Pertanto in caso di fallimento verrà restituito un puntatore nullo
+e si dovrà, in questa come in tutte le funzioni seguenti che restituiscono un
+oggetto di tipo \type{acl\_t}, confrontare il valore di ritorno della funzione
+con ``\code{(acl\_t) NULL}''.\footnote{dato che il valore \var{NULL} in questo
+  caso viene restituito come oggetto di tipo \type{acl\_t}, un confronto del
+  risultato della funzione con \var{NULL} darebbe un errore di compilazione
+  per la differenza di tipo.}
 
 Una volta che si siano completate le operazioni sui dati di una ACL la memoria
-allocata dovrà essere liberata esplicitamente attraverso una chiamata alla
-funzione \funcd{acl\_free}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{int acl\_free(void * obj\_p)}
+allocata per un oggetto \type{acl\_t} dovrà essere liberata esplicitamente
+attraverso una chiamata alla funzione \funcd{acl\_free}, il cui prototipo è:
 
-  Disalloca la memoria riservata per i dati di una ACL.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ se
-    \param{obj\_p} non è un puntatore valido, nel qual caso \var{errno}
-    assumerà il valore \errcode{EINVAL
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{int acl\_free(void * obj\_p)}
+\fdesc{Disalloca la memoria riservata per una ACL.
 }
-\end{functions}
-
-Si noti come la funzione richieda come argomento un puntatore di tipo
-``\ctyp{void *}'', essa infatti può essere usata non solo per liberare la
-memoria allocata per i dati di una ACL, ma anche per quella usata per creare
-le stringhe di descrizione testuale delle ACL o per ottenere i valori dei
-qualificatori di una voce; pertanto a seconda dei casi occorrerà eseguire un
-\textit{cast} a ``\ctyp{void *}'' del tipo di dato di cui si vuole eseguire la
-disallocazione.  Si tenga presente poi che oltre a \func{acl\_init} esistono
-molte altre funzioni che possono allocare memoria per i dati delle ACL, è
-pertanto opportuno tenere traccia di tutte queste funzioni perché alla fine
-delle operazioni tutta la memoria allocata dovrà essere liberata con
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà il valore:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] \param{obj\_p} non è valido.
+  \end{errlist}
+}
+\end{funcproto}
+
+Si noti come la funzione usi come argomento un puntatore di tipo ``\ctyp{void
+  *}'', essa infatti può essere usata non solo per liberare la memoria
+allocata per i dati di una ACL, ma anche per quella usata per creare le
+stringhe di descrizione testuale delle ACL o per ottenere i valori dei
+qualificatori della una voce di una ACL. 
+
+Pertanto a seconda dei casi occorrerà eseguire un \textit{cast} a ``\ctyp{void
+  *}'' del tipo di dato di cui si vuole eseguire la disallocazione.  Si tenga
+presente poi che oltre a \func{acl\_init} ci sono molte altre funzioni che
+possono allocare memoria per i dati delle ACL, è pertanto opportuno tenere
+traccia di tutte le chiamate a queste funzioni perché alla fine delle
+operazioni tutta la memoria allocata dovrà essere liberata con
 \func{acl\_free}.
 
 Una volta che si abbiano a disposizione i dati di una ACL tramite il
 riferimento ad oggetto di tipo \type{acl\_t} questi potranno essere copiati
 con la funzione \funcd{acl\_dup}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{acl\_t acl\_dup(acl\_t acl)}
 
-  Crea una copia della ACL \param{acl}.
-  
-  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
-    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
-    \var{errno} assumerà uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_dup(acl\_t acl)}
+\fdesc{Crea una copia di una ACL.} 
+}
+
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo in
+  caso di successo e \val{NULL} per un errore, nel qual caso \var{errno}
+  assumerà assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] l'argomento \param{acl} non è un puntatore valido
     per una ACL.
@@ -5421,7 +5448,7 @@ con la funzione \funcd{acl\_dup}, il cui prototipo è:
     la copia.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione crea una copia dei dati della ACL indicata tramite l'argomento
 \param{acl}, allocando autonomamente tutto spazio necessario alla copia e
@@ -5435,20 +5462,19 @@ Se si deve creare una ACL manualmente l'uso di \func{acl\_init} è scomodo,
 dato che la funzione restituisce una ACL vuota, una alternativa allora è usare
 \funcd{acl\_from\_mode} che consente di creare una ACL a partire da un valore
 di permessi ordinari, il prototipo della funzione è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{acl\_t acl\_from\_mode(mode\_t mode)}
-
-  Crea una ACL inizializzata con i permessi di \param{mode}.
-  
-  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
-    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
-    \var{errno} assumerà il valore \errval{ENOMEM}.
 
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_from\_mode(mode\_t mode)}
+\fdesc{Crea una ACL inizializzata con i permessi ordinari.} 
 }
-\end{functions}
+
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} potra assumere
+  solo il valore \errval{ENOMEM} nel suo significato generico.}
+\end{funcproto}
+
 
 La funzione restituisce una ACL inizializzata con le tre voci obbligatorie
 \const{ACL\_USER\_OBJ}, \const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER} già
@@ -5461,18 +5487,18 @@ Altre due funzioni che consentono di creare una ACL già inizializzata sono
 \funcd{acl\_get\_fd} e \funcd{acl\_get\_file}, che però sono per lo più
 utilizzate per leggere la ACL corrente di un file; i rispettivi prototipi
 sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{acl\_t acl\_get\_file(const char *path\_p, acl\_type\_t type)}
-  \funcdecl{acl\_t acl\_get\_fd(int fd)}
 
-  Ottiene i dati delle ACL di un file.
-  
-  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
-    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
-    \var{errno} assumerà uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_get\_file(const char *path\_p, acl\_type\_t type)}
+\fdecl{acl\_t acl\_get\_fd(int fd)}
+\fdesc{Ottiene i dati delle ACL di un file.} 
+}
+
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
+  dei valori:
   \begin{errlist}
   \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
   \item[\errcode{ENOTSUP}] il filesystem cui fa riferimento il file non
@@ -5480,10 +5506,8 @@ sono:
   \end{errlist}
   ed inoltre \errval{EBADF} per \func{acl\_get\_fd}, ed \errval{EINVAL} per
   valori scorretti di \param{type} e tutti i possibili errori per l'accesso ad
-  un file per \func{acl\_get\_file}.
-
-}
-\end{functions}
+  un file per \func{acl\_get\_file}. }
+\end{funcproto}
 
 Le due funzioni ritornano, con un oggetto di tipo \type{acl\_t}, il valore
 della ACL correntemente associata ad un file, che può essere identificato
@@ -5520,25 +5544,25 @@ verrà restituita una ACL vuota.
 
 Infine si potrà creare una ACL direttamente dalla sua rappresentazione
 testuale con la funzione  \funcd{acl\_from\_text}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{acl\_t acl\_from\_text(const char *buf\_p)}
 
-  Crea una ACL a partire dalla sua rappresentazione testuale.
-  
-  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
-    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
-    \var{errno} assumerà uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_from\_text(const char *buf\_p)}
+\fdesc{Crea una ACL a partire dalla sua rappresentazione testuale.} 
+}
+
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
+  dei valori:
   \begin{errlist}
   \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
   \item[\errcode{EINVAL}] la rappresentazione testuale all'indirizzo
     \param{buf\_p} non è valida.
-  \end{errlist}
-
-}
-\end{functions}
+   \end{errlist}
+  ed inoltre 
+nel loro significato generico.}  
+\end{funcproto}
 
 La funzione prende come argomento il puntatore ad un buffer dove si è inserita
 la rappresentazione testuale della ACL che si vuole creare, la memoria
@@ -5552,17 +5576,17 @@ ordinari per la gestione delle ACL (\texttt{getfacl} e \texttt{setfacl}), che
 prevede due diverse forme, estesa e breve, entrambe supportate da
 \func{acl\_from\_text}. La forma estesa prevede che sia specificata una voce
 per riga, nella forma:
-\begin{Verbatim}
-  tipo:qualificatore:permessi
-\end{Verbatim}
+\begin{Example}
+tipo:qualificatore:permessi
+\end{Example}
 dove il tipo può essere uno fra \texttt{user}, \texttt{group}, \texttt{other}
 e \texttt{mask}. Il qualificatore è presente solo per \texttt{user} e
 \texttt{group} e indica l'utente o il gruppo a cui la voce si riferisce; i
 permessi sono espressi con una tripletta di lettere analoga a quella usata per
-i permessi dei file.\footnote{vale a dire \texttt{r} per il permesso di
-  lettura, \texttt{w} per il permesso di scrittura, \texttt{x} per il permesso
-  di esecuzione (scritti in quest'ordine) e \texttt{-} per l'assenza del
-  permesso.}
+i permessi dei file.\footnote{vale a dire ``\texttt{r}'' per il permesso di
+  lettura, ``\texttt{w}'' per il permesso di scrittura, ``\texttt{x}'' per il
+  permesso di esecuzione (scritti in quest'ordine) e ``\texttt{-}'' per
+  l'assenza del permesso.}
 
 Va precisato che i due tipi \texttt{user} e \texttt{group} sono usati
 rispettivamente per indicare delle voci relative ad utenti e
@@ -5584,56 +5608,53 @@ voce sono le stesse. In questo caso non sono consentiti permessi.
 Per la conversione inversa, che consente di ottenere la rappresentazione
 testuale di una ACL, sono invece disponibili due funzioni, la prima delle due,
 di uso più immediato, è \funcd{acl\_to\_text}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{char * acl\_to\_text(acl\_t acl, ssize\_t *len\_p)}
 
-  Produce la rappresentazione testuale di una ACL.
-  
-  \bodydesc{La funzione restituisce il puntatore ad una stringa con la
-    rappresentazione testuale della ACL in caso di successo e
-    \code(acl\_t){NULL} in caso di errore, nel qual caso \var{errno} assumerà
-    uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{char * acl\_to\_text(acl\_t acl, ssize\_t *len\_p)}
+\fdesc{Produce la rappresentazione testuale di una ACL.} 
+}
+
+{La funzione ritorna il puntatore ad una stringa con la rappresentazione
+  testuale della ACL in caso di successo e \var{NULL} per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
   \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida.
   \end{errlist}
-
-}
-\end{functions}
+}  
+\end{funcproto}
 
 La funzione restituisce il puntatore ad una stringa terminata da NUL
 contenente la rappresentazione in forma estesa della ACL passata come
 argomento, ed alloca automaticamente la memoria necessaria. Questa dovrà poi
 essere liberata, quando non più necessaria, con \func{acl\_free}. Se
 nell'argomento \param{len\_p} si passa un valore puntatore ad una variabile
-intera in questa verrà restituita la dimensione della stringa con la
-rappresentazione testuale (non comprendente il carattere nullo finale). 
+intera in questa verrà restituita (come \itindex{value~result~argument}
+\textit{value result argument}) la dimensione della stringa con la
+rappresentazione testuale, non comprendente il carattere nullo finale.
 
 La seconda funzione, \funcd{acl\_to\_any\_text}, permette di controllare con
 dovizia di dettagli la generazione della stringa contenente la
 rappresentazione testuale della ACL, il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{char * acl\_to\_any\_text(acl\_t acl, const char *prefix, char
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{char * acl\_to\_any\_text(acl\_t acl, const char *prefix, char
     separator, int options)}
+\fdesc{Produce la rappresentazione testuale di una ACL.} 
+}
 
-  Produce la rappresentazione testuale di una ACL.
-
-  \bodydesc{La funzione restituisce il puntatore ad una stringa con la
-    rappresentazione testuale della ACL in caso di successo e \val{NULL} in
-    caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna il puntatore ad una stringa con la rappresentazione
+  testuale della ACL in caso di successo e \val{NULL} per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
   \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida.
-  \end{errlist}
-
-}
-\end{functions}
+   \end{errlist}
+}  
+\end{funcproto}
 
 La funzione converte in formato testo la ACL indicata dall'argomento
 \param{acl}, usando il carattere \param{separator} come separatore delle
@@ -5690,65 +5711,64 @@ disallocato con una chiamata ad \func{acl\_free}. Si tenga presente infine che
 questa funzione è una estensione specifica di Linux, e non è presente nella
 bozza dello standard POSIX.1e.
 
-Per quanto utile per la visualizzazione o l'impostazione da comando delle ACL,
-la forma testuale non è la più efficiente per poter memorizzare i dati
-relativi ad una ACL, ad esempio quando si vuole eseguirne una copia a scopo di
-archiviazione. Per questo è stata prevista la possibilità di utilizzare una
-rappresentazione delle ACL in una apposita forma binaria contigua e
-persistente. È così possibile copiare il valore di una ACL in un buffer e da
-questa rappresentazione tornare indietro e generare una ACL. 
+Per quanto utile per la visualizzazione o l'impostazione da riga di comando
+delle ACL, la forma testuale non è la più efficiente per poter memorizzare i
+dati relativi ad una ACL, ad esempio quando si vuole eseguirne una copia a
+scopo di archiviazione. Per questo è stata prevista la possibilità di
+utilizzare una rappresentazione delle ACL in una apposita forma binaria
+contigua e persistente. È così possibile copiare il valore di una ACL in un
+buffer e da questa rappresentazione tornare indietro e generare una ACL.
 
 Lo standard POSIX.1e prevede a tale scopo tre funzioni, la prima e più
 semplice è \funcd{acl\_size}, che consente di ottenere la dimensione che avrà
 la citata rappresentazione binaria, in modo da poter allocare per essa un
 buffer di dimensione sufficiente, il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{ssize\_t acl\_size(acl\_t acl)}
 
-  Determina la dimensione della rappresentazione binaria di una ACL.
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{ssize\_t acl\_size(acl\_t acl)}
+\fdesc{Determina la dimensione della rappresentazione binaria di una ACL.} 
+}
 
-  \bodydesc{La funzione restituisce in caso di successo la dimensione in byte
-    della rappresentazione binaria della ACL indicata da \param{acl} e $-1$ in
-    caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna la dimensione in byte della rappresentazione binaria
+  della ACL in caso di successo e $-1$ per un errore, nel qual caso
+  \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida.
   \end{errlist}
-
-}
-\end{functions}
+}  
+\end{funcproto}
 
 Prima di effettuare la lettura della rappresentazione binaria è sempre
 necessario allocare un buffer di dimensione sufficiente a contenerla, pertanto
 prima si dovrà far ricorso a \funcd{acl\_size} per ottenere tale dimensione e
 poi allocare il buffer con una delle funzioni di
 sez.~\ref{sec:proc_mem_alloc}. Una volta terminato l'uso della
-rappresentazione binaria, il buffer dovrà essere esplicitamente disallocato.
+rappresentazione binaria, il buffer dovrà essere esplicitamente disallocato,
+in questo caso con \func{free}.
 
 La funzione che consente di leggere la rappresentazione binaria di una ACL è
 \funcd{acl\_copy\_ext}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{ssize\_t acl\_copy\_ext(void *buf\_p, acl\_t acl, ssize\_t size)}
 
-  Ottiene la rappresentazione binaria di una ACL.
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{ssize\_t acl\_copy\_ext(void *buf\_p, acl\_t acl, ssize\_t size)}
+\fdesc{Ottiene la rappresentazione binaria di una ACL.} 
+}
 
-  \bodydesc{La funzione restituisce in caso di successo la dimensione in byte
-    della rappresentazione binaria della ACL indicata da \param{acl} e $-1$ in
-    caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna la dimensione in byte della rappresentazione binaria
+  della ACL in caso di successo e $-1$ per un errore, nel qual caso
+  \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida o
     \param{size} è negativo o nullo.
   \item[\errcode{ERANGE}] il valore di \param{size} è più piccolo della
     dimensione della rappresentazione della ACL.
   \end{errlist}
-
-}
-\end{functions}
+}  
+\end{funcproto}
 
 La funzione salverà la rappresentazione binaria della ACL indicata da
 \param{acl} sul buffer posto all'indirizzo \param{buf\_p} e lungo \param{size}
@@ -5760,26 +5780,24 @@ effetto sulla ACL indicata da \param{acl}.
 Viceversa se si vuole ripristinare una ACL a partire dalla rappresentazione
 binaria della stessa disponibile in un buffer si potrà usare la funzione 
 \funcd{acl\_copy\_int}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{ssize\_t acl\_copy\_int(const void *buf\_p)}
 
-  Ripristina la rappresentazione binaria di una ACL.
+\begin{funcproto}{
+\fhead{sys/types.h} 
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_copy\_int(const void *buf\_p)}
+\fdesc{.} 
+}
 
-  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
-    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
-    \var{errno} assumerà uno dei valori:
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] il buffer all'indirizzo \param{buf\_p} non contiene
     una rappresentazione corretta di una ACL.
   \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare un oggetto
     \type{acl\_t} per la ACL richiesta.
   \end{errlist}
-
 }
-\end{functions}
+\end{funcproto}
 
 La funzione in caso di successo alloca autonomamente un oggetto di tipo
 \type{acl\_t} che viene restituito come valore di ritorno con il contenuto
@@ -5792,32 +5810,30 @@ Una volta che si disponga della ACL desiderata, questa potrà essere impostata
 su un file o una directory. Per impostare una ACL sono disponibili due
 funzioni; la prima è \funcd{acl\_set\_file}, che opera sia su file che su
 directory, ed il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{int acl\_set\_file(const char *path, acl\_type\_t type, acl\_t
-    acl)}
 
-  Imposta una ACL su un file o una directory.
+\begin{funcproto}{
+\fhead{sys/types.}
+\fhead{sys/acl.h}
+\fdecl{int acl\_set\_file(const char *path, acl\_type\_t type, acl\_t acl)}
+\fdesc{Imposta una ACL su un file o una directory.} 
+}
 
-  \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EACCES}] o un generico errore di accesso a \param{path} o il
     valore di \param{type} specifica una ACL il cui tipo non può essere
     assegnato a \param{path}.
   \item[\errcode{EINVAL}] o \param{acl} non è una ACL valida, o \param{type}
-    ha in valore non corretto.
+    ha un valore non corretto.
   \item[\errcode{ENOSPC}] non c'è spazio disco sufficiente per contenere i
     dati aggiuntivi della ACL.
   \item[\errcode{ENOTSUP}] si è cercato di impostare una ACL su un file
     contenuto in un filesystem che non supporta le ACL.
   \end{errlist}
-  ed inoltre \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENAMETOOLONG},
-  \errval{EROFS}, \errval{EPERM}.
-}
-\end{functions}
+  ed inoltre \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR},
+  \errval{EPERM}, \errval{EROFS} nel loro significato generico.}
+\end{funcproto}
 
 La funzione consente di assegnare la ACL contenuta in \param{acl} al file o
 alla directory indicate dal \textit{pathname} \param{path}, mentre
@@ -5834,27 +5850,28 @@ vuota per cancellare la ACL di default associata a
   default, per i dettagli si ricorra alla pagina di manuale.}  La seconda
 funzione che consente di impostare una ACL è \funcd{acl\_set\_fd}, ed il suo
 prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{int acl\_set\_fd(int fd, acl\_t acl)}
 
-  Imposta una ACL su un file descriptor.
+\begin{funcproto}{
+\fhead{sys/types.h} 
+\fhead{sys/acl.h}
+\fdecl{int acl\_set\_fd(int fd, acl\_t acl)}
+\fdesc{Imposta una ACL su un file descriptor.} 
+}
 
-  \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EINVAL}] o \param{acl} non è una ACL valida, o \param{type}
-    ha in valore non corretto.
+  \item[\errcode{EINVAL}] o \param{acl} non è una ACL valida, o ha più voci di
+    quante se ne possono assegnare al file indicato da \param{fd}.
   \item[\errcode{ENOSPC}] non c'è spazio disco sufficiente per contenere i
     dati aggiuntivi della ACL.
   \item[\errcode{ENOTSUP}] si è cercato di impostare una ACL su un file
     contenuto in un filesystem che non supporta le ACL.
   \end{errlist}
-  ed inoltre \errval{EBADF}, \errval{EROFS}, \errval{EPERM}.
+  ed inoltre \errval{EBADF}, \errval{EPERM}, \errval{EROFS} nel loro
+  significato generico.
 }
-\end{functions}
+\end{funcproto}
 
 La funzione è del tutto è analoga a \funcd{acl\_set\_file} ma opera
 esclusivamente sui file identificati tramite un file descriptor. Non dovendo
@@ -5870,27 +5887,27 @@ voce direttamente con le funzioni previste dallo standard POSIX.1e.  Queste
 funzioni però sono alquanto macchinose da utilizzare per cui è molto più
 semplice operare direttamente sulla rappresentazione testuale. Questo è il
 motivo per non tratteremo nei dettagli dette funzioni, fornendone solo una
-descrizione sommaria; chi fosse interessato potrà ricorrere alle pagina di
+descrizione sommaria; chi fosse interessato potrà ricorrere alle pagine di
 manuale.
 
 Se si vuole operare direttamente sui contenuti di un oggetto di tipo
 \type{acl\_t} infatti occorre fare riferimento alle singole voci tramite gli
 opportuni puntatori di tipo \type{acl\_entry\_t}, che possono essere ottenuti
-dalla funzione \funcd{acl\_get\_entry} (per una voce esistente) o dalla
-funzione \funcd{acl\_create\_entry} per una voce da aggiungere. Nel caso della
+dalla funzione \funcm{acl\_get\_entry} (per una voce esistente) o dalla
+funzione \funcm{acl\_create\_entry} per una voce da aggiungere. Nel caso della
 prima funzione si potrà poi ripetere la lettura per ottenere i puntatori alle
 singole voci successive alla prima.
 
 Una volta ottenuti detti puntatori si potrà operare sui contenuti delle singole
-voci; con le funzioni \funcd{acl\_get\_tag\_type}, \funcd{acl\_get\_qualifier},
-\funcd{acl\_get\_permset} si potranno leggere rispettivamente tipo,
+voci; con le funzioni \funcm{acl\_get\_tag\_type}, \funcm{acl\_get\_qualifier},
+\funcm{acl\_get\_permset} si potranno leggere rispettivamente tipo,
 qualificatore e permessi mentre con le corrispondente funzioni
-\funcd{acl\_set\_tag\_type}, \funcd{acl\_set\_qualifier},
-\funcd{acl\_set\_permset} si possono impostare i valori; in entrambi i casi
+\funcm{acl\_set\_tag\_type}, \funcm{acl\_set\_qualifier},
+\funcm{acl\_set\_permset} si possono impostare i valori; in entrambi i casi
 vengono utilizzati tipi di dato ad hoc.\footnote{descritti nelle singole
   pagine di manuale.} Si possono poi copiare i valori di una voce da una ACL
-ad un altra con \funcd{acl\_copy\_entry} o eliminare una voce da una ACL con
-\funcd{acl\_delete\_entry}.
+ad un altra con \funcm{acl\_copy\_entry} o eliminare una voce da una ACL con
+\funcm{acl\_delete\_entry}.
 
 \itindend{Access~Control~List~(ACL)}
 
@@ -5946,30 +5963,31 @@ dell'\textit{hard limit}.  Questi limiti riguardano separatamente sia lo
 spazio disco (i blocchi) che il numero di file (gli \itindex{inode}
 \textit{inode}) e devono pertanto essere specificati per entrambe le risorse.
 
-La funzione che consente di controllare tutti i vari aspetti della gestione
-delle quote è \funcd{quotactl}, ed il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/quota.h}
-  
-  \funcdecl{quotactl(int cmd, const char *dev, int id, caddr\_t addr)}
+La funzione di sistema che consente di controllare tutti i vari aspetti della
+gestione delle quote è \funcd{quotactl}, ed il suo prototipo è:
 
-  Esegue una operazione di controllo sulle quote disco.
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/quota.h}
+\fdecl{int quotactl(int cmd, const char *dev, int id, caddr\_t addr)}
+\fdesc{Esegue una operazione di controllo sulle quote disco.} 
+}
 
-  \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EACCES}] il file delle quote non è un file ordinario.
-  \item[\errcode{EBUSY}] si è richiesto \const{Q\_QUOTAON} ma le quote sono
+  \item[\errcode{EACCES}] si è richiesto \const{Q\_QUOTAON}, ma il file delle
+    quote indicato da \param{addr} non esiste o non è un file ordinario.
+  \item[\errcode{EBUSY}] si è richiesto \const{Q\_QUOTAON}, ma le quote sono
     già attive.
   \item[\errcode{EFAULT}] l'indirizzo \param{addr} non è valido.
+  \item[\errcode{EINVAL}] o \param{cmd} non è un comando valido,
+    o il dispositivo \param{dev} non esiste.
   \item[\errcode{EIO}] errore di lettura/scrittura sul file delle quote.
   \item[\errcode{EMFILE}] non si può aprire il file delle quote avendo
     superato il limite sul numero di file aperti nel sistema. 
-  \item[\errcode{EINVAL}] o \param{cmd} non è un comando valido,
-    o il dispositivo \param{dev} non esiste.
-  \item[\errcode{ENODEV}] \param{dev} non corrisponde ad un \textit{mount
-      point} attivo.
+  \item[\errcode{ENODEV}] \param{dev} non corrisponde ad un
+    \itindex{mount~point} \textit{mount point} attivo.
   \item[\errcode{ENOPKG}] il kernel è stato compilato senza supporto per le
     quote. 
   \item[\errcode{ENOTBLK}] \param{dev} non è un dispositivo a blocchi.
@@ -5979,7 +5997,9 @@ delle quote è \funcd{quotactl}, ed il suo prototipo è:
     filesystem senza quote attivate.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
+
+% TODO rivedere gli errori
 
 La funzione richiede che il filesystem sul quale si vuole operare sia montato
 con il supporto delle quote abilitato; esso deve essere specificato con il
@@ -5993,10 +6013,18 @@ stessa.
 Il tipo di operazione che si intende effettuare deve essere indicato tramite
 il primo argomento \param{cmd}, questo in genere viene specificato con
 l'ausilio della macro \macro{QCMD}:
-\begin{functions}
-  \funcdecl{int QCMD(subcmd,type)} Imposta il comando \param{subcmd} per il
-  tipo di quote (utente o gruppo) \param{type}.
-\end{functions}
+
+{\centering
+\vspace{3pt}
+\begin{funcbox}{
+\fhead{sys/quota.h}
+\fdecl{int \macro{QCMD}(subcmd,type)}
+\fdesc{Imposta il comando \param{subcmd} per il tipo di quote (utente o
+  gruppo) \param{type}.}
+} 
+\end{funcbox}
+}
+
 \noindent che consente di specificare, oltre al tipo di operazione, se questa
 deve applicarsi alle quote utente o alle quote gruppo, nel qual
 caso \param{type} deve essere rispettivamente \const{USRQUOTA} o
@@ -6350,6 +6378,8 @@ processo con privilegi di amministratore, permettendo così una granularità
 molto più fine nella distribuzione degli stessi che evitasse la originaria
 situazione di ``\textsl{tutto o nulla}''.
 
+\itindbeg{file~capabilities}
+
 Il meccanismo completo delle \textit{capabilities}\footnote{l'implementazione
   si rifà ad una bozza di quello che doveva diventare lo standard POSIX.1e,
   poi abbandonato.} prevede inoltre la possibilità di associare le stesse ai
@@ -6390,7 +6420,7 @@ in forma di tre diverse maschere binarie,\footnote{il kernel li mantiene, come
   \texttt{kernel\_cap\_t}; questo era, fino al kernel 2.6.25 definito come
   intero a 32 bit per un massimo di 32 \textit{capabilities} distinte,
   attualmente è stato aggiornato ad un vettore in grado di mantenerne fino a
-  64.}  in cui ciascun bit corrisponde ad una capacità diversa. 
+  64.} in cui ciascun bit corrisponde ad una capacità diversa.
 
 L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile
 per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui
@@ -6695,6 +6725,9 @@ come indica chiaramente il nome, permette solo la rimozione di una
 \textit{capability} dall'insieme; per i dettagli sull'uso di tutte queste
 operazioni si rimanda alla rilettura di sez.~\ref{sec:process_prctl}.
 
+\itindend{file~capabilities}
+
+
 % TODO verificare per process capability bounding set, vedi:
 %  http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
 
@@ -6875,16 +6908,17 @@ accennato, dato che questa capacità è assente nel \textit{capabilities
   bounding set} usato di default, essa non è neanche mai stata realmente
 disponibile.
 
-Con l'introduzione \textit{file capabilities} e il cambiamento del significato
-del \textit{capabilities bounding set} la possibilità di modificare le
-capacità di altri processi è stata completamente rimossa, e
-\const{CAP\_SETPCAP} ha acquisito quello che avrebbe dovuto essere il suo
-significato originario, e cioè la capacità del processo di poter inserire nel
-suo \textit{inheritable set} qualunque capacità presente nel \textit{bounding
-  set}. Oltre a questo la disponibilità di \const{CAP\_SETPCAP} consente ad un
-processo di eliminare una capacità dal proprio \textit{bounding set} (con la
-conseguente impossibilità successiva di eseguire programmi con quella
-capacità), o di impostare i \textit{securebits} delle \textit{capabilities}.
+Con l'introduzione \itindex{file~capabilities} \textit{file capabilities} e
+il cambiamento del significato del \textit{capabilities bounding set} la
+possibilità di modificare le capacità di altri processi è stata completamente
+rimossa, e \const{CAP\_SETPCAP} ha acquisito quello che avrebbe dovuto essere
+il suo significato originario, e cioè la capacità del processo di poter
+inserire nel suo \textit{inheritable set} qualunque capacità presente nel
+\textit{bounding set}. Oltre a questo la disponibilità di \const{CAP\_SETPCAP}
+consente ad un processo di eliminare una capacità dal proprio \textit{bounding
+  set} (con la conseguente impossibilità successiva di eseguire programmi con
+quella capacità), o di impostare i \textit{securebits} delle
+\textit{capabilities}.
 
 La prima fra le capacità ``\textsl{ampie}'' che occorre dettagliare
 maggiormente è \const{CAP\_FOWNER}, che rimuove le restrizioni poste ad un
@@ -6952,20 +6986,18 @@ funzioni che permettono rispettivamente di leggere ed impostare i valori dei
 tre insiemi illustrati in precedenza. Queste due funzioni sono \funcd{capget}
 e \funcd{capset} e costituiscono l'interfaccia di gestione basso livello; i
 loro rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{sys/capability.h}
-
-  \funcdecl{int capget(cap\_user\_header\_t hdrp, cap\_user\_data\_t datap)}
-  Legge le \textit{capabilities}.
 
-  \funcdecl{int capset(cap\_user\_header\_t hdrp, const cap\_user\_data\_t
-    datap)} 
-  Imposta le \textit{capabilities}.
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int capget(cap\_user\_header\_t hdrp, cap\_user\_data\_t datap)}
+\fdesc{Legge le \textit{capabilities}.} 
+\fdecl{int capset(cap\_user\_header\_t hdrp, const cap\_user\_data\_t datap)} 
+\fdesc{Imposta le \textit{capabilities}.} 
+}
 
-  
-  \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 in caso
-    di errore, nel qual caso \var{errno} può assumere i valori:
-    \begin{errlist}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
+  \begin{errlist}
     \item[\errcode{ESRCH}] si è fatto riferimento ad un processo inesistente.
     \item[\errcode{EPERM}] si è tentato di aggiungere una capacità
       nell'insieme delle \textit{capabilities} permesse, o di impostare una
@@ -6974,9 +7006,10 @@ loro rispettivi prototipi sono:
       \textit{capability} di un altro processo senza avare
       \const{CAP\_SETPCAP}. 
   \end{errlist}
-  ed inoltre \errval{EFAULT} ed \errval{EINVAL}.
-}
-\end{functions}
+  ed inoltre  \errval{EFAULT} ed \errval{EINVAL}
+ nel loro significato generico.}
+\end{funcproto}
+
 
 Queste due funzioni prendono come argomenti due tipi di dati dedicati,
 definiti come puntatori a due strutture specifiche di Linux, illustrate in
@@ -7014,24 +7047,25 @@ utilizzare le interfacce di alto livello che vedremo più avanti.
 La struttura a cui deve puntare l'argomento \param{hdrp} serve ad indicare,
 tramite il campo \var{pid}, il PID del processo del quale si vogliono leggere
 o modificare le \textit{capabilities}. Con \func{capset} questo, se si usano
-le \textit{file capabilities}, può essere solo 0 o PID del processo chiamante,
-che sono equivalenti. Il campo \var{version} deve essere impostato al valore
-della versione delle stesse usata dal kernel (quello indicato da una delle
-costanti \texttt{\_LINUX\_CAPABILITY\_VERSION\_n} di
-fig.~\ref{fig:cap_kernel_struct}) altrimenti le funzioni ritorneranno con un
-errore di \errcode{EINVAL}, restituendo nel campo stesso il valore corretto
-della versione in uso. La versione due è comunque deprecata e non deve essere
-usata (il kernel stamperà un avviso). I valori delle \textit{capabilities}
-devono essere passati come maschere binarie;\footnote{e si tenga presente che
-  i valori di tab.~\ref{tab:proc_capabilities} non possono essere combinati
-  direttamente, indicando il numero progressivo del bit associato alla
-  relativa capacità.} con l'introduzione delle \textit{capabilities} a 64 bit
-inoltre il puntatore \param{datap} non può essere più considerato come
-relativo ad una singola struttura, ma ad un vettore di due
-strutture.\footnote{è questo cambio di significato che ha portato a deprecare
-  la versione 2, che con \func{capget} poteva portare ad un buffer overflow
-  per vecchie applicazioni che continuavano a considerare \param{datap} come
-  puntatore ad una singola struttura.}
+le \itindex{file~capabilities} \textit{file capabilities}, può essere solo 0 o
+PID del processo chiamante, che sono equivalenti. Il campo \var{version} deve
+essere impostato al valore della versione delle stesse usata dal kernel
+(quello indicato da una delle costanti
+\texttt{\_LINUX\_CAPABILITY\_VERSION\_n} di fig.~\ref{fig:cap_kernel_struct})
+altrimenti le funzioni ritorneranno con un errore di \errcode{EINVAL},
+restituendo nel campo stesso il valore corretto della versione in uso. La
+versione due è comunque deprecata e non deve essere usata (il kernel stamperà
+un avviso). I valori delle \textit{capabilities} devono essere passati come
+maschere binarie;\footnote{e si tenga presente che i valori di
+  tab.~\ref{tab:proc_capabilities} non possono essere combinati direttamente,
+  indicando il numero progressivo del bit associato alla relativa capacità.}
+con l'introduzione delle \textit{capabilities} a 64 bit inoltre il
+puntatore \param{datap} non può essere più considerato come relativo ad una
+singola struttura, ma ad un vettore di due strutture.\footnote{è questo cambio
+  di significato che ha portato a deprecare la versione 2, che con
+  \func{capget} poteva portare ad un buffer overflow per vecchie applicazioni
+  che continuavano a considerare \param{datap} come puntatore ad una singola
+  struttura.}
 
 Dato che le precedenti funzioni, oltre ad essere specifiche di Linux, non
 garantiscono la stabilità nell'interfaccia, è sempre opportuno effettuare la
@@ -7059,17 +7093,18 @@ pertanto non soltanto fornisce le funzioni per modificare e leggere le
 La prima funzione dell'interfaccia è quella che permette di inizializzare un
 \textit{capability state}, allocando al contempo la memoria necessaria per i
 relativi dati. La funzione è \funcd{cap\_init} ed il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{cap\_t cap\_init(void)} 
-  Crea ed inizializza un \textit{capability state}.
-  
-  \bodydesc{La funzione ritorna un valore non nullo in caso di successo e
-    \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà il
-    valore \errval{ENOMEM}.
-  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{cap\_t cap\_init(void)}
+\fdesc{Crea ed inizializza un \textit{capability state}.} 
+}
+
+{La funzione ritorna un valore non nullo in caso di successo e\val{NULL} per
+  un errore, nel qual caso \var{errno} potrà assumere solo il valore
+  \errval{ENOMEM}.
+}
+\end{funcproto}
 
 La funzione restituisce il puntatore \type{cap\_t} ad uno stato inizializzato
 con tutte le \textit{capabilities} azzerate. In caso di errore (cioè quando
@@ -7079,16 +7114,18 @@ mantenere i dati viene automaticamente allocata da \func{cap\_init}, ma dovrà
 essere disallocata esplicitamente quando non è più necessaria utilizzando, per
 questo l'interfaccia fornisce una apposita funzione, \funcd{cap\_free}, il cui
 prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{int cap\_free(void *obj\_d)} 
-  Disalloca la memoria allocata per i dati delle \textit{capabilities}.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà il valore \errval{EINVAL}.
-  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int cap\_free(void *obj\_d)}
+\fdesc{Disalloca la memoria allocata per i dati delle \textit{capabilities}..} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.
+}
+\end{funcproto}
+
 
 La funzione permette di liberare la memoria allocata dalle altre funzioni
 della libreria sia per un \textit{capability state}, nel qual caso l'argomento
@@ -7102,17 +7139,18 @@ fallirà con un errore di \errval{EINVAL}.
 
 Infine si può creare una copia di un \textit{capability state} ottenuto in
 precedenza tramite la funzione \funcd{cap\_dup}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{cap\_t cap\_dup(cap\_t cap\_p)} 
-  Duplica un \textit{capability state} restituendone una copia.
-  
-  \bodydesc{La funzione ritorna un valore non nullo in caso di successo e
-    \val{NULL} in caso di errore, nel qual caso \var{errno} potrà assumere i
-    valori \errval{ENOMEM} o \errval{EINVAL}.  
-  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{cap\_t cap\_dup(cap\_t cap\_p)}
+\fdesc{Duplica un \textit{capability state} restituendone una copia.} 
+}
+
+{La funzione ritorna un valore non nullo in caso di successo e \val{NULL} per
+  un errore, nel qual caso \var{errno} assumerà valori \errval{ENOMEM} o
+  \errval{EINVAL} nel loro significato generico.}
+\end{funcproto}
+
 
 La funzione crea una copia del \textit{capability state} posto all'indirizzo
 \param{cap\_p} che si è passato come argomento, restituendo il puntatore alla
@@ -7126,17 +7164,18 @@ indipendente.\footnote{alla fine delle operazioni si ricordi però di
 Una seconda classe di funzioni di servizio previste dall'interfaccia sono
 quelle per la gestione dei dati contenuti all'interno di un \textit{capability
   state}; la prima di queste è \funcd{cap\_clear}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{int cap\_clear(cap\_t cap\_p)} 
-  Inizializza un \textit{capability state} cancellando tutte le
-  \textit{capabilities}.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà il valore \errval{EINVAL}.
-  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int cap\_clear(cap\_t cap\_p)}
+\fdesc{Inizializza un \textit{capability state} cancellando tutte le
+  \textit{capabilities}.}
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.
+}
+\end{funcproto}
 
 La funzione si limita ad azzerare tutte le \textit{capabilities} presenti nel
 \textit{capability state} all'indirizzo \param{cap\_p} passato come argomento,
@@ -7165,17 +7204,18 @@ Una variante di \func{cap\_clear} è \funcd{cap\_clear\_flag} che cancella da
 un \textit{capability state} tutte le \textit{capabilities} di un certo
 insieme fra quelli di pag.~\pageref{sec:capabilities_set}, il suo prototipo
 è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{int cap\_clear\_flag(cap\_t cap\_p, cap\_flag\_t flag)} 
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int cap\_clear\_flag(cap\_t cap\_p, cap\_flag\_t flag)} 
+\fdesc{ncella dal \textit{capability state} \param{cap\_p} tutte le
+  \textit{capabilities} dell'insieme \param{flag}.} 
+}
 
-  Cancella dal \textit{capability state} \param{cap\_p} tutte le
-  \textit{capabilities} dell'insieme \param{flag}.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà il valore \errval{EINVAL}.  }
-\end{functions}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno}  potrà assumere solo il valore \errval{EINVAL}.
+}
+\end{funcproto}
 
 La funzione richiede che si indichi quale degli insiemi si intente cancellare
 con l'argomento \param{flag}. Questo deve essere specificato con una variabile
@@ -7187,15 +7227,17 @@ illustrati in tab.~\ref{tab:cap_set_identifier}.
 Si possono inoltre confrontare in maniera diretta due diversi
 \textit{capability state} con la funzione \funcd{cap\_compare}; il suo
 prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
-  \funcdecl{int cap\_compare(cap\_t cap\_a, cap\_t cap\_b)}
 
-  Confronta due \textit{capability state}.
-  
-  \bodydesc{La funzione ritorna 0 se i \textit{capability state} sono identici
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int cap\_compare(cap\_t cap\_a, cap\_t cap\_b)}
+\fdesc{Confronta due \textit{capability state}.} 
+}
+
+{La funzione ritorna $0$ se i \textit{capability state} sono identici
     ed un valore positivo se differiscono, non sono previsti errori.}
-\end{functions}
+\end{funcproto}
+
 
 La funzione esegue un confronto fra i due \textit{capability state} passati
 come argomenti e ritorna in un valore intero il risultato, questo è nullo se
@@ -7203,10 +7245,17 @@ sono identici o positivo se vi sono delle differenze. Il valore di ritorno
 della funzione consente inoltre di per ottenere ulteriori informazioni su
 quali sono gli insiemi di \textit{capabilities} che risultano differenti.  Per
 questo si può infatti usare la apposita macro \macro{CAP\_DIFFERS}:
-\begin{functions}
-  \funcdecl{int CAP\_DIFFERS(value, flag)} Controlla lo stato di eventuali
-  differenze delle \textit{capabilities} nell'insieme \texttt{flag}.
-\end{functions}
+
+{\centering
+\vspace{3pt}
+\begin{funcbox}{
+\fhead{sys/capability.h}
+\fdecl{int \macro{CAP\_DIFFERS}(value, flag)}
+\fdesc{Controlla lo stato di eventuali differenze delle \textit{capabilities}
+  nell'insieme \texttt{flag}.}
+}
+\end{funcbox}
+}
 
 La macro che richiede si passi nell'argomento \texttt{value} il risultato
 della funzione \func{cap\_compare} e in \texttt{flag} l'indicazione (coi
@@ -7219,21 +7268,21 @@ Per la gestione dei singoli valori delle \textit{capabilities} presenti in un
 \funcd{cap\_get\_flag} e \funcd{cap\_set\_flag}, che permettono
 rispettivamente di leggere o impostare il valore di una capacità all'interno
 in uno dei tre insiemi già citati; i rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{int cap\_get\_flag(cap\_t cap\_p, cap\_value\_t cap, cap\_flag\_t
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int cap\_get\_flag(cap\_t cap\_p, cap\_value\_t cap, cap\_flag\_t
     flag, cap\_flag\_value\_t *value\_p)}
-  Legge il valore di una \textit{capability}.
+\fdesc{Legge il valore di una \textit{capability}.}
+\fdecl{int cap\_set\_flag(cap\_t cap\_p, cap\_flag\_t flag, int ncap,
+  cap\_value\_t *caps, cap\_flag\_value\_t value)} 
+\fdesc{Imposta il valore di una \textit{capability}.} 
+}
 
-  \funcdecl{int cap\_set\_flag(cap\_t cap\_p, cap\_flag\_t flag, int ncap,
-    cap\_value\_t *caps, cap\_flag\_value\_t value)} 
-  Imposta il valore di una \textit{capability}.
-  
-  \bodydesc{Le funzioni ritornano 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà il valore \errval{EINVAL}.
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.  
 }
-\end{functions}
+\end{funcproto}
 
 In entrambe le funzioni l'argomento \param{cap\_p} indica il puntatore al
 \textit{capability state} su cui operare, mentre l'argomento \param{flag}
@@ -7295,19 +7344,18 @@ di un \textit{capability state} e fornisce le opportune funzioni di
 gestione;\footnote{entrambe erano previste dalla bozza dello standard
   POSIX.1e.} la prima di queste, che consente di ottenere la rappresentazione
 testuale, è \funcd{cap\_to\_text}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{char * cap\_to\_text(cap\_t caps, ssize\_t * length\_p)}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{char * cap\_to\_text(cap\_t caps, ssize\_t * length\_p)}
+\fdesc{Genera una visualizzazione testuale delle \textit{capabilities}.} 
+}
 
-  Genera una visualizzazione testuale delle \textit{capabilities}.
-  
-  \bodydesc{La funzione ritorna un puntatore alla stringa con la descrizione
-    delle \textit{capabilities} in caso di successo e \val{NULL} in caso di
-    errore, nel qual caso \var{errno} può assumere i valori \errval{EINVAL} o
-    \errval{ENOMEM}.
-  }
-\end{functions}
+{La funzione ritorna un puntatore alla stringa con la descrizione delle
+  \textit{capabilities} in caso di successo e \val{NULL} per un errore, nel
+  qual caso \var{errno} assumerà i valori \errval{EINVAL} o \errval{ENOMEM}
+  nel loro significato generico.}
+\end{funcproto}
 
 La funzione ritorna l'indirizzo di una stringa contente la descrizione
 testuale del contenuto del \textit{capability state} \param{caps} passato come
@@ -7367,17 +7415,18 @@ detto processo.
 Viceversa per passare ottenere un \textit{capability state} dalla sua
 rappresentazione testuale si può usare \funcd{cap\_from\_text}, il cui
 prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{cap\_t cap\_from\_text(const char *string)}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{cap\_t cap\_from\_text(const char *string)}
+\fdesc{Crea un \textit{capability state} dalla sua rappresentazione testuale.} 
+}
 
-  Crea un \textit{capability state} dalla sua rappresentazione testuale.
+{La funzione ritorna un puntatore valid in caso di successo e \val{NULL} per
+  un errore, nel qual caso \var{errno} assumerà i valori \errval{EINVAL} o
+  \errval{ENOMEM} nel loro significato generico.}
+\end{funcproto}
 
-  \bodydesc{La funzione ritorna un puntatore valido in caso di successo e
-    \val{NULL} in caso di errore, nel qual caso \var{errno} può assumere i
-    valori \errval{EINVAL} o \errval{ENOMEM}.}
-\end{functions}
 
 La funzione restituisce il puntatore ad un \textit{capability state}
 inizializzato con i valori indicati nella stringa \param{string} che ne
@@ -7390,20 +7439,22 @@ convertire i valori delle costanti di tab.~\ref{tab:proc_capabilities} nelle
 stringhe usate nelle rispettive rappresentazioni e viceversa. Le due funzioni,
 \funcd{cap\_to\_name} e \funcd{cap\_from\_name}, sono estensioni specifiche di
 Linux ed i rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{char * cap\_to\_name(cap\_value\_t cap)}
-  \funcdecl{int cap\_from\_name(const char *name, cap\_value\_t *cap\_p)}
-  Convertono le \textit{capabilities} dalle costanti alla rappresentazione
-  testuale e viceversa.
-  
-  \bodydesc{La funzione \func{cap\_to\_name} ritorna un valore diverso da
-    \val{NULL} in caso di successo e \val{NULL} in caso di errore, mentre
-    \func{cap\_to\_name} ritorna rispettivamente 0 e $-1$; per entrambe in
-    caso di errore \var{errno} può assumere i valori \errval{EINVAL} o
-    \errval{ENOMEM}.  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{char * cap\_to\_name(cap\_value\_t cap)}
+\fdecl{int cap\_from\_name(const char *name, cap\_value\_t *cap\_p)}
+
+\fdesc{Convertono le \textit{capabilities} dalle costanti alla rappresentazione
+  testuale e viceversa.} 
+}
+
+{La funzione \func{cap\_to\_name} ritorna un puntatore ad una stringa in caso
+  di successo e \val{NULL} per un errore, mentre \func{cap\_to\_name} ritorna
+  $0$ in caso di successo e $-1$ nel qual caso di errore, per entrambe
+  \var{errno}può assumere i valori \errval{EINVAL} o \errval{ENOMEM}.
+}
+\end{funcproto}
 
 La prima funzione restituisce la stringa (allocata automaticamente e che dovrà
 essere liberata con \func{cap\_free}) che corrisponde al valore della
@@ -7417,16 +7468,18 @@ l'interfaccia di gestione prevede però anche le funzioni per trattare le
 \textit{capabilities} presenti nei processi. La prima di queste funzioni è
 \funcd{cap\_get\_proc} che consente la lettura delle \textit{capabilities} del
 processo corrente, il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{cap\_t cap\_get\_proc(void)}
-  Legge le \textit{capabilities} del processo corrente.
-  
-  \bodydesc{La funzione ritorna un valore diverso da \val{NULL} in caso di
-    successo e \val{NULL} in caso di errore, nel qual caso \var{errno} può
-    assumere i valori \errval{EINVAL}, \errval{EPERM} o \errval{ENOMEM}.  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{cap\_t cap\_get\_proc(void)}
+\fdesc{Legge le \textit{capabilities} del processo corrente.} 
+}
+
+{La funzione ritorna un valore diverso da \val{NULL} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
+  \errval{EINVAL}, \errval{EPERM} o \errval{ENOMEM} nel loro significato
+  generico.}
+\end{funcproto}
 
 La funzione legge il valore delle \textit{capabilities} associate al processo
 da cui viene invocata, restituendo il risultato tramite il puntatore ad un
@@ -7440,17 +7493,18 @@ prototipo\footnote{su alcune pagine di manuale la funzione è descritta con un
   prototipo sbagliato, che prevede un valore di ritorno di tipo \type{cap\_t},
   ma il valore di ritorno è intero, come si può verificare anche dalla
   dichiarazione della stessa in \headfile{sys/capability.h}.} è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{int capgetp(pid\_t pid, cap\_t cap\_d)}
-  Legge le \textit{capabilities} del processo indicato da \param{pid}.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} può assumere i valori \errval{EINVAL},
-    \errval{EPERM} o \errval{ENOMEM}.  
-  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int capgetp(pid\_t pid, cap\_t cap\_d)}
+\fdesc{Legge le \textit{capabilities} di un processo.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà i valori \errval{EINVAL}, \errval{EPERM} o
+  \errval{ENOMEM} nel loro significato generico.}
+\end{funcproto}
+
 %TODO controllare e correggere i codici di errore!!!
 
 La funzione legge il valore delle \textit{capabilities} del processo indicato
@@ -7474,17 +7528,17 @@ Infine per impostare le \textit{capabilities} del processo corrente (non
 esiste una funzione che permetta di cambiare le \textit{capabilities} di un
 altro processo) si deve usare la funzione \funcd{cap\_set\_proc}, il cui
 prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{int cap\_set\_proc(cap\_t cap\_p)}
-  Imposta le \textit{capabilities} del processo corrente.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} può assumere i valori \errval{EINVAL},
-    \errval{EPERM} o \errval{ENOMEM}.  
-  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int cap\_set\_proc(cap\_t cap\_p)}
+\fdesc{Imposta le \textit{capabilities} del processo corrente.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà i valori \errval{EINVAL}, \errval{EPERM} o
+  \errval{ENOMEM} nel loro significato generico.}
+\end{funcproto}
 
 La funzione modifica le \textit{capabilities} del processo corrente secondo
 quanto specificato con l'argomento \param{cap\_p}, posto che questo sia
@@ -7581,27 +7635,31 @@ dalla stessa directory, che corrisponde alla radice del sistema.
 In certe situazioni però è utile poter impedire che un processo possa accedere
 a tutto il filesystem; per far questo si può cambiare la sua directory radice
 con la funzione \funcd{chroot}, il cui prototipo è:
-\begin{prototype}{unistd.h}{int chroot(const char *path)}
-  Cambia la directory radice del processo a quella specificata da
-  \param{path}.
-  
-\bodydesc{La funzione restituisce zero in caso di successo e -1 per
-    un errore, in caso di errore \var{errno} può assumere i valori:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int chroot(const char *path)}
+\fdesc{Cambia la directory radice del processo.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EPERM}] l'\ids{UID} effettivo del processo non è zero.
   \end{errlist}
-  ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
+  ed inoltre errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
   \errval{ENOMEM}, \errval{ENOTDIR}, \errval{EACCES}, \errval{ELOOP};
-  \errval{EROFS} e \errval{EIO}.}
-\end{prototype}
-\noindent in questo modo la directory radice del processo diventerà
+  \errval{EROFS} e \errval{EIO} nel loro significato generico.}
+\end{funcproto}
+
+La funzione  la directory radice del processo a quella specificata da
 \param{path} (che ovviamente deve esistere) ed ogni
-\itindsub{pathname}{assoluto}\textit{pathname} assoluto usato dalle funzioni
+\itindsub{pathname}{assoluto} \textit{pathname} assoluto usato dalle funzioni
 chiamate nel processo sarà risolto a partire da essa, rendendo impossibile
 accedere alla parte di albero sovrastante.  Si ha così quella che viene
 chiamata una \textit{chroot jail}, in quanto il processo non può più accedere
 a file al di fuori della sezione di albero in cui è stato
-\textsl{imprigionato}. 
+\textsl{imprigionato}.
 
 Solo un processo con i privilegi di amministratore può usare questa funzione,
 e la nuova radice, per quanto detto in sez.~\ref{sec:proc_fork}, sarà ereditata