Aggiornamento note copyright e I/O Asyncrono
[gapil.git] / filedir.tex
index 36453cb1e6a8619c8419a0bf19e11b77e8aa0a7b..e174c5bb37040e7778c9677d6dfdca6bf86cbd27 100644 (file)
@@ -1,6 +1,6 @@
 %% filedir.tex
 %%
-%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2015 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -78,7 +78,7 @@ verrà inserita nella tabella, ed il nuovo filesystem comparirà in
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/file_system_type.h}
   \end{minipage}
   \normalsize 
@@ -178,7 +178,7 @@ struttura viene allocata e trascritti all'indietro se modificati.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/inode.h}
   \end{minipage}
   \normalsize 
@@ -213,7 +213,7 @@ tab.~\ref{tab:file_inode_operations} le più rilevanti.
     \hline
     \hline
     \textsl{\code{create}} & Chiamata per creare un nuovo file (vedi
-                             sez.~\ref{sec:file_open}).\\ 
+                             sez.~\ref{sec:file_open_close}).\\ 
     \textsl{\code{link}}   & Crea un \textit{hard link} (vedi
                              sez.~\ref{sec:link_symlink_rename}).\\
     \textsl{\code{unlink}} & Cancella un \textit{hard link} (vedi
@@ -260,13 +260,13 @@ tab.~\ref{tab:file_file_operations}.\footnote{essa può essere comunque
   detta funzione.} Questo avviene perché su Linux l'apertura di un file
 richiede comunque un'altra operazione che mette in gioco l'omonimo oggetto del
 VFS: l'allocazione di una struttura di tipo \kstruct{file} che viene associata
-ad ogni file aperto nel sistema.
-
-I motivi per cui viene usata una struttura a parte sono diversi, anzitutto,
-come illustrato in sez.~\ref{sec:file_fd}, questa è necessaria per le
-operazioni eseguite dai processi con l'interfaccia dei file descriptor; ogni
-processo infatti mantiene il riferimento ad una struttura \kstruct{file} per
-ogni file che ha aperto, ed è tramite essa che esegue le operazioni di I/O.
+ad ogni file aperto nel sistema.  I motivi per cui viene usata una struttura a
+parte sono diversi, anzitutto, come illustrato in sez.~\ref{sec:file_fd},
+questa è necessaria per le operazioni eseguite dai processi con l'interfaccia
+dei file descriptor. Ogni processo infatti mantiene il riferimento ad una
+struttura \kstruct{file} per ogni file che ha aperto, ed è tramite essa che
+esegue le operazioni di I/O. Inoltre il kernel mantiene un elenco di tutti i
+file aperti nella \itindex{file~table} \textit{file table}.
 
 Inoltre se le operazioni relative agli \textit{inode} fanno riferimento ad
 oggetti posti all'interno di un filesystem e vi si applicano quindi le
@@ -279,7 +279,7 @@ di dati) dovrà invece ricorrere a quelle fornite dal driver del dispositivo.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/file.h}
   \end{minipage}
   \normalsize 
@@ -304,14 +304,15 @@ tab.~\ref{tab:file_file_operations} le più significative.
     \textbf{Funzione} & \textbf{Operazione} \\
     \hline
     \hline
-    \textsl{\code{open}}   & Apre il file (vedi sez.~\ref{sec:file_open}).\\
+    \textsl{\code{open}}   & Apre il file (vedi
+                             sez.~\ref{sec:file_open_close}).\\ 
     \textsl{\code{read}}   & Legge dal file (vedi sez.~\ref{sec:file_read}).\\
     \textsl{\code{write}}  & Scrive sul file (vedi 
                              sez.~\ref{sec:file_write}).\\
     \textsl{\code{llseek}} & Sposta la posizione corrente sul file (vedi
                              sez.~\ref{sec:file_lseek}).\\
     \textsl{\code{ioctl}}  & Accede alle operazioni di controllo 
-                             (vedi sez.~\ref{sec:file_ioctl}).\\
+                             (vedi sez.~\ref{sec:file_fcntl_ioctl}).\\
     \textsl{\code{readdir}}& Legge il contenuto di una directory (vedi 
                              sez.~\ref{sec:file_dir_read}).\\
     \textsl{\code{poll}}   & Usata nell'I/O multiplexing (vedi
@@ -812,7 +813,7 @@ nell'elenco seguente:
   tutte le directory del filesystem, ma su alcuni filesystem è possibile
   impostarla a livello di singole directory o per i sottorami di una directory
   con il comando \cmd{chattr}.\footnote{questo avviene tramite delle opportune
-    \texttt{ioctl} (vedi sez.~\ref{sec:file_ioctl}).}
+    \texttt{ioctl} (vedi sez.~\ref{sec:file_fcntl_ioctl}).}
 
   Questo consente di ridurre al minimo il rischio di perdita dei dati delle
   directory in caso di crollo improvviso del sistema, al costo di una certa
@@ -865,8 +866,8 @@ nell'elenco seguente:
   il controllo dei contenuti, in particolar modo quelli posti su dispositivi
   rimuovibili. In questo modo si evitano alla radice possibili situazioni in
   cui un utente malizioso inserisce su uno di questi filesystem dei file di
-  dispositivo con permessi ``opportunamente'' ampliati che gli consentano di
-  accedere anche a risorse cui non dovrebbe.
+  dispositivo con permessi ``opportunamente'' ampliati che gli consentirebbero
+  di accedere anche a risorse cui non dovrebbe.
 
 \item[\const{MS\_NODIRATIME}] Viene disabilitato sul filesystem
   l'aggiornamento degli \textit{access time} (vedi
@@ -1031,7 +1032,7 @@ nell'elenco seguente:
 \item[\const{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona richiedendo che
   ogni modifica al contenuto del filesystem venga immediatamente registrata su
   disco. Lo stesso comportamento può essere ottenuto con il flag
-  \const{O\_SYNC} di \func{open} (vedi sez.~\ref{sec:file_open}).
+  \const{O\_SYNC} di \func{open} (vedi sez.~\ref{sec:file_open_close}).
 
   Questa opzione consente di ridurre al minimo il rischio di perdita dei dati
   in caso di crollo improvviso del sistema, al costo di una pesante perdita di
@@ -1095,7 +1096,7 @@ prototipo è:
 \end{funcproto}
 
 \footnotetext{più precisamente la \itindex{capabilities} capacità
-  \const{CAP\_SYS\_ADMIN}.}
+  \const{CAP\_SYS\_ADMIN}, vedi sez.~\ref{sec:proc_capabilities}.}
 
 La funzione prende il nome della directory su cui il filesystem è montato e
 non il file o il dispositivo che è stato montato,\footnote{questo è vero a
@@ -1122,11 +1123,11 @@ un filesystem anche quando questo risulti occupato; il suo prototipo è:
 {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{EAGAIN}] si è chiamata la funzione con \const{MNT\_EXPIRE}
+       ed il filesystem non era occupato.
      \item[\errcode{EBUSY}] \param{target} è la \index{directory~di~lavoro}
        directory di lavoro di qualche processo, o contiene dei file aperti, o un
        altro mount point.
-     \item[\errcode{EAGAIN}] si è chiamata la funzione con \const{MNT\_EXPIRE}
-       ed il filesystem non era occupato.
      \item[\errcode{EINVAL}] \param{target} non è un \itindex{mount~point}
        \textit{mount point} o si è usato \const{MNT\_EXPIRE} con
        \const{MNT\_FORCE} o \const{MNT\_DETACH} o si è specificato un flag non
@@ -1152,18 +1153,18 @@ eseguita una sincronizzazione dei dati.
     \textbf{Costante} & \textbf{Descrizione}\\
     \hline
     \hline
-    \const{MNT\_FORCE}  & forza lo smontaggio del filesystem anche se questo è
+    \const{MNT\_FORCE}  & Forza lo smontaggio del filesystem anche se questo è
                           occupato (presente dai kernel della serie 2.2).\\
-    \const{MNT\_DETACH} & esegue uno smontaggio ``\textsl{pigro}'', in cui si
+    \const{MNT\_DETACH} & Esegue uno smontaggio ``\textsl{pigro}'', in cui si
                           blocca l'accesso ma si aspetta che il filesystem si
                           liberi (presente dal kernel 2.4.11 e dalla
                           \acr{glibc} 2.11).\\ 
-    \const{MNT\_EXPIRE} & se non occupato marca un \itindex{mount~point} 
+    \const{MNT\_EXPIRE} & Se non occupato marca un \itindex{mount~point} 
                           \textit{mount point} come ``\textsl{in scadenza}'' in
                           modo che ad una successiva chiamata senza utilizzo
                           del filesystem questo venga smontato (presente dal
                           kernel 2.6.8 e dalla \acr{glibc} 2.11).\\ 
-    \const{UMOUNT\_NOFOLLOW}& non dereferenzia \param{target} se questo è un
+    \const{UMOUNT\_NOFOLLOW}& Non dereferenzia \param{target} se questo è un
                           collegamento simbolico (vedi
                           sez.~\ref{sec:link_symlink_rename}) evitando
                           problemi di sicurezza (presente dal kernel 2.6.34).\\ 
@@ -1243,7 +1244,7 @@ del filesystem stesso.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/statfs.h}
   \end{minipage}
   \normalsize 
@@ -1546,8 +1547,8 @@ Si noti che non si è specificato il comportamento delle funzioni che operano
 con i file descriptor (che tratteremo nel prossimo capitolo), in quanto la
 risoluzione del collegamento simbolico viene in genere effettuata dalla
 funzione che restituisce il file descriptor (normalmente la \func{open}, vedi
-sez.~\ref{sec:file_open}) e tutte le operazioni seguenti fanno riferimento
-solo a quest'ultimo.
+sez.~\ref{sec:file_open_close}) e tutte le operazioni seguenti fanno
+riferimento solo a quest'ultimo.
 
 Dato che, come indicato in tab.~\ref{tab:file_symb_effect}, funzioni come la
 \func{open} seguono i collegamenti simbolici, occorrono funzioni apposite per
@@ -1622,26 +1623,22 @@ Un altro punto da tenere sempre presente è che, come abbiamo accennato, un
 collegamento simbolico può fare riferimento anche ad un file che non esiste;
 ad esempio possiamo usare il comando \cmd{ln} per creare un collegamento
 simbolico nella nostra directory con:
-\begin{Command}
-$ ln -s /tmp/tmp_file symlink
-\end{Command}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ln -s /tmp/tmp_file symlink}
+\end{Console}
 %$
 e questo avrà successo anche se \file{/tmp/tmp\_file} non esiste:
-\begin{Command}
-$ ls symlink
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ls symlink}
 symlink
-\end{Terminal}
+\end{Console}
 %$
 ma questo può generare confusione, perché accedendo in sola lettura a
 \file{symlink}, ad esempio con \cmd{cat}, otterremmo un errore:
-\begin{Command}
-$ cat symlink
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{cat symlink}
 cat: symlink: No such file or directory
-\end{Terminal}
+\end{Console}
 %$
 con un errore che può sembrare sbagliato, dato che \cmd{ls} ci ha mostrato
 l'esistenza di \file{symlink}, se invece scrivessimo su \file{symlink}
@@ -1672,8 +1669,8 @@ nome come si può notare ha poco a che fare con il concetto di rimozione, è
 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
   nel qual caso \var{errno} assumerà uno dei valori:\footnotemark  
   \begin{errlist}
-  \item[\errcode{EACCES}] non si ha il permesso di scrivere sulla directory
-    contenente \param{pathname} o di attraversamento di una delle directory
+  \item[\errcode{EACCES}] non si ha il permesso di scrittura sulla directory
+    che contiene \param{pathname} o di attraversamento di una delle directory
     superiori. 
   \item[\errcode{EISDIR}] \param{pathname} si riferisce ad una
     directory.
@@ -1722,7 +1719,7 @@ sono stati cancellati: solo quando il numero di collegamenti mantenuto
 lo spazio occupato su disco viene liberato. Si tenga presente comunque che a
 questo si aggiunge sempre un'ulteriore condizione e cioè che non ci siano
 processi che abbiano il suddetto file aperto.\footnote{come vedremo in
-  cap.~\ref{cha:file_unix_interface} il kernel mantiene anche una tabella dei
+  sez.~\ref{sec:file_unix_interface} il kernel mantiene anche una tabella dei
   file aperti nei vari processi, che a sua volta contiene i riferimenti agli
   \itindex{inode} \textit{inode} ad essi relativi; prima di procedere alla
   cancellazione dello spazio occupato su disco dal contenuto di un file il
@@ -1789,13 +1786,13 @@ sistema \funcd{rename},\footnote{la funzione è definita dallo standard ANSI C,
     parte di qualche processo (come \index{directory~di~lavoro} directory di
     lavoro o come radice) o del sistema (come \itindex{mount~point}
     \textit{mount point}) ed il sistema non riesce a risolvere la situazione.
+  \item[\errcode{EEXIST}] \param{newpath} è una directory già esistente e
+    non è vuota (anche \errcode{ENOTEMPTY}).
   \item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di
     \param{oldpath} o più in generale si è cercato di creare una directory come
     sotto-directory di sé stessa.
   \item[\errcode{EISDIR}] \param{newpath} è una directory mentre
     \param{oldpath} non è una directory.
-  \item[\errcode{EEXIST}] \param{newpath} è una directory già esistente e
-    non è vuota (anche \errcode{ENOTEMPTY}).
   \item[\errcode{ENOTDIR}] uno dei componenti dei \textit{pathname} non è una
     directory o \param{oldpath} è una directory e 
     \param{newpath} esiste e non è una directory.
@@ -1943,11 +1940,11 @@ necessaria una specifica funzione di sistema, \funcd{rmdir}, il suo prototipo
     che contiene la directory che si vuole cancellare, o non c'è il permesso
     di attraversare (esecuzione) una delle directory specificate in
     \param{dirname}.
-  \item[\errcode{EINVAL}] si è usato ``\texttt{.}'' come ultimo componente
-    di \param{dirname}.
   \item[\errcode{EBUSY}] la directory specificata è la
     \index{directory~di~lavoro} directory di lavoro o la radice di qualche
     processo o un \itindex{mount~point} \textit{mount point}.
+  \item[\errcode{EINVAL}] si è usato ``\texttt{.}'' come ultimo componente
+    di \param{dirname}.
   \item[\errcode{EPERM}] il filesystem non supporta la cancellazione di
     directory, oppure la directory che contiene \param{dirname} ha lo
     \itindex{sticky~bit} \textit{sticky bit} impostato e non si è i
@@ -1988,11 +1985,12 @@ con le usuali funzioni di scrittura.
 Ma se la scrittura e l'aggiornamento dei dati delle directory è compito del
 kernel, sono molte le situazioni in cui i processi necessitano di poterne
 leggere il contenuto. Benché questo possa essere fatto direttamente (vedremo
-in sez.~\ref{sec:file_open} che è possibile aprire una directory come se fosse
-un file, anche se solo in sola lettura) in generale il formato con cui esse
-sono scritte può dipendere dal tipo di filesystem, tanto che, come riportato
-in tab.~\ref{tab:file_file_operations}, il \itindex{Virtual~File~System} VFS
-prevede una apposita funzione per la lettura delle directory.
+in sez.~\ref{sec:file_open_close} che è possibile aprire una directory come se
+fosse un file, anche se solo in sola lettura) in generale il formato con cui
+esse sono scritte può dipendere dal tipo di filesystem, tanto che, come
+riportato in tab.~\ref{tab:file_file_operations}, il
+\itindex{Virtual~File~System} VFS prevede una apposita funzione per la lettura
+delle directory.
 
 \itindbeg{directory~stream}
 
@@ -2001,7 +1999,7 @@ Tutto questo si riflette nello standard POSIX\footnote{le funzioni erano
 che ha introdotto una apposita interfaccia per la lettura delle directory,
 basata sui cosiddetti \textit{directory stream}, chiamati così per l'analogia
 con i \textit{file stream} dell'interfaccia standard ANSI C che vedremo in
-cap.~\ref{cha:files_std_interface}. La prima funzione di questa interfaccia è
+sez.~\ref{sec:files_std_interface}. La prima funzione di questa interfaccia è
 \funcd{opendir}, il cui prototipo è:
 
 \begin{funcproto}{
@@ -2166,7 +2164,7 @@ restituito il valore \val{NULL}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/dirent.c}
   \end{minipage} 
   \normalsize 
@@ -2224,8 +2222,8 @@ Ottenuta allora con \code{offsetof(struct dirent, d\_name)} la dimensione
 della parte iniziale della struttura, basterà sommarci la dimensione massima
 dei nomi dei file nel filesystem che si sta usando, che si può ottenere
 attraverso la funzione \func{pathconf} (per la quale si rimanda a
-sez.~\ref{sec:sys_pathconf}) più un ulteriore carattere per la terminazione
-della stringa. 
+sez.~\ref{sec:sys_file_limits}) più un ulteriore carattere per la terminazione
+della stringa.
 
 Per quanto riguarda il significato dei campi opzionali, il campo \var{d\_type}
 indica il tipo di file (se fifo, directory, collegamento simbolico, ecc.), e
@@ -2444,10 +2442,10 @@ la stampa della sintassi, anch'essa omessa, ma il codice completo può essere
 trovato coi sorgenti allegati alla guida nel file \file{myls.c}.
 
 In sostanza tutto quello che fa il programma, dopo aver controllato
-(\texttt{\small 12--15}) di avere almeno un argomento, che indicherà la
+(\texttt{\small 12-15}) di avere almeno un argomento, che indicherà la
 directory da esaminare, è chiamare (\texttt{\small 16}) la funzione
 \myfunc{dir\_scan} per eseguire la scansione, usando la funzione \code{do\_ls}
-(\texttt{\small 22--29}) per fare tutto il lavoro.
+(\texttt{\small 22-29}) per fare tutto il lavoro.
 
 Quest'ultima si limita (\texttt{\small 26}) a chiamare \func{stat} sul file
 indicato dalla directory entry passata come argomento (il cui nome è appunto
@@ -2474,15 +2472,15 @@ Tutto il grosso del lavoro è svolto dalla funzione \myfunc{dir\_scan},
 riportata in fig.~\ref{fig:file_dirscan}. La funzione è volutamente generica e
 permette di eseguire una funzione, passata come secondo argomento, su tutte le
 voci di una directory.  La funzione inizia con l'aprire (\texttt{\small
-  18--22}) uno \textit{stream} sulla directory passata come primo argomento,
+  18-22}) uno \textit{stream} sulla directory passata come primo argomento,
 stampando un messaggio in caso di errore.
 
-Il passo successivo (\texttt{\small 23--24}) è cambiare
+Il passo successivo (\texttt{\small 23-24}) è cambiare
 \index{directory~di~lavoro} directory di lavoro (vedi
 sez.~\ref{sec:file_work_dir}), usando in sequenza le funzioni \func{dirfd} e
 \func{fchdir} (in realtà si sarebbe potuto usare direttamente \func{chdir} su
 \var{dirname}), in modo che durante il successivo ciclo (\texttt{\small
-  26--30}) sulle singole voci dello \textit{stream} ci si trovi all'interno
+  26-30}) sulle singole voci dello \textit{stream} ci si trovi all'interno
 della directory.\footnote{questo è essenziale al funzionamento della funzione
   \code{do\_ls}, e ad ogni funzione che debba usare il campo \var{d\_name}, in
   quanto i nomi dei file memorizzati all'interno di una struttura
@@ -2619,7 +2617,7 @@ appunto per \textit{change directory}, il suo prototipo è:
     di \param{pathname}.
   \item[\errcode{ENOTDIR}] non si è specificata una directory.
   \end{errlist}
-  ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{EIO},
+  ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
   \errval{ENAMETOOLONG}, \errval{ENOENT} e \errval{ENOMEM} nel loro
   significato generico.}
 \end{funcproto}
@@ -3002,9 +3000,9 @@ prototipo è:
   errore, nel qual 
   caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-    \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
     \item[\errcode{EEXIST}] non è riuscita a creare un file temporaneo, il
       contenuto di \param{template} è indefinito.
+    \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
   \end{errlist}}
 \end{funcproto}
 
@@ -3012,8 +3010,8 @@ prototipo è:
 Come per \func{mktemp} anche in questo caso \param{template} non può essere
 una stringa costante. La funzione apre un file in lettura/scrittura con la
 funzione \func{open}, usando l'opzione \const{O\_EXCL} (si veda
-sez.~\ref{sec:file_open}), in questo modo al ritorno della funzione si ha la
-certezza di essere stati i creatori del file, i cui permessi (si veda
+sez.~\ref{sec:file_open_close}), in questo modo al ritorno della funzione si
+ha la certezza di essere stati i creatori del file, i cui permessi (si veda
 sez.~\ref{sec:file_perm_overview}) sono impostati al valore \code{0600}
 (lettura e scrittura solo per il proprietario).\footnote{questo è vero a
   partire dalla \acr{glibc} 2.0.7, le versioni precedenti della \acr{glibc} e
@@ -3057,11 +3055,11 @@ In OpenBSD è stata introdotta un'altra funzione simile alle precedenti,
   più gli altri eventuali codici di errore di \func{mkdir}.}
 \end{funcproto}
 
-La funzione genera una directory il cui nome è ottenuto sostituendo le
-\code{XXXXXX} finali di \param{template} con permessi \code{0700} (al solito
-si veda cap.~\ref{cha:file_unix_interface} per i dettagli). Dato che la
-creazione della directory è sempre esclusiva i precedenti problemi di
-\itindex{race~condition} \textit{race condition} non si pongono.
+La funzione crea una directory temporanea il cui nome è ottenuto sostituendo
+le \code{XXXXXX} finali di \param{template} con permessi \code{0700} (si veda
+sez.~\ref{sec:file_perm_overview} per i dettagli). Dato che la creazione della
+directory è sempre esclusiva i precedenti problemi di \itindex{race~condition}
+\textit{race condition} non si pongono.
 
 
 
@@ -3132,7 +3130,7 @@ sez.~\ref{sec:file_file_times}).
 \begin{figure}[!htb]
   \footnotesize
   \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/stat.h}
   \end{minipage} 
   \normalsize 
@@ -3149,7 +3147,7 @@ introdotti per rendersi indipendenti dalla piattaforma.
 
 Benché la descrizione dei commenti di fig.~\ref{fig:file_stat_struct} sia
 abbastanza chiara, vale la pena illustrare maggiormente il significato dei
-campi di \structd{stat} su cui non torneremo in maggior dettaglio nel resto di
+campi di \struct{stat} su cui non torneremo in maggior dettaglio nel resto di
 questa sezione:
 \begin{itemize*}
 
@@ -3209,13 +3207,13 @@ tipo di file in maniera standardizzata.
     \textbf{Macro} & \textbf{Tipo del file} \\
     \hline
     \hline
-    \macro{S\_ISREG}\texttt{(m)}  & file normale.\\
-    \macro{S\_ISDIR}\texttt{(m)}  & directory.\\
-    \macro{S\_ISCHR}\texttt{(m)}  & dispositivo a caratteri.\\
-    \macro{S\_ISBLK}\texttt{(m)}  & dispositivo a blocchi.\\
-    \macro{S\_ISFIFO}\texttt{(m)} & fifo.\\
-    \macro{S\_ISLNK}\texttt{(m)}  & collegamento simbolico.\\
-    \macro{S\_ISSOCK}\texttt{(m)} & socket.\\
+    \macro{S\_ISREG}\texttt{(m)}  & File normale.\\
+    \macro{S\_ISDIR}\texttt{(m)}  & Directory.\\
+    \macro{S\_ISCHR}\texttt{(m)}  & Dispositivo a caratteri.\\
+    \macro{S\_ISBLK}\texttt{(m)}  & Dispositivo a blocchi.\\
+    \macro{S\_ISFIFO}\texttt{(m)} & Fifo.\\
+    \macro{S\_ISLNK}\texttt{(m)}  & Collegamento simbolico.\\
+    \macro{S\_ISSOCK}\texttt{(m)} & Socket.\\
     \hline    
   \end{tabular}
   \caption{Macro per i tipi di file (definite in \headfile{sys/stat.h}).}
@@ -3248,9 +3246,11 @@ come argomento il valore di \var{st\_mode}.
     \const{S\_IFCHR}  &  0020000 & Dispositivo a caratteri.\\
     \const{S\_IFIFO}  &  0010000 & Fifo.\\
     \hline
-    \const{S\_ISUID}  &  0004000 & \itindex{suid~bit} \acr{suid} bit.\\
-    \const{S\_ISGID}  &  0002000 & \itindex{sgid~bit} \acr{sgid} bit.\\
-    \const{S\_ISVTX}  &  0001000 & \itindex{sticky~bit} \acr{sticky} bit.\\
+    \const{S\_ISUID}  &  0004000 & Set user ID \itindex{suid~bit} (\acr{suid})
+                                   bit.\\ 
+    \const{S\_ISGID}  &  0002000 & Set group ID \itindex{sgid~bit}
+                                   (\acr{sgid}) bit.\\
+    \const{S\_ISVTX}  &  0001000 & \itindex{sticky~bit} \acr{Sticky} bit.\\
     \hline
     \const{S\_IRWXU}  &  00700   & Maschera per i permessi del proprietario.\\
     \const{S\_IRUSR}  &  00400   & Il proprietario ha permesso di lettura.\\
@@ -3628,7 +3628,7 @@ puntatore nullo verrà impostato il tempo corrente.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/utimbuf.h}
   \end{minipage} 
   \normalsize 
@@ -3643,9 +3643,9 @@ tempo corrente ed è sufficiente avere accesso in scrittura al file o essere
 proprietari del file o avere i privilegi di amministratore. Se invece si è
 specificato un valore diverso la funzione avrà successo solo se si è
 proprietari del file o se si hanno i privilegi di amministratore.\footnote{per
-  essere precisi la \itindex{capabilities} capacità \const{CAP\_FOWNER}.} In
-entrambi i casi per verificare la proprietà del file viene utilizzato
-l'\ids{UID} effettivo del processo.
+  essere precisi la \itindex{capabilities} capacità \const{CAP\_FOWNER}, vedi
+  sez.~\ref{sec:proc_capabilities}.} In entrambi i casi per verificare la
+proprietà del file viene utilizzato l'\ids{UID} effettivo del processo.
 
 Si tenga presente che non è possibile modificare manualmente il tempo di
 cambiamento di stato del file, che viene aggiornato direttamente dal kernel
@@ -3694,7 +3694,7 @@ puntatore nullo di nuovo verrà utilizzato il tempo corrente.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/timeval.h}
   \end{minipage} 
   \normalsize 
@@ -3787,7 +3787,7 @@ un valore dei tempi con una precisione fino al nanosecondo.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/timespec.h}
   \end{minipage} 
   \normalsize 
@@ -3984,7 +3984,7 @@ crearlo o rinominarlo o cancellarlo invece occorrerà avere anche il permesso
 di scrittura per la directory.
 
 Avere il permesso di lettura per un file consente di aprirlo con le opzioni
-(si veda quanto riportato in tab.~\ref{tab:file_open_flags}) di sola lettura o
+(si veda quanto riportato in sez.~\ref{sec:file_open_close}) di sola lettura o
 di lettura/scrittura e leggerne il contenuto. Avere il permesso di scrittura
 consente di aprire un file in sola scrittura o lettura/scrittura e modificarne
 il contenuto, lo stesso permesso è necessario per poter troncare il file o per
@@ -4109,9 +4109,10 @@ Entrambi questi attributi attivano queste restrizioni a livello di filesystem,
 per cui a differenza dei permessi ordinari esse varranno per qualunque utente
 compreso l'amministratore. L'amministratore è l'unico che può attivare o
 disattivare questi attributi,\footnote{più precisamente un processo con la
-  \itindex{capabilities} capacità \const{CAP\_LINUX\_IMMUTABLE}.} e potendo
-rimuoverli è comunque capace di tornare in grado di eseguire qualunque
-operazione su un file immutabile o \textit{append-only}.
+  \itindex{capabilities} capacità \const{CAP\_LINUX\_IMMUTABLE}, vedi
+  sez.~\ref{sec:proc_capabilities}.} e potendo rimuoverli è comunque capace di
+tornare in grado di eseguire qualunque operazione su un file immutabile o
+\textit{append-only}.
 
 \itindend{file~attributes}
 
@@ -4228,12 +4229,10 @@ condizioni:
 
 Un classico esempio di directory che ha questo bit impostato è \file{/tmp}, i
 cui permessi infatti di solito sono i seguenti:
-\begin{Command}
-$ ls -ld /tmp
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ls -ld /tmp}
 drwxrwxrwt    6 root     root         1024 Aug 10 01:03 /tmp
-\end{Terminal}
+\end{Console}
 %$
 quindi con lo \textit{sticky bit} bit impostato. In questo modo qualunque
 utente nel sistema può creare dei file in questa directory, che come
@@ -4384,9 +4383,9 @@ file.
     \textbf{\param{mode}} & \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{S\_ISUID} & 04000 & Set user ID \itindex{suid~bit}.\\
-    \const{S\_ISGID} & 02000 & Set group ID \itindex{sgid~bit}.\\
-    \const{S\_ISVTX} & 01000 & Sticky bit \itindex{sticky~bit}.\\
+    \const{S\_ISUID} & 04000 & Set user ID \itindex{suid~bit} bit.\\
+    \const{S\_ISGID} & 02000 & Set group ID \itindex{sgid~bit} bit.\\
+    \const{S\_ISVTX} & 01000 & Sticky \itindex{sticky~bit} bit.\\
     \hline
     \const{S\_IRWXU} & 00700 & L'utente ha tutti i permessi.\\
     \const{S\_IRUSR} & 00400 & L'utente ha il permesso di lettura.\\
@@ -4465,11 +4464,11 @@ un'eventuale modifica comporterà la perdita di questo privilegio.
 Le funzioni \func{chmod} e \func{fchmod} ci permettono di modificare i
 permessi di un file, resta però il problema di quali sono i permessi assegnati
 quando il file viene creato. Le funzioni dell'interfaccia nativa di Unix, come
-vedremo in sez.~\ref{sec:file_open}, permettono di indicare esplicitamente i
-permessi di creazione di un file, ma questo non è possibile per le funzioni
-dell'interfaccia standard ANSI C che non prevede l'esistenza di utenti e
-gruppi, ed inoltre il problema si pone anche per l'interfaccia nativa quando i
-permessi non vengono indicati esplicitamente. 
+vedremo in sez.~\ref{sec:file_open_close}, permettono di indicare
+esplicitamente i permessi di creazione di un file, ma questo non è possibile
+per le funzioni dell'interfaccia standard ANSI C che non prevede l'esistenza
+di utenti e gruppi, ed inoltre il problema si pone anche per l'interfaccia
+nativa quando i permessi non vengono indicati esplicitamente.
 
 \itindbeg{umask} 
 
@@ -4517,7 +4516,7 @@ utenti non hanno motivi per modificarlo.
 \subsection{La gestione della titolarità dei file}
 \label{sec:file_ownership_management}
 
-Vedremo in sez.~\ref{sec:file_base_func} con quali funzioni si possono creare
+Vedremo in sez.~\ref{sec:file_open_close} con quali funzioni si possono creare
 nuovi file, in tale occasione vedremo che è possibile specificare in sede di
 creazione quali permessi applicare ad un file, però non si può indicare a
 quale utente e gruppo esso deve appartenere.  Lo stesso problema si presenta
@@ -5184,7 +5183,7 @@ costituita da un \textsl{tipo}, da un eventuale
   tipo \const{ACL\_USER} e \const{ACL\_GROUP}.} e da un insieme di permessi.
 Ad ogni oggetto sul filesystem si può associare una ACL che ne governa i
 permessi di accesso, detta \textit{access ACL}.  Inoltre per le directory si
-può impostare una ACL aggiuntiva, detta \textit{default ACL}, che serve ad
+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
@@ -5198,21 +5197,21 @@ la capacità \itindex{capabilities} \const{CAP\_FOWNER}.
     \textbf{Tipo} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{ACL\_USER\_OBJ} & voce che contiene i diritti di accesso del
+    \const{ACL\_USER\_OBJ} & Voce che contiene i diritti di accesso del
                              proprietario del file.\\
-    \const{ACL\_USER}      & voce che contiene i diritti di accesso per
+    \const{ACL\_USER}      & Voce che contiene i diritti di accesso per
                              l'utente indicato dal rispettivo
                              qualificatore.\\  
-    \const{ACL\_GROUP\_OBJ}& voce che contiene i diritti di accesso del
+    \const{ACL\_GROUP\_OBJ}& Voce che contiene i diritti di accesso del
                              gruppo proprietario del file.\\
-    \const{ACL\_GROUP}     & voce che contiene i diritti di accesso per
+    \const{ACL\_GROUP}     & Voce che contiene i diritti di accesso per
                              il gruppo indicato dal rispettivo
                              qualificatore.\\
-    \const{ACL\_MASK}      & voce che contiene la maschera dei massimi
+    \const{ACL\_MASK}      & Voce che contiene la maschera dei massimi
                              permessi di accesso che possono essere garantiti
                              da voci del tipo \const{ACL\_USER},
                              \const{ACL\_GROUP} e \const{ACL\_GROUP\_OBJ}.\\
-    \const{ACL\_OTHER}     & voce che contiene i diritti di accesso di chi
+    \const{ACL\_OTHER}     & Voce che contiene i diritti di accesso di chi
                              non corrisponde a nessuna altra voce dell'ACL.\\
     \hline
   \end{tabular}
@@ -5242,7 +5241,7 @@ 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
+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
@@ -5251,7 +5250,7 @@ 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
 quello della corrispondenza fra questi e le ACL. Come accennato i permessi
-ordinari vengono mappati le tre voci di tipo \const{ACL\_USER\_OBJ},
+ordinari vengono mappati nelle 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 e viceversa.\footnote{per permessi
@@ -5275,10 +5274,10 @@ file) tutti quelli non presenti in \const{ACL\_MASK}.\footnote{questo diverso
 Un secondo aspetto dell'incidenza delle ACL sul comportamento del sistema è
 quello relativo alla creazione di nuovi file,\footnote{o oggetti sul
   filesystem, il comportamento discusso vale per le funzioni \func{open} e
-  \func{creat} (vedi sez.~\ref{sec:file_open}), \func{mkdir} (vedi
+  \func{creat} (vedi sez.~\ref{sec:file_open_close}), \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 andrà a contenerli.
+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
@@ -5387,12 +5386,12 @@ 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à, 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.}
+di tipo ``\code{(acl\_t) NULL}'' 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 \val{NULL}.\footnote{a
+  voler essere estremamente pignoli si dovrebbe usare ``\code{(acl\_t)
+    NULL}'', ma è sufficiente fare un confronto direttamente con \val{NULL}
+  essendo cura del compilatore fare le conversioni necessarie.}
 
 Una volta che si siano completate le operazioni sui dati di una ACL la memoria
 allocata per un oggetto \type{acl\_t} dovrà essere liberata esplicitamente
@@ -5401,7 +5400,7 @@ attraverso una chiamata alla funzione \funcd{acl\_free}, il cui prototipo è:
 \begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{sys/acl.h}
-\fdecl{int acl\_free(void * obj\_p)}
+\fdecl{int acl\_free(void *obj\_p)}
 \fdesc{Disalloca la memoria riservata per una ACL.} 
 }
 
@@ -5417,14 +5416,14 @@ 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
+qualificatori della una voce di una ACL. L'uso del tipo generico ``\ctyp{void
+  *}'' consente di evitare di eseguire un \textit{cast} al tipo di dato di cui
+si vuole effettuare 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
@@ -5484,31 +5483,31 @@ estensione usata dalle ACL di Linux e non è portabile, ma consente di
 semplificare l'inizializzazione in maniera molto comoda. 
 
 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:
+\funcd{acl\_get\_fd} e \funcd{acl\_get\_file}, che consentono di leggere la
+ACL di un file; i rispettivi prototipi sono:
 
 \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.} 
+\fdesc{Leggono 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:
+{Le funzioni ritornano 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{EACCESS}] non c'è accesso per una componente di
+    \param{path\_p} o si è richiesta una ACL di default per un file (solo per
+    \func{acl\_get\_file}).
   \item[\errcode{EINVAL}] \param{type} non ha un valore valido (solo per
     \func{acl\_get\_file}).
   \item[\errcode{ENOTSUP}] il filesystem cui fa riferimento il file non
     supporta le ACL.
   \end{errlist}
-  ed inoltre \errval{EBADF} per \func{acl\_get\_fd}, e \errval{EACCES},
-  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR}, per
-  \func{acl\_get\_file}. }
+  ed inoltre \errval{ENOMEM} per entrambe, \errval{EBADF} per
+  \func{acl\_get\_fd}, e \errval{ENAMETOOLONG}, \errval{ENOENT},
+  \errval{ENOTDIR}, per \func{acl\_get\_file} nel loro significato generico. }
 \end{funcproto}
 
 Le due funzioni ritornano, con un oggetto di tipo \type{acl\_t}, il valore
@@ -5529,8 +5528,8 @@ tab.~\ref{tab:acl_type}.
     \textbf{Tipo} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{ACL\_TYPE\_ACCESS} & indica una ACL di accesso.\\
-    \const{ACL\_TYPE\_DEFAULT}& indica una ACL di default.\\  
+    \const{ACL\_TYPE\_ACCESS} & Indica una ACL di accesso.\\
+    \const{ACL\_TYPE\_DEFAULT}& Indica una ACL di default.\\  
     \hline
   \end{tabular}
   \caption{Le costanti che identificano il tipo di ACL.}
@@ -5558,9 +5557,9 @@ testuale con la funzione  \funcd{acl\_from\_text}, il cui prototipo è:
   \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.
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
    \end{errlist}
 }
 \end{funcproto}
@@ -5623,7 +5622,7 @@ di uso più immediato, è \funcd{acl\_to\_text}, ed il suo prototipo è:
 \begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{sys/acl.h}
-\fdecl{char * acl\_to\_text(acl\_t acl, ssize\_t *len\_p)}
+\fdecl{char *acl\_to\_text(acl\_t acl, ssize\_t *len\_p)}
 \fdesc{Produce la rappresentazione testuale di una ACL.} 
 }
 
@@ -5631,8 +5630,8 @@ di uso più immediato, è \funcd{acl\_to\_text}, ed il suo prototipo è:
   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.
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
   \end{errlist}
 }  
 \end{funcproto}
@@ -5646,14 +5645,14 @@ 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, che permette di controllare con dovizia di dettagli la
-generazione della stringa contenente la rappresentazione testuale della ACL, è
-\funcd{acl\_to\_any\_text}, ed il suo prototipo è:
+La seconda funzione, che permette di controllare con una gran dovizia di
+particolari la generazione della stringa contenente la rappresentazione
+testuale della ACL, è \funcd{acl\_to\_any\_text}, ed il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{sys/acl.h}
-\fdecl{char * acl\_to\_any\_text(acl\_t acl, const char *prefix, char
+\fdecl{char *acl\_to\_any\_text(acl\_t acl, const char *prefix, char
     separator, int options)}
 \fdesc{Produce la rappresentazione testuale di una ACL.} 
 }
@@ -5662,9 +5661,9 @@ generazione della stringa contenente la rappresentazione testuale della ACL, è
   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}
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
+  \end{errlist}
 }  
 \end{funcproto}
 
@@ -5689,23 +5688,23 @@ tab.~\ref{tab:acl_to_text_options}.
     \textbf{Tipo} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{TEXT\_ABBREVIATE}     & stampa le voci in forma abbreviata.\\
+    \const{TEXT\_ABBREVIATE}     & Stampa le voci in forma abbreviata.\\
     \const{TEXT\_NUMERIC\_IDS}   & non effettua la risoluzione numerica di
                                    \ids{UID} e \ids{GID}.\\
-    \const{TEXT\_SOME\_EFFECTIVE}& per ciascuna voce che contiene permessi che
+    \const{TEXT\_SOME\_EFFECTIVE}& Per ciascuna voce che contiene permessi che
                                    vengono eliminati dalla \const{ACL\_MASK}
                                    viene generato un commento con i permessi 
                                    effettivamente risultanti; il commento è
                                    separato con un tabulatore.\\
-    \const{TEXT\_ALL\_EFFECTIVE} & viene generato un commento con i permessi
+    \const{TEXT\_ALL\_EFFECTIVE} & Viene generato un commento con i permessi
                                    effettivi per ciascuna voce che contiene
                                    permessi citati nella \const{ACL\_MASK},
                                    anche quando questi non vengono modificati
                                    da essa; il commento è separato con un
                                    tabulatore.\\
-    \const{TEXT\_SMART\_INDENT}  & da usare in combinazione con le precedenti
-                                   \const{TEXT\_SOME\_EFFECTIVE} e
-                                   \const{TEXT\_ALL\_EFFECTIVE} aumenta
+    \const{TEXT\_SMART\_INDENT}  & Da usare in combinazione con le precedenti
+                                   opzioni \const{TEXT\_SOME\_EFFECTIVE} e
+                                   \const{TEXT\_ALL\_EFFECTIVE}, aumenta
                                    automaticamente il numero di spaziatori
                                    prima degli eventuali commenti in modo da
                                    mantenerli allineati.\\
@@ -5752,9 +5751,10 @@ buffer di dimensione sufficiente, il suo prototipo è:
 }  
 \end{funcproto}
 
-Ottenuta con \func{acl\_size} la dimensione per il buffer lo si potrà allocare
-direttamente con \func{malloc}. La rappresentazione binaria di una ACL si
-potrà poi ottenere con la funzione \funcd{acl\_copy\_ext}, il cui prototipo è:
+Ottenuta con \func{acl\_size} la dimensione per il buffer di una ACL lo si
+potrà allocare direttamente con \func{malloc}. La rappresentazione binaria di
+una ACL si potrà invece ottenere con la funzione \funcd{acl\_copy\_ext}, il
+cui prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -5915,20 +5915,49 @@ ad un altra con \funcm{acl\_copy\_entry} o eliminare una voce da una ACL con
 
 \itindend{Access~Control~List~(ACL)}
 
+Come esempio di utilizzo di queste funzioni nei sorgenti allegati alla guida
+si è distribuito il programma \texttt{mygetfacl.c}, che consente di leggere le
+ACL di un file, passato come argomento.
+
+\begin{figure}[!htbp]
+  \footnotesize \centering
+  \begin{minipage}[c]{\codesamplewidth}
+    \includecodesample{listati/mygetfacl.c}
+  \end{minipage} 
+  \normalsize
+  \caption{Corpo principale del programma \texttt{mygetfacl.c}.}
+  \label{fig:proc_mygetfacl}
+\end{figure}
+
+La sezione principale del programma, da cui si è rimossa la sezione sulla
+gestione delle opzioni, è riportata in fig.~\ref{fig:proc_mygetfacl}. Il
+programma richiede un unico argomento (\texttt{\small 16-20}) che indica il
+file di cui si vuole leggere la ACL. Se questo è presente si usa
+(\texttt{\small 22}) la funzione \func{get\_acl\_file} per leggerne la ACL, e
+si controlla (\texttt{\small 23-26}) se l'operazione ha successo, uscendo con
+un messaggio di errore in caso contrario. 
+
+Ottenuta la ACL la si converte in formato testuale (\texttt{\small 27}) con la
+funzione \func{acl\_to\_text}, controllando di nuovo se l'operazione ha
+successo (\texttt{\small 28-31}) ed uscendo in caso contrario.  Si provvede
+infine a stampare la rappresentazione testuale (\texttt{\small 32}) e dopo
+aver liberato (\texttt{\small 33-34}) le risorse allocate automaticamente, si
+conclude l'esecuzione.
+
 
 \subsection{La gestione delle quote disco}
 \label{sec:disk_quota}
 
-Quella delle quote disco è una funzionalità introdotta inizialmente da BSD, e
+Quella delle quote disco è una funzionalità introdotta inizialmente da BSD e
 presente in Linux fino dai kernel dalla serie 2.0, che consente di porre dei
 tetti massimi al consumo delle risorse di un filesystem (spazio disco e
-\itindex{inode} \textit{inode}) da parte di utenti e gruppi. 
+\itindex{inode} \textit{inode}) da parte di utenti e gruppi.
 
 Dato che la funzionalità ha senso solo per i filesystem su cui si mantengono i
 dati degli utenti\footnote{in genere la si attiva sul filesystem che contiene
   le \textit{home} degli utenti, dato che non avrebbe senso per i file di
   sistema che in genere appartengono all'amministratore.} essa deve essere
-esplicitamente richiesta. Questo si fa, per tutti i filesystem che le
+attivata esplicitamente. Questo si fa, per tutti i filesystem che le
 supportano, tramite due distinte opzioni di montaggio, \texttt{usrquota} e
 \texttt{grpquota} che abilitano le quote rispettivamente per gli utenti e per
 i gruppi. Così è possibile usare le limitazioni sulle quote o sugli utenti o
@@ -5941,8 +5970,8 @@ relativi al consumo delle risorse da parte degli utenti e dei gruppi, che a
 far rispettare i limiti imposti dal sistema, con la generazione di un errore
 di \errcode{EDQUOT} per tutte le operazioni sui file che porterebbero ad un
 superamento degli stessi. Si tenga presente che questi due compiti sono
-separati, il primo si attiva al montaggio del filesystem con le quote
-attivate, il secondo deve essere abilitato esplicitamente.
+separati, il primo si attiva al montaggio del filesystem con il supporto per
+le quote, il secondo deve essere abilitato esplicitamente.
 
 Per il mantenimento dei dati di consumo delle risorse vengono usati due file
 riservati nella directory radice del filesystem su cui si sono attivate le
@@ -5955,17 +5984,18 @@ l'unica rimasta in uso, questi file sono \texttt{aquota.user} e
 
 Dato che questi file vengono aggiornati soltanto se il filesystem è stato
 montato attivando il supporto delle quote, se si abilita il supporto in un
-secondo tempo, si si sono eseguite delle operazioni sul filesystem quando era
-disabilitato, i dati contenuti possono non corrispondere esattamente allo
-stato corrente del consumo delle risorse. Per questo motivo prima di montare
-in scrittura un filesystem su cui sono abilitate le quote viene richiesto di
-utilizzare il comando \cmd{quotacheck} per verificare e aggiornare i dati.
+secondo tempo e nel frattempo sono state eseguite delle operazioni sul
+filesystem quando il supporto era disabilitato, i dati contenuti possono non
+corrispondere esattamente allo stato corrente del consumo delle risorse. Per
+questo motivo prima di montare in scrittura un filesystem su cui sono
+abilitate le quote viene richiesto di utilizzare il comando \cmd{quotacheck}
+per verificare e aggiornare i dati.
 
 Le restrizioni sul consumo delle risorse previste dal sistema delle quote
 prevedono sempre la presenza di due diversi limiti, il primo viene detto
 \textit{soft limit} e può essere superato per brevi periodi di tempo senza che
-causare errori, il secondo viene detto \textit{hard limit} non può mai essere
-superato.
+causare errori per lo sforamento delle quote, il secondo viene detto
+\textit{hard limit} e non può mai essere superato.
 
 Il periodo di tempo per cui è possibile eccedere rispetto alle restrizioni
 indicate dal \textit{soft limit} è detto ``\textsl{periodo di grazia}''
@@ -6049,7 +6079,7 @@ macro \macro{QCMD}:
 La macro consente di specificare, oltre al tipo di operazione, da indicare con
 l'argomento \param{subcmd} se questa deve applicarsi alle quote utente o alle
 quote gruppo. Questo viene indicato dall'argomento \param{type} che deve
-essere sempre definito ed assegnato ad uno fra i due valori \const{USRQUOTA} e
+essere sempre definito ed assegnato ad uno fra i due valori \const{USRQUOTA} o
 \const{GRPQUOTA}.
 
 \begin{table}[htb]
@@ -6147,7 +6177,7 @@ singolo utente o gruppo.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.9\textwidth}
     \includestruct{listati/dqblk.h}
   \end{minipage} 
   \normalsize 
@@ -6238,11 +6268,11 @@ identificate tramite le costanti di tab.~\ref{tab:quotactl_id_format}.
     \textbf{Identificatore} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{QFMT\_VFS\_OLD}& il vecchio (ed obsoleto) formato delle quote.\\
-    \const{QFMT\_VFS\_V0} & la versione 0 usata dal VFS di Linux, supporta
+    \const{QFMT\_VFS\_OLD}& Il vecchio (ed obsoleto) formato delle quote.\\
+    \const{QFMT\_VFS\_V0} & La versione 0 usata dal VFS di Linux, supporta
                             \ids{UID} e \ids{GID} a 32 bit e limiti fino a
                             $2^{42}$ byte e $2^{32}$ file.\\
-    \const{QFMT\_VFS\_V1} & la versione 1 usata dal VFS di Linux, supporta
+    \const{QFMT\_VFS\_V1} & La versione 1 usata dal VFS di Linux, supporta
                             \ids{UID} e \ids{GID} a 32 bit e limiti fino a
                             $2^{64}$ byte e $2^{64}$ file.\\
     \hline
@@ -6264,7 +6294,7 @@ la cui definizione è riportata in fig.~\ref{fig:dqinfo_struct}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/dqinfo.h}
   \end{minipage} 
   \normalsize 
@@ -6341,11 +6371,11 @@ quote.\footnote{questi vengono passati come argomenti dalle funzioni mappate
 con \macro{QCMD} al comando \const{Q\_GETQUOTA} per ottenere i dati.
 
 La funzione viene eseguita all'interno di un condizionale (\texttt{\small
-  5--16}) che in caso di successo provvede a costruire (\texttt{\small 6--12})
+  5-16}) che in caso di successo provvede a costruire (\texttt{\small 6-12})
 opportunamente una risposta restituendo tramite la opportuna funzione di
 interfaccia un oggetto Python contenente i dati della struttura \struct{dqblk}
 relativi a uso corrente e limiti sia per i blocchi che per gli \itindex{inode} 
-\textit{inode}. In caso di errore (\texttt{\small 13--15}) si usa un'altra
+\textit{inode}. In caso di errore (\texttt{\small 13-15}) si usa un'altra
 funzione dell'interfaccia per passare il valore di \var{errno} come eccezione.
 
 \begin{figure}[!htbp]
@@ -6362,16 +6392,16 @@ riportata in fig.~\ref{fig:set_block_quota}, che prende gli stessi argomenti
 della precedente, con lo stesso significato, a cui si aggiungono i valori per
 il \textit{soft limit} e l'\textit{hard limit}. In questo caso occorrerà,
 prima di chiamare \func{quotactl}, inizializzare opportunamente
-(\texttt{\small 5--7}) i campi della struttura \struct{dqblk} che si vogliono
+(\texttt{\small 5-7}) i campi della struttura \struct{dqblk} che si vogliono
 utilizzare (quelli relativi ai limiti sui blocchi) e specificare gli stessi
 con \const{QIF\_BLIMITS} in \var{dq.dqb\_valid}. 
 
 Fatto questo la chiamata a \func{quotactl}, stavolta con il comando
 \const{Q\_SETQUOTA}, viene eseguita come in precedenza all'interno di un
-condizionale (\texttt{\small 9--14}). In questo caso non essendovi da
+condizionale (\texttt{\small 9-14}). In questo caso non essendovi da
 restituire nessun dato in caso di successo si usa (\texttt{\small 10}) una
 apposita funzione di uscita, mentre si restituisce come prima una eccezione
-con il valore di \var{errno} in caso di errore (\texttt{\small 12--13}).
+con il valore di \var{errno} in caso di errore (\texttt{\small 12-13}).
 
 
 \subsection{La gestione delle \textit{capabilities}}
@@ -6405,8 +6435,8 @@ suddividere i vari privilegi tradizionalmente associati all'amministratore in
 un insieme di \textsl{capacità} distinte.  L'idea era che queste capacità
 potessero essere abilitate e disabilitate in maniera indipendente per ciascun
 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}''.
+molto più fine nella distribuzione degli stessi che evitasse la situazione
+originaria di ``\textsl{tutto o nulla}''.
 
 \itindbeg{file~capabilities}
 
@@ -6737,7 +6767,7 @@ non più modificabile \const{SECURE\_KEEP\_CAPS}, ed analogamente avviene con
 \const{SECURE\_NO\_SETUID\_FIXUP} e con \const{SECURE\_NOROOT\_LOCKED} per
 \const{SECURE\_NOROOT}.
 
-Per l'impostazione di questi flag sono stata predisposte due specifiche
+Per l'impostazione di questi flag sono state predisposte due specifiche
 operazioni di \func{prctl} (vedi sez.~\ref{sec:process_prctl}),
 \const{PR\_GET\_SECUREBITS}, che consente di ottenerne il valore, e
 \const{PR\_SET\_SECUREBITS}, che consente di modificarne il valore; per
@@ -6762,10 +6792,10 @@ 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
+% NOTE per dati relativi al process capability bounding set, vedi:
+% http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
 
-% TODO capire cosa cambia con i patch vari, vedi
+% NOTE riferimenti ai vari cambiamenti vedi:
 % http://lwn.net/Articles/280279/  
 % http://lwn.net/Articles/256519/
 % http://lwn.net/Articles/211883/
@@ -6776,7 +6806,7 @@ breve descrizione ed il nome delle costanti che le identificano, è riportato
 in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa
   tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man
     capabilities}) e dalle definizioni in
-  \texttt{include/linux/capabilities.h}, è aggiornato al kernel 2.6.26.} la
+  \texttt{include/linux/capabilities.h}, è aggiornato al kernel 3.2.} la
 tabella è divisa in due parti, la prima riporta le \textit{capabilities}
 previste anche nella bozza dello standard POSIX1.e, la seconda quelle
 specifiche di Linux.  Come si può notare dalla tabella alcune
@@ -6800,6 +6830,8 @@ opportuno dettagliare maggiormente.
     \const{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
                               auditing del kernel (dal kernel 2.6.11).\\ 
     % TODO verificare questa roba dell'auditing
+    \const{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare 
+                              la sospensione del sistema (dal kernel 3.5).\\ 
     \const{CAP\_CHOWN}      & Cambiare proprietario e gruppo
                               proprietario di un file (vedi
                               sez.~\ref{sec:file_ownership_management}).\\
@@ -6847,7 +6879,8 @@ opportuno dettagliare maggiormente.
                               funzioni \func{mlock}, \func{mlockall},
                               \func{shmctl}, \func{mmap} (vedi
                               sez.~\ref{sec:proc_mem_lock} e 
-                              sez.~\ref{sec:file_memory_map}). \\  
+                              sez.~\ref{sec:file_memory_map}). \\ 
+% TODO verificare l'interazione con SHM_HUGETLB
     \const{CAP\_IPC\_OWNER} & Evitare il controllo dei permessi
                               per le operazioni sugli oggetti di
                               intercomunicazione fra processi (vedi
@@ -6857,57 +6890,51 @@ opportuno dettagliare maggiormente.
                               sez.~\ref{sec:file_asyncronous_lease})
                               pur non essendo proprietari del file (dal kernel
                               2.4).\\ 
-    \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli
-                              attributi \textit{immutable} e
-                              \itindex{append~mode} \textit{append-only} (vedi
+    \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi 
+                              \textit{immutable} e \itindex{append~mode}
+                              \textit{append-only} (vedi
                               sez.~\ref{sec:file_perm_overview}) se
                               supportati.\\
-    \const{CAP\_MKNOD}      & Creare
-                              \index{file!di~dispositivo} file di dispositivo
-                              con \func{mknod} (vedi
+    \const{CAP\_MKNOD}      & Creare \index{file!di~dispositivo} file di 
+                              dispositivo con \func{mknod} (vedi
                               sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\ 
     \const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni
                               privilegiate sulla rete.\\
-    \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto
-                              su porte riservate (vedi
+    \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi 
                               sez.~\ref{sec:TCP_func_bind}).\\ 
     \const{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
                               \itindex{broadcast} \textit{broadcast} e
                               \itindex{multicast} \textit{multicast}.\\ 
-    \const{CAP\_NET\_RAW}   & Usare socket \texttt{RAW} e
-                              \texttt{PACKET} (vedi sez.~\ref{sec:sock_type}).\\
+    \const{CAP\_NET\_RAW}   & Usare socket \texttt{RAW} e \texttt{PACKET}
+                              (vedi sez.~\ref{sec:sock_type}).\\ 
     \const{CAP\_SETPCAP}    & Effettuare modifiche privilegiate alle
                               \textit{capabilities}.\\   
-    \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti
-                              amministrativi.\\
-    \const{CAP\_SYS\_BOOT}  & Eseguire un riavvio del
-                              sistema (vedi sez.~\ref{sec:sys_reboot}).\\
-    \const{CAP\_SYS\_CHROOT}& Eseguire la funzione
-                              \func{chroot} (vedi sez.~\ref{sec:file_chroot}).\\
+    \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\
+    \const{CAP\_SYS\_BOOT}  & Eseguire un riavvio del sistema (vedi
+                              sez.~\ref{sec:sys_reboot}).\\ 
+    \const{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi 
+                              sez.~\ref{sec:file_chroot}).\\
     \const{CAP\_MAC\_ADMIN} & Amministrare il \textit{Mandatory
                                Access Control} di Smack (dal kernel 2.6.25).\\  
     \const{CAP\_MAC\_OVERRIDE}& Evitare il  \textit{Mandatory
                                Access Control} di Smack (dal kernel 2.6.25).\\  
-    \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del
-                              kernel.\\ 
-    \const{CAP\_SYS\_NICE}  & Modificare le varie priorità dei
-                              processi (vedi sez.~\ref{sec:proc_priority}).\\
-    \const{CAP\_SYS\_PACCT} & Usare le funzioni di
-                              \textit{accounting} dei processi (vedi
-                              sez.~\ref{sec:sys_bsd_accounting}).\\ 
+    \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\ 
+    \const{CAP\_SYS\_NICE}  & Modificare le varie priorità dei processi (vedi 
+                              sez.~\ref{sec:proc_priority}).\\
+    \const{CAP\_SYS\_PACCT} & Usare le funzioni di \textit{accounting} dei 
+                              processi (vedi
+                              sez.~\ref{sec:sys_bsd_accounting}).\\  
     \const{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
                               \func{ptrace} (vedi 
                               sez.~\ref{sec:process_ptrace}).\\
-    \const{CAP\_SYS\_RAWIO} & Operare sulle porte
-                              di I/O con \func{ioperm} e \func{iopl} (vedi
+    \const{CAP\_SYS\_RAWIO} & Operare sulle porte di I/O con \func{ioperm} e
+                               \func{iopl} (vedi
                               sez.~\ref{sec:process_io_port}).\\
-    \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni
-                              sulle risorse.\\ 
-    \const{CAP\_SYS\_TIME}  & Modificare il tempo di sistema
-                              (vedi sez.~\ref{sec:sys_time}).\\ 
-    \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup}
-                              della console, con la funzione
-                              \func{vhangup}.\\
+    \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\ 
+    \const{CAP\_SYS\_TIME}  & Modificare il tempo di sistema (vedi 
+                              sez.~\ref{sec:sys_time}).\\ 
+    \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
+                              con la funzione \func{vhangup}.\\
     \const{CAP\_SYSLOG}     & Gestire il buffer dei messaggi
                               del kernel, (vedi sez.~\ref{sec:sess_daemon}),
                               introdotta dal kernel 2.6.38 come capacità
@@ -6933,12 +6960,12 @@ però dedicare un discorso a parte a \const{CAP\_SETPCAP}, il cui significato è
 stato completamente cambiato con l'introduzione delle \textit{file
   capabilities} nel kernel 2.6.24. In precedenza questa capacità era quella
 che permetteva al processo che la possedeva di impostare o rimuovere le
-\textit{capabilities} che fossero presenti nel \textit{permitted set} del
-chiamante di un qualunque altro processo. In realtà questo non è mai stato
-l'uso inteso nelle bozze dallo standard POSIX, ed inoltre, come si è già
-accennato, dato che questa capacità è assente nel \textit{capabilities
-  bounding set} usato di default, essa non è neanche mai stata realmente
-disponibile.
+\textit{capabilities} presenti nel suo \textit{permitted set} su un qualunque
+altro processo. In realtà questo non è mai stato l'uso inteso nelle bozze
+dallo standard POSIX, ed inoltre, come si è già accennato, dato che questa
+capacità è sempre stata assente (a meno di specifiche ricompilazioni del
+kernel) nel \textit{capabilities bounding set} usato di default, essa non è
+neanche mai stata realmente disponibile.
 
 Con l'introduzione \itindex{file~capabilities} \textit{file capabilities} e
 il cambiamento del significato del \textit{capabilities bounding set} la
@@ -6965,7 +6992,8 @@ sez.~\ref{sec:file_xattr} e \ref{sec:file_ACL}), poter ignorare lo
 \itindex{sticky~bit} \textit{sticky bit} nella cancellazione dei file (vedi
 sez.~\ref{sec:file_special_perm}), la possibilità di impostare il flag di
 \const{O\_NOATIME} con \func{open} e \func{fcntl} (vedi
-sez.~\ref{sec:file_open} e sez.~\ref{sec:file_fcntl}) senza restrizioni.
+sez.~\ref{sec:file_open_close} e sez.~\ref{sec:file_fcntl_ioctl}) senza
+restrizioni.
 
 Una seconda capacità che copre diverse operazioni, in questo caso riguardanti
 la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni
@@ -7027,7 +7055,7 @@ basso livello; i loro rispettivi prototipi sono:
 \fdesc{Imposta le \textit{capabilities}.} 
 }
 
-{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
   caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EFAULT}] si è indicato un puntatore sbagliato o nullo
@@ -7060,7 +7088,7 @@ presente.\footnote{e non è chiaro neanche quanto sia mai stato davvero
 \begin{figure}[!htb]
   \footnotesize
   \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/cap_user_header_t.h}
   \end{minipage} 
   \normalsize 
@@ -7081,21 +7109,22 @@ modifiche o adeguamenti su qualunque versione del kernel è opportuno
 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 \itindex{file~capabilities} \textit{file capabilities}, può essere solo 0 o
-PID del processo chiamante, che sono equivalenti. Non tratteremo, essendo
-comunque di uso irrilevante, il caso in cui, in mancanza di tale supporto, la
-funzione può essere usata per modificare le \textit{capabilities} di altri
-processi, per il quale si rimanda alla pagina di manuale.
+tramite il campo \var{pid}, il \ids{PID} del processo del quale si vogliono
+leggere o modificare le \textit{capabilities}. Con \func{capset} questo, se si
+usano le \itindex{file~capabilities} \textit{file capabilities}, può essere
+solo 0 o il \ids{PID} del processo chiamante, che sono equivalenti. Non
+tratteremo, essendo comunque di uso irrilevante, il caso in cui, in mancanza
+di tale supporto, la funzione può essere usata per modificare le
+\textit{capabilities} di altri processi, per il quale si rimanda, se
+interessati, alla lettura della pagina di manuale.
 
 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).
+versione due è comunque deprecata e non deve essere usata, ed il kernel
+stamperà un avviso se lo si fa.
 
 I valori delle \textit{capabilities} devono essere passati come maschere
 binarie;\footnote{e si tenga presente che i valori di
@@ -7131,9 +7160,9 @@ opaco, \type{cap\_t}, come puntatore ai dati mantenuti nel cosiddetto
 
 In questo modo è possibile mascherare i dettagli della gestione di basso
 livello, che potranno essere modificati senza dover cambiare le funzioni
-dell'interfaccia, che pertanto fanno riferimento soltanto ad oggetti di questo
-tipo.  L'interfaccia pertanto non soltanto fornisce le funzioni per modificare
-leggere le \textit{capabilities}, ma anche quelle per gestire i dati
+dell'interfaccia, che fanno riferimento soltanto ad oggetti di questo tipo.
+L'interfaccia pertanto non soltanto fornisce le funzioni per modificare e
+leggere le \textit{capabilities}, ma anche quelle per gestire i dati
 attraverso i \textit{capability state}, che presentano notevoli affinità,
 essendo parte di bozze dello stesso standard, con quelle già viste per le ACL.
 
@@ -7176,13 +7205,14 @@ funzione, \funcd{cap\_free}, il cui prototipo è:
 
 La funzione permette di liberare la memoria allocata dalle altre funzioni
 della libreria sia per un \textit{capability state}, nel qual caso l'argomento
-dovrà essere un dato di tipo \type{cap\_t}, che per una descrizione testuale
-dello stesso,\footnote{cioè quanto ottenuto tramite la funzione
-  \func{cap\_to\_text}.} nel qual caso l'argomento dovrà essere un dato di
-tipo \texttt{char *}. Per questo motivo l'argomento \param{obj\_d} è
-dichiarato come \texttt{void *} e deve sempre corrispondere ad un puntatore
-ottenuto tramite le altre funzioni della libreria, altrimenti la funzione
-fallirà con un errore di \errval{EINVAL}.
+sarà un dato di tipo \type{cap\_t}, che per una descrizione testuale dello
+stesso,\footnote{cioè quanto ottenuto tramite la funzione
+  \func{cap\_to\_text}.} nel qual caso l'argomento sarà un dato di tipo
+\texttt{char *}. Per questo motivo l'argomento \param{obj\_d} è dichiarato
+come \texttt{void *}, per evitare la necessità di eseguire un \textit{cast},
+ma dovrà comunque corrispondere ad un puntatore ottenuto tramite le altre
+funzioni della libreria, altrimenti la funzione 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 è:
@@ -7204,9 +7234,8 @@ La funzione crea una copia del \textit{capability state} posto all'indirizzo
 copia, che conterrà gli stessi valori delle \textit{capabilities} presenti
 nell'originale. La memoria necessaria viene allocata automaticamente dalla
 funzione. Una volta effettuata la copia i due \textit{capability state}
-potranno essere modificati in maniera completamente
-indipendente.\footnote{alla fine delle operazioni si ricordi però di
-  disallocare anche la copia, oltre all'originale. }
+potranno essere modificati in maniera completamente indipendente, ed alla fine
+delle operazioni si dovrà disallocare anche la copia, oltre all'originale.
 
 Una seconda classe di funzioni di servizio previste dall'interfaccia sono
 quelle per la gestione dei dati contenuti all'interno di un \textit{capability
@@ -7231,8 +7260,8 @@ creazione con \func{cap\_init}.
 
 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
-è:
+insieme fra quelli elencati a pag.~\pageref{sec:capabilities_set}, il suo
+prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/capability.h}
@@ -7245,8 +7274,8 @@ insieme fra quelli di pag.~\pageref{sec:capabilities_set}, il suo prototipo
 }
 \end{funcproto}
 
-La funzione richiede che si indichi quale degli insiemi si intente cancellar
-ad \param{cap\_p} con l'argomento \param{flag}. Questo deve essere specificato
+La funzione richiede che si indichi quale degli insiemi si intente cancellare
+da \param{cap\_p} con l'argomento \param{flag}. Questo deve essere specificato
 con una variabile di tipo \type{cap\_flag\_t} che può assumere
 esclusivamente\footnote{si tratta in effetti di un tipo enumerato, come si può
   verificare dalla sua definizione che si trova in
@@ -7328,7 +7357,7 @@ flag,\\
 \fdesc{Imposta il valore di una \textit{capability}.} 
 }
 
-{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
   caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.  
 }
 \end{funcproto}
@@ -7370,7 +7399,8 @@ tab.~\ref{tab:cap_value_type}.
 
 La funzione \func{cap\_get\_flag} legge lo stato della capacità indicata
 dall'argomento \param{cap} all'interno dell'insieme indicato dall'argomento
-\param{flag} e lo restituisce nella variabile puntata
+\param{flag} e lo restituisce come \itindex{value~result~argument}
+\textit{value result argument} nella variabile puntata
 dall'argomento \param{value\_p}. Questa deve essere di tipo
 \type{cap\_flag\_value\_t} ed assumerà uno dei valori di
 tab.~\ref{tab:cap_value_type}. La funzione consente pertanto di leggere solo
@@ -7394,7 +7424,7 @@ testuale, è \funcd{cap\_to\_text}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/capability.h}
-\fdecl{char * cap\_to\_text(cap\_t caps, ssize\_t * length\_p)}
+\fdecl{char *cap\_to\_text(cap\_t caps, ssize\_t *length\_p)}
 \fdesc{Genera una visualizzazione testuale delle \textit{capabilities}.} 
 }
 
@@ -7407,7 +7437,8 @@ testuale, è \funcd{cap\_to\_text}, il cui prototipo è:
 La funzione ritorna l'indirizzo di una stringa contente la descrizione
 testuale del contenuto del \textit{capability state} \param{caps} passato come
 argomento, e, qualora l'argomento \param{length\_p} sia diverso da \val{NULL},
-restituisce nella variabile intera da questo puntata la lunghezza della
+restituisce come \itindex{value~result~argument} \textit{value result
+  argument} nella variabile intera da questo puntata la lunghezza della
 stringa. La stringa restituita viene allocata automaticamente dalla funzione e
 pertanto dovrà essere liberata con \func{cap\_free}.
 
@@ -7551,39 +7582,34 @@ prototipo\footnote{su alcune pagine di manuale la funzione è descritta con un
 }
 
 {La funzione ritorna un \textit{capability state} in caso di successo e
-  \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori:
-
-
-  \errval{ESRCH} o \errval{ENOMEM} nel loro significato generico.
-}
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
+  \errval{ESRCH} o \errval{ENOMEM} nel loro significato generico.  }
 \end{funcproto}
 
 La funzione legge il valore delle \textit{capabilities} del processo indicato
 con l'argomento \param{pid}, e restituisce il risultato tramite il puntatore
-ad \textit{capability state} contenente tutti i dati che provvede ad allocare
-autonomamente e che al solito deve essere disallocato con
+ad un \textit{capability state} contenente tutti i dati che provvede ad
+allocare autonomamente e che al solito deve essere disallocato con
 \func{cap\_free}. Qualora il processo indicato non esista si avrà un errore di
 \errval{ESRCH}. Gli stessi valori possono essere letti direttamente nel
 filesystem \textit{proc}, nei file \texttt{/proc/<pid>/status}; ad esempio per
 \texttt{init} si otterrà qualcosa del tipo:
-\begin{Command}
-$ cat /proc/1/status
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{cat /proc/1/status}
 ...
 CapInh: 0000000000000000
 CapPrm: 00000000fffffeff
 CapEff: 00000000fffffeff  
 ...
-\end{Terminal}
+\end{Console}
 %$
 
 \itindend{capability~state}
 
-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 è:
+Infine per impostare le \textit{capabilities} del processo corrente (nella
+bozza dello standard POSIX.1e 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{funcproto}{
 \fhead{sys/capability.h}
@@ -7611,13 +7637,13 @@ funzione fallirà, e per quanto appena detto, lo stato delle
 \textit{capabilities} non verrà modificato (neanche per le parti eventualmente
 permesse).
 
-Oltre a queste funzioni sono presenti due ulteriori funzioni, \funcm{capgetp}
-e \funcm{capsetp}, che svolgono un compito analogo. Queste funzioni risalgono
-alla implementazione iniziale delle \textit{capabilities} ed in particolare
-\funcm{capsetp} consentiva anche di cambiare le capacità di un altro
-processo. Le due funzioni oggi sono deprecate e pertanto eviteremo di
-trattarle, per chi fosse interessato si rimanda alla lettura della loro pagina
-di manuale.
+Oltre a queste funzioni su Linux sono presenti due ulteriori funzioni,
+\funcm{capgetp} e \funcm{capsetp}, che svolgono un compito analogo. Queste
+funzioni risalgono alla implementazione iniziale delle \textit{capabilities}
+ed in particolare \funcm{capsetp} consentirebbe anche, come possibile in quel
+caso, di cambiare le capacità di un altro processo. Le due funzioni oggi sono
+deprecate e pertanto eviteremo di trattarle, per chi fosse interessato si
+rimanda alla lettura della loro pagina di manuale.
 
 Come esempio di utilizzo di queste funzioni nei sorgenti allegati alla guida
 si è distribuito il programma \texttt{getcap.c}, che consente di leggere le
@@ -7625,7 +7651,7 @@ si è distribuito il programma \texttt{getcap.c}, che consente di leggere le
   quando lo si lancia, il che può sembrare inutile, ma serve a mostrarci quali
   sono le \textit{capabilities} standard che ottiene un processo lanciato
   dalla riga di comando.} o tramite l'opzione \texttt{-p}, quelle di un
-processo qualunque il cui pid viene passato come parametro dell'opzione.
+processo qualunque il cui \ids{PID} viene passato come parametro dell'opzione.
 
 \begin{figure}[!htbp]
   \footnotesize \centering
@@ -7640,16 +7666,16 @@ processo qualunque il cui pid viene passato come parametro dell'opzione.
 La sezione principale del programma è riportata in fig.~\ref{fig:proc_getcap},
 e si basa su una condizione sulla variabile \var{pid} che se si è usato
 l'opzione \texttt{-p} è impostata (nella sezione di gestione delle opzioni,
-che si è tralasciata) al valore del \textsl{pid} del processo di cui si vuole
+che si è tralasciata) al valore del \ids{PID} del processo di cui si vuole
 leggere le \textit{capabilities} e nulla altrimenti. Nel primo caso
-(\texttt{\small 1--6}) si utilizza (\texttt{\small 2}) \func{cap\_get\_proc}
+(\texttt{\small 1-6}) si utilizza (\texttt{\small 2}) \func{cap\_get\_proc}
 per ottenere lo stato delle capacità del processo, nel secondo (\texttt{\small
-  7--13}) si usa invece \func{cap\_get\_pid} (\texttt{\small 8}) per leggere
+  7-13}) si usa invece \func{cap\_get\_pid} (\texttt{\small 8}) per leggere
 il valore delle capacità del processo indicato.
 
 Il passo successivo è utilizzare (\texttt{\small 15}) \func{cap\_to\_text} per
 tradurre in una stringa lo stato, e poi (\texttt{\small 16}) stamparlo; infine
-(\texttt{\small 18--19}) si libera la memoria allocata dalle precedenti
+(\texttt{\small 18-19}) si libera la memoria allocata dalle precedenti
 funzioni con \func{cap\_free} per poi ritornare dal ciclo principale della
 funzione.
 
@@ -7663,45 +7689,54 @@ funzione.
 \subsection{La gestione dei {chroot}}
 \label{sec:file_chroot}
 
-% TODO introdurre nuova sezione sulle funzionalità di sicurezza avanzate, con
-% dentro chroot SELinux e AppArmor, Tomoyo, Smack, cgroup o che altro ???
+% TODO: valutare se introdurre una nuova sezione sulle funzionalità di
+% sicurezza avanzate, con dentro chroot SELinux e AppArmor, Tomoyo, Smack,
+% cgroup o altro
+
+% TODO: trattare la funzione setns e i namespace file descriptors (vedi
+% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0, altre
+% informazioni su setns qui: http://lwn.net/Articles/532748/
+% http://lwn.net/Articles/531498/
+
+
+% TODO: spostare chroot e le funzioni affini relative ai container da qualche
+% parte diversa se è il caso. 
 
-% inserire setns (introdotta con il 3.0, vedi http://lwn.net/Articles/407495/)
-% e le funzionalità di isolamento dei container
 
 Benché non abbia niente a che fare con permessi, utenti e gruppi, la funzione
 \func{chroot} viene usata spesso per restringere le capacità di accesso di un
 programma ad una sezione limitata del filesystem, per cui ne parleremo in
 questa sezione.
 
-% TODO riferimenti ai bind mount, link simbolici ecc.
-
 Come accennato in sez.~\ref{sec:proc_fork} ogni processo oltre ad una
 \index{directory~di~lavoro} directory di lavoro, ha anche una directory
 \textsl{radice}\footnote{entrambe sono contenute in due campi (rispettivamente
   \var{pwd} e \var{root}) di \kstruct{fs\_struct}; vedi
   fig.~\ref{fig:proc_task_struct}.} che, pur essendo di norma corrispondente
-alla radice dell'albero di file e directory come visto dal kernel (ed
-illustrato in sez.~\ref{sec:file_pathname}), ha per il processo il significato
-specifico di directory rispetto alla quale vengono risolti i
+alla radice dell'albero dei file dell'intero sistema, ha per il processo il
+significato specifico di directory rispetto alla quale vengono risolti i
 \itindsub{pathname}{assoluto}\textit{pathname} assoluti.\footnote{cioè quando
   un processo chiede la risoluzione di un \textit{pathname}, il kernel usa
   sempre questa directory come punto di partenza.} Il fatto che questo valore
 sia specificato per ogni processo apre allora la possibilità di modificare le
-modalità di risoluzione dei \textit{pathname} assoluti da parte di un processo
-cambiando questa directory, così come si fa coi
-\itindsub{pathname}{relativo}\textit{pathname} relativi cambiando la
+modalità di risoluzione dei \itindsub{pathname}{assoluto} \textit{pathname}
+assoluti da parte di un processo cambiando questa directory, così come si fa
+coi \itindsub{pathname}{relativo} \textit{pathname} relativi cambiando la
 \index{directory~di~lavoro} directory di lavoro.
 
-Normalmente la directory radice di un processo coincide anche con la radice
-del filesystem usata dal kernel, e dato che il suo valore viene ereditato dal
-padre da ogni processo figlio, in generale i processi risolvono i
-\itindsub{pathname}{assoluto} \textit{pathname} assoluti a partire sempre
-dalla stessa directory, che corrisponde alla radice del sistema.
+Normalmente la directory radice di un processo coincide con la radice generica
+dell'albero dei file, che è la directory che viene montata direttamente dal
+kernel all'avvio secondo quanto illustrato in sez.~\ref{sec:file_pathname}.
+Questo avviene perché, come visto in sez.~\ref{cha:process_handling} la
+directory radice di un processo viene ereditata dal padre attraverso una
+\func{fork} e mantenuta attraverso una \func{exec}, e siccome tutti i processi
+derivano da \cmd{init}, che ha come radice quella montata dal kernel, questa
+verrà mantenuta.
 
 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 di sistema \funcd{chroot}, il cui prototipo è:
+a tutto l'albero dei file iniziale; per far questo si può cambiare la sua
+directory radice con la funzione di sistema \funcd{chroot}, il cui prototipo
+è:
 
 \begin{funcproto}{
 \fhead{unistd.h}
@@ -7723,49 +7758,51 @@ La funzione imposta 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
 chiamate nel processo sarà risolto a partire da essa, rendendo impossibile
-accedere alla parte di albero sovrastante.  Si ha così quella che viene
+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}.
 
 Solo un processo con i privilegi di amministratore può usare questa
-funzione,\footnote{più precisamente la \itindex{capabilities} capacità
-  \const{CAP\_SYS\_CHROOT}.} e la nuova radice, per quanto detto in
+funzione,\footnote{più precisamente se possiede la \itindex{capabilities}
+  capacità \const{CAP\_SYS\_CHROOT}.} e la nuova radice, per quanto detto in
 sez.~\ref{sec:proc_fork}, sarà ereditata da tutti i suoi processi figli. Si
-tenga presente però che la funzione non cambia la directory di lavoro, che
-potrebbe restare fuori dalla \textit{chroot jail}.
-
-Questo è il motivo per cui la funzione è efficace solo se dopo averla eseguita
-si cedono i privilegi di amministratore. Infatti se per un qualche motivo il
-processo resta con \index{directory~di~lavoro} la directory di lavoro fuori
-dalla \textit{chroot jail}, potrà comunque accedere a tutto il resto del
-filesystem usando \itindsub{pathname}{relativo} dei \textit{pathname}
-relativi, i quali, partendo da una directory di lavoro fuori della
-\textit{chroot jail}, potranno (con l'uso di ``\texttt{..}'') risalire fino
-alla radice effettiva del filesystem.
-
-Ma se ad un processo restano i privilegi di amministratore esso potrà comunque
-portare la sua \index{directory~di~lavoro} directory di lavoro fuori dalla
-\textit{chroot jail} in cui si trova. Basta infatti creare una nuova
-\textit{chroot jail} con l'uso di \func{chroot} su una qualunque directory
-contenuta nell'attuale directory di lavoro.  Per questo motivo l'uso di questa
-funzione non ha molto senso quando un processo necessita dei privilegi di
-amministratore per le sue normali operazioni.
-
-Un caso tipico di uso di \func{chroot} è quello di un server FTP anonimo, in
-questo caso infatti si vuole che il server veda solo i file che deve
-trasferire, per cui in genere si esegue una \func{chroot} sulla directory che
-contiene i file.  Si tenga presente però che in questo caso occorrerà
-replicare all'interno della \textit{chroot jail} tutti i file (in genere
-programmi e librerie) di cui il server potrebbe avere bisogno.
-
-
+tenga presente però che la funzione non cambia la directory di lavoro del
+processo, che potrebbe restare fuori dalla \textit{chroot jail}.
+
+Questo è il motivo per cui la funzione è efficace nel restringere un processo
+ad un ramo di albero solo se dopo averla eseguita si cedono i privilegi di
+amministratore. Infatti se per un qualunque motivo il processo resta con la
+sua \index{directory~di~lavoro} directory di lavoro al di fuori dalla
+\textit{chroot jail}, potrà accedere a tutto il resto del filesystem usando
+\itindsub{pathname}{relativo} dei \textit{pathname} relativi, dato che in tal
+caso è possibile, grazie all'uso di ``\texttt{..}'', risalire all'indietro
+fino alla radice effettiva dell'albero dei file.
+
+Potrebbe sembrare che per risolvere il problema sia sufficiente ricordarsi di
+eseguire preventivamente anche una \func{chdir} sulla directory su cui si
+andrà ad eseguire \func{chroot}, così da assicurarsi che le directory di
+lavoro sia all'interno della \textit{chroot jail}.  Ma se ad un processo
+restano i privilegi di amministratore esso potrà comunque portare la sua
+\index{directory~di~lavoro} directory di lavoro fuori dalla \textit{chroot
+  jail} in cui si trova. Basterà infatti eseguire di nuovo \func{chroot} su
+una qualunque directory contenuta nell'attuale directory di lavoro perché
+quest'ultima risulti al di fuori della nuova \textit{chroot jail}.  Per questo
+motivo l'uso di questa funzione non ha molto senso quando un processo di cui
+si vuole limitare l'accesso necessita comunque dei privilegi di amministratore
+per le sue normali operazioni.
+
+Nonostante queste limitazioni la funzione risulta utile qualora la si possa
+applicare correttamente cedendo completamente i privilegi di amministratore
+una volta eseguita.  Ed esempio caso tipico di uso di \func{chroot} è quello
+di un server FTP anonimo in si vuole che il server veda solo i file che deve
+trasferire. In tal caso si esegue una \func{chroot} sulla directory che
+contiene i file, che il server dovrà in grado di leggere come utente
+ordinario, e poi si cedono tutti i privilegi di amministratore.  Si tenga
+presente però che in casi come questo occorrerà fornire all'interno della
+\textit{chroot jail} un accesso anche a tutti i file (in genere programmi e
+librerie) di cui il server potrebbe avere bisogno.
 
-% TODO: trattare la funzione setns e i namespace file descriptors (vedi
-% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0
-
-% TODO: spostare chroot e le funzioni affini relative ai container da qualche
-% parte diversa se è il caso. 
 
 % LocalWords:  sez like filesystem unlink MacOS Windows VMS inode kernel unistd
 % LocalWords:  int const char oldpath newpath errno EXDEV EPERM st Smack SysV
@@ -7839,7 +7876,7 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  lazy encfs sshfs setfsent getfsent getfsfile getfsspec endfsent
 % LocalWords:  setmntent getmntent addmntent endmntent hasmntopt such offsetof
 % LocalWords:  member scan attack EOVERFLOW BITS blkcnt rdev FDCWD functions
-% LocalWords:  faccessat grpid lacl AppArmor capsetp
+% LocalWords:  faccessat grpid lacl AppArmor capsetp mygetfacl
 
 %%% Local Variables: 
 %%% mode: latex