Varie correzioni, completata revisione capitolo sull'I/O su file
[gapil.git] / filedir.tex
index 11a25fc9d650e1cd85d7afe1497dcccd5c1d542f..65772744bf8b02534423526b817c07f620510f3e 100644 (file)
@@ -1,6 +1,6 @@
 %% filedir.tex
 %%
-%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2019 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",
@@ -22,9 +22,9 @@ Esamineremo poi le funzioni di libreria che si usano per copiare, spostare e
 cambiare i nomi di file e directory e l'interfaccia che permette la
 manipolazione dei loro attributi. Tratteremo inoltre la struttura di base del
 sistema delle protezioni e del controllo dell'accesso ai file e le successive
-estensioni (\textit{Extended Attributes}, ACL, quote disco,
-\textit{capabilities}). Tutto quello che riguarda invece la gestione dell'I/O
-sui file è lasciato al capitolo successivo.
+estensioni (\textit{Extended Attributes}, ACL, quote disco). Tutto quello che
+riguarda invece la gestione dell'I/O sui file è lasciato al capitolo
+successivo.
 
 
 
@@ -35,8 +35,8 @@ In questa sezione tratteremo con maggiori dettagli rispetto a quanto visto in
 sez.~\ref{sec:file_arch_overview} il \textit{Virtual File System} di Linux e
 come il kernel può gestire diversi tipi di filesystem, descrivendo prima le
 caratteristiche generali di un filesystem di un sistema unix-like, per poi
-fare una panoramica sul filesystem più usato con Linux, l'\acr{ext2} ed i suoi
-successori.
+fare una panoramica sul filesystem tradizionalmente più usato con Linux,
+l'\acr{ext2} ed i suoi successori.
 
 
 \subsection{Il funzionamento del \textit{Virtual File System} di Linux}
@@ -45,7 +45,7 @@ successori.
 % NOTE articolo interessante:
 % http://www.ibm.com/developerworks/linux/library/l-virtual-filesystem-switch/index.html?ca=dgr-lnxw97Linux-VFSdth-LXdW&S_TACT=105AGX59&S_CMP=GRlnxw97
 
-\itindbeg{Virtual~File~System}
+\itindbeg{Virtual~File~System~(VFS)}
 
 Come illustrato brevemente in sez.~\ref{sec:file_arch_overview} in Linux il
 concetto di \textit{everything is a file} è stato implementato attraverso il
@@ -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 
@@ -107,7 +107,7 @@ restituisce una \textit{dentry}, abbreviazione che sta per \textit{directory
   entry}. Le \textit{dentry} sono gli oggetti che il kernel usa per eseguire
 la \textit{pathname resolution}, ciascuna di esse corrisponde ad un
 \textit{pathname} e contiene il riferimento ad un \textit{inode}, che come
-vedremo a breve è l'oggetto usato dal kernel per identificare un un
+vedremo a breve è l'oggetto usato dal kernel per identificare un
 file.\footnote{in questo caso si parla di file come di un qualunque oggetto
   generico che sta sul filesystem e non dell'oggetto file del VFS cui
   accennavamo prima.} La \textit{dentry} ottenuta dalla chiamata alla funzione
@@ -137,13 +137,13 @@ scopo è risolvere il nome mancante e fornire la sua \textit{dentry} che a
 questo punto verrà inserita nella cache.
 
 Dato che tutte le volte che si monta un filesystem la funzione \texttt{mount}
-della corrispondente \kstruct{file\_system\_type} inserisce la \textit{dentry}
-iniziale nel \itindex{mount~point} \textit{mount point} dello stesso, si avrà
-comunque un punto di partenza. Inoltre essendo questa \textit{dentry} relativa
-a quel tipo di filesystem essa farà riferimento ad un \textit{inode} di quel
-filesystem, e come vedremo questo farà sì che venga eseguita una
-\texttt{lookup} adatta per effettuare la risoluzione dei nomi per quel
-filesystem.
+(vedi sez.~\ref{sec:filesystem_mounting}) della corrispondente
+\kstruct{file\_system\_type} inserisce la \textit{dentry} iniziale nel
+\textit{mount point} dello stesso, si avrà comunque un punto di
+partenza. Inoltre essendo questa \textit{dentry} relativa a quel tipo di
+filesystem essa farà riferimento ad un \textit{inode} di quel filesystem, e
+come vedremo questo farà sì che venga eseguita una \texttt{lookup} adatta per
+effettuare la risoluzione dei nomi per quel filesystem.
 
 \itindend{pathname}
 \itindend{pathname~resolution}
@@ -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
@@ -224,7 +224,7 @@ tab.~\ref{tab:file_inode_operations} le più rilevanti.
                              sez.~\ref{sec:file_dir_creat_rem}).\\
     \textsl{\code{rmdir}}  & Rimuove una directory (vedi
                              sez.~\ref{sec:file_dir_creat_rem}).\\
-    \textsl{\code{mknod}}  & Crea un \index{file!speciali} file speciale (vedi
+    \textsl{\code{mknod}}  & Crea un file speciale (vedi
                              sez.~\ref{sec:file_mknod}).\\
     \textsl{\code{rename}} & Cambia il nome di un file (vedi
                              sez.~\ref{sec:link_symlink_rename}).\\
@@ -232,7 +232,7 @@ tab.~\ref{tab:file_inode_operations} le più rilevanti.
     \hline
   \end{tabular}
   \caption{Le principali operazioni sugli \textit{inode} definite tramite
-    \kstruct{inode\_operation}.} 
+    \kstructd{inode\_operation}.} 
   \label{tab:file_inode_operations}
 \end{table}
 
@@ -260,13 +260,14 @@ 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 \textit{file table} (torneremo su questo in
+sez.~\ref{sec:file_fd}).
 
 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 +280,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 
@@ -290,11 +291,12 @@ di dati) dovrà invece ricorrere a quelle fornite dal driver del dispositivo.
 
 Come si può notare dall'estratto di fig.~\ref{fig:kstruct_file}, la struttura
 \kstruct{file} contiene, oltre ad alcune informazioni usate dall'interfaccia
-dei file descriptor il cui significato emergerà più avanti, il puntatore
-\var{f\_op} ad una struttura \kstruct{file\_operation}. Questa è l'analoga per
-i file di \kstruct{inode\_operation}, e definisce le operazioni generiche
-fornite dal VFS per i file. Si sono riportate in
-tab.~\ref{tab:file_file_operations} le più significative.
+dei file descriptor il cui significato emergerà più avanti (vedi
+sez.~\ref{sec:file_unix_interface}), il puntatore \var{f\_op} ad una struttura
+\kstruct{file\_operation}. Questa è l'analoga per i file di
+\kstruct{inode\_operation}, e definisce le operazioni generiche fornite dal
+VFS per i file. Si sono riportate in tab.~\ref{tab:file_file_operations} le
+più significative.
 
 \begin{table}[htb]
   \centering
@@ -304,14 +306,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
@@ -326,7 +329,7 @@ tab.~\ref{tab:file_file_operations} le più significative.
                              sez.~\ref{sec:file_asyncronous_io}) sul file.\\
     \hline
   \end{tabular}
-  \caption{Operazioni sui file definite tramite \kstruct{file\_operation}.}
+  \caption{Operazioni sui file definite tramite \kstructd{file\_operation}.}
   \label{tab:file_file_operations}
 \end{table}
 
@@ -343,14 +346,14 @@ Il VFS realizza la quasi totalità delle operazioni relative ai file grazie
 alle funzioni presenti nelle due strutture \kstruct{inode\_operation} e
 \kstruct{file\_operation}.  Ovviamente non è detto che tutte le operazioni
 possibili siano poi disponibili in tutti i casi, ad esempio \code{llseek} non
-sarà presente per un dispositivo come la porta seriale o per una fifo, mentre
-sui file del filesystem \texttt{vfat} non saranno disponibili i permessi, ma
-resta il fatto che grazie al VFS le \textit{system call} per le operazioni sui
-file possono restare sempre le stesse nonostante le enormi differenze che
-possono esserci negli oggetti a cui si applicano.
+sarà presente per un dispositivo come la porta seriale o per una
+\textit{fifo}, mentre sui file del filesystem \texttt{vfat} non saranno
+disponibili i permessi, ma resta il fatto che grazie al VFS le \textit{system
+  call} per le operazioni sui file possono restare sempre le stesse nonostante
+le enormi differenze che possono esserci negli oggetti a cui si applicano.
  
 
-\itindend{Virtual~File~System}
+\itindend{Virtual~File~System~(VFS)}
 
 % NOTE: documentazione interessante:
 %       * sorgenti del kernel: Documentation/filesystems/vfs.txt
@@ -371,17 +374,20 @@ proprie.  Per questo non entreremo nei dettagli di un filesystem specifico, ma
 daremo una descrizione a grandi linee che si adatta alle caratteristiche
 comuni di qualunque filesystem di un sistema unix-like.
 
+\itindbeg{superblock}
+
 Una possibile strutturazione dell'informazione su un disco è riportata in
 fig.~\ref{fig:file_disk_filesys}, dove si hanno tre filesystem su tre
 partizioni. In essa per semplicità si è fatto riferimento alla struttura del
 filesystem \acr{ext2}, che prevede una suddivisione dei dati in \textit{block
   group}.  All'interno di ciascun \textit{block group} viene anzitutto
-replicato il cosiddetto \itindex{superblock} \textit{superblock}, (la
-struttura che contiene l'indice iniziale del filesystem e che consente di
-accedere a tutti i dati sottostanti) e creata una opportuna suddivisione dei
-dati e delle informazioni per accedere agli stessi.  Sulle caratteristiche di
-\acr{ext2} e derivati torneremo in sez.~\ref{sec:file_ext2}.
+replicato il cosiddetto \textit{superblock}, (la struttura che contiene
+l'indice iniziale del filesystem e che consente di accedere a tutti i dati
+sottostanti) e creata una opportuna suddivisione dei dati e delle informazioni
+per accedere agli stessi.  Sulle caratteristiche di \acr{ext2} e derivati
+torneremo in sez.~\ref{sec:file_ext2}.
 
+\itindend{superblock}
 \itindbeg{inode}
 
 È comunque caratteristica comune di tutti i filesystem per Unix,
@@ -394,23 +400,22 @@ per i dati in essi contenuti.
 
 \begin{figure}[!htb]
   \centering
-  \includegraphics[width=12cm]{img/disk_struct}
+  \includegraphics[width=11cm]{img/disk_struct}
   \caption{Organizzazione dello spazio su un disco in partizioni e
   filesystem.}
   \label{fig:file_disk_filesys}
 \end{figure}
 
 Se si va ad esaminare con maggiore dettaglio la strutturazione
-dell'informazione all'interno del filesystem \textsl{ext2}, tralasciando i
+dell'informazione all'interno del filesystem \acr{ext2}, tralasciando i
 dettagli relativi al funzionamento del filesystem stesso come la
-strutturazione in gruppi dei blocchi, il \itindex{superblock}
-\textit{superblock} e tutti i dati di gestione possiamo esemplificare la
-situazione con uno schema come quello esposto in
-fig.~\ref{fig:file_filesys_detail}.
+strutturazione in gruppi dei blocchi, il \textit{superblock} e tutti i dati di
+gestione possiamo esemplificare la situazione con uno schema come quello
+esposto in fig.~\ref{fig:file_filesys_detail}.
 
 \begin{figure}[!htb]
   \centering
-  \includegraphics[width=12cm]{img/filesys_struct}
+  \includegraphics[width=11cm]{img/filesys_struct}
   \caption{Strutturazione dei dati all'interno di un filesystem.}
   \label{fig:file_filesys_detail}
 \end{figure}
@@ -424,7 +429,7 @@ directory che tratteremo nel prosieguo del capitolo. In particolare è
 opportuno tenere sempre presente che:
 
 
-\begin{enumerate}
+\begin{enumerate*}
   
 \item L'\textit{inode} contiene i cosiddetti \textsl{metadati}, vale dire le
   informazioni riguardanti le proprietà del file come oggetto del filesystem:
@@ -477,11 +482,11 @@ opportuno tenere sempre presente che:
   per gli \textit{inode}. Nel primo caso non sarà possibile allocare ulteriore
   spazio, ma si potranno creare file (vuoti), nel secondo non si potranno
   creare nuovi file, ma si potranno estendere quelli che ci
-  sono.\footnote{questo comportamento non è generale, alcuni filesystem
-    evoluti possono evitare il problema dell'esaurimento degli \textit{inode}
-    riallocando lo spazio disco libero per i blocchi.}
+  sono.\footnote{questo comportamento non è generale, alcuni filesystem più
+    sofisticati possono evitare il problema dell'esaurimento degli
+    \textit{inode} riallocando lo spazio disco libero per i blocchi.}
 
-\end{enumerate}
+\end{enumerate*}
 
 \begin{figure}[!htb]
   \centering 
@@ -509,10 +514,9 @@ tre, in quanto adesso sarà referenziata anche dalla voce ``\texttt{..}'' di
 \itindend{inode}
 
 
-\subsection{Alcuni dettagli sul filesystem \textsl{ext2} e successori}
+\subsection{Alcuni dettagli sul filesystem \acr{ext2} e successori}
 \label{sec:file_ext2}
 
-
 Benché non esista ``il'' filesystem di Linux, dato che esiste un supporto
 nativo di diversi filesystem che sono in uso da anni, quello che gli avvicina
 di più è la famiglia di filesystem evolutasi a partire dal \textit{second
@@ -520,11 +524,11 @@ di più è la famiglia di filesystem evolutasi a partire dal \textit{second
 grande sviluppo e diverse evoluzioni, fra cui l'aggiunta del
 \textit{journaling} con il passaggio ad \acr{ext3}, che probabilmente è ancora
 il filesystem più diffuso, ed una serie di ulteriori miglioramenti con il
-successivo \acr{ext4}, che sta iniziando a sostituirlo gradualmente. In futuro
-è previsto che questo debba essere sostituito da un filesystem completamente
-diverso, \acr{btrfs}, che dovrebbe diventare il filesystem standard di Linux,
-ma questo al momento è ancora in fase di sviluppo.\footnote{si fa riferimento
-  al momento dell'ultima revisione di di questo paragrafo, l'inizio del 2012.}
+successivo \acr{ext4}. In futuro è previsto che questo debba essere sostituito
+da un filesystem completamente diverso, \acr{Btrfs}, che dovrebbe diventare il
+filesystem standard di Linux, ma questo al momento è ancora in fase di
+sviluppo.\footnote{si fa riferimento al momento dell'ultima revisione di
+  questo paragrafo, l'inizio del 2012.}
 
 Il filesystem \acr{ext2} nasce come filesystem nativo per Linux a partire
 dalle prime versioni del kernel e supporta tutte le caratteristiche di un
@@ -537,7 +541,7 @@ significative ne mantengono le caratteristiche fondamentali.
 Oltre alle caratteristiche standard, \acr{ext2} fornisce alcune estensioni che
 non sono presenti su un classico filesystem di tipo Unix; le principali sono
 le seguenti:
-\begin{itemize}
+\begin{itemize*}
 \item gli attributi estesi (vedi sez.~\ref{sec:file_xattr}) che consentono di
   estendere le informazioni salvabili come metadati e le ACL (vedi
   sez.~\ref{sec:file_ACL}) che consentono di estendere il modello tradizionale
@@ -554,17 +558,17 @@ le seguenti:
   in fase di creazione, a seconda delle sue esigenze: blocchi più grandi
   permettono un accesso più veloce, ma sprecano più spazio disco.
 \item il filesystem implementa collegamenti simbolici veloci, in cui il nome
-  del file non è salvato su un blocco, ma tenuto all'interno \itindex{inode}
+  del file non è salvato su un blocco, ma tenuto all'interno
   dell'\textit{inode} (evitando letture multiple e spreco di spazio), non
   tutti i nomi però possono essere gestiti così per limiti di spazio (il
   limite è 60 caratteri).
-\item vengono supportati \itindex{file~attributes} i cosiddetti \textit{file
-    attributes} che attivano comportamenti specifici per i file su cui vengono
-  attivati come marcarli come immutabili (che possono cioè essere soltanto
-  letti) per la protezione di file di configurazione sensibili, o come
-  \textit{append-only} (che possono essere aperti in scrittura solo per
-  aggiungere dati) per la protezione dei file di log.
-\end{itemize}
+\item vengono supportati i cosiddetti \textit{file attributes} (vedi
+  sez.~\ref{sec:file_perm_overview}) che attivano comportamenti specifici per
+  i file su cui vengono attivati come marcarli come immutabili (che possono
+  cioè essere soltanto letti) per la protezione di file di configurazione
+  sensibili, o come \textit{append-only} (che possono essere aperti in
+  scrittura solo per aggiungere dati) per la protezione dei file di log.
+\end{itemize*}
 
 La struttura di \acr{ext2} è stata ispirata a quella del filesystem di BSD: un
 filesystem è composto da un insieme di blocchi, la struttura generale è quella
@@ -572,12 +576,11 @@ riportata in fig.~\ref{fig:file_filesys_detail}, in cui la partizione è divisa
 in gruppi di blocchi.
 
 Ciascun gruppo di blocchi contiene una copia delle informazioni essenziali del
-filesystem (i \itindex{superblock} \textit{superblock} sono quindi ridondati)
-per una maggiore affidabilità e possibilità di recupero in caso di corruzione
-del \itindex{superblock} \textit{superblock} principale. L'utilizzo di
-raggruppamenti di blocchi ha inoltre degli effetti positivi nelle prestazioni
-dato che viene ridotta la distanza fra i dati e la tabella degli
-\itindex{inode} \textit{inode}.
+filesystem (i \textit{superblock} sono quindi ridondati) per una maggiore
+affidabilità e possibilità di recupero in caso di corruzione del
+\textit{superblock} principale. L'utilizzo di raggruppamenti di blocchi ha
+inoltre degli effetti positivi nelle prestazioni dato che viene ridotta la
+distanza fra i dati e la tabella degli \textit{inode}.
 
 \begin{figure}[!htb]
   \centering
@@ -586,15 +589,16 @@ dato che viene ridotta la distanza fra i dati e la tabella degli
   \label{fig:file_ext2_dirs}
 \end{figure}
 
-Le directory sono implementate come una \itindex{linked~list} \textit{linked
-  list} con voci di dimensione variabile. Ciascuna voce della lista contiene
-il numero di \itindex{inode} \textit{inode}, la sua lunghezza, il nome del
-file e la sua lunghezza, secondo lo schema in fig.~\ref{fig:file_ext2_dirs};
-in questo modo è possibile implementare nomi per i file anche molto lunghi
-(fino a 1024 caratteri) senza sprecare spazio disco.
 
-Con l'introduzione del filesystem \textit{ext3} sono state introdotte diverse
-modifiche strutturali, la principale di queste è quella che \textit{ext3} è un
+Le directory sono implementate come una \textit{linked list} con voci di
+dimensione variabile. Ciascuna voce della lista contiene il numero di
+\textit{inode}, la sua lunghezza, il nome del file e la sua lunghezza, secondo
+lo schema in fig.~\ref{fig:file_ext2_dirs}; in questo modo è possibile
+implementare nomi per i file anche molto lunghi (fino a 1024 caratteri) senza
+sprecare spazio disco.
+
+Con l'introduzione del filesystem \acr{ext3} sono state introdotte diverse
+modifiche strutturali, la principale di queste è quella che \acr{ext3} è un
 filesystem \textit{journaled}, è cioè in grado di eseguire una registrazione
 delle operazioni di scrittura su un giornale (uno speciale file interno) in
 modo da poter garantire il ripristino della coerenza dei dati del
@@ -606,12 +610,12 @@ filesystem\footnote{si noti bene che si è parlato di dati \textsl{del}
 della corrente o di crollo del sistema che abbia causato una interruzione
 della scrittura dei dati sul disco.
 
-Oltre a questo \textit{ext3} introduce ulteriori modifiche volte a migliorare
+Oltre a questo \acr{ext3} introduce ulteriori modifiche volte a migliorare
 sia le prestazioni che la semplicità di gestione del filesystem, in
 particolare per le directory si è passato all'uso di alberi binari con
-indicizzazione tramite hash al posto delle \textit{linked list} che abbiamo
-illustrato, ottenendo un forte guadagno di prestazioni in caso di directory
-contenenti un gran numero di file.
+indicizzazione tramite \textit{hash} al posto delle \textit{linked list} che
+abbiamo illustrato, ottenendo un forte guadagno di prestazioni in caso di
+directory contenenti un gran numero di file.
 
 % TODO (bassa priorità) portare a ext3, ext4 e btrfs ed illustrare le
 % problematiche che si possono incontrare (in particolare quelle relative alla
@@ -650,14 +654,14 @@ memorizzati. L'operazione di attivazione del filesystem è chiamata
     o non può essere montato su \param{target} perché la directory è ancora in
     uso.
   \item[\errcode{EINVAL}] il dispositivo \param{source} presenta un
-    \itindex{superblock} \textit{superblock} non valido, o si è cercato di
-    rimontare un filesystem non ancora montato, o di montarlo senza
-    che \param{target} sia un \itindex{mount~point} \textit{mount point} o di
-    spostarlo quando \param{target} non è un \itindex{mount~point}
-    \textit{mount point} o è la radice.
-  \item[\errcode{ELOOP}] si è cercato di spostare un \itindex{mount~point}
-    \textit{mount point} su una sottodirectory di \param{source} o si sono
-    incontrati troppi collegamenti simbolici nella risoluzione di un nome.
+    \textit{superblock} non valido, o si è cercato di rimontare un filesystem
+    non ancora montato, o di montarlo senza che \param{target} sia un
+    \textit{mount point} o di spostarlo quando \param{target} non è un
+    \textit{mount point} o è la radice o si è usato un valore di
+    \param{mountflags} non valido.
+  \item[\errcode{ELOOP}] si è cercato di spostare un \textit{mount point} su
+    una sottodirectory di \param{source} o si sono incontrati troppi
+    collegamenti simbolici nella risoluzione di un nome.
   \item[\errcode{EMFILE}] in caso di filesystem virtuale, la tabella dei
     dispositivi fittizi (chiamati \textit{dummy} nella documentazione inglese)
     è piena.
@@ -665,7 +669,7 @@ memorizzati. L'operazione di attivazione del filesystem è chiamata
     configurato nel kernel.
   \item[\errcode{ENOTBLK}] non si è usato un \textit{block device} per
     \param{source} quando era richiesto.
-  \item[\errcode{ENXIO}] il \itindex{major~number} \textit{major number} del
+  \item[\errcode{ENXIO}] il \textit{major number} del
     dispositivo \param{source} è sbagliato.
   \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore.
   \end{errlist} 
@@ -673,28 +677,29 @@ memorizzati. L'operazione di attivazione del filesystem è chiamata
   \errval{ENOENT}, \errval{ENOTDIR} nel loro significato generico.}
 \end{funcproto}
 
-La funzione monta sulla directory indicata da \param{target}, detta
-\itindex{mount~point} \textit{mount point}, il filesystem contenuto nel file
-di dispositivo indicato da \param{source}. In entrambi i casi, come daremo per
-assunto da qui in avanti tutte le volte che si parla di directory o file nel
-passaggio di un argomento di una funzione, si intende che questi devono essere
-indicati con la stringa contenente il loro \textit{pathname}.
+\itindbeg{mount~point}
+
+L'uso più comune della funzione è quello di montare sulla directory indicata
+da \param{target}, detta \textit{mount point}, il filesystem contenuto nel
+file di dispositivo indicato da \param{source}. In entrambi i casi, come
+daremo per assunto da qui in avanti tutte le volte che si parla di directory o
+file nel passaggio di un argomento di una funzione, si intende che questi
+devono essere indicati con la stringa contenente il loro \textit{pathname}.
 
 Normalmente un filesystem è contenuto su un disco o una partizione, ma come
-illustrato in sez.~\ref{sec:file_vfs_work} la struttura del
-\itindex{Virtual~File~System} \textit{Virtual File System} è estremamente
-flessibile e può essere usata anche per oggetti diversi da un disco. Ad
-esempio usando il \textit{loop device} si può montare un file qualunque (come
-l'immagine di un CD-ROM o di un floppy) che contiene l'immagine di un
-filesystem, inoltre alcuni tipi di filesystem, come \texttt{proc} o
-\texttt{sysfs} sono virtuali e non hanno un supporto che ne contenga i dati,
-che invece sono generati al volo ad ogni lettura, e passati indietro al kernel
-ad ogni scrittura.\footnote{costituiscono quindi un meccanismo di
-  comunicazione, attraverso l'ordinaria interfaccia dei file, con il kernel.}
+illustrato in sez.~\ref{sec:file_vfs_work} la struttura del \textit{Virtual
+  File System} è estremamente flessibile e può essere usata anche per oggetti
+diversi da un disco. Ad esempio usando il \textit{loop device} si può montare
+un file qualunque (come l'immagine di un CD-ROM o di un floppy) che contiene
+l'immagine di un filesystem, inoltre alcuni tipi di filesystem, come
+\texttt{proc} o \texttt{sysfs} sono virtuali e non hanno un supporto che ne
+contenga i dati che sono generati al volo dal kernel ad ogni lettura, e
+inviati al kernel ad ogni scrittura (costituiscono quindi un meccanismo di
+comunicazione, attraverso l'ordinaria interfaccia dei file, con il kernel).
 
 Il tipo di filesystem che si vuole montare è specificato
 dall'argomento \param{filesystemtype}, che deve essere una delle stringhe
-riportate nel file \procfile{/proc/filesystems} che, come accennato in
+riportate nel file \procfilem{/proc/filesystems} che, come accennato in
 sez.~\ref{sec:file_vfs_work}, contiene l'elenco dei filesystem supportati dal
 kernel. Nel caso si sia indicato un filesystem virtuale, che non è associato a
 nessun file di dispositivo, il contenuto di \param{source} viene ignorato.
@@ -708,111 +713,307 @@ del comando \texttt{mount}. I valori utilizzabili dipendono dal tipo di
 filesystem e ciascuno ha i suoi, pertanto si rimanda alla documentazione della
 pagina di manuale di questo comando e dei singoli filesystem.
 
-Dopo l'esecuzione della funzione il contenuto del filesystem viene resto
-disponibile nella directory specificata come \itindex{mount~point}
-\textit{mount point}, il precedente contenuto di detta directory viene
-mascherato dal contenuto della directory radice del filesystem montato. Fino
-ai kernel della serie 2.2.x non era possibile montare un filesystem se un
-\textit{mount point} era già in uso. 
-
-A partire dal kernel 2.4.x inoltre è divenuto possibile sia spostare
-atomicamente un \itindex{mount~point} \textit{mount point} da una directory ad
-un'altra, sia montare lo stesso filesystem in diversi \itindex{mount~point}
-\textit{mount point}, sia montare più filesystem sullo stesso
-\itindex{mount~point} \textit{mount point} impilandoli l'uno sull'altro, nel
-qual caso vale comunque quanto detto in precedenza, e cioè che solo il
-contenuto dell'ultimo filesystem montato sarà visibile.
-
-Oltre alle opzioni specifiche di ciascun filesystem, che si passano nella
-forma della lista di parole chiave indicata con l'argomento \param{data},
-esistono pure alcune opzioni che si possono applicare in generale, anche se
-non è detto che tutti i filesystem le supportino, che si specificano tramite
-l'argomento \param{mountflags}.  L'argomento inoltre può essere utilizzato per
-modificare il comportamento della funzione \func{mount}, facendole compiere
-una operazione diversa (ad esempio un rimontaggio, invece che un montaggio).
-
-In Linux \param{mountflags} deve essere un intero a 32 bit; fino ai kernel
-della serie 2.2.x i 16 più significativi avevano un valore riservato che
-doveva essere specificato obbligatoriamente,\footnote{il valore era il
-  \itindex{magic~number} \textit{magic number} \code{0xC0ED}, si può usare la
-  costante \const{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags}
-  riservata al \textit{magic number}, mentre per specificarlo si può dare un
-  OR aritmetico con la costante \const{MS\_MGC\_VAL}.} e si potevano usare
-solo i 16 meno significativi. Oggi invece, con un numero di opzioni superiore,
-sono utilizzati tutti e 32 i bit, ma qualora nei 16 più significativi sia
-presente detto valore, che non esprime una combinazione valida, esso viene
-ignorato. Il valore dell'argomento deve essere espresso come maschera binaria
-e i vari bit che lo compongono, detti anche \textit{mount flags}, devono
-essere impostati con un OR aritmetico dei valori dalle costanti riportate
-nell'elenco seguente:
-
-\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
+Dopo l'esecuzione della funzione il contenuto del filesystem viene reso
+disponibile nella directory specificata come \textit{mount point} ed il
+precedente contenuto di detta directory viene mascherato dal contenuto della
+directory radice del filesystem montato. Fino ai kernel della serie 2.2.x non
+era possibile montare un filesystem se un \textit{mount point} era già in uso,
+coi kernel successivi è possibile montare più filesystem sullo stesso
+\textit{mount point} impilandoli l'uno sull'altro, anche in questo caso vale
+quanto appena detto, e solo il contenuto dell'ultimo filesystem montato sarà
+visibile, mascherando quelli sottostanti.
+
+In realtà quella di montare un filesystem è solo una delle operazioni che si
+possono effettuare con \func{mount}, la funzione infatti è dedicata a tutte le
+operazioni relative alla gestione del montaggio dei filesystem e dei
+\textit{mount point}. Ad esempio fin dalle sue origini poteva essere
+utilizzata per effettuare il rimontaggio di un filesystem con opzioni diverse,
+ed a partire dal kernel 2.4.x è divenuto possibile usarla per spostare
+atomicamente un \textit{mount point} da una directory ad un'altra, per montare
+lo stesso filesystem in diversi \textit{mount point}, per montare una
+directory su un'altra (il cosiddetto \textit{bind mount}).
+
+\itindend{mount~point}
+
+Il tipo di operazione compiuto da \func{mount} viene stabilito in base al
+valore dell'argomento \param{mountflags}, che oltre alla selezione del tipo di
+operazione da compiere, consente anche di indicare alcune opzioni generiche
+valide per qualunque filesystem.\footnote{benché queste siano espresse nel
+  comando \cmd{mount} con l'opzione \texttt{-o} esse non vengono impostate nei
+  valori di \param{data}, che serve solo per le opzioni specifiche di ogni
+  filesystem.}  Il valore dell'argomento deve essere espresso come maschera
+binaria e i vari bit che lo compongono, detti anche \textit{mount flags},
+devono essere impostati con un OR aritmetico dei valori dalle opportune
+costanti che illustreremo a breve.
+
+In Linux \param{mountflags} deve essere un intero a 32 bit;
+fino ai kernel della serie 2.2.x i 16 più significativi avevano un valore
+riservato che doveva essere specificato obbligatoriamente,\footnote{il valore
+  era il \textit{magic number} \code{0xC0ED}, si può usare la costante
+  \constd{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags} riservata
+  al \textit{magic number}, mentre per specificarlo si può dare un OR
+  aritmetico con la costante \constd{MS\_MGC\_VAL}.} e si potevano usare solo
+i 16 meno significativi. Oggi invece, con un numero di opzioni superiore, sono
+utilizzati tutti e 32 i bit, ma qualora nei 16 più significativi sia presente
+detto valore, che non esprime una combinazione valida, esso viene ignorato.
+
+Come accennato il tipo di operazione eseguito da \func{mount} viene stabilito
+in base al contenuto di \param{mountflags}, la scelta viene effettuata
+controllando nell'ordine:
+\begin{enumerate*}
+\item se è presente il flag \const{MS\_REMOUNT}, nel qual caso verrà eseguito
+  il rimontaggio del filesystem, con le nuove opzioni indicate da \param{data}
+  e dagli altri flag di \param{mountflags};
+\item se è presente il flag \const{MS\_BIND}, nel qual caso verrà eseguito un
+  \textit{bind mount} (argomento che tratteremo più avanti);
+\item se è presente uno fra \const{MS\_SHARED}, \const{MS\_PRIVATE},
+  \const{MS\_SLAVE}, \const{MS\_UNBINDABLE}, nel qual caso verrà cambiata la
+  modalità di propagazione del montaggio (detti valori sono mutualmente
+  esclusivi).
+\item se è presente \const{MS\_MOVE}, nel qual caso verrà effettuato uno
+  spostamento del \textit{mount point};
+\item se nessuno dei precedenti è presente si tratta di una ordinaria
+  operazione di montaggio di un filesystem.
+\end{enumerate*}
+
+Il fatto che questi valori vengano controllati in quest'ordine significa che
+l'effetto di alcuni di questi flag possono cambiare se usati in combinazione
+con gli altri che vengono prima nella sequenza (è quanto avviene ad esempio
+per \const{MS\_BIND} usato con \const{MS\_REMOUNT}). Tratteremo questi
+\textit{mount flags} speciali per primi, nell'ordine appena illustrato,
+tornando sugli altri più avanti.
+
+Usando il flag \constd{MS\_REMOUNT} si richiede a \func{mount} di rimontare un
+filesystem già montato cambiandone le opzioni di montaggio in maniera atomica
+(non è cioè necessario smontare e rimontare il filesystem per effettuare il
+cambiamento). Questa operazione consente di modificare le opzioni del
+filesystem anche se questo è in uso. Gli argomenti \param{source} e
+\param{target} devono essere gli stessi usati per il montaggio originale,
+mentre sia \param{data} che \param{mountflags} conterranno le nuove opzioni,
+\param{filesystemtype} viene ignorato.  Perché l'operazione abbia successo
+occorre comunque che il cambiamento sia possibile (ad esempio non sarà
+possibile rimontare in sola lettura un filesystem su cui sono aperti file per
+la lettura/scrittura).
+
+Qualunque opzione specifica del filesystem indicata con \param{data} può
+essere modificata (ma si dovranno rielencare tutte quelle volute), mentre con
+\param{mountflags} possono essere modificate solo alcune opzioni generiche:
+\const{MS\_LAZYTIME}, \const{MS\_MANDLOCK}, \const{MS\_NOATIME},
+\const{MS\_NODEV}, \const{MS\_NODIRATIME}, \const{MS\_NOEXEC},
+\const{MS\_NOSUID}, \const{MS\_RELATIME}, \const{MS\_RDONLY},
+\const{MS\_STRICTATIME} e \const{MS\_SYNCHRONOUS}. Inoltre dal kernel 3.17 il
+comportamento relativo alle opzioni che operano sui tempi di ultimo accesso
+dei file (vedi sez.~\ref{sec:file_file_times}) è cambiato e se non si è
+indicato nessuno dei vari \texttt{MS\_*ATIME} vengono mantenute le
+impostazioni esistenti anziché forzare l'uso di \const{MS\_RELATIME}.
+
 \itindbeg{bind~mount}
-\item[\const{MS\_BIND}] Effettua un cosiddetto \textit{bind mount}, in cui è
-  possibile montare una directory di un filesystem in un'altra directory,
-  l'opzione è disponibile a partire dai kernel della serie 2.4. In questo caso
-  verranno presi in considerazione solo gli argomenti \param{source}, che
-  stavolta indicherà la directory che si vuole montare e non un file di
-  dispositivo, e \param{target} che indicherà la directory su cui verrà
-  effettuato il \textit{bind mount}. Gli argomenti \param{filesystemtype}
-  e \param{data} vengono ignorati.
-
-  In sostanza quello che avviene è che in corrispondenza del \textit{pathname}
-  indicato da \param{target} viene montato \itindex{inode} l'\textit{inode}
-  di \param{source}, così che la porzione di albero dei file presente sotto
-  \param{source} diventi visibile allo stesso modo sotto
-  \param{target}. Trattandosi esattamente dei dati dello stesso filesystem,
-  ogni modifica fatta in uno qualunque dei due rami di albero sarà visibile
-  nell'altro, visto che entrambi faranno riferimento agli stessi
-  \textit{inode}.
-
-  Dal punto di vista del \itindex{Virtual~File~System} VFS l'operazione è
-  analoga al montaggio di un filesystem proprio nel fatto che anche in questo
-  caso si inserisce in corrispondenza della \textit{dentry} di \texttt{target}
-  un diverso \itindex{inode} \textit{inode}, che stavolta, invece di essere
-  quello della radice del filesystem indicato da un file di dispositivo, è
-  quello di una directory già montata.
-
-  Si tenga presente che proprio per questo sotto \param{target} comparirà il
-  contenuto che è presente sotto \param{source} all'interno del filesystem in
-  cui quest'ultima è contenuta. Questo potrebbe non corrispondere alla
-  porzione di albero che sta sotto \param{source} qualora in una
-  sottodirectory di quest'ultima si fosse effettuato un altro montaggio. In
-  tal caso infatti nella porzione di albero sotto \param{source} si troverebbe
-  il contenuto del nuovo filesystem (o di un altro \textit{bind mount}) mentre
-  sotto \param{target} ci sarebbe il contenuto presente nel filesystem
-  originale.\footnote{questo evita anche il problema dei \textit{loop} di
-    fig.~\ref{fig:file_link_loop}, dato che se anche si montasse su
-    \param{target} una directory in cui essa è contenuta, il cerchio non
-    potrebbe chiudersi perché ritornati a \param{target} dentro il
-    \textit{bind mount} vi si troverebbe solo il contenuto originale e non si
-    potrebbe tornare indietro.}
-
-  Fino al kernel 2.6.26 questo flag doveva essere usato da solo, in quanto il
-  \textit{bind mount} continuava ad utilizzare le stesse opzioni del montaggio
-  originale, dal 2.6.26 è stato introdotto il supporto per il cosiddetto
-  \textit{read-only bind mount} e viene onorata la presenza aggiuntiva del
-  flag \const{MS\_RDONLY}. In questo modo si ottiene che l'accesso ai file
-  sotto \param{target} sia effettuabile esclusivamente in sola lettura.
-
-  Il supporto per il \textit{bind mount} consente di superare i limiti
-  presenti per gli \textit{hard link} (di cui parleremo in
-  sez.~\ref{sec:link_symlink_rename}) con la possibilità di fare riferimento
-  alla porzione dell'albero dei file di un filesystem presente a partire da
-  una certa directory, utilizzando una qualunque altra directory, anche se
-  questa sta su un filesystem diverso. Si può così fornire una alternativa
-  all'uso dei collegamenti simbolici (di cui parleremo in
-  sez.~\ref{sec:link_symlink_rename}) che funziona correttamente anche
-  all'intero di un \textit{chroot} (argomento su cui torneremo in
-  sez.~\ref{sec:file_chroot}).  \itindend{bind~mount}
-
-\item[\const{MS\_DIRSYNC}] Richiede che ogni modifica al contenuto di una
+
+Usando il flag \constd{MS\_BIND} si richiede a \func{mount} di effettuare un
+cosiddetto \textit{bind mount}, l'operazione che consente di montare una
+directory di un filesystem in un'altra directory. L'opzione è disponibile a
+partire dai kernel della serie 2.4. In questo caso verranno presi in
+considerazione solo gli argomenti \param{source}, che stavolta indicherà la
+directory che si vuole montare e non un file di dispositivo, e \param{target}
+che indicherà la directory su cui verrà effettuato il \textit{bind mount}. Gli
+argomenti \param{filesystemtype} e \param{data} vengono ignorati.
+
+Quello che avviene con questa operazione è che in corrispondenza del
+\textit{pathname} indicato da \param{target} viene montato l'\textit{inode} di
+\param{source}, così che la porzione di albero dei file presente sotto
+\param{source} diventi visibile allo stesso modo sotto
+\param{target}. Trattandosi esattamente dei dati dello stesso filesystem, ogni
+modifica fatta in uno qualunque dei due rami di albero sarà visibile
+nell'altro, visto che entrambi faranno riferimento agli stessi \textit{inode}.
+
+Dal punto di vista del VFS l'operazione è analoga al montaggio di un
+filesystem proprio nel fatto che anche in questo caso si inserisce in
+corrispondenza della \textit{dentry} di \texttt{target} un diverso
+\textit{inode}, che stavolta, invece di essere quello della radice del
+filesystem indicato da un file di dispositivo, è quello di una directory già
+montata.
+
+Si tenga presente che proprio per questo sotto \param{target} comparirà il
+contenuto che è presente sotto \param{source} all'interno del filesystem in
+cui quest'ultima è contenuta. Questo potrebbe non corrispondere alla porzione
+di albero che sta sotto \param{source} qualora in una sottodirectory di
+quest'ultima si fosse effettuato un altro montaggio. In tal caso infatti nella
+porzione di albero sotto \param{source} si troverebbe il contenuto del nuovo
+filesystem (o di un altro \textit{bind mount}) mentre sotto \param{target} ci
+sarebbe il contenuto presente nel filesystem originale.
+
+L'unico altro \textit{mount flag} usabile direttamente con \const{MS\_BIND} è
+\const{MS\_REC} che consente di eseguire una operazione di \textit{bind mount}
+ricorsiva, in cui sotto \param{target} vengono montati ricorsivamente anche
+tutti gli eventuali ulteriori \textit{bind mount} già presenti sotto
+\param{source}.
+
+E' però possibile, a partire dal kernel 2.6.26, usare questo flag insieme a
+\const{MS\_REMOUNT}, nel qual caso consente di effettuare una modifica delle
+opzioni di montaggio del \textit{bind mount} ed in particolare effettuare il
+cosiddetto \textit{read-only bind mount} in cui viene onorata anche la
+presenza aggiuntiva del flag \const{MS\_RDONLY}. In questo modo si ottiene che
+l'accesso ai file sotto \param{target} sia effettuabile esclusivamente in sola
+lettura, mantenendo il normale accesso in lettura/scrittura sotto
+\param{source}.
+
+Il supporto per il \textit{bind mount} consente di superare i limiti presenti
+per gli \textit{hard link} (di cui parleremo in
+sez.~\ref{sec:link_symlink_rename}) con la possibilità di fare riferimento
+alla porzione dell'albero dei file di un filesystem presente a partire da una
+certa directory utilizzando una qualunque altra directory, anche se questa sta
+su un filesystem diverso.\footnote{e non c'è neanche il problema di non esser
+  più in grado di cancellare un \textit{hard link} ad una directory sullo
+  stesso filesystem (vedi sez.~\ref{sec:link_symlink_rename}), per cui su
+  Linux questi non sono possibili, dato che in questo caso per la rimozione
+  del collegamento basta smontare \param{target}.} Si può così fornire una
+alternativa all'uso dei collegamenti simbolici (di cui parleremo in
+sez.~\ref{sec:link_symlink_rename}) che funziona correttamente anche
+all'intero di un \textit{chroot} (argomento su cui torneremo in
+sez.~\ref{sec:file_chroot}).
+
+\itindend{bind~mount}
+\itindbeg{shared~subtree}
+
+I quattro flag \const{MS\_PRIVATE}, \const{MS\_SHARED}, \const{MS\_SLAVE} e
+\const{MS\_UNBINDABLE} sono stati introdotti a partire dal kernel 2.6.15 per
+realizzare l'infrastruttura dei cosiddetti \textit{shared subtree}, che
+estendono le funzionalità dei \textit{bind mount}.  La funzionalità nasce
+dalle esigenze di poter utilizzare a pieno le funzionalità di isolamento
+fornite dal kernel per i processi (i \textit{namespace}, che tratteremo in
+sez.~\ref{sec:process_namespaces}) in particolare per quanto riguarda la
+possibilità di far avere ad un processo una visione ristretta dei filesystem
+montati (il \textit{mount namespace}), ma l'applicazione è comunque rilevante
+anche con un classico \textit{chroot} (vedi sez.~\ref{sec:file_chroot}).
+
+\itindbeg{submount}
+
+Abbiamo visto come nella modalità ordinaria in cui si esegue un
+\textit{bind mount} sotto \param{target} compaia lo stesso ramo di albero dei
+file presente sotto \param{source}, ma limitato a quanto presente nel
+filesystem di \param{source}; i risultati di un eventuale
+``\textit{submount}'' effettuato all'interno di \param{source} non saranno
+visibili. Ed anche se quelli presenti al momento dell'uso di \const{MS\_BIND}
+possono essere riottenuti usando \const{MS\_REC}, ogni eventuale
+``\textit{submount}'' successivo (che avvenga sotto \param{source} o sotto
+\param{target}) resterà ``\textsl{privato}'' al ramo di albero su cui è
+avvenuto.
+
+\itindend{submount}
+\itindbeg{mount peer group}
+
+Ci sono casi però in cui può risultare utile che eventuali
+``\textit{submount}'' siano visibili sui rami di albero presenti al di sotto
+di tutte le directory coinvolte in un \textit{bind mount}, anche se effettuati
+in un secondo tempo. Per poter ottenere questa funzionalità i
+\textit{bind mount} sono stati estesi introducendo i \textit{mount peer
+  group}, che consentono di raggrupparli in modo da poter inviare a ciascuno
+di essi tutti gli eventi relativi a montaggi o smontaggi effettuati al loro
+interno ed avere sempre una propagazione degli stessi che li renda coerenti.
+
+Quando si effettua un montaggio ordinario, o si esegue un \textit{bind mount},
+di default non viene utilizzato nessun \textit{mount peer group} ed il
+\textit{mount point} viene classificato come ``\textsl{privato}'', nel senso
+che abbiamo appena visto.  Si può però marcare un \textit{mount point} come
+``\textsl{condiviso}'', ed in questo modo esso verrà associato ad un
+\textit{mount peer group} insieme a tutti gli altri ulteriori \textit{mount
+  point} per i quali sia stato eseguito un \textit{bind mount}. Questo fa sì
+che tutte le volte che si effettua un montaggio o uno smontaggio all'interno
+di uno qualunque dei \textit{mount point} del gruppo, questo venga propagato
+anche su tutti gli altri e sotto tutti sia visibile sempre lo stesso ramo di
+albero dei file.
+
+A completare l'infrastruttura degli \textit{shared subtree} sono state
+previste due ulteriori funzionalità: la prima è quella di marcare un
+\textit{mount point} come ``\textit{slave}'', in tal caso le operazioni di
+montaggio e smontaggio effettuate al suo interno non verranno più propagate
+agli altri membri del \textit{mount peer group} di cui fa parte, ma continuerà
+a ricevere quelle eseguite negli altri membri.
+
+La seconda funzionalità è quella di marcare un \textit{mount point} come
+``\textit{unbindable}''; questo anzitutto impedirà che possa essere usato come
+sorgente di un \textit{bind mount} ed inoltre lo renderà privato, con la
+conseguenza che quando è presente all'interno di altri \textit{bind mount},
+all'interno di questi si vedrà solo il contenuto originale e non quello
+risultante da eventuali ulteriori montaggi effettuati al suo interno.
+
+\itindend{mount peer group}
+
+I \textit{mount flag} che controllano le operazioni relative agli
+\textit{shared subtree} sono descritti nella lista seguente. Si ricordi che
+sono mutuamente esclusivi, e compatibili solo con l'uso degli ulteriori flag
+\const{MS\_REC} (che applica ricorsivamente l'operazione a tutti gli eventuali
+\textit{mount point} sottostanti) e \const{MS\_SILENT}; in tutti gli altri
+casi \func{mount} fallirà con un errore di \errval{EINVAL}. L'unico altro
+argomento che deve essere specificato quando li si usano è \param{target};
+\param{source}, \param{data} e \param{filesystem} sono ignorati.
+
+\begin{basedescript}{\desclabelwidth{1.9cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\constd{MS\_PRIVATE}] Marca un \textit{mount point} come \textit{private
+    mount}.  Di default, finché non lo si marca altrimenti con una delle altre
+  opzioni dell'interfaccia, ogni \textit{mount point} è privato. Ogni
+  \textit{bind mount} ottenuto da un \textit{mount point} privato si comporta
+  come descritto nella trattazione di \const{MS\_BIND}. Si usa questo flag
+  principalmente per revocare gli effetti delle altre opzioni e riportare il
+  comportamento a quello ordinario.
+
+\item[\constd{MS\_SHARED}] Marca un \textit{mount point} come \textit{shared
+    mount}.  Lo scopo dell'opzione è ottenere che tutti i successivi
+  \textit{bind mount} ottenuti da un \textit{mount point} così marcato siano
+  di tipo \textit{shared} e vengano inseriti nello stesso \textit{mount peer
+    group} in modo da ``\textsl{condividere}'' ogni ulteriore operazione di
+  montaggio o smontaggio. Con questa opzione le operazioni di montaggio e
+  smontaggio effettuate al di sotto di uno \textit{shared mount} vengono
+  automaticamente ``\textsl{propagate}'' a tutti gli altri membri del
+  \textit{mount peer group} di cui fa parte, in modo che la sezione di albero
+  dei file visibile al di sotto di ciascuno di essi sia sempre la stessa.
+
+\item[\constd{MS\_SLAVE}] Marca un \textit{mount point} come \textit{slave
+    mount}. Se il \textit{mount point} è parte di un \textit{mount peer group}
+  esso diventerà di tipo \textit{slave}: le operazioni di montaggio e
+  smontaggio al suo interno non verranno più propagate agli altri membri del
+  gruppo, ma continuerà a ricevere quelle eseguite negli altri membri. Se non
+  esistono altri membri nel gruppo il \textit{mount point} diventerà privato,
+  negli altri casi non subirà nessun cambiamento.
+
+\item[\constd{MS\_UNBINDABLE}] Marca un \textit{mount point} come
+  \textit{unbindable mount}.  Un \textit{mount point} marcato in questo modo
+  non può essere usato per un \textit{bind mount} del suo contenuto. Si
+  comporta cioè come allo stesso modo di un \textit{mount point} ordinario di
+  tipo \textit{private} con in più la restrizione che nessuna sua
+  sottodirectory (anche se relativa ad un ulteriore montaggio) possa essere
+  utilizzata come sorgente di un \textit{bind mount}.
+  
+\end{basedescript}
+\itindend{shared~subtree}
+
+L'ultimo \textit{mount flag} che controlla una modalità operativa di
+\func{mount} è \constd{MS\_MOVE}, che consente di effettuare lo spostamento
+del \textit{mount point} di un filesystem. La directory del \textit{mount
+  point} originale deve essere indicata nell'argomento \param{source}, e la
+sua nuova posizione nell'argomento \param{target}. Tutti gli altri argomenti
+della funzione vengono ignorati.
+
+Lo spostamento avviene atomicamente, ed il ramo di albero presente sotto
+\param{source} sarà immediatamente visibile sotto \param{target}. Non esiste
+cioè nessun momento in cui il filesystem non risulti montato in una o
+nell'altra directory e pertanto è garantito che la risoluzione di
+\textit{pathname} relativi all'interno del filesystem non possa fallire.
+
+Elenchiamo infine i restanti \textit{mount flag}, il cui utilizzo non attiene
+alle operazioni di \func{mount}, ma soltanto l'impostazione di opzioni
+generiche relative al funzionamento di un filesystem e che vengono per lo più
+utilizzati solo in fase di montaggio:
+
+\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}}
+\item[\constd{MS\_DIRSYNC}] Richiede che ogni modifica al contenuto di una
   directory venga immediatamente registrata su disco in maniera sincrona
   (introdotta a partire dai kernel della serie 2.6). L'opzione si applica a
   tutte le directory del filesystem, ma su alcuni filesystem è possibile
-  impostarla a livello di singole directory o per i sottorami di una directory
+  impostarla a livello di singole directory o per i sotto-rami 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
@@ -820,62 +1021,62 @@ nell'elenco seguente:
   operazioni sulle directory non saranno più bufferizzate e si bloccheranno
   fino all'arrivo dei dati sul disco prima che un programma possa proseguire.
 
-\item[\const{MS\_MANDLOCK}] Consente l'uso del \textit{mandatory locking}
-  \itindex{mandatory~locking} (vedi sez.~\ref{sec:file_mand_locking}) sui file
-  del filesystem. Per poterlo utilizzare effettivamente però esso dovrà essere
-  comunque attivato esplicitamente per i singoli file impostando i permessi
-  come illustrato in sez.~\ref{sec:file_mand_locking}.
-
-\item[\const{MS\_MOVE}] Effettua uno del spostamento del \itindex{mount~point}
-  \textit{mount point} di un filesystem. La directory del
-  \itindex{mount~point} \textit{mount point} originale deve essere indicata
-  nell'argomento \param{source}, e la sua nuova posizione
-  nell'argomento \param{target}. Tutti gli altri argomenti della funzione
-  vengono ignorati.
-
-  Lo spostamento avviene atomicamente, ed il ramo di albero presente
-  sotto \param{source} sarà immediatamente visibile sotto \param{target}. Non
-  esiste cioè nessun momento in cui il filesystem non risulti montato in una o
-  nell'altra directory e pertanto è garantito che la risoluzione di
-  \itindsub{pathname}{relativo} \textit{pathname} relativi all'interno del
-  filesystem non possa fallire.
-
-\item[\const{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento
-  degli \textit{access time} (vedi sez.~\ref{sec:file_file_times}) per
-  qualunque tipo di file. Dato che l'aggiornamento degli \textit{access time}
-  è una funzionalità la cui utilità è spesso irrilevante ma comporta un costo
+\item[\constd{MS\_LAZYTIME}] Modifica la modalità di registrazione di tempi
+  dei file (vedi sez.~\ref{sec:file_file_times}) per ridurre al massimo gli
+  accessi a disco (particolarmente utile per i portatili). Attivandolo i tempi
+  dei file vengono mantenuti in memoria e vengono salvati su disco solo in
+  quattro casi: quando c'è da eseguire un aggiornamento dei dati
+  dell'\textit{inode} per altri motivi, se viene usata una delle funzioni di
+  sincronizzazione dei dati su disco (vedi sez.~\ref{sec:file_sync}), se
+  l'\textit{inode} viene rimosso dalla memoria, o se è passato un giorno
+  dall'ultima registrazione. Introdotto a partire dal kernel 4.0.
+
+  In questo modo si possono ridurre significativamente le scritture su disco
+  mantenendo tutte le informazioni riguardo ai tempi dei file, riducendo anche
+  l'impatto dell'uso di \const{MS\_STRICTATIME}. Il costo da pagare è il
+  rischio, in caso di crash del sistema, di avere dati vecchi fino a 24 ore
+  per quel che riguarda i tempi dei file.
+  
+\item[\constd{MS\_MANDLOCK}] Consente l'uso del \textit{mandatory locking}
+  (vedi sez.~\ref{sec:file_mand_locking}) sui file del filesystem. Per poterlo
+  utilizzare effettivamente però esso dovrà essere comunque attivato
+  esplicitamente per i singoli file impostando i permessi come illustrato in
+  sez.~\ref{sec:file_mand_locking}.
+
+\item[\constd{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento
+  dell'\textit{access time} (vedi sez.~\ref{sec:file_file_times}) per
+  qualunque tipo di file. Dato che l'aggiornamento dell'\textit{access time} è
+  una funzionalità la cui utilità è spesso irrilevante ma comporta un costo
   elevato visto che una qualunque lettura comporta comunque una scrittura su
-  disco,\footnote{e questo ad esempio ha conseguenze molto pesanti nell'uso
-    della batteria sui portatili.} questa opzione consente di disabilitarla
-  completamente. La soluzione può risultare troppo drastica dato che
-  l'informazione viene comunque utilizzata da alcuni programmi, per cui nello
-  sviluppo del kernel sono state introdotte altre opzioni che forniscono
-  soluzioni più appropriate e meno radicali.
-
-\item[\const{MS\_NODEV}] Viene disabilitato sul filesystem l'accesso ai file
+  disco, questa opzione consente di disabilitarla completamente. La soluzione
+  può risultare troppo drastica dato che l'informazione viene comunque
+  utilizzata da alcuni programmi, per cui nello sviluppo del kernel sono state
+  introdotte altre opzioni che forniscono soluzioni più appropriate e meno
+  radicali.
+
+\item[\constd{MS\_NODEV}] Viene disabilitato sul filesystem l'accesso ai file
   di dispositivo eventualmente presenti su di esso. L'opzione viene usata come
   misura di precauzione per rendere inutile la presenza di eventuali file di
   dispositivo su filesystem che non dovrebbero contenerne.\footnote{si ricordi
-    che le convenzioni del \itindex{Filesystem~Hierarchy~Standard~(FHS)}
-    \textit{Linux Filesystem Hierarchy Standard} richiedono che questi siano
-    mantenuti esclusivamente sotto \texttt{/dev}.}
+    che le convenzioni del \textit{Linux Filesystem Hierarchy Standard}
+    richiedono che questi siano mantenuti esclusivamente sotto \texttt{/dev}.}
 
   Viene utilizzata, assieme a \const{MS\_NOEXEC} e \const{MS\_NOSUID}, per
   fornire un accesso più controllato a quei filesystem di cui gli utenti hanno
   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
-  sez.~\ref{sec:file_file_times}), ma soltanto per le directory. Costituisce
+\item[\constd{MS\_NODIRATIME}] Viene disabilitato sul filesystem
+  l'aggiornamento dell'\textit{access time} (vedi
+  sez.~\ref{sec:file_file_times}) ma soltanto per le directory. Costituisce
   una alternativa per \const{MS\_NOATIME}, che elimina l'informazione per le
   directory, che in pratica che non viene mai utilizzata, mantenendola per i
   file in cui invece ha un impiego, sia pur limitato.
 
-\item[\const{MS\_NOEXEC}] Viene disabilitata sul filesystem l'esecuzione di un
+\item[\constd{MS\_NOEXEC}] Viene disabilitata sul filesystem l'esecuzione di un
   qualunque file eseguibile eventualmente presente su di esso. L'opzione viene
   usata come misura di precauzione per rendere impossibile l'uso di programmi
   posti su filesystem che non dovrebbero contenerne.
@@ -891,56 +1092,43 @@ nell'elenco seguente:
     vuole che gli utenti eseguano solo i programmi forniti
     dall'amministratore.}
 
-\item[\const{MS\_NOSUID}] Viene disabilitato sul filesystem l'effetto dei bit
-  dei permessi \itindex{suid~bit} \acr{suid} e \itindex{sgid~bit} \acr{sgid}
-  (vedi sez.~\ref{sec:file_special_perm}) eventualmente presenti sui file in
-  esso contenuti. L'opzione viene usata come misura di precauzione per rendere
-  inefficace l'effetto di questi bit per filesystem in cui non ci dovrebbero
-  essere file dotati di questi permessi.
+\item[\constd{MS\_NOSUID}] Viene disabilitato sul filesystem l'effetto dei bit
+  dei permessi \acr{suid} e \acr{sgid} (vedi sez.~\ref{sec:file_special_perm})
+  eventualmente presenti sui file in esso contenuti. L'opzione viene usata
+  come misura di precauzione per rendere inefficace l'effetto di questi bit
+  per filesystem in cui non ci dovrebbero essere file dotati di questi
+  permessi.
 
   Di nuovo viene utilizzata, analogamente a \const{MS\_NOEXEC} e
   \const{MS\_NODEV}, per fornire un accesso più controllato a quei filesystem
   di cui gli utenti hanno il controllo dei contenuti. In questo caso si evita
   che un utente malizioso possa inserire su uno di questi filesystem un
-  eseguibile con il bit \itindex{suid~bit} \acr{suid} attivo e di proprietà
-  dell'amministratore o di un altro utente, che gli consentirebbe di eseguirlo
-  per conto di quest'ultimo.
-
-\item[\const{MS\_PRIVATE}] Marca un \itindex{mount~point} \textit{mount point}
-  come privato. Si tratta di una delle nuove opzioni (insieme a
-  \const{MS\_SHARED}, \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti
-  parte dell'infrastruttura degli \itindex{shared~subtree} \textit{shared
-    subtree} introdotta a partire dal kernel 2.6.15, che estendono le
-  funzionalità dei \itindex{bind~mount} \textit{bind mount}. In questo caso
-  \param{target} dovrà fare riferimento al \textit{mount point} che si intende
-  marcare, e tutti gli altri argomenti verranno ignorati.
-
-  Di default, finché non lo si marca altrimenti con una delle altre opzioni
-  dell'interfaccia \itindex{shared~subtree} \textit{shared subtree}, ogni
-  \textit{mount point} è privato. Ogni \textit{bind mount} ottenuto da un
-  \itindex{mount~point} \textit{mount point} di tipo \textit{private} si
-  comporta come descritto nella trattazione di \const{MS\_BIND}. Si usa questo
-  flag principalmente per revocare gli effetti delle altre opzioni e riportare
-  il comportamento a quello ordinario.
-
-\item[\const{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura,
+  eseguibile con il bit \acr{suid} attivo e di proprietà dell'amministratore o
+  di un altro utente, che gli consentirebbe di eseguirlo per conto di
+  quest'ultimo.
+
+\item[\constd{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura,
   non sarà possibile nessuna modifica ai suoi contenuti. Viene usato tutte le
   volte che si deve accedere ai contenuti di un filesystem con la certezza che
   questo non venga modificato (ad esempio per ispezionare un filesystem
   corrotto). All'avvio di default il kernel monta la radice in questa
-  modalità.
-
-\item[\const{MS\_REC}] Applica ricorsivamente a tutti i \itindex{mount~point}
-  \textit{mount point} presenti al di sotto del \textit{mount point} indicato
-  gli effetti della opzione degli \itindex{shared~subtree} \textit{shared
-    subtree} associata. Anche questo caso l'argomento \param{target} deve fare
-  riferimento ad un \itindex{mount~point} \textit{mount point} e tutti gli
-  altri argomenti sono ignorati, ed il flag deve essere indicato assieme ad
-  una fra \const{MS\_PRIVATE}, \const{MS\_SHARED}, \const{MS\_SLAVE} e
-  \const{MS\_UNBINDABLE}.
-
-\item[\const{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli
-  \textit{access time} sul filesystem soltanto quando questo risulti
+  modalità. Si tenga presente che se non viene indicato il filesystem verrà
+  montato, o rimontato nel caso lo si usi con \const{MS\_REMOUNT}, in
+  lettura/scrittura; questo significa in sostanza che non esiste una opzione
+  separata per indicare il montaggio in lettura/scrittura.
+
+\item[\constd{MS\_REC}] Applica ricorsivamente a tutti i \textit{mount point}
+  presenti al di sotto del \textit{mount point} indicato gli effetti della
+  opzione degli \textit{shared subtree} associata. In questo caso l'argomento
+  \param{target} deve fare riferimento ad un \textit{mount point} e tutti gli
+  altri argomenti sono ignorati, ed il flag deve essere indicato con uno fra
+  \const{MS\_PRIVATE}, \const{MS\_SHARED}, \const{MS\_SLAVE} e
+  \const{MS\_UNBINDABLE}. Può anche essere usato con \const{MS\_BIND} per
+  richiedere il montaggio ricorsivo anche degli eventuali ulteriori
+  \textit{bind mount} presenti sotto \param{target}.
+
+\item[\constd{MS\_RELATIME}] Indica di effettuare l'aggiornamento
+  dell'\textit{access time} sul filesystem soltanto quando questo risulti
   antecedente il valore corrente del \textit{modification time} o del
   \textit{change time} (per i tempi dei file si veda
   sez.~\ref{sec:file_file_times}). L'opzione è disponibile a partire dal
@@ -960,78 +1148,22 @@ nell'elenco seguente:
   l'introduzione di questo comportamento l'uso delle alternative
   \const{MS\_NOATIME} e \const{MS\_NODIRATIME} è sostanzialmente inutile.
 
-\item[\const{MS\_REMOUNT}] Consente di rimontare un filesystem già montato
-  cambiandone le opzioni di montaggio in maniera atomica. In questo modo si
-  possono modificare le opzioni del filesystem anche se questo è in uso. Gli
-  argomenti \param{source} e \param{target} devono essere gli stessi usati per
-  il montaggio originale, mentre sia \param{data} che \param{mountflags}
-  conterranno le nuove opzioni, \param{filesystemtype} viene ignorato.
-
-  Qualunque opzione specifica del filesystem indicata con \param{data} può
-  essere modificata, mentre con \param{mountflags} possono essere modificate
-  solo alcune opzioni generiche. Con i kernel più recenti queste sono soltanto
-  \const{MS\_MANDLOCK}, \const{MS\_RDONLY} e \const{MS\_SYNCHRONOUS}, prima
-  del kernel 2.6.16 potevano essere modificate anche le ulteriori
-  \const{MS\_NOATIME} e \const{MS\_NODIRATIME}, ed infine prima del kernel
-  2.4.10 anche \const{MS\_NODEV}, \const{MS\_NOEXEC} e \const{MS\_NOSUID}.
-
-\item[\const{MS\_SHARED}] Marca un \itindex{mount~point} \textit{mount point}
-  come \textit{shared mount}.  Si tratta di una delle nuove opzioni (insieme a
-  \const{MS\_PRIVATE}, \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti
-  parte dell'infrastruttura degli \itindex{shared~subtree} \textit{shared
-    subtree} introdotta a partire dal kernel 2.6.15, che estendono le
-  funzionalità dei \itindex{bind~mount} \textit{bind mount}.  In questo caso
-  \param{target} dovrà fare riferimento al \itindex{mount~point} \textit{mount
-    point} che si intende marcare, e tutti gli altri argomenti verranno
-  ignorati.
-
-  Lo scopo dell'opzione è ottenere che tutti i successivi \itindex{bind~mount}
-  \textit{bind mount} effettuati da un \textit{mount point} marcato da essa
-  siano di tipo \textit{shared}, cioè ``\textsl{condividano}'' con l'originale
-  e fra di loro ogni ulteriore operazione di montaggio o smontaggio che
-  avviene su una directory al di sotto di uno qualunque di essi. Le operazioni
-  di montaggio e smontaggio effettuate al di sotto di un qualunque
-  \textit{mount point} così marcato verranno ``\textsl{propagate}'' a tutti i
-  \itindex{mount~point} \textit{mount point} della stessa condivisione, e la
-  sezione di albero di file vista al di sotto di ciascuno di essi sarà sempre
-  identica.
-
-\item[\const{MS\_SILENT}] Richiede la soppressione di alcuni messaggi di
+\item[\constd{MS\_SILENT}] Richiede la soppressione di alcuni messaggi di
   avvertimento nei log del kernel (vedi sez.~\ref{sec:sess_daemon}). L'opzione
   è presente a partire dal kernel 2.6.17 e sostituisce, utilizzando un nome
   non fuorviante, la precedente \const{MS\_VERBOSE}, introdotta nel kernel
   2.6.12, che aveva lo stesso effetto.
 
-\item[\const{MS\_SLAVE}] Marca un \itindex{mount~point} \textit{mount point}
-  come \textit{slave mount}. Si tratta di una delle nuove opzioni (insieme a
-  \const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_UNBINDABLE}) facenti
-  parte dell'infrastruttura degli \itindex{shared~subtree} \textit{shared
-    subtree} introdotta a partire dal kernel 2.6.15, che estendono le
-  funzionalità dei \itindex{bind~mount} \textit{bind mount}.  In questo caso
-  \param{target} dovrà fare riferimento al \textit{mount point} che si intende
-  marcare, e tutti gli altri argomenti verranno ignorati.
-
-  Lo scopo dell'opzione è ottenere che tutti i successivi \textit{bind mount}
-  effettuati da un \textit{mount point} marcato da essa siano di tipo
-  \textit{slave}, cioè ``\textsl{condividano}'' ogni ulteriore operazione di
-  montaggio o smontaggio che avviene su una directory al di sotto del
-  \textit{mount point} originale. Le operazioni di montaggio e smontaggio in
-  questo caso vengono ``\textsl{propagate}'' soltanto dal \textit{mount point}
-  originale (detto anche \textit{master}) verso gli \textit{slave}, mentre
-  essi potranno eseguire al loro interno ulteriori montaggi che non saranno
-  propagati né negli altri né nel \itindex{mount~point} \textit{mount point}
-  originale.
-
-\item[\const{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per
+\item[\constd{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per
   cui l'\textit{access time} viene aggiornato ad ogni accesso al
   file. L'opzione è disponibile solo a partire dal kernel 2.6.30 quando il
   comportamento di default del kernel è diventato quello fornito da
   \const{MS\_RELATIME}.
 
-\item[\const{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona richiedendo che
+\item[\constd{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
@@ -1040,26 +1172,11 @@ nell'elenco seguente:
   compromesso in cui questo comportamento avviene solo per le directory, ed ha
   quindi una incidenza nettamente minore, si può usare \const{MS\_DIRSYNC}.
 
-\item[\const{MS\_UNBINDABLE}] Marca un \itindex{mount~point} \textit{mount
-    point} come \textit{unbindable mount}. Si tratta di una delle nuove
-  opzioni (insieme a \const{MS\_PRIVATE}, \const{MS\_SHARED} e
-  \const{MS\_SLAVE}) facenti parte dell'infrastruttura degli
-  \itindex{shared~subtree} \textit{shared subtree} introdotta a partire dal
-  kernel 2.6.15, che estendono le funzionalità dei \itindex{bind~mount}
-  \textit{bind mount}.  In questo caso
-  \param{target} dovrà fare riferimento al \textit{mount point} che si intende
-  marcare, e tutti gli altri argomenti verranno ignorati.
-
-  Un \textit{mount point} marcato in questo modo disabilita la capacità di
-  eseguire dei \itindex{bind~mount} \textit{bind mount} del suo contenuto. Si
-  comporta cioè come allo stesso modo di un \itindex{mount~point}
-  \textit{mount point} ordinario di tipo \textit{private} con in più la
-  restrizione che nessuna sua sottodirectory (anche se relativa ad un
-  ulteriore montaggio) possa essere utilizzata per un come sorgente di un
-  \itindex{bind~mount} \textit{bind mount}.
-
 \end{basedescript}
 
+% NOTE: per l'opzione \texttt{lazytime} introdotta con il kernel 4.0,
+% vedi http://lwn.net/Articles/621046/
+
 % NOTE per \const{MS\_SLAVE},\const{MS\_SHARE}, \const{MS\_PRIVATE} e
 % \const{MS\_UNBINDABLE} dal 2.6.15 vedi shared subtrees, in particolare
 %  * http://lwn.net/Articles/159077/ e
@@ -1094,8 +1211,8 @@ prototipo è:
   \errval{ENOENT}, \errval{ENOMEM} nel loro significato generico.  }
 \end{funcproto}
 
-\footnotetext{più precisamente la \itindex{capabilities} capacità
-  \texttt{CAP\_SYS\_ADMIN}.}
+\footnotetext{più precisamente la capacità \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
@@ -1103,12 +1220,12 @@ non il file o il dispositivo che è stato montato,\footnote{questo è vero a
   funzione poteva essere usata anche specificando il file di dispositivo.} in
 quanto a partire dai kernel della serie 2.4.x è possibile montare lo stesso
 dispositivo in più punti. Nel caso più di un filesystem sia stato montato
-sullo stesso \itindex{mount~point} \textit{mount point} viene smontato quello
-che è stato montato per ultimo. Si tenga presente che la funzione fallisce se
-il filesystem è ``\textsl{occupato}'', cioè quando ci sono ancora dei file
-aperti sul filesystem, se questo contiene la \index{directory~di~lavoro}
-directory di lavoro di un qualunque processo o il \itindex{mount~point}
-\textit{mount point} di un altro filesystem.
+sullo stesso \textit{mount point} viene smontato quello che è stato montato
+per ultimo. Si tenga presente che la funzione fallisce se il filesystem è
+``\textsl{occupato}'', cioè quando ci sono ancora dei file aperti sul
+filesystem, se questo contiene la directory di lavoro (vedi
+sez.~\ref{sec:file_work_dir}) di un qualunque processo o il \textit{mount
+  point} di un altro filesystem.
 
 Linux provvede inoltre una seconda funzione di sistema, \funcd{umount2}, che
 consente un maggior controllo delle operazioni, come forzare lo smontaggio di
@@ -1122,15 +1239,13 @@ 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{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
-       esistente.
+     \item[\errcode{EBUSY}] \param{target} è la directory di lavoro di qualche
+       processo, o contiene dei file aperti, o un altro \textit{mount point}.
+     \item[\errcode{EINVAL}] \param{target} non è un \textit{mount point} o si
+       è usato \const{MNT\_EXPIRE} con \const{MNT\_FORCE} o
+       \const{MNT\_DETACH} o si è specificato un flag non esistente.
   \end{errlist}
   e tutti gli altri valori visti per \func{umount} con lo stesso significato.}
 \end{funcproto}
@@ -1138,7 +1253,7 @@ un filesystem anche quando questo risulti occupato; il suo prototipo è:
 Il valore di \param{flags} è una maschera binaria dei flag che controllano le
 modalità di smontaggio, che deve essere specificato con un OR aritmetico delle
 costanti illustrate in tab.~\ref{tab:umount2_flags}.  Specificando
-\const{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è
+\constd{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è
 occupato per via di una delle condizioni descritte in precedenza. A seconda
 del tipo di filesystem alcune (o tutte) possono essere superate, evitando
 l'errore di \errcode{EBUSY}. In tutti i casi prima dello smontaggio viene
@@ -1152,21 +1267,22 @@ eseguita una sincronizzazione dei dati.
     \textbf{Costante} & \textbf{Descrizione}\\
     \hline
     \hline
-    \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
-                          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} 
-                          \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
-                          collegamento simbolico (vedi
-                          sez.~\ref{sec:link_symlink_rename}) evitando
-                          problemi di sicurezza (presente dal kernel 2.6.34).\\ 
+    \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
+                           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 \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
+                               collegamento simbolico (vedi
+                               sez.~\ref{sec:link_symlink_rename}) evitando
+                               problemi di sicurezza (presente dal kernel
+                               2.6.34).\\  
     \hline
   \end{tabular}
   \caption{Costanti che identificano i bit dell'argomento \param{flags}
@@ -1174,38 +1290,38 @@ eseguita una sincronizzazione dei dati.
   \label{tab:umount2_flags}
 \end{table}
 
-Con l'opzione \const{MNT\_DETACH} si richiede invece uno smontaggio
+Con l'opzione \constd{MNT\_DETACH} si richiede invece uno smontaggio
 ``\textsl{pigro}'' (o \textit{lazy umount}) in cui il filesystem diventa
 inaccessibile per i nuovi processi subito dopo la chiamata della funzione, ma
 resta accessibile per quelli che lo hanno ancora in uso e non viene smontato
 fintanto che resta occupato.
 
-Con \const{MNT\_EXPIRE}, che non può essere specificato insieme agli altri
-due, si marca il \itindex{mount~point} \textit{mount point} di un filesystem
-non occupato come ``\textsl{in scadenza}'', in tal caso \func{umount2} ritorna
-con un errore di \errcode{EAGAIN}, mentre in caso di filesystem occupato si
-sarebbe ricevuto \errcode{EBUSY}.  Una volta marcato, se nel frattempo non
-viene fatto nessun uso del filesystem, ad una successiva chiamata con
-\const{MNT\_EXPIRE} questo verrà smontato. Questo flag consente di realizzare
-un meccanismo che smonti automaticamente i filesystem che restano inutilizzati
-per un certo periodo di tempo.
-
-Infine il flag \const{UMOUNT\_NOFOLLOW} non dereferenzia \param{target} se
+Con \constd{MNT\_EXPIRE}, che non può essere specificato insieme agli altri
+due, si marca il \textit{mount point} di un filesystem non occupato come
+``\textsl{in scadenza}'', in tal caso \func{umount2} ritorna con un errore di
+\errcode{EAGAIN}, mentre in caso di filesystem occupato si sarebbe ricevuto
+\errcode{EBUSY}.  Una volta marcato, se nel frattempo non viene fatto nessun
+uso del filesystem, ad una successiva chiamata con \const{MNT\_EXPIRE} questo
+verrà smontato. Questo flag consente di realizzare un meccanismo che smonti
+automaticamente i filesystem che restano inutilizzati per un certo periodo di
+tempo.
+
+Infine il flag \constd{UMOUNT\_NOFOLLOW} non dereferenzia \param{target} se
 questo è un collegamento simbolico (vedi
 sez.~\ref{sec:link_symlink_rename}). Questa è una misura di sicurezza
 introdotta per evitare, per quei filesystem per il quale è prevista una
-gestione diretta da parte degli utenti, come quelli basati su
+gestione diretta da parte degli utenti, come quelli basati su \itindex{FUSE}
 FUSE,\footnote{il \textit{Filesystem in USEr space} (FUSE) è una delle più
-  interessanti applicazioni del \itindex{Virtual~File~System} VFS che
-  consente, tramite un opportuno modulo, di implementarne le funzioni in
-  \textit{user space}, così da rendere possibile l'implementazione di un
-  qualunque filesystem (con applicazioni di grande interesse come il
-  filesystem cifrato \textit{encfs} o il filesystem di rete \textit{sshfs})
-  che possa essere usato direttamente per conto degli utenti.}  che si possano
-passare ai programmi che effettuano lo smontaggio dei filesystem, che in
-genere sono privilegiati ma consentono di agire solo sui propri \textit{mount
-  point}, dei collegamenti simbolici che puntano ad altri \textit{mount
-  point}, ottenendo così la possibilità di smontare qualunque filesystem.
+  interessanti applicazioni del VFS che consente, tramite un opportuno modulo,
+  di implementarne le funzioni in \textit{user space}, così da rendere
+  possibile l'implementazione di un qualunque filesystem (con applicazioni di
+  grande interesse come il filesystem cifrato \textit{encfs} o il filesystem
+  di rete \textit{sshfs}) che possa essere usato direttamente per conto degli
+  utenti.}  che si possano passare ai programmi che effettuano lo smontaggio
+dei filesystem, che in genere sono privilegiati ma consentono di agire solo
+sui propri \textit{mount point}, dei collegamenti simbolici che puntano ad
+altri \textit{mount point}, ottenendo così la possibilità di smontare
+qualunque filesystem.
 
 
 Altre due funzioni di sistema specifiche di Linux,\footnote{esse si trovano
@@ -1243,7 +1359,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 
@@ -1251,17 +1367,19 @@ del filesystem stesso.
   \label{fig:sys_statfs}
 \end{figure}
 
+\conffilebeg{/etc/mtab} 
+
 La \acr{glibc} provvede infine una serie di funzioni per la gestione dei due
-file \conffile{/etc/fstab}\footnote{più precisamente \funcm{setfsent},
+file \conffiled{/etc/fstab}\footnote{più precisamente \funcm{setfsent},
   \funcm{getfsent}, \funcm{getfsfile}, \funcm{getfsspec}, \funcm{endfsent}.}
 ed \conffile{/etc/mtab}\footnote{più precisamente \funcm{setmntent},
   \funcm{getmntent},\funcm{getmntent\_r}, \funcm{addmntent},\funcm{endmntent},
   \funcm{hasmntopt}.} che convenzionalmente sono usati in quasi tutti i
 sistemi unix-like per mantenere rispettivamente le informazioni riguardo ai
 filesystem da montare e a quelli correntemente montati. Le funzioni servono a
-leggere il contenuto di questi file in opportune strutture \struct{fstab} e
-\struct{mntent}, e, nel caso di \conffile{/etc/mtab}, per inserire e rimuovere
-le voci presenti nel file.
+leggere il contenuto di questi file in opportune strutture \structd{fstab} e
+\structd{mntent}, e, nel caso di \conffile{/etc/mtab}, per inserire e
+rimuovere le voci presenti nel file.
 
 In generale si dovrebbero usare queste funzioni, in particolare quelle
 relative a \conffile{/etc/mtab}, quando si debba scrivere un programma che
@@ -1279,9 +1397,15 @@ disponibile e sempre aggiornata. Per questo motivo tralasceremo la
 trattazione, di queste funzioni, rimandando al manuale della \acr{glibc}
 \cite{GlibcMan} per la documentazione completa.
 
+\conffileend{/etc/mtab}
+
 % TODO (bassa priorità) scrivere delle funzioni (getfsent e getmntent &C)
 % TODO (bassa priorità) documentare ? swapon e swapoff (man 2 ...) 
 
+% TODO con il 5.2 è stata introdotta una serie di nuove syscall per montare un
+% filesystem, vedi https://lwn.net/Articles/759499/ e
+% https://git.kernel.org/linus/f1b5618e013a 
+
 
 \section{La gestione di file e directory}
 \label{sec:file_dir}
@@ -1296,7 +1420,6 @@ directory di lavoro e le funzioni per la gestione di file speciali e
 temporanei.
 
 
-
 \subsection{La gestione dei nomi dei file}
 \label{sec:link_symlink_rename}
 
@@ -1308,7 +1431,7 @@ dei nomi alternativi, come gli alias del vecchio MacOS o i collegamenti di
 Windows o i nomi logici del VMS, che permettono di fare riferimento allo
 stesso file chiamandolo con nomi diversi o accedendovi da directory diverse.
 Questo è possibile anche in ambiente Unix, dove un nome alternativo viene
-usualmente chiamato `` \textsl{collegamento}'' (o \textit{link}).  Data
+usualmente chiamato ``\textsl{collegamento}'' (o \textit{link}).  Data
 l'architettura del sistema riguardo la gestione dei file vedremo però che ci
 sono due metodi sostanzialmente diversi per fare questa operazione.
 
@@ -1319,23 +1442,22 @@ In sez.~\ref{sec:file_filesystem} abbiamo spiegato come la capacità di
 chiamare un file con nomi diversi sia connaturata con l'architettura di un
 filesystem per un sistema Unix, in quanto il nome del file che si trova in una
 directory è solo un'etichetta associata ad un puntatore che permette di
-ottenere il riferimento ad un \itindex{inode} \textit{inode}, e che è
-quest'ultimo che viene usato dal kernel per identificare univocamente gli
-oggetti sul filesystem.
+ottenere il riferimento ad un \textit{inode}, e che è quest'ultimo che viene
+usato dal kernel per identificare univocamente gli oggetti sul filesystem.
 
 Questo significa che fintanto che si resta sullo stesso filesystem la
 realizzazione di un \textit{link} è immediata: uno stesso file può avere tanti
 nomi diversi, dati da altrettante associazioni diverse allo stesso
-\itindex{inode} \textit{inode} effettuate tramite ``etichette'' diverse in
-directory diverse. Si noti anche come nessuno di questi nomi possa assumere
-una particolare preferenza o originalità rispetto agli altri, in quanto tutti
-fanno comunque riferimento allo stesso \itindex{inode} \textit{inode} e quindi
-tutti otterranno lo stesso file.
+\textit{inode} effettuate tramite ``etichette'' diverse in directory
+diverse. Si noti anche come nessuno di questi nomi possa assumere una
+particolare preferenza o originalità rispetto agli altri, in quanto tutti
+fanno comunque riferimento allo stesso \textit{inode} e quindi tutti
+otterranno lo stesso file.
 
 Quando si vuole aggiungere ad una directory una voce che faccia riferimento ad
-un file già esistente nella modalità appena descritta, per ottenere quello che
-viene denominato ``\textsl{collegamento diretto}'' (o \textit{hard link}), si
-deve usare la funzione di sistema \funcd{link}, il cui prototipo è:
+un file già esistente come appena descritto, per ottenere quello che viene
+denominato ``\textsl{collegamento diretto}'' (o \textit{hard link}), si deve
+usare la funzione di sistema \funcd{link}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{unistd.h}
@@ -1351,23 +1473,30 @@ deve usare la funzione di sistema \funcd{link}, il cui prototipo è:
     (il numero massimo è specificato dalla variabile \const{LINK\_MAX}, vedi
     sez.~\ref{sec:sys_limits}).
   \item[\errcode{EPERM}] il filesystem che contiene \param{oldpath} e
-    \param{newpath} non supporta i collegamenti diretti o è una directory.
+    \param{newpath} non supporta i collegamenti diretti, è una directory o per
+    \param{oldpath} non si rispettano i criteri per i \textit{protected
+      hardlink}.\footnotemark 
   \item[\errcode{EXDEV}] i file \param{oldpath} e \param{newpath} non fanno
-    riferimento ad un filesystem montato sullo stesso \itindex{mount~point}
+    riferimento ad un filesystem montato sullo stesso 
     \textit{mount point}.
-  \end{errlist} ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{EIO},
-  \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM},
-  \errval{ENOSPC}, \errval{ENOTDIR}, \errval{EROFS} nel loro significato
-  generico.}
+  \end{errlist} ed inoltre \errval{EACCES}, \errval{EDQUOT}, \errval{EFAULT},
+  \errval{EIO}, \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT},
+  \errval{ENOMEM}, \errval{ENOSPC}, \errval{ENOTDIR}, \errval{EROFS} nel loro
+  significato generico.}
 \end{funcproto}
 
+\footnotetext{i \textit{protected hardlink} sono una funzionalità di
+  protezione introdotta con il kernel 3.16 (si veda
+  sez.~\ref{sec:procadv_security_misc} per i dettagli) che limita la capacità
+  di creare un \textit{hard link} ad un file qualunque.}
+
 La funzione crea in \param{newpath} un collegamento diretto al file indicato
 da \param{oldpath}. Per quanto detto la creazione di un nuovo collegamento
 diretto non copia il contenuto del file, ma si limita a creare la voce
 specificata da \param{newpath} nella directory corrispondente e l'unica
 proprietà del file che verrà modificata sarà il numero di riferimenti al file
 (il campo \var{i\_nlink} della struttura \kstruct{inode}, vedi
-fig.~\ref{fig:kstruct_inode}) che verrà aumentato di di uno. In questo modo lo
+fig.~\ref{fig:kstruct_inode}) che verrà aumentato di uno. In questo modo lo
 stesso file potrà essere acceduto sia con \param{newpath} che
 con \param{oldpath}.
 
@@ -1377,29 +1506,26 @@ nello stesso filesystem ed inoltre esso deve supportare gli \textit{hard link}
 (il meccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di
 Windows). In realtà la funzione ha un ulteriore requisito, e cioè che non solo
 che i due file siano sullo stesso filesystem, ma anche che si faccia
-riferimento ad essi all'interno dello stesso \itindex{mount~point}
-\textit{mount point}.\footnote{si tenga presente infatti, come detto in
-  sez.~\ref{sec:filesystem_mounting}, che a partire dal kernel 2.4 uno stesso
-  filesystem può essere montato più volte su directory diverse.}
-
+riferimento ad essi all'interno dello stesso \textit{mount point}.\footnote{si
+  tenga presente infatti, come detto in sez.~\ref{sec:filesystem_mounting},
+  che a partire dal kernel 2.4 uno stesso filesystem può essere montato più
+  volte su directory diverse.}
 La funzione inoltre opera sia sui file ordinari che sugli altri oggetti del
 filesystem, con l'eccezione delle directory. In alcune versioni di Unix solo
 l'amministratore è in grado di creare un collegamento diretto ad un'altra
 directory: questo viene fatto perché con una tale operazione è possibile
 creare dei \textit{loop} nel filesystem (vedi fig.~\ref{fig:file_link_loop})
-che molti programmi non sono in grado di gestire e la cui rimozione
-diventerebbe piuttosto complicata.\footnote{in genere per questo tipo di
-  errori occorre eseguire il programma \cmd{fsck} per riparare il filesystem,
-  in quanto in caso di \textit{loop} la directory creata non sarebbe vuota e
-  non si potrebbe più rimuoverla.}
-
-Data la pericolosità di questa operazione e la disponibilità dei collegamenti
-simbolici (che vedremo a breve) e dei \itindex{bind~mount} \textit{bind mount}
-(già visti in sez.~\ref{sec:filesystem_mounting}) che possono fornire la
-stessa funzionalità senza questi problemi, nel caso di Linux questa capacità è
-stata completamente disabilitata, e al tentativo di creare un collegamento
-diretto ad una directory la funzione \func{link} restituisce sempre l'errore
-\errcode{EPERM}.
+la cui rimozione diventerebbe piuttosto complicata.\footnote{occorrerebbe
+  infatti eseguire il programma \cmd{fsck} per riparare il filesystem, perché
+  in caso di \textit{loop} la directory non potrebbe essere più svuotata,
+  contenendo comunque se stessa, e quindi non potrebbe essere rimossa.}
+
+Data la pericolosità di questa operazione, e visto che i collegamenti
+simbolici (che tratteremo a breve) ed i \textit{bind mount} (già visti in
+sez.~\ref{sec:filesystem_mounting}) possono fornire la stessa funzionalità
+senza questi problemi, nel caso di Linux questa capacità è stata completamente
+disabilitata, e al tentativo di creare un collegamento diretto ad una
+directory la funzione \func{link} restituisce sempre l'errore \errcode{EPERM}.
 
 Un ulteriore comportamento peculiare di Linux è quello in cui si crea un
 \textit{hard link} ad un collegamento simbolico. In questo caso lo standard
@@ -1419,7 +1545,6 @@ dall'implementazione, cosa che rende Linux conforme a questa versione
 successiva dello standard.
 
 \itindbeg{symbolic~link}
-
 \index{collegamento!simbolico|(}
 
 La ragione di questa differenza rispetto al vecchio standard, presente anche
@@ -1440,10 +1565,10 @@ simbolico è sempre possibile farlo direttamente.\footnote{ciò non toglie che
   questa differenza rispetto allo standard POSIX.}
 
 Dato che \func{link} crea semplicemente dei nomi che fanno riferimenti agli
-\itindex{inode} \textit{inode}, essa può funzionare soltanto per file che
-risiedono sullo stesso filesystem e solo per un filesystem di tipo Unix.
-Inoltre abbiamo visto che in Linux non è consentito eseguire un collegamento
-diretto ad una directory.
+\textit{inode}, essa può funzionare soltanto per file che risiedono sullo
+stesso filesystem e solo per un filesystem di tipo Unix.  Inoltre abbiamo
+visto che in Linux non è consentito eseguire un collegamento diretto ad una
+directory.
 
 Per ovviare a queste limitazioni, come accennato all'inizio, i sistemi
 unix-like supportano un'altra forma di collegamento, detta
@@ -1460,11 +1585,11 @@ anche a file che non esistono ancora.
 
 Il meccanismo funziona in quanto i \textit{symbolic link} sono riconosciuti
 come tali dal kernel\footnote{è uno dei diversi tipi di file visti in
-  tab.~\ref{tab:file_file_types}, contrassegnato come tale \itindex{inode}
-  nell'\textit{inode} e riconoscibile dal valore del campo \var{st\_mode}
-  della struttura \struct{stat} (vedi sez.~\ref{sec:file_stat}).} e tutta una
-serie di funzioni di sistema (come \func{open} o \func{stat}) quando ricevono
-come argomento il \textit{pathname} di un collegamento simbolico vanno
+  tab.~\ref{tab:file_file_types}, contrassegnato come tale nell'\textit{inode}
+  e riconoscibile dal valore del campo \var{st\_mode} della struttura
+  \struct{stat} (vedi sez.~\ref{sec:file_stat}).} e tutta una serie di
+funzioni di sistema (come \func{open} o \func{stat}) quando ricevono come
+argomento il \textit{pathname} di un collegamento simbolico vanno
 automaticamente ad operare sul file da esso specificato. La funzione di
 sistema che permette di creare un nuovo collegamento simbolico è
 \funcd{symlink}, ed il suo prototipo è:
@@ -1477,6 +1602,8 @@ sistema che permette di creare un nuovo collegamento simbolico è
 {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 non si hanno i permessi sulla directory in cui
+    creare il \textit{link}.
   \item[\errcode{EEXIST}] esiste già un file \param{newpath}.
   \item[\errcode{ENOENT}] una componente di \param{newpath} non esiste o
     \param{oldpath} è una stringa vuota.
@@ -1484,11 +1611,12 @@ sistema che permette di creare un nuovo collegamento simbolico è
     supporta i collegamenti simbolici.
   \item[\errcode{EROFS}] \param{newpath} è su un filesystem montato in sola
     lettura.
-  \end{errlist} ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{EIO},
+  \end{errlist} ed inoltre \errval{EDQUOT}, \errval{EFAULT}, \errval{EIO},
   \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOMEM}, \errval{ENOSPC} e
   \errval{ENOTDIR} nel loro significato generico.}
 \end{funcproto}
 
+
 La funzione crea un nuovo collegamento simbolico \param{newpath} che fa
 riferimento ad \param{oldpath}.  Si tenga presente che la funzione non
 effettua nessun controllo sull'esistenza di un file di nome \param{oldpath},
@@ -1496,7 +1624,30 @@ ma si limita ad inserire il \textit{pathname} nel collegamento
 simbolico. Pertanto un collegamento simbolico può anche riferirsi ad un file
 che non esiste ed in questo caso si ha quello che viene chiamato un
 \itindex{dangling~link} \textit{dangling link}, letteralmente un
-\index{collegamento!ciondolante} ``\textsl{collegamento ciondolante}''.
+\index{collegamento!ciondolante} ``\textsl{collegamento ciondolante}''. Ad
+esempio possiamo usare il comando \cmd{ln} per creare un collegamento
+simbolico nella nostra directory con:
+\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{Console}
+piccardi@hain:~/gapil$ \textbf{ls symlink}
+symlink
+\end{Console}
+%$
+ma questo può generare confusione, perché accedendo in lettura a
+\file{symlink}, ad esempio con \cmd{cat}, otterremmo:
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{cat symlink}
+cat: symlink: No such file or directory
+\end{Console}
+%$
+con un errore che può sembrare sbagliato, dato che \cmd{ls} ci ha mostrato in
+precedenza l'esistenza di \file{symlink}. Se invece andassimo a scrivere su
+\file{symlink}, l'effetto sarebbe quello di ottenere la creazione di
+\file{/tmp/tmp\_file} (che a quel punto verrebbe creato) senza errori.
 
 Come accennato i collegamenti simbolici sono risolti automaticamente dal
 kernel all'invocazione delle varie \textit{system call}. In
@@ -1546,8 +1697,15 @@ 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.
+
+Si tenga anche presente che a partire dal kernel 3.16, se si abilita la
+funzionalità dei \textit{protected symlinks} (attiva di default in tutte le
+distribuzioni più recenti) la risoluzione dei nomi attraverso un collegamento
+simbolico può fallire per una serie di restrizione di sicurezza aggiuntive
+imposte dal meccanismo (si consulti sez.~\ref{sec:procadv_security_misc} per i
+dettagli).
 
 Dato che, come indicato in tab.~\ref{tab:file_symb_effect}, funzioni come la
 \func{open} seguono i collegamenti simbolici, occorrono funzioni apposite per
@@ -1557,30 +1715,32 @@ simbolico si usa la funzione di sistema \funcd{readlink}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{unistd.h}
-\fdecl{int readlink(const char *path, char *buff, size\_t size)}
+\fdecl{int readlink(const char *pathname, char *buff, size\_t size)}
 \fdesc{Legge il contenuto di un collegamento simbolico.} 
 }
 {La funzione ritorna il numero di caratteri letti dentro \param{buff} in caso
   di successo e $-1$ per un errore,  nel qual caso \var{errno} assumerà uno
   dei valori:
   \begin{errlist}
-  \item[\errcode{EINVAL}] \param{path} non è un collegamento simbolico
+  \item[\errcode{EACCES}] non si hanno i permessi di attraversamento di una
+    delle directory del pathname
+  \item[\errcode{EINVAL}] \param{pathname} non è un collegamento simbolico
     o \param{size} non è positiva.
-  \end{errlist} ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{EIO},
-  \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM} e
-  \errval{ENOTDIR} nel loro significato generico.}
+  \end{errlist} ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
+  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM} e \errval{ENOTDIR}
+  nel loro significato generico.}
 \end{funcproto}
 
 La funzione legge il \textit{pathname} a cui fa riferimento il collegamento
-simbolico indicato dall'argomento \param{path} scrivendolo sul
-buffer \param{buff} di dimensione \param{size}. Si tenga presente che la
-funzione non termina la stringa con un carattere nullo e che se questa è
-troppo lunga la tronca alla dimensione specificata da \param{size} per evitare
-di sovrascrivere oltre le dimensioni del buffer.
+simbolico indicato dall'argomento \param{pathname} scrivendolo sul buffer
+\param{buff} di dimensione \param{size}. Si tenga presente che la funzione non
+termina la stringa con un carattere nullo e che se questa è troppo lunga la
+tronca alla dimensione specificata da \param{size} per evitare di scrivere
+dati oltre le dimensioni del buffer.
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=8.5cm]{img/link_loop}
+  \includegraphics[width=8cm]{img/link_loop}
   \caption{Esempio di loop nel filesystem creato con un collegamento
     simbolico.}
   \label{fig:file_link_loop}
@@ -1591,74 +1751,42 @@ alle directory è che questi possono creare dei \textit{loop} nella risoluzione
 dei nomi che non possono essere eliminati facilmente. Invece è sempre
 possibile, ed in genere anche molto utile, creare un collegamento simbolico ad
 una directory, anche se in questo caso si potranno ottenere anche dei
-\textit{loop}. La situazione è illustrata in fig.~\ref{fig:file_link_loop},
-che riporta la struttura della directory \file{/boot}. Come si vede si è
-creato al suo interno un collegamento simbolico che punta di nuovo a
+\textit{loop}.
+
+La situazione è illustrata in fig.~\ref{fig:file_link_loop}, che riporta la
+struttura della directory \file{/boot}. Come si vede si è creato al suo
+interno un collegamento simbolico che punta di nuovo a
 \file{/boot}.\footnote{il \textit{loop} mostrato in
-  fig.~\ref{fig:file_link_loop} è stato usato per poter permettere a
-  \cmd{grub} (un bootloader in grado di leggere direttamente da vari
-  filesystem il file da lanciare come sistema operativo) di vedere i file
-  contenuti nella directory \file{/boot} con lo stesso \textit{pathname} con
-  cui verrebbero visti dal sistema operativo, anche se essi si trovano, come
-  accade spesso, su una partizione separata (che \cmd{grub} all'avvio vedrebbe 
-  come \file{/}).}
-
-Questo però può causare problemi per tutti quei programmi che effettuano la
-scansione di una directory senza tener conto dei collegamenti simbolici, ad
-esempio se lanciassimo un comando del tipo \code{grep -r linux *}, il loop
-nella directory porterebbe il comando ad esaminare \file{/boot},
-\file{/boot/boot}, \file{/boot/boot/boot} e così via.
+  fig.~\ref{fig:file_link_loop} è stato usato per poter permettere a al
+  \textit{bootloader} \cmd{grub} di vedere i file contenuti nella directory
+  \file{/boot} con lo stesso \textit{pathname} con cui verrebbero visti dal
+  sistema operativo, anche quando si trovano, come accade spesso, su una
+  partizione separata (che \cmd{grub} all'avvio vedrebbe come \file{/}).} Un
+\textit{loop} di di questo tipo però può causare problemi per tutti i
+programmi che effettuano la scansione di una directory, e ad esempio se
+lanciassimo un comando come \code{grep -r linux *}, il \textit{loop} nella
+directory porterebbe ad esaminare \file{/boot}, \file{/boot/boot},
+\file{/boot/boot/boot} e così via.
 
 Per questo motivo il kernel e le librerie prevedono che nella risoluzione di
 un \textit{pathname} possano essere seguiti fino ad un certo numero massimo di
 collegamenti simbolici, il cui valore limite è specificato dalla costante
-\const{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un
-errore ed \var{errno} viene impostata al valore \errcode{ELOOP}, che nella
-quasi totalità dei casi indica appunto che si è creato un collegamento
-simbolico che fa riferimento ad una directory del suo stesso
-\textit{pathname}.
-
-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}
-%$
-e questo avrà successo anche se \file{/tmp/tmp\_file} non esiste:
-\begin{Command}
-$ ls symlink
-\end{Command}
-\begin{Terminal}
-symlink
-\end{Terminal}
-%$
-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}
-cat: symlink: No such file or directory
-\end{Terminal}
-%$
-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}
-otterremmo la creazione di \file{/tmp/tmp\_file} senza errori.
+\constd{MAXSYMLINKS}. Se il limite viene superato si ha un errore ed
+\var{errno} viene impostata al valore \errcode{ELOOP}, che nella quasi
+totalità dei casi indica appunto che si è creato un collegamento simbolico che
+fa riferimento ad una directory del suo stesso \textit{pathname}.
 
 
 \itindend{symbolic~link}
 \index{collegamento!simbolico|)}
 
-
 Un'altra funzione relativa alla gestione dei nomi dei file, anche se a prima
-vista parrebbe riguardare un argomento completamente diverso, è quella che per
-la cancellazione di un file. In realtà una \textit{system call} che serva
-proprio a cancellare un file non esiste neanche perché, come accennato in
+vista parrebbe riguardare un argomento completamente diverso, è quella per la
+cancellazione di un file. In realtà una \textit{system call} che serva proprio
+a cancellare un file non esiste neanche perché, come accennato in
 sez.~\ref{sec:file_filesystem}, quando in un sistema unix-like si richiede la
-rimozione di un file quella che si va a cancellare è soltanto la voce che
-referenzia il suo \itindex{inode} \textit{inode} all'interno di una directory.
+rimozione di un file, quello che si va a cancellare è soltanto la voce che
+referenzia il suo \textit{inode} all'interno di una directory.
 
 La funzione di sistema che consente di effettuare questa operazione, il cui
 nome come si può notare ha poco a che fare con il concetto di rimozione, è
@@ -1672,15 +1800,17 @@ 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
-    superiori. 
+  \item[\errcode{EACCES}] non si ha il permesso di scrittura sulla directory
+    che contiene \param{pathname} o quello di attraversamento per una delle
+    directory superiori.
+  \item[\errcode{EBUSY}] \param{pathname} non può essere rimosso perché è in
+    uso da parte del sistema (in particolare per i cosiddetti \textit{silly
+      renames} di NFS).
   \item[\errcode{EISDIR}] \param{pathname} si riferisce ad una
     directory.
   \item[\errcode{EPERM}] il filesystem non consente l'operazione, o la
-    directory che contiene \param{pathname} ha lo \itindex{sticky~bit}
-    \textit{sticky bit} e non si è il proprietario o non si hanno privilegi
-    amministrativi. 
+    directory che contiene \param{pathname} ha lo \textit{sticky bit} e non si
+    è il proprietario del file o non si hanno privilegi amministrativi. 
   \end{errlist} ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
   \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errval{EROFS} nel loro
   significato generico.}
@@ -1697,56 +1827,60 @@ nome come si può notare ha poco a che fare con il concetto di rimozione, è
 
 La funzione elimina il nome specificato dall'argomento \param{pathname} nella
 directory che lo contiene e decrementa il numero di riferimenti nel relativo
-\itindex{inode} \textit{inode}.\footnote{come per \func{link} queste due
-  operazioni sono effettuate all'interno della \textit{system call} in maniera
-  atomica.} Nel caso di socket, fifo o file di dispositivo
-\index{file!di~dispositivo} rimuove il nome, ma come per i file normali i
-processi che hanno aperto uno di questi oggetti possono continuare ad
-utilizzarli.  Nel caso di cancellazione di un collegamento simbolico, che
-consiste solo nel rimando ad un altro file, questo viene immediatamente
-eliminato.
+\textit{inode}; come per \func{link} queste due operazioni sono effettuate
+all'interno della \textit{system call} in maniera atomica rispetto ai
+processi.
+
+Si ricordi che, anche se se ne è rimosso il nome, un file viene realmente
+cancellato soltanto quando il numero di collegamenti mantenuto
+nell'\textit{inode} diventa nullo; solo allora l'\textit{inode} viene
+disallocato e lo spazio che il file occupava sul disco viene liberato.
+
+Si tenga presente comunque che a questo si aggiunge sempre un'ulteriore
+condizione e cioè che non ci siano processi che stiano ancora lavorando sul il
+file. Come vedremo in sez.~\ref{sec:file_unix_interface} il kernel una tabella
+di tutti file aperti da ciascun processo, che a sua volta contiene i
+riferimenti agli \textit{inode} ad essi relativi. Prima di procedere alla
+cancellazione dello spazio occupato su disco dal contenuto di un file il
+kernel controlla anche questa tabella, per verificare che anche in essa non ci
+sia più nessun riferimento all'\textit{inode} in questione, assicurandosi con
+questo che nessun processo stia ancora usando il file.
+
+Nel caso di socket, \textit{fifo} o file di dispositivo la funzione rimuove il
+nome, e come per i file normali i processi che hanno aperto uno di questi
+oggetti possono continuare ad utilizzarli.  Nel caso di cancellazione di un
+\textit{link} simbolico, che consiste solo nel rimando ad un altro file,
+questo viene immediatamente eliminato e non sarà più utilizzabile. 
 
 Per cancellare una voce in una directory è necessario avere il permesso di
 scrittura su di essa, dato che si va a rimuovere una voce dal suo contenuto, e
 il diritto di esecuzione/attraversamento sulla directory che la contiene
 (affronteremo in dettaglio l'argomento dei permessi di file e directory in
-sez.~\ref{sec:file_access_control}). Se inoltre lo \itindex{sticky~bit}
-\textit{sticky bit} (vedi sez.~\ref{sec:file_special_perm}) è impostato
-occorrerà anche essere proprietari del file o proprietari della directory o
-avere i privilegi di amministratore.
-
-Si ricordi inoltre che anche se se ne è rimosso il nome da una directory, un
-file non viene eliminato dal disco fintanto che tutti i riferimenti ad esso
-sono stati cancellati: solo quando il numero di collegamenti mantenuto
-\itindex{inode} nell'\textit{inode} diventa nullo, questo viene disallocato e
-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
-  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
-  kernel controlla anche questa tabella, per verificare che anche in essa non
-  ci sia più nessun riferimento all'\textit{inode} in questione.}
-
-Questa caratteristica del sistema può essere usata per essere sicuri di non
-lasciare file temporanei su disco in caso di crash di un programma. La tecnica
-è quella di aprire un nuovo file e chiamare \func{unlink} su di esso subito
+sez.~\ref{sec:file_access_control}). Se inoltre per la directory è impostato
+lo \textit{sticky bit} (vedi sez.~\ref{sec:file_special_perm}), occorrerà
+anche essere proprietari del file o proprietari della directory o avere i
+privilegi di amministratore.
+
+Questa caratteristica del sistema, che consente di usare un file anche se lo
+si è ``cancellato'', può essere usata per essere sicuri di non lasciare file
+temporanei su disco in caso di uscita imprevista di un programma. La tecnica è
+quella di aprire un nuovo file e chiamare \func{unlink} su di esso subito
 dopo, in questo modo il contenuto del file sarà sempre disponibile all'interno
 del processo attraverso il suo file descriptor (vedi sez.~\ref{sec:file_fd}),
-ma non ne resta traccia in nessuna directory, e lo spazio occupato su disco
-viene immediatamente rilasciato alla conclusione del processo, quando tutti i
-file vengono chiusi.
+ma non ne resterà traccia in nessuna directory, inoltre lo spazio occupato su
+disco verrà immediatamente rilasciato alla conclusione del processo, quando
+tutti i file vengono chiusi.
 
 Al contrario di quanto avviene con altri Unix, in Linux non è possibile usare
-la funzione \func{unlink} sulle directory, nel qual caso si otterrebbe un
+la funzione \func{unlink} sulle directory, che in tal caso fallisce con un
 errore di \errcode{EISDIR}. Per cancellare una directory si deve usare la
 apposita funzione di sistema \func{rmdir} (che vedremo in
 sez.~\ref{sec:file_dir_creat_rem}), oppure la funzione \func{remove}.
+
 Quest'ultima è la funzione prevista dallo standard ANSI C per effettuare una
-cancellazione generica di un file o di una directory e funziona anche per i
-sistemi operativo che non supportano gli \textit{hard link}. Nei sistemi
-unix-like \funcd{remove} è equivalente ad usare in maniera trasparente
+cancellazione generica di un file o di una directory e viene usata in generale
+anche per i sistemi operativi che non supportano gli \textit{hard link}. Nei
+sistemi unix-like \funcd{remove} è equivalente ad usare in maniera trasparente
 \func{unlink} per i file ed \func{rmdir} per le directory; il suo prototipo è:
 
 \begin{funcproto}{
@@ -1760,13 +1894,15 @@ unix-like \funcd{remove} è equivalente ad usare in maniera trasparente
   \func{unlink} e \func{rmdir}.}
 \end{funcproto}
 
-La funzione utilizza la funzione \func{unlink} per cancellare i file e la
-funzione \func{rmdir} (vedi sez.~\ref{sec:file_dir_creat_rem}) per cancellare
-le directory.\footnote{questo vale usando la \acr{glibc}; nella libc4 e nella
-  libc5 la funzione \func{remove} era un semplice alias alla funzione
-  \func{unlink} e quindi non poteva essere usata per le directory.} Si tenga
-presente che per alcune implementazioni del protocollo NFS utilizzare questa
-funzione può comportare la scomparsa di file ancora in uso.
+La funzione utilizza la funzione \func{unlink} per cancellare i file (e si
+applica anche a link simbolici, socket, \textit{fifo} e file di dispositivo) e
+la funzione \func{rmdir} (vedi sez.~\ref{sec:file_dir_creat_rem}) per
+cancellare le directory.\footnote{questo vale usando la \acr{glibc}; nella
+  \acr{libc4} e nella \acr{libc5} la funzione \func{remove} era un semplice
+  alias alla funzione \func{unlink} e quindi non poteva essere usata per le
+  directory.}  Si tenga presente che, per alcune limitazioni del protocollo
+NFS, utilizzare questa funzione su file che usano questo filesystem di rete
+può comportare la scomparsa di file ancora in uso.
 
 Infine per cambiare nome ad un file o a una directory si usa la funzione di
 sistema \funcd{rename},\footnote{la funzione è definita dallo standard ANSI C,
@@ -1781,32 +1917,30 @@ sistema \funcd{rename},\footnote{la funzione è definita dallo standard ANSI C,
 {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{EACCESS}] non c'è permesso di scrivere nelle directory
+  \item[\errcode{EACCESS}] manca il permesso di scrittura sulle directory
     contenenti \param{oldpath} e \param{newpath} o di attraversare 
-    quelle dei loro \textit{pathname} o di scrivere su \param{newpath}
+    il loro \textit{pathname} o di scrivere su \param{newpath}
     se questa è una directory.
   \item[\errcode{EBUSY}] o \param{oldpath} o \param{newpath} sono in uso da
-    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.
+    parte di qualche processo (come directory di lavoro o come radice) o del
+    sistema (come \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.
   \item[\errval{EPERM}] la directory contenente \param{oldpath} o quella
-    contenente un \param{newpath} esistente hanno lo
-    \itindex{sticky~bit} \textit{sticky bit} e non si è i proprietari dei
-    rispettivi file (o non si hanno privilegi amministrativi) oppure il
-    filesystem non supporta l'operazione. 
+    contenente un \param{newpath} esistente hanno lo \textit{sticky bit} e non
+    si è i proprietari dei rispettivi file (o non si hanno privilegi
+    amministrativi) oppure il filesystem non supporta l'operazione. 
   \item[\errcode{EXDEV}] \param{oldpath} e \param{newpath} non sono sullo
-    stesso filesystem e sotto lo stesso \itindex{mount~point} \textit{mount
-      point}. 
+    stesso filesystem e sotto lo stesso \textit{mount point}. 
   \end{errlist} ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{EMLINK},
   \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOSPC} e
   \errval{EROFS} nel loro significato generico.}
@@ -1815,10 +1949,9 @@ sistema \funcd{rename},\footnote{la funzione è definita dallo standard ANSI C,
 La funzione rinomina in \param{newpath} il file o la directory indicati
 dall'argomento \param{oldpath}. Il nome viene eliminato nella directory
 originale e ricreato nella directory di destinazione mantenendo il riferimento
-allo stesso \itindex{inode} \textit{inode}. Non viene spostato nessun dato e
-\itindex{inode} l'\textit{inode} del file non subisce nessuna modifica in
-quanto le modifiche sono eseguite sulle directory che
-contengono \param{newpath} ed \param{oldpath}.
+allo stesso \textit{inode}. Non viene spostato nessun dato e l'\textit{inode}
+del file non subisce nessuna modifica in quanto le modifiche sono eseguite
+sulle directory che contengono \param{newpath} ed \param{oldpath}.
 
 Il vantaggio nell'uso di questa funzione al posto della chiamata successiva di
 \func{link} e \func{unlink} è che l'operazione è eseguita atomicamente, non
@@ -1830,10 +1963,10 @@ temporaneamente se già esiste.
 Dato che opera in maniera analoga la funzione è soggetta alle stesse
 restrizioni di \func{link}, quindi è necessario che \param{oldpath}
 e \param{newpath} siano nello stesso filesystem e facciano riferimento allo
-stesso \itindex{mount~point} \textit{mount point}, e che il filesystem
-supporti questo tipo di operazione. Qualora questo non avvenga si dovrà
-effettuare l'operazione in maniera non atomica copiando il file a destinazione
-e poi cancellando l'originale.
+stesso \textit{mount point}, e che il filesystem supporti questo tipo di
+operazione. Qualora questo non avvenga si dovrà effettuare l'operazione in
+maniera non atomica copiando il file a destinazione e poi cancellando
+l'originale.
 
 Il comportamento della funzione è diverso a seconda che si voglia rinominare
 un file o una directory. Se ci riferisce ad un file allora \param{newpath}, se
@@ -1867,22 +2000,21 @@ In tutti i casi si dovranno avere i permessi di scrittura nelle directory
 contenenti \param{oldpath} e \param{newpath}, e nel caso \param{newpath} sia
 una directory vuota già esistente anche su di essa (perché dovrà essere
 aggiornata la voce ``\texttt{..}''). Se poi le directory
-contenenti \param{oldpath} o \param{newpath} hanno lo \itindex{sticky~bit}
-\textit{sticky bit} attivo (vedi sez.~\ref{sec:file_special_perm}) si dovrà
-essere i proprietari dei file (o delle directory) che si vogliono rinominare,
-o avere i permessi di amministratore.
+contenenti \param{oldpath} o \param{newpath} hanno lo \textit{sticky bit}
+attivo (vedi sez.~\ref{sec:file_special_perm}) si dovrà essere i proprietari
+dei file (o delle directory) che si vogliono rinominare, o avere i permessi di
+amministratore.
 
 
 \subsection{La creazione e la cancellazione delle directory} 
 \label{sec:file_dir_creat_rem}
 
 Benché in sostanza le directory non siano altro che dei file contenenti
-elenchi di nomi con riferimenti ai rispettivi \itindex{inode} \textit{inode},
-non è possibile trattarle come file ordinari e devono essere create
-direttamente dal kernel attraverso una opportuna \textit{system
-  call}.\footnote{questo è quello che permette anche, attraverso l'uso del
-  \itindex{Virtual~File~System} VFS, l'utilizzo di diversi formati per la
-  gestione dei suddetti elenchi, dalle semplici liste a strutture complesse
+elenchi di nomi con riferimenti ai rispettivi \textit{inode}, non è possibile
+trattarle come file ordinari e devono essere create direttamente dal kernel
+attraverso una opportuna \textit{system call}.\footnote{questo è quello che
+  permette anche, attraverso l'uso del VFS, l'utilizzo di diversi formati per
+  la gestione dei suddetti elenchi, dalle semplici liste a strutture complesse
   come alberi binari, hash, ecc. che consentono una ricerca veloce quando il
   numero di file è molto grande.}  La funzione di sistema usata per creare una
 directory è \funcd{mkdir}, ed il suo prototipo è:
@@ -1943,15 +2075,14 @@ 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{EBUSY}] la directory specificata è la directory di lavoro o
+    la radice di qualche processo o un \textit{mount point}.
   \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{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
-    proprietari della directory o non si hanno privilegi amministrativi. 
+    \textit{sticky bit} impostato e non si è i proprietari della directory o
+    non si hanno privilegi amministrativi.
   \end{errlist}
   ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG},
   \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errcode{ENOTEMPTY} e
@@ -1967,6 +2098,12 @@ nella directory genitrice, questo significa che \textit{pathname} terminanti
 in ``\file{.}'' e ``\file{..}'' anche se validi in altri contesti, causeranno
 il fallimento della funzione.
 
+Inoltre per eseguire la cancellazione, oltre ad essere vuota, occorre anche
+che la directory non sia utilizzata, questo vuol dire anche che non deve
+essere la directory di lavoro (vedi sez.~\ref{sec:file_work_dir}) o la
+directory radice (vedi sez.~\ref{sec:file_chroot}) di nessun processo, od
+essere utilizzata come \textit{mount point}.
+
 Se la directory cancellata risultasse aperta in qualche processo per una
 lettura dei suoi contenuti (vedi sez.~\ref{sec:file_dir_read}), pur
 scomparendo dal filesystem e non essendo più possibile accedervi o crearvi
@@ -1978,21 +2115,21 @@ chiusura di tutti questi ulteriori riferimenti.
 \label{sec:file_dir_read}
 
 Benché le directory alla fine non siano altro che dei file che contengono
-delle liste di nomi associati ai relativi \itindex{inode} \textit{inode}, per
-il ruolo che rivestono nella struttura del sistema non possono essere trattate
-come dei normali file di dati. Ad esempio, onde evitare inconsistenze
-all'interno del filesystem, solo il kernel può scrivere il contenuto di una
-directory, e non può essere un processo a inserirvi direttamente delle voci
-con le usuali funzioni di scrittura.
+delle liste di nomi associati ai relativi \textit{inode}, per il ruolo che
+rivestono nella struttura del sistema non possono essere trattate come dei
+normali file di dati. Ad esempio, onde evitare inconsistenze all'interno del
+filesystem, solo il kernel può scrivere il contenuto di una directory, e non
+può essere un processo a inserirvi direttamente delle voci 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 VFS prevede una apposita
+funzione per la lettura delle directory.
 
 \itindbeg{directory~stream}
 
@@ -2001,7 +2138,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}{
@@ -2018,21 +2155,20 @@ cap.~\ref{cha:files_std_interface}. La prima funzione di questa interfaccia è
 \end{funcproto}
 
 La funzione apre un \textit{directory stream} per la directory
-\param{dirname}, ritornando il puntatore ad un oggetto di tipo \type{DIR} (che
-è il \index{tipo!opaco} tipo opaco usato dalle librerie per gestire i
-\textit{directory stream}) da usare per tutte le operazioni successive, la
-funzione inoltre posiziona lo \textit{stream} sulla prima voce contenuta nella
-directory.
+\param{dirname}, ritornando il puntatore ad un oggetto di tipo \typed{DIR} (che
+è il tipo opaco usato dalle librerie per gestire i \textit{directory stream})
+da usare per tutte le operazioni successive, la funzione inoltre posiziona lo
+\textit{stream} sulla prima voce contenuta nella directory.
 
 Si tenga presente che comunque la funzione opera associando il
-\textit{directory stream} ad un opportuno file descriptor sottostante, sul
-quale vengono compiute le operazioni. Questo viene sempre aperto impostando il
-flag di \itindex{close-on-exec} \textit{close-on-exec} (si ricordi quanto
-detto in sez.~\ref{sec:proc_exec}), così da evitare che resti aperto in caso
-di esecuzione di un altro programma.
-
-Nel caso in cui sia necessario conoscere il \textit{file descriptor} associato
-ad un \textit{directory stream} si può usare la funzione
+\textit{directory stream} ad un opportuno file descriptor (vedi
+sez.~\ref{sec:file_fd}) sottostante, sul quale vengono compiute le
+operazioni. Questo viene sempre aperto impostando il flag di
+\textit{close-on-exec} (si ricordi quanto detto in sez.~\ref{sec:proc_exec}),
+così da evitare che resti aperto in caso di esecuzione di un altro programma.
+
+Nel caso in cui sia necessario conoscere il file descriptor associato ad un
+\textit{directory stream} si può usare la funzione
 \funcd{dirfd},\footnote{questa funzione è una estensione introdotta con BSD
   4.3-Reno ed è presente in Linux con le libc5 (a partire dalla versione
   5.1.2) e con la \acr{glibc} ma non presente in POSIX fino alla revisione
@@ -2064,8 +2200,7 @@ La funzione restituisce il file descriptor associato al \textit{directory
   stream} \param{dir}. Di solito si utilizza questa funzione in abbinamento a
 funzioni che operano sui file descriptor, ad esempio si potrà usare
 \func{fstat} per ottenere le proprietà della directory, o \func{fchdir} per
-spostare su di essa la \index{directory~di~lavoro} directory di lavoro (vedi
-sez.~\ref{sec:file_work_dir}).
+spostare su di essa la directory di lavoro (vedi sez.~\ref{sec:file_work_dir}).
 
 Viceversa se si è aperto un file descriptor corrispondente ad una directory è
 possibile associarvi un \textit{directory stream} con la funzione
@@ -2100,9 +2235,8 @@ funzioni che operano sul \textit{directory stream} e non dovrà essere più
 utilizzato all'interno del proprio programma. In particolare dovrà essere
 chiuso attraverso il \textit{directory stream} con \func{closedir} e non
 direttamente. Si tenga presente inoltre che \func{fdopendir} non modifica lo
-stato di un eventuale flag di \itindex{close-on-exec} \textit{close-on-exec},
-che pertanto dovrà essere impostato esplicitamente in fase di apertura del
-file descriptor.
+stato di un eventuale flag di \textit{close-on-exec}, che pertanto dovrà
+essere impostato esplicitamente in fase di apertura del file descriptor.
 
 Una volta che si sia aperto un \textit{directory stream} la lettura del
 contenuto della directory viene effettuata attraverso la funzione
@@ -2138,13 +2272,12 @@ fig.~\ref{fig:file_dirent_struct}.\footnote{la definizione è quella usata da
 una struttura allocata staticamente, che viene sovrascritta tutte le volte che
 si ripete la lettura di una voce sullo stesso \textit{directory stream}.
 
-Di questa funzione esiste anche una versione \index{funzioni!rientranti}
-rientrante, \funcd{readdir\_r},\footnote{per usarla è necessario definire una
-  qualunque delle macro \texttt{\macro{\_POSIX\_C\_SOURCE} >= 1},
+Di questa funzione esiste anche una versione rientrante,
+\funcd{readdir\_r},\footnote{per usarla è necessario definire una qualunque
+  delle macro \texttt{\macro{\_POSIX\_C\_SOURCE} >= 1},
   \macro{\_XOPEN\_SOURCE}, \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE},
   \macro{\_POSIX\_SOURCE}.} che non usa una struttura allocata staticamente, e
-può essere utilizzata anche con i \itindex{thread} \textit{thread}, il suo
-prototipo è:
+può essere utilizzata anche con i \textit{thread}, il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -2157,16 +2290,16 @@ prototipo è:
   \func{readdir}.} 
 \end{funcproto}
 
-La funzione restituisce in \param{result} come \itindex{value~result~argument}
-\textit{value result argument} l'indirizzo della struttura \struct{dirent}
-dove sono stati salvati i dati, che deve essere allocata dal chiamante, ed il
-cui indirizzo deve essere indicato con l'argomento \param{entry}.  Se si è
-raggiunta la fine del \textit{directory stream} invece in \param{result} viene
-restituito il valore \val{NULL}.
+La funzione restituisce in \param{result} come \textit{value result argument}
+l'indirizzo della struttura \struct{dirent} dove sono stati salvati i dati,
+che deve essere allocata dal chiamante, ed il cui indirizzo deve essere
+indicato con l'argomento \param{entry}.  Se si è raggiunta la fine del
+\textit{directory stream} invece in \param{result} viene 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 
@@ -2187,14 +2320,14 @@ presenti nella directory. Sia BSD che SVr4 che POSIX.1-2001\footnote{il
   dall'implementazione.}  prevedono che siano sempre presenti il campo
 \var{d\_name}, che contiene il nome del file nella forma di una stringa
 terminata da uno zero, ed il campo \var{d\_ino}, che contiene il numero di
-\itindex{inode} \textit{inode} cui il file è associato e corrisponde al campo
-\var{st\_ino} di \struct{stat}.  La presenza di ulteriori campi opzionali
-oltre i due citati è segnalata dalla definizione di altrettante macro nella
-forma \code{\_DIRENT\_HAVE\_D\_XXX} dove \code{XXX} è il nome del relativo
+\textit{inode} cui il file è associato e corrisponde al campo \var{st\_ino} di
+\struct{stat}.  La presenza di ulteriori campi opzionali oltre i due citati è
+segnalata dalla definizione di altrettante macro nella forma
+\code{\_DIRENT\_HAVE\_D\_XXX} dove \code{XXX} è il nome del relativo
 campo. Come si può evincere da fig.~\ref{fig:file_dirent_struct} nel caso di
-Linux sono pertanto definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
-\macro{\_DIRENT\_HAVE\_D\_OFF} e \macro{\_DIRENT\_HAVE\_D\_RECLEN}, mentre non
-è definita la macro \macro{\_DIRENT\_HAVE\_D\_NAMLEN}.
+Linux sono pertanto definite le macro \macrod{\_DIRENT\_HAVE\_D\_TYPE},
+\macrod{\_DIRENT\_HAVE\_D\_OFF} e \macrod{\_DIRENT\_HAVE\_D\_RECLEN}, mentre non
+è definita la macro \macrod{\_DIRENT\_HAVE\_D\_NAMLEN}.
 
 Dato che possono essere presenti campi opzionali e che lo standard
 POSIX.1-2001 non specifica una dimensione definita per il nome dei file (che
@@ -2213,7 +2346,7 @@ ottenere la dimensione della prima parte con la macro di utilità generica
 \vspace{3pt}
 \begin{funcbox}{
 \fhead{stddef.h}
-\fdecl{size\_t \macro{offsetof}(type, member)}
+\fdecl{size\_t \macrod{offsetof}(type, member)}
 \fdesc{Restituisce la posizione del campo \param{member} nella
   struttura \param{type}.}
 } 
@@ -2224,17 +2357,17 @@ 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
-consente di evitare una successiva chiamata a \func{lstat} (vedi
+indica il tipo di file (se \textit{fifo}, directory, collegamento simbolico,
+ecc.), e consente di evitare una successiva chiamata a \func{lstat} (vedi
 sez.~\ref{sec:file_stat}) per determinarlo. I suoi possibili valori sono
 riportati in tab.~\ref{tab:file_dtype_macro}. Si tenga presente che questo
 valore è disponibile solo per i filesystem che ne supportano la restituzione
-(fra questi i più noti sono \textsl{btrfs}, \textsl{ext2}, \textsl{ext3}, e
-\textsl{ext4}), per gli altri si otterrà sempre il valore
+(fra questi i più noti sono \acr{Btrfs}, \acr{ext2}, \acr{ext3}, e
+\acr{ext4}), per gli altri si otterrà sempre il valore
 \const{DT\_UNKNOWN}.\footnote{inoltre fino alla versione 2.1 della
   \acr{glibc}, pur essendo il campo \var{d\_type} presente, il suo uso non era
   implementato, e veniva restituito comunque il valore \const{DT\_UNKNOWN}.}
@@ -2247,14 +2380,14 @@ valore è disponibile solo per i filesystem che ne supportano la restituzione
     \textbf{Valore} & \textbf{Tipo di file} \\
     \hline
     \hline
-    \const{DT\_UNKNOWN} & Tipo sconosciuto.\\
-    \const{DT\_REG}     & File normale.\\
-    \const{DT\_DIR}     & Directory.\\
-    \const{DT\_LNK}     & Collegamento simbolico.\\
-    \const{DT\_FIFO}    & Fifo.\\
-    \const{DT\_SOCK}    & Socket.\\
-    \const{DT\_CHR}     & Dispositivo a caratteri.\\
-    \const{DT\_BLK}     & Dispositivo a blocchi.\\
+    \constd{DT\_UNKNOWN} & Tipo sconosciuto.\\
+    \constd{DT\_REG}     & File normale.\\
+    \constd{DT\_DIR}     & Directory.\\
+    \constd{DT\_LNK}     & Collegamento simbolico.\\
+    \constd{DT\_FIFO}    & \textit{Fifo}.\\
+    \constd{DT\_SOCK}    & Socket.\\
+    \constd{DT\_CHR}     & Dispositivo a caratteri.\\
+    \constd{DT\_BLK}     & Dispositivo a blocchi.\\
     \hline    
   \end{tabular}
   \caption{Costanti che indicano i vari tipi di file nel campo \var{d\_type}
@@ -2270,10 +2403,10 @@ definite anche due macro di conversione, \macro{IFTODT} e \macro{DTTOIF}:
 \vspace{3pt}
 \begin{funcbox}{
 \fhead{dirent.h}
-\fdecl{int \macro{IFTODT}(mode\_t MODE)}
+\fdecl{int \macrod{IFTODT}(mode\_t MODE)}
 \fdesc{Converte il tipo di file dal formato di \var{st\_mode} a quello di
   \var{d\_type}.}
-\fdecl{mode\_t \macro{DTTOIF}(int DTYPE)}
+\fdecl{mode\_t \macrod{DTTOIF}(int DTYPE)}
 \fdesc{Converte il tipo di file dal formato di \var{d\_type} a quello di
   \var{st\_mode}.}  
 } 
@@ -2386,10 +2519,10 @@ restituendo un valore positivo, nullo o negativo per indicarne l'ordinamento;
 alla fine l'indirizzo della lista ordinata dei puntatori alle strutture
 \struct{dirent} viene restituito nell'argomento
 \param{namelist}.\footnote{la funzione alloca automaticamente la lista, e
-  restituisce, come \itindex{value~result~argument} \textit{value result
-    argument}, l'indirizzo della stessa; questo significa che \param{namelist}
-  deve essere dichiarato come \code{struct dirent **namelist} ed alla funzione
-  si deve passare il suo indirizzo.}
+  restituisce, come \textit{value result argument}, l'indirizzo della stessa;
+  questo significa che \param{namelist} deve essere dichiarato come
+  \code{struct dirent **namelist} ed alla funzione si deve passare il suo
+  indirizzo.}
 
 \itindend{directory~stream}
 
@@ -2421,7 +2554,7 @@ estensione\footnote{la \acr{glibc}, a partire dalla versione 2.1, effettua
 \func{versionsort}, che ordina i nomi tenendo conto del numero di versione,
 cioè qualcosa per cui \texttt{file10} viene comunque dopo \texttt{file4}.
 
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
     \includecodesample{listati/my_ls.c}
@@ -2444,10 +2577,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
@@ -2456,11 +2589,11 @@ dati ad esso relativi, per poi provvedere (\texttt{\small 27}) a stampare il
 nome del file e la dimensione riportata in \var{data}.
 
 Dato che la funzione verrà chiamata all'interno di \myfunc{dir\_scan} per ogni
-voce presente questo è sufficiente a stampare la lista completa dei file e
+voce presente, questo è sufficiente a stampare la lista completa dei file e
 delle relative dimensioni. Si noti infine come si restituisca sempre 0 come
 valore di ritorno per indicare una esecuzione senza errori.
 
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
     \includecodesample{listati/dir_scan.c}
@@ -2474,21 +2607,20 @@ 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
-\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
-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
-  \struct{dirent} sono sempre relativi alla directory in questione, e senza
-  questo posizionamento non si sarebbe potuto usare \func{stat} per ottenere
-  le dimensioni.}
+Il passo successivo (\texttt{\small 23-24}) è cambiare 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 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 \struct{dirent} sono sempre relativi alla directory in questione,
+  e senza questo posizionamento non si sarebbe potuto usare \func{stat} per
+  ottenere le dimensioni.}
 
 Avendo usato lo stratagemma di fare eseguire tutte le manipolazioni necessarie
 alla funzione passata come secondo argomento, il ciclo di scansione della
@@ -2499,7 +2631,7 @@ voce valida, cioè un puntatore diverso da \val{NULL}, si esegue
 caso sarà \code{do\_ls}), ritornando con un codice di errore (\texttt{\small
   28}) qualora questa presenti una anomalia, identificata da un codice di
 ritorno negativo. Una volta terminato il ciclo la funzione si conclude con la
-chiusura (\texttt{\small 32}) dello \textit{stream}\footnote{nel nostro caso,
+chiusura (\texttt{\small 31}) dello \textit{stream}\footnote{nel nostro caso,
   uscendo subito dopo la chiamata, questo non servirebbe, in generale però
   l'operazione è necessaria, dato che la funzione può essere invocata molte
   volte all'interno dello stesso processo, per cui non chiudere i
@@ -2515,14 +2647,14 @@ chiusura (\texttt{\small 32}) dello \textit{stream}\footnote{nel nostro caso,
 \index{directory~di~lavoro|(} 
 
 Come accennato in sez.~\ref{sec:proc_fork} a ciascun processo è associata una
-directory nel filesystem,\footnote{questa viene mantenuta all'interno dei dati
-  della sua \kstruct{task\_struct} (vedi fig.~\ref{fig:proc_task_struct}), più
-  precisamente nel campo \texttt{pwd} della sotto-struttura
-  \kstruct{fs\_struct}.} che è chiamata \textsl{directory corrente} o
-\textsl{directory di lavoro} (in inglese \textit{current working directory}).
-La directory di lavoro è quella da cui si parte quando un
-\itindsub{pathname}{relativo} \textit{pathname} è espresso in forma relativa,
-dove il ``\textsl{relativa}'' fa riferimento appunto a questa directory.
+directory nell'albero dei file,\footnote{questa viene mantenuta all'interno
+  dei dati della sua \kstruct{task\_struct} (vedi
+  fig.~\ref{fig:proc_task_struct}), più precisamente nel campo \texttt{pwd}
+  della sotto-struttura \kstruct{fs\_struct}.} che è chiamata
+\textsl{directory corrente} o \textsl{directory di lavoro} (in inglese
+\textit{current working directory}).  La directory di lavoro è quella da cui
+si parte quando un \textit{pathname} è espresso in forma relativa, dove il
+``\textsl{relativa}'' fa riferimento appunto a questa directory.
 
 Quando un utente effettua il login, questa directory viene impostata alla
 \textit{home directory} del suo account. Il comando \cmd{cd} della shell
@@ -2532,13 +2664,12 @@ resta la stessa quando viene creato un processo figlio (vedi
 sez.~\ref{sec:proc_fork}), la directory di lavoro della shell diventa anche la
 directory di lavoro di qualunque comando da essa lanciato.
 
-Dato che è il kernel che tiene traccia per ciascun processo \itindex{inode}
-dell'\textit{inode} della directory di lavoro, per ottenerne il
-\textit{pathname} occorre usare una apposita funzione,
-\funcd{getcwd},\footnote{con Linux \func{getcwd} è una \textit{system call}
-  dalla versione 2.1.9, in precedenza il valore doveva essere ottenuto tramite
-  il filesystem \texttt{/proc} da \procfile{/proc/self/cwd}.} il cui prototipo
-è:
+Dato che è il kernel che tiene traccia dell'\textit{inode} della directory di
+lavoro di ciascun processo, per ottenerne il \textit{pathname} occorre usare
+una apposita funzione, \funcd{getcwd},\footnote{con Linux \func{getcwd} è una
+  \textit{system call} dalla versione 2.1.9, in precedenza il valore doveva
+  essere ottenuto tramite il filesystem \texttt{/proc} da
+  \procfile{/proc/self/cwd}.} il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{unistd.h}
@@ -2557,7 +2688,8 @@ dell'\textit{inode} della directory di lavoro, per ottenerne il
   \item[\errcode{ERANGE}] l'argomento \param{size} è più piccolo della
     lunghezza del \textit{pathname}. 
   \end{errlist}
-  ed inoltre \errcode{EFAULT} nel suo significato generico.}
+  ed inoltre \errcode{EFAULT} ed \errcode{ENOMEM} nel loro significato
+  generico.}
 \end{funcproto}
 
 La funzione restituisce il \textit{pathname} completo della directory di
@@ -2568,13 +2700,19 @@ buffer deve essere sufficientemente largo da poter contenere il
 esso ecceda le dimensioni specificate con \param{size} la funzione restituisce
 un errore.
 
-Si può anche specificare un puntatore nullo come
-\param{buffer},\footnote{questa è un'estensione allo standard POSIX.1,
-  supportata da Linux e dalla \acr{glibc}.} nel qual caso la stringa sarà
-allocata automaticamente per una dimensione pari a \param{size} qualora questa
-sia diversa da zero, o della lunghezza esatta del \textit{pathname}
-altrimenti. In questo caso ci si deve ricordare di disallocare la stringa con
-\func{free} una volta cessato il suo utilizzo.
+A partire dal kernel Linux 2.6.36 il nome può avere come prefisso la stringa
+\texttt{(unreachable)} se la directory di lavoro resta fuori dalla directory
+radice del processo dopo un \func{chroot} (torneremo su questi argomenti in
+sez.~\ref{sec:file_chroot}); pertanto è sempre opportuno controllare il primo
+carattere della stringa restituita dalla funzione per evitare di interpretare
+mare un \textit{pathname} irraggiungibile.
+
+Come estensione allo standard POSIX.1, supportata da Linux e dalla
+\acr{glibc}, si può anche specificare un puntatore nullo come \param{buffer}
+nel qual caso la stringa sarà allocata automaticamente per una dimensione pari
+a \param{size} qualora questa sia diversa da zero, o della lunghezza esatta
+del \textit{pathname} altrimenti. In questo caso ci si deve ricordare di
+disallocare la stringa con \func{free} una volta cessato il suo utilizzo.
 
 Un uso comune di \func{getcwd} è quello di salvarsi la directory di lavoro
 all'avvio del programma per poi potervi tornare in un tempo successivo, un
@@ -2593,15 +2731,15 @@ detto che il buffer sia sufficiente a contenere il nome del file, e questa è
 la ragione principale per cui questa funzione è deprecata, e non la tratteremo.
 
 Una seconda funzione usata per ottenere la directory di lavoro è
-\funcm{get\_current\_dir\_name},\footnote{la funzione è una estensione GNU e
-  presente solo nella \acr{glibc}.} che non prende nessun argomento ed è
-sostanzialmente equivalente ad una \code{getcwd(NULL, 0)}, con la differenza
-che se disponibile essa ritorna il valore della variabile di ambiente
-\envvar{PWD}, che essendo costruita dalla shell può contenere un
-\textit{pathname} comprendente anche dei collegamenti simbolici. Usando
-\func{getcwd} infatti, essendo il \textit{pathname} ricavato risalendo
-all'indietro l'albero della directory, si perderebbe traccia di ogni passaggio
-attraverso eventuali collegamenti simbolici.
+\funcm{get\_current\_dir\_name} (la funzione è una estensione GNU e presente
+solo nella \acr{glibc}) che non prende nessun argomento ed è sostanzialmente
+equivalente ad una \code{getcwd(NULL, 0)}, con la differenza che se
+disponibile essa ritorna il valore della variabile di ambiente \envvar{PWD},
+che essendo costruita dalla shell può contenere un \textit{pathname}
+comprendente anche dei collegamenti simbolici. Usando \func{getcwd} infatti,
+essendo il \textit{pathname} ricavato risalendo all'indietro l'albero della
+directory, si perderebbe traccia di ogni passaggio attraverso eventuali
+collegamenti simbolici.
 
 Per cambiare la directory di lavoro si può usare la funzione di sistema
 \funcd{chdir}, equivalente del comando di shell \cmd{cd}, il cui nome sta
@@ -2617,11 +2755,11 @@ appunto per \textit{change directory}, il suo prototipo è:
   \begin{errlist}
   \item[\errcode{EACCES}] manca il permesso di ricerca su uno dei componenti
     di \param{pathname}.
+  \item[\errcode{ENAMETOOLONG}] il nome indicato in \param{path} è troppo lungo.
   \item[\errcode{ENOTDIR}] non si è specificata una directory.
   \end{errlist}
-  ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{EIO},
-  \errval{ENAMETOOLONG}, \errval{ENOENT} e \errval{ENOMEM} nel loro
-  significato generico.}
+  ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP}, \errval{ENOENT} e
+  \errval{ENOMEM} nel loro significato generico.}
 \end{funcproto}
 
 La funzione cambia la directory di lavoro in \param{pathname} ed
@@ -2661,8 +2799,8 @@ ha il permesso di attraversamento alla directory specificata da \param{fd}.
 Finora abbiamo parlato esclusivamente di file, directory e collegamenti
 simbolici, ma in sez.~\ref{sec:file_file_types} abbiamo visto che il sistema
 prevede anche degli altri tipi di file, che in genere vanno sotto il nome
-generico di \textsl{file speciali}, come i file di dispositivo, le fifo ed i
-socket.
+generico di \textsl{file speciali}, come i file di dispositivo, le
+\textit{fifo} ed i socket.
 
 La manipolazione delle caratteristiche di questi file speciali, il cambiamento
 di nome o la loro cancellazione può essere effettuata con le stesse funzioni
@@ -2684,9 +2822,9 @@ funzione di sistema \funcd{mknod}, il cui prototipo è:
   \item[\errcode{EEXIST}] \param{pathname} esiste già o è un collegamento
     simbolico. 
   \item[\errcode{EINVAL}] il valore di \param{mode} non indica un file, una
-    fifo, un socket o un dispositivo.
+    \textit{fifo}, un socket o un dispositivo.
   \item[\errcode{EPERM}] non si hanno privilegi sufficienti a creare
-    \itindex{inode} l'\texttt{inode}, o il filesystem su cui si è cercato di
+    l'\texttt{inode}, o il filesystem su cui si è cercato di
     creare \param{pathname} non supporta l'operazione.
   \end{errlist}
   ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{ELOOP},
@@ -2694,21 +2832,21 @@ funzione di sistema \funcd{mknod}, il cui prototipo è:
   \errval{ENOTDIR} e \errval{EROFS} nel loro significato generico.}
 \end{funcproto}
 
-La funzione permette di creare un \itindex{inode} \textit{inode} di tipo
-generico sul filesystem, e viene in genere utilizzata per creare i file di
-dispositivo, ma si può usare anche per creare qualunque tipo di file speciale
-ed anche file regolari. L'argomento \param{mode} specifica sia il tipo di file
-che si vuole creare che i relativi permessi, secondo i valori riportati in
+La funzione permette di creare un \textit{inode} di tipo generico sul
+filesystem, e viene in genere utilizzata per creare i file di dispositivo, ma
+si può usare anche per creare qualunque tipo di file speciale ed anche file
+regolari. L'argomento \param{mode} specifica sia il tipo di file che si vuole
+creare che i relativi permessi, secondo i valori riportati in
 tab.~\ref{tab:file_mode_flags}, che vanno combinati con un OR aritmetico. I
 permessi sono comunque modificati nella maniera usuale dal valore di
-\itindex{umask} \textit{umask} (si veda sez.~\ref{sec:file_perm_management}).
+\textit{umask} (si veda sez.~\ref{sec:file_perm_management}).
 
 Per il tipo di file può essere specificato solo uno fra i seguenti valori:
 \const{S\_IFREG} per un file regolare (che sarà creato vuoto),
 \const{S\_IFBLK} per un dispositivo a blocchi, \const{S\_IFCHR} per un
 dispositivo a caratteri, \const{S\_IFSOCK} per un socket e \const{S\_IFIFO}
-per una fifo;\footnote{con Linux la funzione non può essere usata per creare
-  directory o collegamenti simbolici, si dovranno usare le funzioni
+per una \textit{fifo};\footnote{con Linux la funzione non può essere usata per
+  creare directory o collegamenti simbolici, si dovranno usare le funzioni
   \func{mkdir} e \func{symlink} a questo dedicate.} un valore diverso
 comporterà l'errore \errcode{EINVAL}. Inoltre \param{pathname} non deve
 esistere, neanche come collegamento simbolico.
@@ -2717,24 +2855,26 @@ Qualora si sia specificato in \param{mode} un file di dispositivo (vale a dire
 o \const{S\_IFBLK} o \const{S\_IFCHR}), il valore di \param{dev} dovrà essere
 usato per indicare a quale dispositivo si fa riferimento, altrimenti il suo
 valore verrà ignorato.  Solo l'amministratore può creare un file di
-dispositivo usando questa funzione (il processo deve avere la
-\itindex{capabilities} \textit{capability} \const{CAP\_MKNOD}), ma in
-Linux\footnote{questo è un comportamento specifico di Linux, la funzione non è
-  prevista dallo standard POSIX.1 originale, mentre è presente in SVr4 e
-  4.4BSD, ma esistono differenze nei comportamenti e nei codici di errore,
-  tanto che questa è stata introdotta in POSIX.1-2001 con una nota che la
-  definisce portabile solo quando viene usata per creare delle fifo, ma
-  comunque deprecata essendo utilizzabile a tale scopo la specifica
-  \func{mkfifo}.} l'uso per la creazione di un file ordinario, di una fifo o
-di un socket è consentito anche agli utenti normali.
-
-I nuovi \itindex{inode} \textit{inode} creati con \func{mknod} apparterranno
-al proprietario e al gruppo del processo (usando \ids{UID} e \ids{GID} del
-gruppo effettivo) che li ha creati a meno non sia presente il bit \acr{sgid}
-per la directory o sia stata attivata la semantica BSD per il filesystem (si
-veda sez.~\ref{sec:file_ownership_management}) in cui si va a creare
-\itindex{inode} l'\textit{inode}, nel qual caso per il gruppo verrà usato il
-\ids{GID} del proprietario della directory.
+dispositivo usando questa funzione (il processo deve avere la capacità
+\const{CAP\_MKNOD}), ma in Linux\footnote{questo è un comportamento specifico
+  di Linux, la funzione non è prevista dallo standard POSIX.1 originale,
+  mentre è presente in SVr4 e 4.4BSD, ma esistono differenze nei comportamenti
+  e nei codici di errore, tanto che questa è stata introdotta in POSIX.1-2001
+  con una nota che la definisce portabile solo quando viene usata per creare
+  delle \textit{fifo}, ma comunque deprecata essendo utilizzabile a tale scopo
+  la specifica \func{mkfifo}.} l'uso per la creazione di un file ordinario, di
+una \textit{fifo} o di un socket è consentito anche agli utenti normali.
+
+Gli \textit{inode} creati con \func{mknod} apparterranno al proprietario e al
+gruppo del processo (usando \ids{UID} e \ids{GID} del gruppo effettivo) che li
+ha creati a meno non sia presente il bit \acr{sgid} per la directory o sia
+stata attivata la semantica BSD per il filesystem (si veda
+sez.~\ref{sec:file_ownership_management}) in cui si va a creare
+l'\textit{inode}, nel qual caso per il gruppo verrà usato il \ids{GID} del
+proprietario della directory.
+
+\itindbeg{major~number}
+\itindbeg{minor~number}
 
 Nella creazione di un file di dispositivo occorre poi specificare
 correttamente il valore di \param{dev}; questo infatti è di tipo
@@ -2742,88 +2882,83 @@ correttamente il valore di \param{dev}; questo infatti è di tipo
 tab.~\ref{tab:intro_primitive_types}) riservato per indicare un
 \textsl{numero} di dispositivo. Il kernel infatti identifica ciascun
 dispositivo con un valore numerico, originariamente questo era un intero a 16
-bit diviso in due parti di 8 bit chiamate rispettivamente
-\itindex{major~number} \textit{major number} e \itindex{minor~number}
-\textit{minor number}, che sono poi i due numeri mostrati dal comando
-\texttt{ls -l} al posto della dimensione quando lo si esegue su un file di
-dispositivo.
-
-Il \itindex{major~number} \textit{major number} identifica una classe di
-dispositivi (ad esempio la seriale, o i dischi IDE) e serve in sostanza per
-indicare al kernel quale è il modulo che gestisce quella classe di
-dispositivi. Per identificare uno specifico dispositivo di quella classe (ad
-esempio una singola porta seriale, o uno dei dischi presenti) si usa invece il
-\itindex{minor~number} \textit{minor number}. L'elenco aggiornato di questi
-numeri con le relative corrispondenze ai vari dispositivi può essere trovato
-nel file \texttt{Documentation/devices.txt} allegato alla documentazione dei
-sorgenti del kernel.
+bit diviso in due parti di 8 bit chiamate rispettivamente \textit{major
+  number} e \textit{minor number}, che sono poi i due numeri mostrati dal
+comando \texttt{ls -l} al posto della dimensione quando lo si esegue su un
+file di dispositivo.
+
+Il \textit{major number} identifica una classe di dispositivi (ad esempio la
+seriale, o i dischi IDE) e serve in sostanza per indicare al kernel quale è il
+modulo che gestisce quella classe di dispositivi. Per identificare uno
+specifico dispositivo di quella classe (ad esempio una singola porta seriale,
+o uno dei dischi presenti) si usa invece il \textit{minor number}. L'elenco
+aggiornato di questi numeri con le relative corrispondenze ai vari dispositivi
+può essere trovato nel file \texttt{Documentation/devices.txt} allegato alla
+documentazione dei sorgenti del kernel.
 
 Data la crescita nel numero di dispositivi supportati, ben presto il limite
 massimo di 256 si è rivelato troppo basso, e nel passaggio dai kernel della
 serie 2.4 alla serie 2.6 è stata aumentata a 32 bit la dimensione del tipo
-\type{dev\_t}, con delle dimensioni passate a 12 bit per il
-\itindex{major~number} \textit{major number} e 20 bit per il
-\itindex{minor~number} \textit{minor number}. La transizione però ha
-comportato il fatto che \type{dev\_t} è diventato un \index{tipo!opaco} tipo
-opaco, e la necessità di specificare il numero tramite delle opportune macro,
-così da non avere problemi di compatibilità con eventuali ulteriori
-estensioni.
-
-Le macro sono definite nel file \headfile{sys/sysmacros.h},\footnote{se si usa
-  la \acr{glibc} dalla versione 2.3.3 queste macro sono degli alias alle
-  versioni specifiche di questa libreria, \macro{gnu\_dev\_major},
-  \macro{gnu\_dev\_minor} e \macro{gnu\_dev\_makedev} che si possono usare
-  direttamente, al costo di una minore portabilità.} che viene
-automaticamente incluso quando si include \headfile{sys/types.h}. Si possono
-pertanto ottenere i valori del \itindex{major~number} \textit{major number} e
-\itindex{minor~number} \textit{minor number} di un dispositivo rispettivamente
-con le macro \macro{major} e \macro{minor}:
+\type{dev\_t}, con delle dimensioni passate a 12 bit per il \textit{major
+  number} e 20 bit per il \textit{minor number}. La transizione però ha
+comportato il fatto che \type{dev\_t} è diventato un tipo opaco, e la
+necessità di specificare il numero tramite delle opportune macro, così da non
+avere problemi di compatibilità con eventuali ulteriori estensioni.
+
+Le macro sono definite nel file \headfiled{sys/sysmacros.h},\footnote{se si
+  usa la \acr{glibc} dalla versione 2.3.3 queste macro sono degli alias alle
+  versioni specifiche di questa libreria, \macrod{gnu\_dev\_major},
+  \macrod{gnu\_dev\_minor} e \macrod{gnu\_dev\_makedev} che si possono usare
+  direttamente, al costo di una minore portabilità.} che viene automaticamente
+incluso quando si include \headfile{sys/types.h}. Si possono pertanto ottenere
+i valori del \textit{major number} e \textit{minor number} di un dispositivo
+rispettivamente con le macro \macro{major} e \macro{minor}:
 
 {\centering
 \vspace{3pt}
 \begin{funcbox}{
 \fhead{sys/types.h}
-\fdecl{int \macro{major}(dev\_t dev)}
-\fdesc{Restituisce il \itindex{major~number} \textit{major number} del
-  dispositivo \param{dev}.}
-\fdecl{int \macro{minor}(dev\_t dev)}
-\fdesc{Restituisce il \itindex{minor~number} \textit{minor number} del
-  dispositivo \param{dev}.}  
+\fdecl{int \macrod{major}(dev\_t dev)}
+\fdesc{Restituisce il \textit{major number} del dispositivo \param{dev}.}
+\fdecl{int \macrod{minor}(dev\_t dev)}
+\fdesc{Restituisce il \textit{minor number} del dispositivo \param{dev}.}  
 } 
 \end{funcbox}
 }
 
-\noindent mentre una volta che siano noti \itindex{major~number} \textit{major
-  number} e \itindex{minor~number} \textit{minor number} si potrà costruire il
-relativo identificativo con la macro \macro{makedev}:
+\noindent mentre una volta che siano noti \textit{major number} e
+\textit{minor number} si potrà costruire il relativo identificativo con la
+macro \macro{makedev}:
 
 {\centering
 \vspace{3pt}
 \begin{funcbox}{
 \fhead{sys/types.h}
-\fdecl{dev\_t \macro{makedev}(int major, int minor)}
-\fdesc{Dati \itindex{major~number} \textit{major number} e
-  \itindex{minor~number} \textit{minor number} restituisce l'identificativo di
-  un dispositivo.} 
+\fdecl{dev\_t \macrod{makedev}(int major, int minor)}
+\fdesc{Dati \textit{major number} e \textit{minor number} restituisce
+  l'identificativo di un dispositivo.} 
 } 
 \end{funcbox}
 }
 
+
+\itindend{major~number}
+\itindend{minor~number}
 \index{file!di~dispositivo|)}
 
 Dato che la funzione di sistema \func{mknod} presenta diverse varianti nei
 vari sistemi unix-like, lo standard POSIX.1-2001 la dichiara portabile solo in
-caso di creazione delle fifo, ma anche in questo caso alcune combinazioni
-degli argomenti restano non specificate, per cui nello stesso standard è stata
-introdotta una funzione specifica per creare una fifo deprecando l'uso di
-\func{mknod} a tale riguardo.  La funzione è \funcd{mkfifo} ed il suo
-prototipo è:
+caso di creazione delle \textit{fifo}, ma anche in questo caso alcune
+combinazioni degli argomenti restano non specificate, per cui nello stesso
+standard è stata introdotta una funzione specifica per creare una
+\textit{fifo} deprecando l'uso di \func{mknod} a tale riguardo.  La funzione è
+\funcd{mkfifo} ed il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{sys/stat.h}
 \fdecl{int mkfifo(const char *pathname, mode\_t mode)}
-\fdesc{Crea una fifo.} 
+\fdesc{Crea una \textit{fifo}.} 
 }
 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
   caso \var{errno} assumerà \errval{EACCES}, \errval{EEXIST},
@@ -2831,10 +2966,11 @@ prototipo è:
   \errval{EROFS} nel loro significato generico.}
 \end{funcproto}
 
-La funzione crea la fifo \param{pathname} con i permessi \param{mode}. Come
-per \func{mknod} il file \param{pathname} non deve esistere (neanche come
-collegamento simbolico); al solito i permessi specificati da \param{mode}
-vengono modificati dal valore di \itindex{umask} \textit{umask}.
+La funzione crea la \textit{fifo} \param{pathname} con i
+permessi \param{mode}. Come per \func{mknod} il file \param{pathname} non deve
+esistere (neanche come collegamento simbolico); al solito i permessi
+specificati da \param{mode} vengono modificati dal valore di \textit{umask}
+(vedi sez.~\ref{sec:file_perm_management}).
 
 \index{file!speciali|)} 
 
@@ -2846,18 +2982,23 @@ In molte occasioni è utile poter creare dei file temporanei; benché la cosa
 sembri semplice, in realtà il problema è più sottile di quanto non appaia a
 prima vista. Infatti anche se sembrerebbe banale generare un nome a caso e
 creare il file dopo aver controllato che questo non esista, nel momento fra il
-controllo e la creazione si ha giusto lo spazio per una possibile
-\itindex{race~condition} \textit{race condition} (si ricordi quanto visto in
-sez.~\ref{sec:proc_race_cond}).
+controllo e la creazione si ha giusto lo spazio per una possibile \textit{race
+  condition} (si ricordi quanto visto in sez.~\ref{sec:proc_race_cond}).
+
+\itindbeg{symlink~attack}
 
 Molti problemi di sicurezza derivano proprio da una creazione non accorta di
-file temporanei che lascia aperta questa \itindex{race~condition} \textit{race
-  condition}. Un attaccante allora potrà sfruttarla con quello che viene
-chiamato \itindex{symlink~attack} ``\textit{symlink attack}'' dove
-nell'intervallo fra la generazione di un nome e l'accesso allo stesso, viene
-creato un collegamento simbolico con quel nome verso un file diverso,
-ottenendo, se il programma sotto attacco ne ha la capacità, un accesso
-privilegiato.
+file temporanei che lascia aperta questa \textit{race condition}. Un
+attaccante allora potrà sfruttarla con quello che viene chiamato
+``\textit{symlink attack}'' dove nell'intervallo fra la generazione di un nome
+e l'accesso allo stesso, viene creato un collegamento simbolico con quel nome
+verso un file diverso, ottenendo, se il programma sotto attacco ne ha la
+capacità, un accesso privilegiato.\footnote{dal kernel 3.6 sono state
+  introdotte delle contromisure, illustrate in
+  sez.~\ref{sec:procadv_security_misc}, che rendono impraticabili questo tipo
+  di attacchi, ma questa non è una buona scusa per ignorare il problema.}
+
+\itindend{symlink~attack}
 
 La \acr{glibc} provvede varie funzioni per generare nomi di file temporanei,
 di cui si abbia certezza di unicità al momento della generazione; storicamente
@@ -2877,20 +3018,20 @@ la prima di queste funzioni create a questo scopo era
 La funzione restituisce il puntatore ad una stringa contente un nome di file
 valido e non esistente al momento dell'invocazione. Se si è passato come
 argomento \param{string} un puntatore non nullo ad un buffer di caratteri
-questo deve essere di dimensione \const{L\_tmpnam} ed il nome generato vi
+questo deve essere di dimensione \constd{L\_tmpnam} ed il nome generato vi
 verrà copiato automaticamente, altrimenti il nome sarà generato in un buffer
 statico interno che verrà sovrascritto ad una chiamata successiva.  Successive
 invocazioni della funzione continueranno a restituire nomi unici fino ad un
-massimo di \const{TMP\_MAX} volte, limite oltre il quale il comportamento è
+massimo di \constd{TMP\_MAX} volte, limite oltre il quale il comportamento è
 indefinito. Al nome viene automaticamente aggiunto come prefisso la directory
-specificata dalla costante \const{P\_tmpdir}.\footnote{le costanti
+specificata dalla costante \constd{P\_tmpdir}.\footnote{le costanti
   \const{L\_tmpnam}, \const{P\_tmpdir} e \const{TMP\_MAX} sono definite in
   \headfile{stdio.h}.}
 
-Di questa funzione esiste una versione \index{funzioni!rientranti} rientrante,
-\funcm{tmpnam\_r}, che non fa nulla quando si passa \val{NULL} come argomento.
-Una funzione simile, \funcd{tempnam}, permette di specificare un prefisso per
-il file esplicitamente, il suo prototipo è:
+Di questa funzione esiste una versione rientrante, \funcm{tmpnam\_r}, che non
+fa nulla quando si passa \val{NULL} come argomento.  Una funzione simile,
+\funcd{tempnam}, permette di specificare un prefisso per il file
+esplicitamente, il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{stdio.h}
@@ -2903,15 +3044,15 @@ il file esplicitamente, il suo prototipo è:
 \end{funcproto}
 
 La funzione alloca con \code{malloc} la stringa in cui restituisce il nome,
-per cui è sempre \index{funzioni!rientranti} rientrante, occorre però
-ricordarsi di disallocare con \code{free} il puntatore che restituisce.
-L'argomento \param{pfx} specifica un prefisso di massimo 5 caratteri per il
-nome provvisorio. La funzione assegna come directory per il file temporaneo,
-verificando che esista e sia accessibile, la prima valida fra le seguenti:
+per cui è sempre rientrante, occorre però ricordarsi di disallocare con
+\code{free} il puntatore che restituisce.  L'argomento \param{pfx} specifica
+un prefisso di massimo 5 caratteri per il nome provvisorio. La funzione
+assegna come directory per il file temporaneo, verificando che esista e sia
+accessibile, la prima valida fra le seguenti:
 \begin{itemize*}
 \item la variabile di ambiente \envvar{TMPDIR} (non ha effetto se non è
-  definita o se il programma chiamante è \itindex{suid~bit} \acr{suid} o
-  \itindex{sgid~bit} \acr{sgid}, vedi sez.~\ref{sec:file_special_perm}),
+  definita o se il programma chiamante è \acr{suid} o \acr{sgid}, vedi
+  sez.~\ref{sec:file_special_perm}),
 \item il valore dell'argomento \param{dir} (se diverso da \val{NULL}),
 \item il valore della costante \const{P\_tmpdir},
 \item la directory \file{/tmp}.
@@ -2955,8 +3096,8 @@ modalità \code{w+b}, si veda sez.~\ref{sec:file_fopen}) e pronto per l'uso,
 che viene automaticamente cancellato alla sua chiusura o all'uscita dal
 programma. Lo standard non specifica in quale directory verrà aperto il file,
 ma la \acr{glibc} prima tenta con \const{P\_tmpdir} e poi con
-\file{/tmp}. Questa funzione è \index{funzioni!rientranti} rientrante e non
-soffre di problemi di \itindex{race~condition} \textit{race condition}.
+\file{/tmp}. Questa funzione è rientrante e non soffre di problemi di
+\textit{race condition}.
 
 Alcune versioni meno recenti di Unix non supportano queste funzioni; in questo
 caso si possono usare le vecchie funzioni \funcd{mktemp} e \func{mkstemp} che
@@ -2980,13 +3121,12 @@ casuale, il suo prototipo è:
 La funzione genera un nome univoco sostituendo le \code{XXXXXX} finali di
 \param{template}; dato che \param{template} deve poter essere modificata dalla
 funzione non si può usare una stringa costante.  Tutte le avvertenze riguardo
-alle possibili \itindex{race~condition} \textit{race condition} date per
-\func{tmpnam} continuano a valere; inoltre in alcune vecchie implementazioni
-il valore usato per sostituire le \code{XXXXXX} viene formato con il \ids{PID}
-del processo più una lettera, il che mette a disposizione solo 26 possibilità
-diverse per il nome del file, e rende il nome temporaneo facile da indovinare.
-Per tutti questi motivi la funzione è deprecata e non dovrebbe mai essere
-usata.
+alle possibili \textit{race condition} date per \func{tmpnam} continuano a
+valere; inoltre in alcune vecchie implementazioni il valore usato per
+sostituire le \code{XXXXXX} viene formato con il \ids{PID} del processo più
+una lettera, il che mette a disposizione solo 26 possibilità diverse per il
+nome del file, e rende il nome temporaneo facile da indovinare.  Per tutti
+questi motivi la funzione è deprecata e non dovrebbe mai essere usata.
 
 La seconda funzione, \funcd{mkstemp} è sostanzialmente equivalente a
 \func{tmpfile}, ma restituisce un file descriptor invece di un nome; il suo
@@ -3002,18 +3142,17 @@ 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}
 
-
 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
@@ -3034,14 +3173,43 @@ specificamente dalla \acr{glibc},\footnote{la funzione è stata introdotta
   \func{mkstemp}.} 
 \end{funcproto}
 \noindent la cui sola differenza è la presenza dell'ulteriore argomento
-\var{flags} che consente di specificare i flag da passare ad \func{open}
-nell'apertura del file.
+\var{flags} che consente di specificare alcuni ulteriori flag (come
+\const{O\_APPEND}, \const{O\_CLOEXEC}, \const{O\_SYNC}, il cui significato
+vedremo in sez.~\ref{sec:file_open_close}) da passare ad \func{open}
+nell'apertura del file.\footnote{si tenga presente che \func{mkostemp}
+  utilizza già \const{O\_CREAT}, \const{O\_EXCL} e \const{O\_RDWR}, che non è
+  il caso di riindicare, dato che ciò potrebbe portare ad errori in altri
+  sistemi operativi.}
+
+Di queste due funzioni sono state poi introdotte, a partire dalla \acr{glibc}
+2.11 due varianti, \funcd{mkstemps} e \funcd{mkostemps}, che consentono di
+indicare anche un suffisso, i loro prototipi sono:
+
+\begin{funcproto}{
+\fhead{stlib.h}
+\fdecl{int mkstemps(char *template, int suffixlen)}
+\fdesc{Apre un file temporaneo.} 
+\fdecl{int mkostemps(char *template, int suffixlen, int flags)}
+\fdesc{Apre un file temporaneo.} 
+}
 
+{Le funzioni hanno gli stessi valori di ritorno e gli stessi errori di
+  \func{mkstemp} con lo stesso significato, tranne \errval{EINVAL} che viene
+  restituito se \param{template} non è di lunghezza pari ad almeno
+  $6+$\param{suffixlen} ed i 6 caratteri prima del suffisso non sono
+  \code{XXXXXX}.}
+\end{funcproto}
+
+Le due funzioni, un'estensione non standard fornita dalla \acr{glibc}, sono
+identiche a \funcd{mkstemp} e \funcd{mkostemp}, ma consentono di avere un nome
+del file nella forma \texttt{prefissoXXXXXXsuffisso} dove la lunghezza del
+suffisso deve essere indicata con \param{suffixlen}.
 
-In OpenBSD è stata introdotta un'altra funzione simile alle precedenti,
-\funcd{mkdtemp}, che crea invece una directory temporanea;\footnote{la
-  funzione è stata introdotta nella \acr{glibc} a partire dalla versione
-  2.1.91 ed inserita nello standard POSIX.1-2008.}  il suo prototipo è:
+Infine con OpenBSD è stata introdotta un'altra funzione simile alle
+precedenti, \funcd{mkdtemp}, che crea invece una directory
+temporanea;\footnote{la funzione è stata introdotta nella \acr{glibc} a
+  partire dalla versione 2.1.91 ed inserita nello standard POSIX.1-2008.}  il
+suo prototipo è:
 
 \begin{funcproto}{
 \fhead{stlib.h}
@@ -3057,14 +3225,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 atomica i precedenti problemi di \textit{race condition}
+non si pongono.
 
 
 \section{La manipolazione delle caratteristiche dei file}
@@ -3072,13 +3237,12 @@ creazione della directory è sempre esclusiva i precedenti problemi di
 
 Come spiegato in sez.~\ref{sec:file_filesystem} tutte le informazioni generali
 relative alle caratteristiche di ciascun file, a partire dalle informazioni
-relative al controllo di accesso, sono mantenute \itindex{inode}
-nell'\textit{inode}. Vedremo in questa sezione come sia possibile leggere
-tutte queste informazioni usando la funzione \func{stat}, che permette
-l'accesso a tutti i dati memorizzati \itindex{inode} nell'\textit{inode};
-esamineremo poi le varie funzioni usate per manipolare tutte queste
-informazioni, eccetto quelle che riguardano la gestione del controllo di
-accesso, trattate in in sez.~\ref{sec:file_access_control}.
+relative al controllo di accesso, sono mantenute nell'\textit{inode}. Vedremo
+in questa sezione come sia possibile leggere tutte queste informazioni usando
+la funzione \func{stat}, che permette l'accesso a tutti i dati memorizzati
+nell'\textit{inode}; esamineremo poi le varie funzioni usate per manipolare
+tutte queste informazioni, eccetto quelle che riguardano la gestione del
+controllo di accesso, trattate in sez.~\ref{sec:file_access_control}.
 
 
 \subsection{La lettura delle caratteristiche dei file}
@@ -3122,7 +3286,7 @@ informazioni relative ad esso e non al file a cui fa riferimento. Infine
 tramite il suo file descriptor \param{filedes}.
 
 La struttura \struct{stat} usata da queste funzioni è definita nell'header
-\headfile{sys/stat.h} e in generale dipende dall'implementazione; la versione
+\headfiled{sys/stat.h} e in generale dipende dall'implementazione; la versione
 usata da Linux è mostrata in fig.~\ref{fig:file_stat_struct}, così come
 riportata dalla pagina di manuale di \func{stat}. In realtà la definizione
 effettivamente usata nel kernel dipende dall'architettura e ha altri campi
@@ -3132,7 +3296,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 
@@ -3144,43 +3308,60 @@ sez.~\ref{sec:file_file_times}).
 Si noti come i vari membri della struttura siano specificati come tipi
 primitivi del sistema, di quelli definiti in
 tab.~\ref{tab:intro_primitive_types}, e dichiarati in \headfile{sys/types.h},
-con l'eccezione di \type{blksize\_t} e \type{blkcnt\_t} che sono nuovi tipi
+con l'eccezione di \typed{blksize\_t} e \typed{blkcnt\_t} che sono nuovi tipi
 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*}
-
 \item Il campo \var{st\_nlink} contiene il numero di \textit{hard link} che
   fanno riferimento al file (il cosiddetto \textit{link count}) di cui abbiamo
   già parlato in numerose occasioni.
-
-\item Il campo \var{st\_ino} contiene il numero di \itindex{inode}
-  \textit{inode} del file, quello viene usato all'interno del filesystem per
-  identificarlo e che può essere usato da un programma per determinare se due
-  \textit{pathname} fanno riferimento allo stesso file.
-
+\item Il campo \var{st\_ino} contiene il numero di \textit{inode} del file,
+  quello viene usato all'interno del filesystem per identificarlo e che può
+  essere usato da un programma per determinare se due \textit{pathname} fanno
+  riferimento allo stesso file.
 \item Il campo \var{st\_dev} contiene il numero del dispositivo su cui risiede
   il file (o meglio il suo filesystem). Si tratta dello stesso numero che si
-  usa con \func{mknod} e che può essere decomposto in \itindex{major~number}
-  \textit{major number} e \itindex{minor~number} \textit{minor number} con le
-  macro \macro{major} e \macro{minor} viste in sez.~\ref{sec:file_mknod}.
-
+  usa con \func{mknod} e che può essere decomposto in \textit{major number} e
+  \textit{minor number} con le macro \macro{major} e \macro{minor} viste in
+  sez.~\ref{sec:file_mknod}.
 \item Il campo \var{st\_rdev} contiene il numero di dispositivo associato al
   file stesso ed ovviamente ha un valore significativo soltanto quando il file
   è un dispositivo a caratteri o a blocchi.
-
 \item Il campo \var{st\_blksize} contiene la dimensione dei blocchi di dati
   usati nell'I/O su disco, che è anche la dimensione usata per la
   bufferizzazione dei dati dalle librerie del C per l'interfaccia degli
   \textit{stream}.  Leggere o scrivere blocchi di dati in dimensioni inferiori
   a questo valore è inefficiente in quanto le operazioni su disco usano
   comunque trasferimenti di questa dimensione.
-
 \end{itemize*}
 
+Nell'evoluzione del kernel la \textit{system call} che fornisce \func{stat} è
+stata modificata più volte per tener conto dei cambiamenti fatti alla
+struttura \struct{stat},\footnote{questo ha significato l'utilizzo a basso
+  livello di diverse \textit{system call} e diverse versioni della struttura.}
+in particolare a riguardo ai tempi dei file, di cui è stata aumentata la
+precisione (torneremo su questo in sez.~\ref{sec:file_file_times}) ma anche
+per gli aggiornamenti fatti ai campi \var{st\_ino}, \var{st\_uid} e
+\var{st\_gid}.
+
+Sulle piattaforme a 32 bit questi cambiamenti, che han visto un aumento delle
+dimensioni dei campi della struttura per adattarli alle nuove esigenze, sono
+mascherati dalla \acr{glibc} che attraverso \func{stat} invoca la versione più
+recente della \textit{system call} e rimpacchetta i dati se questo è
+necessario per eseguire dei vecchi programmi. Nelle piattaforme a 64 bit
+invece è presente un'unica versione della \textit{system call} e la struttura
+\struct{stat} ha campi di dimensione sufficiente.
+
+Infine a partire dal kernel 2.6.16 è stata introdotta una ulteriore funzione
+della famiglia, \func{fstatat} che consente di trattare con sicurezza i
+\textit{pathname} relativi, la tratteremo in sez.~\ref{sec:file_openat},
+insieme alla nuova \textit{system call} \func{statx}, introdotta dal kernel
+4.11 per estendere l'interfaccia di \func{stat} e le informazioni che essa può
+restituire.
 
 
 \subsection{I tipi di file}
@@ -3193,14 +3374,6 @@ tab.~\ref{tab:file_file_types}).  Il tipo di file viene ritornato dalle
 funzioni della famiglia \func{stat} all'interno del campo \var{st\_mode} di
 una struttura \struct{stat}. 
 
-Il campo \var{st\_mode} è una maschera binaria in cui l'informazione viene
-suddivisa nei vari bit che compongono, ed oltre a quelle sul tipo di file,
-contiene anche le informazioni relative ai permessi su cui torneremo in
-sez.~\ref{sec:file_perm_overview}. Dato che i valori numerici usati per
-definire il tipo di file possono variare a seconda delle implementazioni, lo
-standard POSIX definisce un insieme di macro che consentono di verificare il
-tipo di file in maniera standardizzata.
-
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -3209,19 +3382,27 @@ 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.\\
+    \macrod{S\_ISREG}\texttt{(m)}  & File normale.\\
+    \macrod{S\_ISDIR}\texttt{(m)}  & Directory.\\
+    \macrod{S\_ISCHR}\texttt{(m)}  & Dispositivo a caratteri.\\
+    \macrod{S\_ISBLK}\texttt{(m)}  & Dispositivo a blocchi.\\
+    \macrod{S\_ISFIFO}\texttt{(m)} & \textit{Fifo}.\\
+    \macrod{S\_ISLNK}\texttt{(m)}  & Collegamento simbolico.\\
+    \macrod{S\_ISSOCK}\texttt{(m)} & Socket.\\
     \hline    
   \end{tabular}
   \caption{Macro per i tipi di file (definite in \headfile{sys/stat.h}).}
   \label{tab:file_type_macro}
 \end{table}
 
+Il campo \var{st\_mode} è una maschera binaria in cui l'informazione viene
+suddivisa nei vari bit che compongono, ed oltre a quelle sul tipo di file,
+contiene anche le informazioni relative ai permessi su cui torneremo in
+sez.~\ref{sec:file_perm_overview}. Dato che i valori numerici usati per
+definire il tipo di file possono variare a seconda delle implementazioni, lo
+standard POSIX definisce un insieme di macro che consentono di verificare il
+tipo di file in maniera standardizzata.
+
 Queste macro vengono usate anche da Linux che supporta pure le estensioni allo
 standard per i collegamenti simbolici e i socket definite da BSD.\footnote{le
   ultime due macro di tab.~\ref{tab:file_type_macro}, che non sono presenti
@@ -3239,33 +3420,36 @@ come argomento il valore di \var{st\_mode}.
     \textbf{Flag} & \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{S\_IFMT}   &  0170000 & Maschera per i bit del tipo di file.\\
-    \const{S\_IFSOCK} &  0140000 & Socket.\\
-    \const{S\_IFLNK}  &  0120000 & Collegamento simbolico.\\
-    \const{S\_IFREG}  &  0100000 & File regolare.\\ 
-    \const{S\_IFBLK}  &  0060000 & Dispositivo a blocchi.\\
-    \const{S\_IFDIR}  &  0040000 & Directory.\\
-    \const{S\_IFCHR}  &  0020000 & Dispositivo a caratteri.\\
-    \const{S\_IFIFO}  &  0010000 & Fifo.\\
+    \constd{S\_IFMT}   &  0170000 & Maschera per i bit del tipo di file.\\
+    \constd{S\_IFSOCK} &  0140000 & Socket.\\
+    \constd{S\_IFLNK}  &  0120000 & Collegamento simbolico.\\
+    \constd{S\_IFREG}  &  0100000 & File regolare.\\ 
+    \constd{S\_IFBLK}  &  0060000 & Dispositivo a blocchi.\\
+    \constd{S\_IFDIR}  &  0040000 & Directory.\\
+    \constd{S\_IFCHR}  &  0020000 & Dispositivo a caratteri.\\
+    \constd{S\_IFIFO}  &  0010000 & \textit{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.\\
+    \constd{S\_ISUID}  &  0004000 & Set user ID (\acr{suid}) bit, vedi
+                                   sez.~\ref{sec:file_special_perm}).\\
+    \constd{S\_ISGID}  &  0002000 & Set group ID (\acr{sgid}) bit, vedi
+                                   sez.~\ref{sec:file_special_perm}).\\
+    \constd{S\_ISVTX}  &  0001000 & \acr{Sticky} bit, vedi
+                                   sez.~\ref{sec:file_special_perm}).\\
     \hline
-    \const{S\_IRWXU}  &  00700   & Maschera per i permessi del proprietario.\\
-    \const{S\_IRUSR}  &  00400   & Il proprietario ha permesso di lettura.\\
-    \const{S\_IWUSR}  &  00200   & Il proprietario ha permesso di scrittura.\\
-    \const{S\_IXUSR}  &  00100   & Il proprietario ha permesso di esecuzione.\\
+    \constd{S\_IRWXU}  &  00700   & Maschera per i permessi del proprietario.\\
+    \constd{S\_IRUSR}  &  00400   & Il proprietario ha permesso di lettura.\\
+    \constd{S\_IWUSR}  &  00200   & Il proprietario ha permesso di scrittura.\\
+    \constd{S\_IXUSR}  &  00100   & Il proprietario ha permesso di esecuzione.\\
     \hline
-    \const{S\_IRWXG}  &  00070   & Maschera per i permessi del gruppo.\\
-    \const{S\_IRGRP}  &  00040   & Il gruppo ha permesso di lettura.\\
-    \const{S\_IWGRP}  &  00020   & Il gruppo ha permesso di scrittura.\\
-    \const{S\_IXGRP}  &  00010   & Il gruppo ha permesso di esecuzione.\\
+    \constd{S\_IRWXG}  &  00070   & Maschera per i permessi del gruppo.\\
+    \constd{S\_IRGRP}  &  00040   & Il gruppo ha permesso di lettura.\\
+    \constd{S\_IWGRP}  &  00020   & Il gruppo ha permesso di scrittura.\\
+    \constd{S\_IXGRP}  &  00010   & Il gruppo ha permesso di esecuzione.\\
     \hline
-    \const{S\_IRWXO}  &  00007   & Maschera per i permessi di tutti gli altri\\
-    \const{S\_IROTH}  &  00004   & Gli altri hanno permesso di lettura.\\
-    \const{S\_IWOTH}  &  00002   & Gli altri hanno permesso di esecuzione.\\
-    \const{S\_IXOTH}  &  00001   & Gli altri hanno permesso di esecuzione.\\
+    \constd{S\_IRWXO}  &  00007   & Maschera per i permessi di tutti gli altri\\
+    \constd{S\_IROTH}  &  00004   & Gli altri hanno permesso di lettura.\\
+    \constd{S\_IWOTH}  &  00002   & Gli altri hanno permesso di esecuzione.\\
+    \constd{S\_IXOTH}  &  00001   & Gli altri hanno permesso di esecuzione.\\
     \hline    
   \end{tabular}
   \caption{Costanti per l'identificazione dei vari bit che compongono il campo
@@ -3307,33 +3491,36 @@ file e poi si effettua il confronto con i due possibili tipi di file.
 \label{sec:file_file_size}
 
 Abbiamo visto in fig.~\ref{fig:file_stat_struct} che campo \var{st\_size} di
-una struttura \struct{stat} contiene la dimensione del file in byte. Questo
-però è vero solo se si tratta di un file regolare, mentre nel caso di un
-collegamento simbolico la dimensione è quella del \textit{pathname} che il
-collegamento stesso contiene, infine per le fifo ed i file di dispositivo
-questo campo è sempre nullo.
-
-Il campo \var{st\_blocks} invece definisce la lunghezza del file in blocchi di
-512 byte. La differenza con \var{st\_size} è che in questo caso si fa
-riferimento alla quantità di spazio disco allocata per il file, e non alla
-dimensione dello stesso che si otterrebbe leggendolo sequenzialmente.
+una struttura \struct{stat} contiene la dimensione del file in byte. In realtà
+questo è vero solo se si tratta di un file regolare contenente dei dati; nel
+caso di un collegamento simbolico invece la dimensione è quella del
+\textit{pathname} che il collegamento stesso contiene, e per una directory
+quella dello spazio occupato per le voci della stessa (che dipende da come
+queste vengono mantenute dal filesystem), infine per le \textit{fifo}, i socket
+ed i file di dispositivo questo campo è sempre nullo.
+
+Il campo \var{st\_blocks} invece definisce la lunghezza del file espressa in
+numero di blocchi di 512 byte. La differenza con \var{st\_size} è che in
+questo caso si fa riferimento alla quantità di spazio disco allocata per il
+file, e non alla dimensione dello stesso che si otterrebbe leggendolo
+sequenzialmente.
 
 Si deve tener presente infatti che la lunghezza del file riportata in
 \var{st\_size} non è detto che corrisponda all'occupazione dello spazio su
 disco, e non solo perché la parte finale del file potrebbe riempire
 parzialmente un blocco. In un sistema unix-like infatti è possibile
-l'esistenza dei cosiddetti \itindex{sparse~file} \textit{sparse file}, cioè
-file in cui sono presenti dei ``\textsl{buchi}'' \index{file!\textit{hole}}
-(\textit{holes} nella nomenclatura inglese) che si formano tutte le volte che
-si va a scrivere su un file dopo aver eseguito uno spostamento oltre la sua
-fine (tratteremo in dettaglio l'argomento in sez.~\ref{sec:file_lseek}).
+l'esistenza dei cosiddetti \textit{sparse file}, cioè file in cui sono
+presenti dei ``\textsl{buchi}'' (\textit{holes} nella nomenclatura inglese)
+che si formano tutte le volte che si va a scrivere su un file dopo aver
+eseguito uno spostamento oltre la sua fine (tratteremo in dettaglio
+l'argomento in sez.~\ref{sec:file_lseek}).
 
 In questo caso si avranno risultati differenti a seconda del modo in cui si
 calcola la lunghezza del file, ad esempio il comando \cmd{du}, (che riporta il
 numero di blocchi occupati) potrà dare una dimensione inferiore, mentre se si
-legge dal file (ad esempio usando il comando \cmd{wc -c}), dato che in tal
-caso per i ``\textsl{buchi}'' \index{file!\textit{hole}} vengono restituiti
-degli zeri, si avrà lo stesso risultato di \cmd{ls}.
+legge il contenuto del file (ad esempio usando il comando \cmd{wc -c}), dato
+che in tal caso per i ``\textsl{buchi}'' vengono restituiti degli zeri, si
+avrà lo stesso risultato di \cmd{ls}.
 
 Se è sempre possibile allargare un file, scrivendoci sopra o usando la
 funzione \func{lseek} (vedi sez.~\ref{sec:file_lseek}) per spostarsi oltre la
@@ -3342,9 +3529,9 @@ troncamento, scartando i dati presenti al di là della dimensione scelta come
 nuova fine del file.
 
 Un file può sempre essere troncato a zero aprendolo con il flag
-\const{O\_TRUNC}, ma questo è un caso particolare; per qualunque altra
-dimensione si possono usare le due funzioni di sistema \funcd{truncate} e
-\funcd{ftruncate}, i cui prototipi sono:
+\const{O\_TRUNC} (vedi sez.~\ref{sec:file_open_close}), ma questo è un caso
+particolare; per qualunque altra dimensione si possono usare le due funzioni
+di sistema \funcd{truncate} e \funcd{ftruncate}, i cui prototipi sono:
 
 \begin{funcproto}{
 \fhead{unistd.h}
@@ -3388,25 +3575,23 @@ perduti.
 Il comportamento in caso di lunghezza del file inferiore a \param{length} non
 è specificato e dipende dall'implementazione: il file può essere lasciato
 invariato o esteso fino alla lunghezza scelta. Nel caso di Linux viene esteso
-con la creazione di un \index{file!\textit{hole}} \textsl{buco} nel
-\itindex{sparse~file} file e ad una lettura si otterranno degli zeri, si tenga
-presente però che questo comportamento è supportato solo per filesystem
-nativi, ad esempio su un filesystem non nativo come il VFAT di Windows questo
-non è possibile.
+con la creazione di un \textsl{buco} nel file e ad una lettura si otterranno
+degli zeri, si tenga presente però che questo comportamento è supportato solo
+per filesystem nativi, ad esempio su un filesystem non nativo come il VFAT di
+Windows questo non è possibile.
 
 
 \subsection{I tempi dei file}
 \label{sec:file_file_times}
 
 Il sistema mantiene per ciascun file tre tempi, che sono registrati
-\itindex{inode} nell'\textit{inode} insieme agli altri attributi del
-file. Questi possono essere letti tramite la funzione \func{stat}, che li
-restituisce attraverso tre campi della struttura \struct{stat} di
-fig.~\ref{fig:file_stat_struct}. Il significato di questi tempi e dei relativi
-campi della struttura \struct{stat} è illustrato nello schema di
-tab.~\ref{tab:file_file_times}, dove è anche riportato un esempio delle
-funzioni che effettuano cambiamenti su di essi. Il valore del tempo è espresso
-nel cosiddetto \itindex{calendar~time} \textit{calendar time}, su cui
+nell'\textit{inode} insieme agli altri attributi del file. Questi possono
+essere letti tramite la funzione \func{stat}, che li restituisce attraverso
+tre campi della struttura \struct{stat} di fig.~\ref{fig:file_stat_struct}. Il
+significato di questi tempi e dei relativi campi della struttura \struct{stat}
+è illustrato nello schema di tab.~\ref{tab:file_file_times}, dove è anche
+riportato un esempio delle funzioni che effettuano cambiamenti su di essi. Il
+valore del tempo è espresso nel cosiddetto \textit{calendar time}, su cui
 torneremo in dettaglio in sez.~\ref{sec:sys_time}.
 
 \begin{table}[htb]
@@ -3435,10 +3620,10 @@ ultima modifica (il \textit{modification time}) riportato in \var{st\_mtime},
 ed il tempo di ultimo cambiamento di stato (il \textit{change status time})
 riportato in \var{st\_ctime}. Il primo infatti fa riferimento ad una modifica
 del contenuto di un file, mentre il secondo ad una modifica dei metadati
-\itindex{inode} dell'\textit{inode}. Dato che esistono molte operazioni, come
-la funzione \func{link} e altre che vedremo in seguito, che modificano solo le
-informazioni contenute \itindex{inode} nell'\textit{inode} senza toccare il
-contenuto del file, diventa necessario l'utilizzo di questo secondo tempo.
+dell'\textit{inode}. Dato che esistono molte operazioni, come la funzione
+\func{link} e altre che vedremo in seguito, che modificano solo le
+informazioni contenute nell'\textit{inode} senza toccare il contenuto del
+file, diventa necessario l'utilizzo di questo secondo tempo.
 
 Il tempo di ultima modifica viene usato ad esempio da programmi come
 \cmd{make} per decidere quali file necessitano di essere ricompilati perché
@@ -3450,13 +3635,18 @@ lasso di tempo. Ad esempio un programma come \texttt{leafnode} lo usa per
 cancellare gli articoli letti più vecchi, mentre \texttt{mutt} lo usa per
 marcare i messaggi di posta che risultano letti.  
 
-Il sistema non tiene mai conto dell'ultimo accesso \itindex{inode}
-all'\textit{inode}, pertanto funzioni come \func{access} o \func{stat} non
-hanno alcuna influenza sui tre tempi. Il comando \cmd{ls} (quando usato con le
-opzioni \cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema
-riportato nell'ultima colonna di tab.~\ref{tab:file_file_times}. Si noti anche
-come non esista, a differenza di altri sistemi operativi, un \textsl{tempo di
-  creazione} di un file.
+Il sistema non tiene mai conto dell'ultimo accesso all'\textit{inode},
+pertanto funzioni come \func{access} o \func{stat} non hanno alcuna influenza
+sui tre tempi. Il comando \cmd{ls} (quando usato con le opzioni \cmd{-l} o
+\cmd{-t}) mostra i tempi dei file secondo lo schema riportato nell'ultima
+colonna di tab.~\ref{tab:file_file_times}. Si noti anche come in
+tab.~\ref{tab:file_file_times} non venga riportato il \textsl{tempo di
+  creazione} di un file; in un sistema unix-like infatti questo non esiste, e
+non è previsto dall'interfaccia classica, ma essendo usato da altri sistemi
+operativi (in particolare Windows) in tutti i filesystem più recenti ne viene
+supportata la registrazione, ed a partire dal kernel 4.11 è diventato
+possibile anche ottenerne la lettura con la nuova \textit{system call}
+\func{statx} (che tratteremo in sez.~\ref{sec:file_openat}).
 
 L'aggiornamento del tempo di ultimo accesso è stato a lungo considerato un
 difetto progettuale di Unix, questo infatti comporta la necessità di
@@ -3466,40 +3656,41 @@ accesso in lettura sui dati bufferizzati. Questo comporta un ovvio costo sia
 in termini di prestazioni, che di consumo di risorse come la batteria per i
 portatili, o i cicli di riscrittura per i dischi su memorie riscrivibili.
 
-
-Per questo motivo abbiamo visto in sez.~\ref{sec:filesystem_mounting} come
-nello sviluppo del kernel siano stati introdotti degli opportuni \textit{mount
-  flag} che consentissero di evitare di aggiornare continuamente una
-informazione che nella maggior parte dei casi non interessa. Per questo i
-valori che si possono trovare per l'\textit{access time} dipendono dalle
-opzioni di montaggio, ed anche, essendo stato cambiato il comportamento di
-default a partire dalla versione 2.6.30, dal kernel che si sta usando. 
-
-In generale quello che si ha con i kernel più recenti è che il tempo di ultimo
-accesso viene aggiornato solo se è precedente al tempo di ultima modifica o
-cambiamento, o se è passato più di un giorno dall'ultimo accesso. Così si può
-rendere evidente che vi è stato un accesso dopo una modifica e che il file
-viene comunque osservato regolarmente, conservando tutte le informazioni
-veramente utili senza dover consumare risorse in scritture continue per
-mantenere costantemente aggiornata una informazione che a questo punto non ha
-più nessuna rilevanza pratica.\footnote{qualora ce ne fosse la necessità è
-  comunque possibile, tramite l'opzione di montaggio \texttt{strictatime},
-  richiedere in ogni caso il comportamento tradizionale.}
+Per questo motivo abbiamo visto in sez.~\ref{sec:filesystem_mounting} come nel
+corso dello sviluppo del kernel siano stati introdotti degli opportuni
+\textit{mount flag} che consentono di evitare di aggiornare continuamente una
+informazione che nella maggior parte dei casi non ha un interesse
+rilevante. Per questo motivo i valori dell'\textit{access time} possono
+dipendere dalle opzioni di montaggio, ed anche, essendo stato cambiato il
+comportamento di default a partire dalla versione 2.6.30, dal kernel che si
+sta usando.
+
+In generale quello che avviene con i kernel più recenti è che il tempo di
+ultimo accesso viene aggiornato solo se è precedente al tempo di ultima
+modifica o cambiamento, o se è cambiato ed passato più di un giorno
+dall'ultimo aggiornamento. Così si può rendere evidente che vi è stato un
+accesso dopo una modifica, e che il file viene comunque osservato a cadenza
+regolare, conservando le informazioni veramente utili senza consumare
+inutilmente risorse in continue scritture per mantenere costantemente
+aggiornata una informazione che a questo punto non ha più nessuna rilevanza
+pratica.\footnote{qualora ce ne fosse la necessità è comunque possibile,
+  tramite l'opzione di montaggio \texttt{strictatime}, richiedere in ogni caso
+  il comportamento tradizionale.}
 
 \begin{table}[htb]
   \centering
   \footnotesize
   \begin{tabular}[c]{|l|c|c|c|c|c|c|l|}
     \hline
-    \multicolumn{1}{|p{2.8cm}|}{\centering{\vspace{6pt}\textbf{Funzione}}} &
+    \multicolumn{1}{|p{2.3cm}|}{\centering{\vspace{6pt}\textbf{Funzione}}} &
     \multicolumn{3}{|p{3.2cm}|}{\centering{
         \textbf{File o directory del riferimento}}}&
     \multicolumn{3}{|p{3.2cm}|}{\centering{
         \textbf{Directory contenente il riferimento}}} 
-    &\multicolumn{1}{|p{3.4cm}|}{\centering{\vspace{6pt}\textbf{Note}}} \\
+    &\multicolumn{1}{|p{3.cm}|}{\centering{\vspace{6pt}\textbf{Note}}} \\
     \cline{2-7}
     \cline{2-7}
-    \multicolumn{1}{|p{2.8cm}|}{} 
+    \multicolumn{1}{|p{2.3cm}|}{} 
     &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(a)}}}
     &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(m)}}}
     &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(c)}}}
@@ -3549,10 +3740,12 @@ più nessuna rilevanza pratica.\footnote{qualora ce ne fosse la necessità è
               se esegue \func{rmdir}\\
     \func{rename}
               & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$& 
-              per entrambi gli argomenti\\
+              per ambo gli argomenti\\
     \func{rmdir}
               & --      & --      & --      & --      &$\bullet$&$\bullet$&\\ 
-    \func{truncate}, \func{ftruncate}
+    \func{truncate}
+              & --      &$\bullet$&$\bullet$& --      & --      & --      &\\ 
+    \func{ftruncate}
               & --      &$\bullet$&$\bullet$& --      & --      & --      &\\ 
     \func{unlink}
               & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$&\\ 
@@ -3628,7 +3821,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,27 +3836,26 @@ 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 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
-tutte le volte che si modifica \itindex{inode} l'\textit{inode}, e quindi
-anche alla chiamata di \func{utime}.  Questo serve anche come misura di
-sicurezza per evitare che si possa modificare un file nascondendo
-completamente le proprie tracce. In realtà la cosa resta possibile se si è in
-grado di accedere al \index{file!di~dispositivo} file di dispositivo,
-scrivendo direttamente sul disco senza passare attraverso il filesystem, ma
-ovviamente in questo modo la cosa è più complicata da
+tutte le volte che si modifica l'\textit{inode}, e quindi anche alla chiamata
+di \func{utime}.  Questo serve anche come misura di sicurezza per evitare che
+si possa modificare un file nascondendo completamente le proprie tracce. In
+realtà la cosa resta possibile se si è in grado di accedere al file di
+dispositivo, scrivendo direttamente sul disco senza passare attraverso il
+filesystem, ma ovviamente in questo modo la cosa è più complicata da
 realizzare.\footnote{esistono comunque molti programmi che consentono di farlo
   con relativa semplicità per cui non si dia per scontato che il valore sia
   credibile in caso di macchina compromessa.}
 
 A partire dal kernel 2.6 la risoluzione dei tempi dei file, che nei campi di
 tab.~\ref{tab:file_file_times} è espressa in secondi, è stata portata ai
-nanosecondi per la gran parte dei filesystem. Lulteriore informazione può
-essere acceduta attraverso altri campi appositamente aggiunti alla struttura
+nanosecondi per la gran parte dei filesystem. L'ulteriore informazione può
+essere ottenuta attraverso altri campi appositamente aggiunti alla struttura
 \struct{stat}. Se si sono definite le macro \macro{\_BSD\_SOURCE} o
 \macro{\_SVID\_SOURCE} questi sono \var{st\_atim.tv\_nsec},
 \var{st\_mtim.tv\_nsec} e \var{st\_ctim.tv\_nsec} se queste non sono definite,
@@ -3694,7 +3886,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 
@@ -3703,12 +3895,59 @@ puntatore nullo di nuovo verrà utilizzato il tempo corrente.
   \label{fig:sys_timeval_struct}
 \end{figure}
 
+
+% Oltre ad \func{utimes} su Linux sono presenti altre due funzioni per la
+% manipolazione dei tempi dei file,\footnote{le due funzioni non sono definite
+%   in nessuno standard, ma sono presenti, oltre che su Linux, anche su BSD;
+%   sono accessibili definendo \macro{\_DEFAULT\_SOURCE} dalla \acr{glibc} 2.19
+%   o \macro{\_GNU\_SOURCE} prima.} la prima è \funcd{futimes} e consente di
+% effettuare la modifica utilizzando un file già aperto, il suo prototipo è:
+
+% \begin{funcproto}{
+% \fhead{sys/time.h}
+% \fdecl{int futimes(int fd, const struct timeval tv[2])}
+% \fdesc{Cambia i tempi di un file già aperto.} 
+% }
+
+% {La funzione ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+%   caso \var{errno} assumerà uno gli stessi valori di \func{utimes} ed inoltre:
+%   \begin{errlist}
+%   \item[\errcode{EBADF}] \param{fd} non è un file descriptor.
+%   \item[\errcode{ENOSYS}] il filesystem \texttt{/proc} non è accessibile.
+%   \end{errlist}}  
+% \end{funcproto}
+
+% La seconda funzione, introdotta a partire dal kernel 2.6.22, è
+% \funcd{lutimes}, e consente rispettivamente di modificare i tempi di un
+% collegamento simbolico; il suo prototipo è:
+
+% \begin{funcproto}{
+% \fhead{sys/time.h}
+% \fdecl{int lutimes(const char *filename, const struct timeval tv[2])}
+% \fdesc{Cambia i tempi di un collegamento simbolico.} 
+% }
+
+% {La funzione ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+%   caso \var{errno} assumerà uno gli stessi valori di \func{utimes}, con in più:
+%   \begin{errlist}
+%   \item[\errcode{ENOSYS}] la funzione non è supportata.
+%   \end{errlist}}
+% \end{funcproto}
+
+% Le due funzioni hanno lo stesso comportamento di \texttt{utimes} e richiedono
+% gli stessi privilegi per poter operare, la differenza è che con \func{futimes}
+% si può indicare il file su cui operare se questo è già aperto facendo
+% riferimento al suo file descriptor, mentre con \func{lutimes}, nel caso in cui
+% \param{filename} sia un collegamento simbolico, saranno modificati i suoi
+% tempi invece di quelli del file a cui esso punta.
+
 Oltre ad \func{utimes} su Linux sono presenti altre due funzioni,\footnote{le
   due funzioni non sono definite in nessuno standard, ma sono presenti, oltre
-  che su Linux, anche su BSD.} \funcd{futimes} e \funcd{lutimes}, che
-consentono rispettivamente di effettuare la modifica utilizzando un file già
-aperto o di eseguirla direttamente su un collegamento simbolico. I relativi
-prototipi sono:
+  che su Linux, anche su BSD; sono accessibili definendo
+  \macro{\_DEFAULT\_SOURCE} dalla \acr{glibc} 2.19 o \macro{\_GNU\_SOURCE}
+  prima.} \funcd{futimes} e \funcd{lutimes}, che consentono rispettivamente
+di effettuare la modifica utilizzando un file già aperto o di eseguirla
+direttamente su un collegamento simbolico. I relativi prototipi sono:
 
 \begin{funcproto}{
 \fhead{sys/time.h}
@@ -3723,7 +3962,8 @@ prototipi sono:
   per \func{futimes}:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{fd} non è un file descriptor.
-  \item[\errcode{ENOSYS}] il filesystem \texttt{/proc} non è accessibile.
+  \item[\errcode{ENOSYS}] il filesystem \texttt{/proc} non è accessibile per
+    \func{futimes} o la funzione non è supportata per \func{lutimes}.
   \end{errlist}}  
 \end{funcproto}
 
@@ -3737,57 +3977,45 @@ tempi invece di quelli del file a cui esso punta.
 Nonostante il kernel nelle versioni più recenti supporti, come accennato,
 risoluzioni dei tempi dei file fino al nanosecondo, le funzioni fin qui
 esaminate non consentono di impostare valori con questa precisione. Per questo
-sono state introdotte due nuove funzioni di sistema, \funcd{futimens} e
-\funcd{utimensat}, in grado di eseguire questo compito; i rispettivi prototipi
-sono:
+sono state introdotte due nuove funzioni di sistema, \func{utimensat} (che
+vedremo in sez.~\ref{sec:file_openat} insieme alle altre
+\textit{at-functions}), e \funcd{futimens}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/time.h}
-\fdecl{futimens(int fd, const struct timespec times[2])}
+\fdecl{int futimens(int fd, const struct timespec times[2])}
 \fdesc{Cambia i tempi di un file già aperto.} 
-\fdecl{int utimensat(int dirfd, const char *pathname, const struct
-    timespec times[2], int flags)}
-\fdesc{Cambia i tempi di un file.} 
 }
 
-{Le funzioni ritornano $0$ in caso di successo e $-1$ per un 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}] si è richiesta l'impostazione del tempo corrente ma
     non si ha il permesso di scrittura sul file, o non si è proprietari del
     file o non si hanno i privilegi di amministratore; oppure il file è
     immutabile (vedi sez.~\ref{sec:file_perm_overview}).
-  \item[\errcode{EBADF}] \param{fd} non è un file descriptor valido (solo
-    \func{futimens}), oppure \param{dirfd} non è \const{AT\_FDCWD} o un file
-    descriptor valido (solo \func{utimensat}).
-  \item[\errcode{EFAULT}] \param{times} non è un puntatore valido (per
-    entrambe), oppure \param{dirfd} è \const{AT\_FDCWD} ma \param{pathname} è
-    \var{NULL} o non è un puntatore valido (solo \func{utimensat}).
-  \item[\errcode{EINVAL}] si sono usati dei valori non corretti per i tempi
-    di \param{times} (per entrambe), oppure è si usato un valore non valido
-    per \param{flags}, oppure \param{pathname} è \var{NULL}, \param{dirfd} non
-    è \const{AT\_FDCWD} e \param{flags} contiene \const{AT\_SYMLINK\_NOFOLLOW}
-    (solo \func{utimensat}).
+  \item[\errcode{EBADF}] \param{fd} non è un file descriptor valido.
+  \item[\errcode{EFAULT}] \param{times} non è un puntatore valido.
+  \item[\errcode{EINVAL}] si sono usati dei valori non corretti per i tempi di
+    \param{times}.
   \item[\errcode{EPERM}] si è richiesto un cambiamento nei tempi non al tempo
     corrente, ma non si è proprietari del file o non si hanno i privilegi di
-    amministratore; oppure il file è \itindex{file~attributes} immutabile o
-    \textit{append-only} (vedi sez.~\ref{sec:file_perm_overview}).
-  \item[\errcode{ESRCH}] non c'è il permesso di attraversamento per una delle
-    componenti di \param{pathname} (solo \func{utimensat})
+    amministratore; oppure il file è immutabile o \textit{append-only} (vedi
+    sez.~\ref{sec:file_perm_overview}).
   \end{errlist}
-  ed inoltre per entrambe \errval{EROFS} e per \func{utimensat}
-  \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR} nel
-  loro significato generico.}
+  ed inoltre per entrambe \errval{EROFS} nel suo significato generico.}
 \end{funcproto}
 
-Entrambe le funzioni utilizzano per indicare i valori dei tempi un
-vettore \param{times} di due strutture \struct{timespec}, la cui definizione è
-riportata in fig.~\ref{fig:sys_timespec_struct}, che permette di specificare
-un valore dei tempi con una precisione fino al nanosecondo.
+La funzione è sostanzialmente una estensione di \func{futimes} che consente di
+specificare i tempi con precisione maggiore. Per questo per indicare i valori
+dei tempi da impostare utilizza un vettore \param{times} di due strutture
+\struct{timespec} che permettono di indicare il valore del tempo con una
+precisione fino al nanosecondo (se ne è riportata la definizione in
+fig.~\ref{fig:sys_timespec_struct}).
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/timespec.h}
   \end{minipage} 
   \normalsize 
@@ -3799,48 +4027,23 @@ un valore dei tempi con una precisione fino al nanosecondo.
 Come per le precedenti funzioni il primo elemento di \param{times} indica il
 tempo di ultimo accesso ed il secondo quello di ultima modifica, e se si usa
 il valore \val{NULL} verrà impostato il tempo corrente sia per l'ultimo
-accesso che per l'ultima modifica. Nei singoli elementi di \param{times} si
-possono inoltre utilizzare due valori speciali per il campo \var{tv\_nsec}:
-con \const{UTIME\_NOW} si richiede l'uso del tempo corrente, mentre con
-\const{UTIME\_OMIT} si richiede di non impostare il tempo. Si può così
-aggiornare in maniera specifica soltanto uno fra il tempo di ultimo accesso e
-quello di ultima modifica. Quando si usa uno di questi valori speciali per
-\var{tv\_nsec} il corrispondente valore di \var{tv\_sec} viene ignorato.
-
-Queste due funzioni sono una estensione definita nella revisione POSIX.1-2008
-dello standard POSIX, in Linux sono state introdotte a partire dal kernel
-2.6.22,\footnote{si tenga presente però che per kernel precedenti il 2.6.26 le
-  due funzioni sono difettose nel rispetto di alcuni requisiti minori dello
-  standard e nel controllo della correttezza dei tempi, per i dettagli dei
-  quali si rimanda alla pagina di manuale.} e supportate dalla \acr{glibc} a
-partire dalla versione 2.6.\footnote{in precedenza, a partire dal kernel
-  2.6.16, era stata introdotta una \textit{system call} \funcm{futimesat}
-  seguendo una bozza della revisione dello standard poi modificata; questa
-  funzione, sostituita da \func{utimensat}, è stata dichiarata obsoleta, non è
-  supportata da nessuno standard e non deve essere più utilizzata: pertanto
-  non ne parleremo.} La prima è sostanzialmente una estensione di
-\func{futimes} che consente di specificare i tempi con precisione maggiore, la
-seconda supporta invece, rispetto ad \func{utimes}, una sintassi più complessa
-che consente una indicazione sicura del file su cui operare specificando la
-directory su cui si trova tramite il file descriptor \param{dirfd} ed il suo
-nome come \itindsub{pathname}{relativo} \textit{pathname relativo}
-in \param{pathname}.\footnote{su Linux solo \func{utimensat} è una
-  \textit{system call} e \func{futimens} è una funzione di libreria, infatti
-  se \param{pathname} è \var{NULL} \param{dirfd} viene considerato un file
-  descriptor ordinario e il cambiamento del tempo applicato al file
-  sottostante, qualunque esso sia, per cui \code{futimens(fd, times}) è del
-  tutto equivalente a \code{utimensat(fd, NULL, times, 0)}.}
-
-Torneremo su questa sintassi e sulla sua motivazione in
-sez.~\ref{sec:file_openat}, quando tratteremo tutte le altre funzioni (le
-cosiddette \itindex{at-functions} \textit{at-functions}) che la utilizzano;
-essa prevede comunque anche la presenza dell'argomento \param{flags} con cui
-attivare flag di controllo che modificano il comportamento della funzione, nel
-caso specifico l'unico valore consentito è \const{AT\_SYMLINK\_NOFOLLOW} che
-indica alla funzione di non dereferenziare i collegamenti simbolici, cosa che
-le permette di riprodurre le funzionalità di \func{lutimes}.
+accesso che per l'ultima modifica.
 
+Nei singoli elementi di \param{times} si possono inoltre utilizzare due valori
+speciali per il campo \var{tv\_nsec}: con \constd{UTIME\_NOW} si richiede
+l'uso del tempo corrente, mentre con \constd{UTIME\_OMIT} si richiede di non
+impostare il tempo. Si può così aggiornare in maniera specifica soltanto uno
+fra il tempo di ultimo accesso e quello di ultima modifica. Quando si usa uno
+di questi valori speciali per \var{tv\_nsec} il corrispondente valore di
+\var{tv\_sec} viene ignorato.
 
+Questa funzione e \func{utimensat} sono una estensione definita nella
+revisione POSIX.1-2008 dello standard POSIX; in Linux sono state introdotte a
+partire dal kernel 2.6.22, e sono supportate dalla \acr{glibc} a partire dalla
+versione 2.6, si tenga presente però che per kernel precedenti il 2.6.26 le
+due funzioni sono difettose nel rispetto di alcuni requisiti minori dello
+standard e nel controllo della correttezza dei tempi, per i dettagli dei quali
+si rimanda alla pagina di manuale.
 
 
 \section{Il controllo di accesso ai file}
@@ -3848,11 +4051,11 @@ le permette di riprodurre le funzionalità di \func{lutimes}.
 
 Una delle caratteristiche fondamentali di tutti i sistemi unix-like è quella
 del controllo di accesso ai file, che viene implementato per qualunque
-filesystem standard.\footnote{per standard si intende che implementa le
-  caratteristiche previste dallo standard POSIX; in Linux sono utilizzabili
-  anche filesystem di altri sistemi operativi, che non supportano queste
-  caratteristiche.} In questa sezione ne esamineremo i concetti essenziali e
-le funzioni usate per gestirne i vari aspetti.
+filesystem standard.\footnote{per filesystem standard si intende un filesystem
+  che implementi le caratteristiche previste dallo standard POSIX; in Linux
+  sono utilizzabili anche filesystem di altri sistemi operativi, che non
+  supportano queste caratteristiche.} In questa sezione ne esamineremo i
+concetti essenziali e le funzioni usate per gestirne i vari aspetti.
 
 
 \subsection{I permessi per l'accesso ai file}
@@ -3866,21 +4069,20 @@ sez.~\ref{sec:proc_access_id}.\footnote{questo è vero solo per filesystem di
   tipo Unix, ad esempio non è vero per il filesystem VFAT di Windows, che non
   fornisce nessun supporto per l'accesso multiutente, e per il quale queste
   proprietà vengono assegnate in maniera fissa con opportune opzioni di
-  montaggio.}  Anche questi sono mantenuti \itindex{inode} sull'\textit{inode}
-insieme alle altre proprietà e sono accessibili da programma tramite la
-funzione \func{stat} (trattata in sez.~\ref{sec:file_stat}), che restituisce
-l'utente proprietario nel campo \var{st\_uid} ed il gruppo proprietario nel
-campo \var{st\_gid} della omonima struttura \struct{stat}.
+  montaggio.}  Anche questi sono mantenuti sull'\textit{inode} insieme alle
+altre proprietà e sono accessibili da programma tramite la funzione
+\func{stat} (trattata in sez.~\ref{sec:file_stat}), che restituisce l'utente
+proprietario nel campo \var{st\_uid} ed il gruppo proprietario nel campo
+\var{st\_gid} della omonima struttura \struct{stat}.
 
 Il controllo di accesso ai file segue un modello abbastanza semplice che
 prevede tre permessi fondamentali strutturati su tre livelli di accesso.
-Esistono varie estensioni a questo modello,\footnote{come le
-  \itindex{Access~Control~List~(ACL)} \textit{Access Control List} che sono
-  state aggiunte ai filesystem standard con opportune estensioni (vedi
-  sez.~\ref{sec:file_ACL}) per arrivare a meccanismi di controllo ancora più
-  sofisticati come il \itindex{Mandatory~Access~Control~(MAC)}
-  \textit{mandatory access control} di SE-Linux e delle altre estesioni come
-  \textit{Smack} o.} ma nella maggior parte dei casi il meccanismo standard è
+Esistono varie estensioni a questo modello,\footnote{come le \textit{Access
+    Control List} che sono state aggiunte ai filesystem standard con opportune
+  estensioni (vedi sez.~\ref{sec:file_ACL}) per arrivare a meccanismi di
+  controllo ancora più sofisticati come il \textit{Mandatory Access Control}
+  di \textit{SELinux} e delle altre estensioni come \textit{Smack} o
+  \textit{AppArmor}.} ma nella maggior parte dei casi il meccanismo standard è
 più che sufficiente a soddisfare tutte le necessità più comuni.  I tre
 permessi di base associati ad ogni file sono:
 \begin{itemize*}
@@ -3906,34 +4108,21 @@ rispettivamente al proprietario, al gruppo, a tutti gli altri.
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=6cm]{img/fileperm}
+  \includegraphics[width=8cm]{img/fileperm}
   \caption{Lo schema dei bit utilizzati per specificare i permessi di un file
     contenuti nel campo \var{st\_mode} di \struct{stat}.}
   \label{fig:file_perm_bit}
 \end{figure}
 
-I restanti tre bit (noti come \itindex{suid~bit} \textit{suid bit},
-\itindex{sgid~bit} \textit{sgid bit}, e \itindex{sticky~bit} \textit{sticky
-  bit}) sono usati per indicare alcune caratteristiche più complesse del
-meccanismo del controllo di accesso su cui torneremo in seguito (in
-sez.~\ref{sec:file_special_perm}), lo schema di allocazione dei bit è
+I restanti tre bit (noti come \textit{suid bit}, \textit{sgid bit}, e
+\textit{sticky bit}) sono usati per indicare alcune caratteristiche più
+complesse del meccanismo del controllo di accesso su cui torneremo in seguito
+(in sez.~\ref{sec:file_special_perm}), lo schema di allocazione dei bit è
 riportato in fig.~\ref{fig:file_perm_bit}.  Come tutte le altre proprietà di
-un file anche i permessi sono memorizzati \itindex{inode} nell'\textit{inode},
-e come accennato in sez.~\ref{sec:file_types} essi sono vengono restituiti in
-una parte del campo \var{st\_mode} della struttura \struct{stat} (si veda di
-nuovo fig.~\ref{fig:file_stat_struct}).
-
-In genere ci si riferisce ai tre livelli dei privilegi usando le lettere
-\texttt{u} (per \textit{user}), \texttt{g} (per \textit{group}) e \texttt{o}
-(per \textit{other}), inoltre se si vuole indicare tutti i raggruppamenti
-insieme si usa la lettera \texttt{a} (per \textit{all}). Si tenga ben presente
-questa distinzione dato che in certi casi, mutuando la terminologia in uso a
-suo tempo nel VMS, si parla dei permessi base come di permessi per
-\textit{owner}, \textit{group} ed \textit{all}, le cui iniziali possono dar
-luogo a confusione.  Le costanti che permettono di accedere al valore numerico
-di questi bit nel campo \var{st\_mode}, già viste in
-tab.~\ref{tab:file_mode_flags}, sono riportate per chiarezza una seconda volta
-in tab.~\ref{tab:file_bit_perm}.
+un file anche i permessi sono memorizzati nell'\textit{inode}, e come
+accennato in sez.~\ref{sec:file_types} essi vengono restituiti in una parte
+del campo \var{st\_mode} della struttura \struct{stat} (si veda di nuovo
+fig.~\ref{fig:file_stat_struct}).
 
 \begin{table}[htb]
   \centering
@@ -3961,6 +4150,19 @@ in tab.~\ref{tab:file_bit_perm}.
   \label{tab:file_bit_perm}
 \end{table}
 
+
+In genere ci si riferisce ai tre livelli dei privilegi usando le lettere
+\texttt{u} (per \textit{user}), \texttt{g} (per \textit{group}) e \texttt{o}
+(per \textit{other}), inoltre se si vuole indicare tutti i raggruppamenti
+insieme si usa la lettera \texttt{a} (per \textit{all}). Si tenga ben presente
+questa distinzione dato che in certi casi, mutuando la terminologia in uso a
+suo tempo nel VMS, si parla dei permessi base come di permessi per
+\textit{owner}, \textit{group} ed \textit{all}, le cui iniziali possono dar
+luogo a confusione.  Le costanti che permettono di accedere al valore numerico
+di questi bit nel campo \var{st\_mode}, già viste in
+tab.~\ref{tab:file_mode_flags}, sono riportate per chiarezza una seconda volta
+in tab.~\ref{tab:file_bit_perm}.
+
 I permessi vengono usati in maniera diversa dalle varie funzioni, e a seconda
 che si riferiscano a dei file, dei collegamenti simbolici o delle directory;
 qui ci limiteremo ad un riassunto delle regole generali, entrando nei dettagli
@@ -3977,14 +4179,14 @@ distinto dal permesso di lettura che invece implica che si può leggere il
 contenuto della directory.
 
 Questo significa che se si ha il permesso di esecuzione senza permesso di
-lettura si potrà lo stesso aprire un file all'interno di una una directory (se
-si hanno i permessi adeguati per il medesimo) ma non si potrà vederlo con
+lettura si potrà lo stesso aprire un file all'interno di una directory (se si
+hanno i permessi adeguati per il medesimo) ma non si potrà vederlo con
 \cmd{ls} mancando il permesso di leggere il contenuto della directory. Per
 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
@@ -3997,9 +4199,11 @@ Non si può creare un file fintanto che non si disponga del permesso di
 esecuzione e di quello di scrittura per la directory di destinazione. Gli
 stessi permessi occorrono per cancellare un file da una directory (si ricordi
 che questo non implica necessariamente la rimozione del contenuto del file dal
-disco). Per la cancellazione non è necessario nessun tipo di permesso per il
-file stesso dato che, come illustrato in sez.~\ref{sec:link_symlink_rename}
-esso non viene toccato, nella cancellazione infatti viene solo modificato il
+disco).
+
+Per la cancellazione non è necessario nessun tipo di permesso per il file
+stesso dato che, come illustrato in sez.~\ref{sec:link_symlink_rename} esso
+non viene toccato, nella cancellazione infatti viene solo modificato il
 contenuto della directory, rimuovendo la voce che ad esso fa riferimento. Lo
 stesso vale per poter rinominare o spostare il file in altra directory, in
 entrambi i casi occorrerà il permesso di scrittura sulle directory che si
@@ -4018,8 +4222,8 @@ file a cui fa riferimento; per questo in genere il comando \cmd{ls} riporta
 per un collegamento simbolico tutti i permessi come concessi. Utente e gruppo
 a cui esso appartiene vengono pure ignorati quando il collegamento viene
 risolto, vengono controllati solo quando viene richiesta la rimozione del
-collegamento e quest'ultimo è in una directory con lo \itindex{sticky~bit}
-\textit{sticky bit} impostato (si veda sez.~\ref{sec:file_special_perm}).
+collegamento e quest'ultimo è in una directory con lo \textit{sticky bit}
+impostato (si veda sez.~\ref{sec:file_special_perm}).
 
 La procedura con cui il kernel stabilisce se un processo possiede un certo
 permesso (di lettura, scrittura o esecuzione) si basa sul confronto fra
@@ -4105,13 +4309,14 @@ corrente, non possono essere modificati in alcun modo, quindi di nuovo non si
 potrà cancellare, rinominare, o modificare nei permessi o nelle altre
 proprietà.
 
-Entrambi questi attributi attivano queste restrizioni a livello di filesytem,
+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}.
+  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}
 
@@ -4179,17 +4384,15 @@ con questi bit l'uso della semantica BSD nella creazione di nuovi file (si
 veda sez.~\ref{sec:file_ownership_management} per una spiegazione dettagliata
 al proposito).
 
-Infine Linux utilizza il bit \acr{sgid} per un'ulteriore estensione mutuata
-da SVr4. Il caso in cui un file ha il bit \acr{sgid} impostato senza che lo
-sia anche il corrispondente bit di esecuzione viene utilizzato per attivare
-per quel file il \itindex{mandatory~locking} \textit{mandatory locking}
-(affronteremo questo argomento in dettaglio più avanti, in
-sez.~\ref{sec:file_mand_locking}).
+Infine Linux utilizza il bit \acr{sgid} per un'ulteriore estensione mutuata da
+SVr4. Il caso in cui un file ha il bit \acr{sgid} impostato senza che lo sia
+anche il corrispondente bit di esecuzione viene utilizzato per attivare per
+quel file il \textit{mandatory locking} (affronteremo questo argomento in
+dettaglio più avanti, in sez.~\ref{sec:file_mand_locking}).
 
 \itindend{suid~bit}
 \itindend{sgid~bit}
 
-
 \itindbeg{sticky~bit}
 
 L'ultimo dei bit rimanenti, identificato dalla costante \const{S\_ISVTX}, è in
@@ -4198,14 +4401,14 @@ memoria virtuale e l'accesso ai file erano molto meno sofisticati e per
 ottenere la massima velocità possibile per i programmi usati più comunemente
 si poteva impostare questo bit.
 
-L'effetto di questo bit era che il \index{segmento!testo} segmento di testo
-del programma (si veda sez.~\ref{sec:proc_mem_layout} per i dettagli) veniva
-scritto nella swap la prima volta che questo veniva lanciato, e vi permaneva
-fino al riavvio della macchina (da questo il nome di \textsl{sticky bit});
-essendo la swap un file continuo o una partizione indicizzata direttamente si
-poteva risparmiare in tempo di caricamento rispetto alla ricerca attraverso la
-struttura del filesystem. Lo \textsl{sticky bit} è indicato usando la lettera
-``\texttt{t}'' al posto della ``\texttt{x}'' nei permessi per gli altri.
+L'effetto di questo bit era che il segmento di testo del programma (si veda
+sez.~\ref{sec:proc_mem_layout} per i dettagli) veniva scritto nella swap la
+prima volta che questo veniva lanciato, e vi permaneva fino al riavvio della
+macchina (da questo il nome di \textsl{sticky bit}); essendo la swap un file
+continuo o una partizione indicizzata direttamente si poteva risparmiare in
+tempo di caricamento rispetto alla ricerca attraverso la struttura del
+filesystem. Lo \textsl{sticky bit} è indicato usando la lettera ``\texttt{t}''
+al posto della ``\texttt{x}'' nei permessi per gli altri.
 
 Ovviamente per evitare che gli utenti potessero intasare la swap solo
 l'amministratore era in grado di impostare questo bit, che venne chiamato
@@ -4228,12 +4431,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
@@ -4249,12 +4450,12 @@ consapevolmente, cancellare i file temporanei creati degli altri utenti.
 \subsection{Le funzioni per la gestione dei permessi dei file}
 \label{sec:file_perm_management}
 
-Come visto in sez.~\ref{sec:file_access_control} il controllo di accesso ad un
-file viene fatto utilizzando l'\ids{UID} ed il \ids{GID} effettivo del processo;
-ci sono casi però in cui si può voler effettuare il controllo con l'\ids{UID}
-reale ed il \ids{GID} reale, vale a dire usando i valori di \ids{UID} e
-\ids{GID} relativi all'utente che ha lanciato il programma, e che, come
-accennato in sez.~\ref{sec:file_special_perm} e spiegato in dettaglio in
+Come visto in sez.~\ref{sec:file_perm_overview} il controllo di accesso ad un
+file viene fatto utilizzando l'\ids{UID} ed il \ids{GID} effettivo del
+processo; ci sono casi però in cui si può voler effettuare il controllo con
+l'\ids{UID} reale ed il \ids{GID} reale, vale a dire usando i valori di
+\ids{UID} e \ids{GID} relativi all'utente che ha lanciato il programma, e che,
+come accennato in sez.~\ref{sec:file_special_perm} e spiegato in dettaglio in
 sez.~\ref{sec:proc_perms}, non è detto siano uguali a quelli effettivi.
 
 Per far questo si può usare la funzione di sistema \funcd{access}, il cui
@@ -4309,10 +4510,10 @@ controllati sono disponibili.
     \textbf{\param{mode}} & \textbf{Significato} \\
     \hline
     \hline
-    \const{R\_OK} & Verifica il permesso di lettura. \\
-    \const{W\_OK} & Verifica il permesso di scrittura. \\
-    \const{X\_OK} & Verifica il permesso di esecuzione. \\
-    \const{F\_OK} & Verifica l'esistenza del file. \\
+    \constd{R\_OK} & Verifica il permesso di lettura. \\
+    \constd{W\_OK} & Verifica il permesso di scrittura. \\
+    \constd{X\_OK} & Verifica il permesso di esecuzione. \\
+    \constd{F\_OK} & Verifica l'esistenza del file. \\
     \hline
   \end{tabular}
   \caption{Valori possibili per l'argomento \param{mode} della funzione 
@@ -4322,14 +4523,14 @@ controllati sono disponibili.
 
 Un esempio tipico per l'uso di questa funzione è quello di un processo che sta
 eseguendo un programma coi privilegi di un altro utente (ad esempio attraverso
-l'uso del \itindex{suid~bit} \textit{suid bit}) che vuole controllare se
-l'utente originale ha i permessi per accedere ad un certo file, ma eseguire
-questo controllo prima di aprire il file espone al rischio di una
-\itindex{race~condition} \textit{race condition} che apre ad un possibile
-\itindex{symlink~attack} \textit{symlink attack} fra il controllo e l'apertura
-del file. In questo caso è sempre opportuno usare invece la funzione
-\func{faccessat} che tratteremo insieme alle altre \itindex{at-functions}
-\textit{at-functions} in sez.~\ref{sec:file_openat}.
+l'uso del \textit{suid bit}) che vuole controllare se l'utente originale ha i
+permessi per accedere ad un certo file, ma eseguire questo controllo prima di
+aprire il file espone al rischio di una \textit{race condition} che apre ad un
+possibile \textit{symlink attack} fra il controllo e l'apertura del file. In
+questo caso è sempre opportuno usare invece la funzione \func{faccessat} che
+tratteremo insieme alle altre \textit{at-functions} in
+sez.~\ref{sec:file_openat}.
+
 
 Del tutto analoghe a \func{access} sono le due funzioni \funcm{euidaccess} e
 \funcm{eaccess} che ripetono lo stesso controllo usando però gli
@@ -4341,9 +4542,19 @@ prototipo\footnote{in realtà \funcm{eaccess} è solo un sinonimo di
 anche gli stessi valori e restituiscono gli stessi risultati e gli stessi
 codici di errore.
 
-Per cambiare i permessi di un file il sistema mette ad disposizione due
-funzioni \funcd{chmod} e \funcd{fchmod}, che operano rispettivamente su un
-filename e su un file descriptor, i loro prototipi sono:
+Le due funzioni non sono previste da nessuno standard, ed utilizzabili solo
+avendo definito \macro{\_GNU\_SOURCE}; inoltre qualora le si vogliano
+utilizzare per verificare che un processo abbia i permessi per accedere ad un
+file prima di farlo effettivamente, ci si esporrebbe ad una \textit{race
+  condition}, dato che i permessi potrebbero cambiare nell'intervallo fra il
+controllo e l'accesso effettivo. Per questo motivo in questo caso è molto più
+semplice e sicuro tentare direttamente l'accesso, e trattare opportunamente
+l'eventuale fallimento per mancanza di permessi.
+
+Per cambiare i permessi di un file sono invece disponibili due funzioni di
+sistema \funcd{chmod} e \funcd{fchmod}, che operano rispettivamente usando il
+\textit{pathname} di un file o se questo è già aperto sul relativo file
+descriptor; i loro prototipi sono:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -4373,8 +4584,8 @@ filename e su un file descriptor, i loro prototipi sono:
 
 Entrambe le funzioni utilizzano come secondo argomento \param{mode}, una
 variabile dell'apposito tipo primitivo \type{mode\_t} (vedi
-tab.~\ref{tab:intro_primitive_types}) utilizzato per specificare i permessi sui
-file.
+tab.~\ref{tab:intro_primitive_types}), che è una maschera binaria da
+utilizzare per specificare i permessi sui file.
 
 \begin{table}[!htb]
   \centering
@@ -4384,9 +4595,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  bit.\\
+    \const{S\_ISGID} & 02000 & Set group ID bit.\\
+    \const{S\_ISVTX} & 01000 & Sticky bit.\\
     \hline
     \const{S\_IRWXU} & 00700 & L'utente ha tutti i permessi.\\
     \const{S\_IRUSR} & 00400 & L'utente ha il permesso di lettura.\\
@@ -4409,67 +4620,71 @@ file.
   \label{tab:file_permission_const}
 \end{table}
 
-Le costanti con cui specificare i singoli bit di \param{mode} sono riportate
-in tab.~\ref{tab:file_permission_const}, e corrispondono agli stessi valori
-usati per \var{st\_mode} in tab.~\ref{tab:file_mode_flags}. Il valore
-di \param{mode} può essere ottenuto combinando fra loro con un OR binario le
-costanti simboliche relative ai vari bit, o specificato direttamente, come per
-l'omonimo comando di shell, con un valore numerico (la shell lo vuole in
-ottale, dato che i bit dei permessi sono divisibili in gruppi di tre), che si
-può calcolare direttamente usando lo schema di utilizzo dei bit illustrato in
+Si sono riportate in tab.~\ref{tab:file_permission_const} le costanti con cui
+indicare i singoli bit di \param{mode}; si noti come corrispondano agli stessi
+valori usati per \var{st\_mode} già visti in tab.~\ref{tab:file_mode_flags}.
+Il valore di \param{mode} può essere ottenuto combinando fra loro con un OR
+binario le costanti simboliche relative ai vari bit, o specificato
+direttamente, come per l'omonimo comando di shell \texttt{chmod}, con un
+valore numerico (con la shell in genere lo si scrive in ottale, dato che i bit
+dei permessi sono divisibili in gruppi di tre), che si può calcolare
+direttamente usando lo schema di utilizzo dei bit illustrato in
 fig.~\ref{fig:file_perm_bit}.
 
 Ad esempio i permessi standard assegnati ai nuovi file (lettura e scrittura
 per il proprietario, sola lettura per il gruppo e gli altri) sono
-corrispondenti al valore ottale $0644$, un programma invece avrebbe anche il
-bit di esecuzione attivo, con un valore di $0755$, se si volesse attivare il
-bit \itindex{suid~bit} \acr{suid} il valore da fornire sarebbe $4755$.
+corrispondenti al valore ottale \texttt{0644}, un programma invece avrebbe
+anche il bit di esecuzione attivo, con un valore ottale di \texttt{0755}, se
+infine si volesse attivare anche il bit \acr{suid} il valore ottale da fornire
+sarebbe \texttt{4755}.
 
 Il cambiamento dei permessi di un file eseguito attraverso queste funzioni ha
 comunque alcune limitazioni, previste per motivi di sicurezza. L'uso delle
 funzioni infatti è possibile solo se l'\ids{UID} effettivo del processo
-corrisponde a quello del proprietario del file o dell'amministratore,
-altrimenti esse falliranno con un errore di \errcode{EPERM}.
+chiamante corrisponde a quello del proprietario del file o se il processo ha i
+privilegi di amministratore,\footnote{per la precisione la capacità
+  \const{CAP\_FOWNER}, vedi sez.~\ref{sec:proc_capabilities}.} in caso
+contrario esse falliranno con un errore di \errcode{EPERM}.
 
 Ma oltre a questa regola generale, di immediata comprensione, esistono delle
 limitazioni ulteriori. Per questo motivo, anche se si è proprietari del file,
 non tutti i valori possibili di \param{mode} sono permessi o hanno effetto;
 in particolare accade che:
 \begin{enumerate*}
-\item siccome solo l'amministratore può impostare lo \itindex{sticky~bit}
-  \textit{sticky bit}, se l'\ids{UID} effettivo del processo non è zero esso
-  viene automaticamente cancellato, senza notifica di errore, qualora sia
-  stato indicato in \param{mode}.
+\item siccome solo l'amministratore può impostare lo \textit{sticky bit}, se
+  l'\ids{UID} effettivo del processo non è zero esso viene automaticamente
+  cancellato, senza notifica di errore, qualora sia stato indicato
+  in \param{mode}.
 \item per quanto detto in sez.~\ref{sec:file_ownership_management} riguardo la
   creazione dei nuovi file, si può avere il caso in cui il file creato da un
   processo è assegnato ad un gruppo per il quale il processo non ha privilegi.
-  Per evitare che si possa assegnare il bit \itindex{sgid~bit} \acr{sgid} ad
-  un file appartenente ad un gruppo per cui non si hanno diritti, questo viene
-  automaticamente cancellato da \param{mode}, senza notifica di errore,
-  qualora il gruppo del file non corrisponda a quelli associati al processo;
-  la cosa non avviene quando l'\ids{UID} effettivo del processo è zero.
+  Per evitare che si possa assegnare il bit \acr{sgid} ad un file appartenente
+  ad un gruppo per cui non si hanno diritti, questo viene automaticamente
+  cancellato da \param{mode}, senza notifica di errore, qualora il gruppo del
+  file non corrisponda a quelli associati al processo; la cosa non avviene
+  quando l'\ids{UID} effettivo del processo è zero.
 \end{enumerate*}
 
-Per alcuni filesystem\footnote{i filesystem più comuni (\textsl{ext2},
-  \textsl{ext3}, \textsl{ext4}, \textsl{ReiserFS}) supportano questa
-  caratteristica, che è mutuata da BSD.} è inoltre prevista un'ulteriore
-misura di sicurezza, volta a scongiurare l'abuso dei \itindex{suid~bit} bit
+Per alcuni filesystem\footnote{i filesystem più comuni (\acr{ext2},
+  \acr{ext3}, \acr{ext4}, \acr{XFS}, \acr{Btrfs}) supportano
+  questa caratteristica, che è mutuata da BSD.} è inoltre prevista
+un'ulteriore misura di sicurezza, volta a scongiurare l'abuso dei bit
 \acr{suid} e \acr{sgid}; essa consiste nel cancellare automaticamente questi
 bit dai permessi di un file qualora un processo che non appartenga
 all'amministratore\footnote{per la precisione un processo che non dispone
-  della \itindex{capabilities} capacità \const{CAP\_FSETID}, vedi
-  sez.~\ref{sec:proc_capabilities}.} effettui una scrittura. In questo modo
-anche se un utente malizioso scopre un file \acr{suid} su cui può scrivere,
-un'eventuale modifica comporterà la perdita di questo privilegio.
+  della capacità \const{CAP\_FSETID}, vedi sez.~\ref{sec:proc_capabilities}.}
+effettui una scrittura. In questo modo anche se un utente malizioso scopre un
+file \acr{suid} su cui può scrivere, 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} 
 
@@ -4497,8 +4712,8 @@ di controllo è \funcd{umask}, ed il suo prototipo è:
 \fdesc{Imposta la maschera dei permessi.} 
 }
 
-{La funzione ritorna ritorna il precedente valore della maschera, non sono
-  previste condizioni di errore.}
+{La funzione ritorna il precedente valore della maschera, non sono previste
+  condizioni di errore.}
 \end{funcproto}
 
 La funzione imposta la maschera dei permessi dei bit al valore specificato
@@ -4517,7 +4732,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
@@ -4538,10 +4753,10 @@ 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,
+creato ha il bit \acr{sgid} dei permessi 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
+  \acr{ext2}, \acr{ext3}, \acr{ext4}, e \acr{XFS}.}  con l'uso dell'opzione di
 montaggio \texttt{grpid}, che se attivata fa passare all'uso della semantica
 BSD.
 
@@ -4562,14 +4777,14 @@ 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
+usare prima della creazione dei file un valore per \textit{umask} lasci il
+permesso di scrittura per il gruppo.\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
+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:
 
@@ -4582,7 +4797,7 @@ prototipi sono:
 \fdesc{Cambiano proprietario e gruppo proprietario di un file.} 
 }
 
-{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{EPERM}] l'\ids{UID} effettivo non corrisponde a quello del
@@ -4596,14 +4811,14 @@ prototipi sono:
 
 Le funzioni cambiano utente e gruppo di appartenenza di un file ai valori
 specificati dalle variabili \param{owner} e \param{group}. Con Linux solo
-l'amministratore\footnote{o in generale un processo con la
-  \itindex{capabilities} capacità \const{CAP\_CHOWN}, vedi
-  sez.~\ref{sec:proc_capabilities}.} può cambiare il proprietario di un file;
-in questo viene seguita la semantica usata da BSD che non consente agli utenti
-di assegnare i loro file ad altri utenti evitando eventuali aggiramenti delle
-quote.  L'amministratore può cambiare sempre il gruppo di un file, il
-proprietario può cambiare il gruppo solo dei file che gli appartengono e solo
-se il nuovo gruppo è il suo gruppo primario o uno dei gruppi di cui fa parte.
+l'amministratore\footnote{o in generale un processo con la capacità
+  \const{CAP\_CHOWN}, vedi sez.~\ref{sec:proc_capabilities}.} può cambiare il
+proprietario di un file; in questo viene seguita la semantica usata da BSD che
+non consente agli utenti di assegnare i loro file ad altri utenti evitando
+eventuali aggiramenti delle quote.  L'amministratore può cambiare sempre il
+gruppo di un file, il proprietario può cambiare il gruppo solo dei file che
+gli appartengono e solo se il nuovo gruppo è il suo gruppo primario o uno dei
+gruppi di cui fa parte.
 
 La funzione \func{chown} segue i collegamenti simbolici, per operare
 direttamente su un collegamento simbolico si deve usare la funzione
@@ -4613,15 +4828,14 @@ direttamente su un collegamento simbolico si deve usare la funzione
   stata creata una nuova \textit{system call} per \func{chown} che seguisse i
   collegamenti simbolici.} La funzione \func{fchown} opera su un file aperto,
 essa è mutuata da BSD, ma non è nello standard POSIX.  Un'altra estensione
-rispetto allo standard POSIX è che specificando -1 come valore
-per \param{owner} e \param{group} i valori restano immutati.
+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 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
-\itindex{mandatory~locking} \textit{mandatory locking} (vedi
+privilegi di amministratore entrambi i bit \acr{suid} e \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 \textit{mandatory locking} (vedi
 sez.~\ref{sec:file_mand_locking}).
 
 
@@ -4653,8 +4867,7 @@ fornire un quadro d'insieme.
     \hline
    1&-&-&-&-&1&-&-&-&-&-&-&Eseguito conferisce l'\ids{UID} effettivo dell'utente.\\
    -&1&-&-&-&1&-&-&-&-&-&-&Eseguito conferisce il \ids{GID} effettivo del gruppo.\\
-   -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking} 
-                           \textit{mandatory locking} è abilitato.\\
+   -&1&-&-&-&0&-&-&-&-&-&-&Il \textit{mandatory locking} è abilitato.\\
    -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato.\\
    -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per l'utente.\\
    -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per l'utente.\\
@@ -4702,20 +4915,17 @@ Nella parte superiore di tab.~\ref{tab:file_fileperm_bits} si è riassunto il
 significato dei vari bit dei permessi per un file ordinario; per quanto
 riguarda l'applicazione dei permessi per proprietario, gruppo ed altri si
 ricordi quanto illustrato in sez.~\ref{sec:file_perm_overview}.  Per
-compattezza, nella tabella si sono specificati i bit di \itindex{suid~bit}
-\textit{suid}, \itindex{sgid~bit} \textit{sgid} e \textit{sticky}
-\itindex{sticky~bit} con la notazione illustrata anche in
+compattezza, nella tabella si sono specificati i bit di \textit{suid},
+\textit{sgid} e \textit{sticky} con la notazione illustrata anche in
 fig.~\ref{fig:file_perm_bit}.  Nella parte inferiore si sono invece riassunti
 i significati dei vari bit dei permessi per una directory; anche in questo
-caso si è riapplicato ai bit di \itindex{suid~bit} \textit{suid},
-\itindex{sgid~bit} \textit{sgid} e \textit{sticky} \itindex{sticky~bit} la
-notazione illustrata in fig.~\ref{fig:file_perm_bit}.
+caso si è riapplicato ai bit di \textit{suid}, \textit{sgid} e \textit{sticky}
+la notazione illustrata in fig.~\ref{fig:file_perm_bit}.
 
 Si ricordi infine che i permessi non hanno alcun significato per i
-collegamenti simbolici, mentre per i \index{file!di~dispositivo} file di
-dispositivo hanno senso soltanto i permessi di lettura e scrittura, che si
-riflettono sulla possibilità di compiere dette operazioni sul dispositivo
-stesso.
+collegamenti simbolici, mentre per i file di dispositivo hanno senso soltanto
+i permessi di lettura e scrittura, che si riflettono sulla possibilità di
+compiere dette operazioni sul dispositivo stesso.
 
 Nella tabella si è indicato con il carattere ``-'' il fatto che il valore del
 bit in questione non è influente rispetto a quanto indicato nella riga della
@@ -4740,26 +4950,25 @@ Linux.
 \itindbeg{Extended~Attributes}
 
 Nelle sezioni precedenti abbiamo trattato in dettaglio le varie informazioni
-che il sistema mantiene negli \itindex{inode} \textit{inode}, e le varie
-funzioni che permettono di modificarle.  Si sarà notato come in realtà queste
-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 abbiam chiamato genericamente \textsl{metadati}) che però non
-potevano trovare spazio nei dati classici mantenuti negli \itindex{inode}
-\textit{inode}.
+che il sistema mantiene negli \textit{inode}, e le varie funzioni che
+permettono di modificarle.  Si sarà notato come in realtà queste 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
+abbiamo chiamato genericamente \textsl{metadati}) che però non potevano
+trovare spazio nei dati classici mantenuti negli \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 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.
+singoli file; ad esempio vengono usati per la gestione delle ACL, che
+tratteremo in sez.~\ref{sec:file_ACL} e per le \textit{file capabilities}, che
+vedremo in sez.~\ref{sec:proc_capabilities}. Gli \textsl{attributi estesi}
+(abbreviati in \textsl{xattr}) 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
@@ -4773,26 +4982,28 @@ efficienti,\footnote{cosa molto importante, specie per le applicazioni che
   richiedono una gran numero di accessi, come le ACL.} e di garantire
 l'atomicità di tutte le operazioni.
 
-In Linux gli attributi estesi sono sempre associati al singolo \itindex{inode}
-\textit{inode} e l'accesso viene sempre eseguito in forma atomica, in lettura
-il valore corrente viene scritto su un buffer in memoria, mentre la scrittura
-prevede che ogni valore precedente sia sovrascritto.
+In Linux gli attributi estesi sono sempre associati al singolo \textit{inode}
+e l'accesso viene sempre eseguito in forma atomica, in lettura il valore
+corrente viene scritto su un buffer in memoria, mentre la scrittura prevede
+che ogni valore precedente sia sovrascritto.
 
 Si tenga presente che non tutti i filesystem supportano gli \textit{Extended
   Attributes}; al momento della scrittura di queste dispense essi sono
-presenti solo sui vari \textsl{extN}, \textsl{ReiserFS}, \textsl{JFS},
-\textsl{XFS} e \textsl{Btrfs}.\footnote{l'elenco è aggiornato a Luglio 2011.}
-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
+presenti solo sui vari \acr{extN}, \acr{ReiserFS}, \acr{JFS},
+\acr{XFS}, \acr{Btrfs}, \acr{Lustre} e \acr{OCFS2}.  Inoltre a
+seconda della implementazione ci possono essere dei limiti sulla quantità di
+attributi che si possono utilizzare.\footnote{ad esempio nel caso di
+  \acr{ext2} ed \acr{ext3} è richiesto che essi siano contenuti
   all'interno di un singolo blocco, pertanto 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
-  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
-attributi estesi viene tenuto in conto per il calcolo delle quote di utente e
-gruppo proprietari del file.
+  in fase di creazione del filesystem, mentre con \textsl{XFS} e
+  \textsl{Btrfs} 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à; lasciamo i
+  dettagli dei vari filesystem alla documentazione accessibile con \texttt{man
+    xattr}.} Infine lo spazio utilizzato per mantenere gli attributi estesi
+viene tenuto in conto per il calcolo delle quote di utente e gruppo
+proprietari del file.
 
 Come meccanismo per mantenere informazioni aggiuntive associate al singolo
 file, gli \textit{Extended Attributes} possono avere usi anche molto diversi
@@ -4802,9 +5013,9 @@ gestione. Per questo motivo il nome di un attributo deve essere sempre
 specificato nella forma \texttt{namespace.attribute}, dove \texttt{namespace}
 fa riferimento alla classe a cui l'attributo appartiene, mentre
 \texttt{attribute} è il nome ad esso assegnato. In tale forma il nome di un
-attributo esteso deve essere univoco. Al momento\footnote{della scrittura di
-  questa sezione, kernel 2.6.23, ottobre 2007.} sono state definite le quattro
-classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}.
+attributo esteso deve essere univoco. Al momento sono state definite le
+quattro classi di attributi riportate in
+tab.~\ref{tab:extended_attribute_class}.
 
 \begin{table}[htb]
   \centering
@@ -4816,19 +5027,17 @@ classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}.
     \hline
     \texttt{security}&Gli \textit{extended security attributes}: vengono
                       utilizzati dalle estensioni di sicurezza del kernel (i
-                      \itindex{Linux~Security~Modules} \textit{Linux 
-                        Security Modules}), per le realizzazione di meccanismi
-                      evoluti di controllo di accesso come \index{SELinux}
-                      SELinux o le \textit{capabilities} dei file di
-                      sez.~\ref{sec:proc_capabilities}.\\ 
-    \texttt{system} & Gli \textit{extended security attributes}: sono usati
+                      \textit{Linux Security Modules}), per le realizzazione
+                      di meccanismi evoluti di controllo di accesso come
+                      \textit{SELinux} o le \textit{capabilities} dei
+                      file di sez.~\ref{sec:proc_capabilities}.\\ 
+    \texttt{system} & Gli \textit{extended system attributes}: sono usati
                       dal kernel per memorizzare dati di sistema associati ai
-                      file come le \itindex{Access~Control~List~(ACL)} ACL (vedi
-                      sez.~\ref{sec:file_ACL}) o le \itindex{capabilities}
+                      file come le ACL (vedi sez.~\ref{sec:file_ACL}) o le
                       \textit{capabilities} (vedi
                       sez.~\ref{sec:proc_capabilities}).\\
     \texttt{trusted}& I \textit{trusted extended attributes}: vengono
-                      utilizzati per poter realizzare in user space 
+                      utilizzati per poter realizzare in \textit{user space} 
                       meccanismi che consentano di mantenere delle
                       informazioni sui file che non devono essere accessibili
                       ai processi ordinari.\\
@@ -4845,43 +5054,40 @@ classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}.
 
 
 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:
+realizzare delle estensioni al tradizionale meccanismo dei controlli di
+accesso di Unix (come le ACL, \textit{SELinux}, ecc.), 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
-  l'utilizzo di un sistema di controllo basato sui
-  \itindex{Linux~Security~Modules} \textit{Linux Security Modules} (ad esempio
-  \index{SELinux} SELinux). Pertanto l'accesso in lettura o scrittura dipende
-  dalle politiche di sicurezza implementate all'interno dal modulo di
-  sicurezza che si sta utilizzando al momento (ciascuno avrà le sue). Se non è
-  stato caricato nessun modulo di sicurezza l'accesso in lettura sarà
-  consentito a tutti i processi, mentre quello in scrittura solo ai processi
-  con privilegi amministrativi dotati della \itindex{capabilities}
-  \textit{capability} \const{CAP\_SYS\_ADMIN}.
+  l'utilizzo di un sistema di controllo basato sui \textit{Linux Security
+    Modules} (ad esempio \textit{SELinux}). Pertanto l'accesso in lettura o
+  scrittura dipende dalle politiche di sicurezza implementate all'interno dal
+  modulo di sicurezza che si sta utilizzando al momento (ciascuno avrà le
+  sue). Se non è stato caricato nessun modulo di sicurezza l'accesso in
+  lettura sarà consentito a tutti i processi, mentre quello in scrittura solo
+  ai processi con privilegi amministrativi (per la precisione dotati della
+  capacità \const{CAP\_SYS\_ADMIN}, vedi sez.~\ref{sec:proc_capabilities}).
 
 \item[\texttt{system}] Anche l'accesso agli \textit{extended system
     attributes} dipende dalle politiche di accesso che il kernel realizza
   anche utilizzando gli stessi valori in essi contenuti. Ad esempio nel caso
-  delle \itindex{Access~Control~List~(ACL)} ACL l'accesso è consentito in
-  lettura ai processi che hanno la capacità di eseguire una ricerca sul file
-  (cioè hanno il permesso di lettura sulla directory che contiene il file) ed
-  in scrittura al proprietario del file o ai processi dotati della
-  \textit{capability} \itindex{capabilities}
-  \const{CAP\_FOWNER}.\footnote{vale a dire una politica di accesso analoga a
-    quella impiegata per gli ordinari permessi dei file.}
+  delle ACL (vedi sez.~\ref{sec:file_ACL}) l'accesso è consentito in lettura
+  ai processi che hanno la capacità di eseguire una ricerca sul file (cioè
+  hanno il permesso di lettura sulla directory che contiene il file) ed in
+  scrittura al proprietario del file o ai processi dotati della capacità
+  \const{CAP\_FOWNER}, vale a dire una politica di accesso analoga a quella
+  impiegata per gli ordinari permessi dei file.
 
 \item[\texttt{trusted}] L'accesso ai \textit{trusted extended attributes}, sia
   per la lettura che per la scrittura, è consentito soltanto ai processi con
-  privilegi amministrativi dotati della \itindex{capabilities}
-  \textit{capability} \const{CAP\_SYS\_ADMIN}. In questo modo si possono
-  utilizzare questi attributi per realizzare in user space dei meccanismi di
-  controllo che accedono ad informazioni non disponibili ai processi ordinari.
+  privilegi amministrativi dotati della capacità \const{CAP\_SYS\_ADMIN}. In
+  questo modo si possono utilizzare questi attributi per realizzare in
+  \textit{user space} dei meccanismi di controllo che accedono ad informazioni
+  non disponibili ai processi ordinari.
 
 \item[\texttt{user}] L'accesso agli \textit{extended user attributes} è
   regolato dai normali permessi dei file: occorre avere il permesso di lettura
@@ -4891,37 +5097,36 @@ casi:
   cui essi fanno riferimento. Questa scelta vale però soltanto per i file e le
   directory ordinarie, se valesse in generale infatti si avrebbe un serio
   problema di sicurezza dato che esistono diversi oggetti sul filesystem per i
-  quali è normale avere avere il permesso di scrittura consentito a tutti gli
-  utenti, come i collegamenti simbolici, o alcuni \index{file!di~dispositivo}
-  file di dispositivo come \texttt{/dev/null}. Se fosse possibile usare su di
-  essi gli \textit{extended user attributes} un utente qualunque potrebbe
-  inserirvi dati a piacere.\footnote{la cosa è stata notata su XFS, dove
-    questo comportamento permetteva, non essendovi limiti sullo spazio
-    occupabile dagli \textit{Extended Attributes}, di bloccare il sistema
-    riempiendo il disco.}
+  quali è normale avere il permesso di scrittura consentito a tutti gli
+  utenti, come i collegamenti simbolici, o alcuni file di dispositivo come
+  \texttt{/dev/null}. Se fosse possibile usare su di essi gli \textit{extended
+    user attributes} un utente qualunque potrebbe inserirvi dati a
+  piacere.\footnote{la cosa è stata notata su XFS, dove questo comportamento
+    permetteva, non essendovi limiti sullo spazio occupabile dagli
+    \textit{Extended Attributes}, di bloccare il sistema riempiendo il disco.}
 
   La semantica del controllo di accesso indicata inoltre non avrebbe alcun
   senso al di fuori di file e directory: i permessi di lettura e scrittura per
-  un \index{file!di~dispositivo} file di dispositivo attengono alle capacità
-  di accesso al dispositivo sottostante,\footnote{motivo per cui si può
-    formattare un disco anche se \texttt{/dev} è su un filesystem in sola
-    lettura.} mentre per i collegamenti simbolici questi vengono semplicemente
-  ignorati: in nessuno dei due casi hanno a che fare con il contenuto del
-  file, e nella discussione relativa all'uso degli \textit{extended user
-    attributes} nessuno è mai stato capace di indicare una qualche forma
-  sensata di utilizzo degli stessi per collegamenti simbolici o
-  \index{file!di~dispositivo} file di dispositivo, e neanche per le fifo o i
-  socket.  Per questo motivo essi sono stati completamente disabilitati per
-  tutto ciò che non sia un file regolare o una directory.\footnote{si può
-    verificare la semantica adottata consultando il file \texttt{fs/xattr.c}
-    dei sorgenti del kernel.} Inoltre per le directory è stata introdotta una
-  ulteriore restrizione, dovuta di nuovo alla presenza ordinaria di permessi
-  di scrittura completi su directory come \texttt{/tmp}. Per questo motivo,
-  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 capacità \itindex{capabilities}
-  \const{CAP\_FOWNER}.
+  un file di dispositivo attengono alle capacità di accesso al dispositivo
+  sottostante,\footnote{motivo per cui si può formattare un disco anche se
+    \texttt{/dev} è su un filesystem in sola lettura.} mentre per i
+  collegamenti simbolici questi vengono semplicemente ignorati: in nessuno dei
+  due casi hanno a che fare con il contenuto del file, e nella discussione
+  relativa all'uso degli \textit{extended user attributes} nessuno è mai stato
+  capace di indicare una qualche forma sensata di utilizzo degli stessi per
+  collegamenti simbolici o file di dispositivo, e neanche per le \textit{fifo}
+  o i socket.
+
+  Per questo motivo essi sono stati completamente disabilitati per tutto ciò
+  che non sia un file regolare o una directory.\footnote{si può verificare la
+    semantica adottata consultando il file \texttt{fs/xattr.c} dei sorgenti
+    del kernel.} Inoltre per le directory è stata introdotta una ulteriore
+  restrizione, dovuta di nuovo alla presenza ordinaria di permessi di
+  scrittura completi su directory come \texttt{/tmp}. Per questo motivo, per
+  evitare eventuali abusi, se una directory ha lo \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 capacità \const{CAP\_FOWNER}.
 \end{basedescript}
 
 Le funzioni per la gestione degli attributi estesi, come altre funzioni di
@@ -4932,8 +5137,8 @@ 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
-di sistema, \funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che
+Per 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:
@@ -4978,35 +5183,41 @@ il nome dell'attributo di cui si vuole ottenere il valore. Il nome deve essere
 indicato comprensivo di prefisso del \textit{namespace} cui appartiene (uno
 dei valori di tab.~\ref{tab:extended_attribute_class}) nella forma
 \texttt{namespace.attributename}, come stringa terminata da un carattere NUL.
-Il suo valore verrà restituito nel buffer puntato dall'argomento \param{value}
-per una dimensione massima di \param{size} byte;\footnote{gli attributi estesi
-  possono essere costituiti arbitrariamente da dati testuali o binari.}  se
-quest'ultima non è sufficiente si avrà un errore di \errcode{ERANGE}.
+Il valore dell'attributo richiesto verrà restituito nel buffer puntato
+dall'argomento \param{value} per una dimensione massima di \param{size} byte
+(gli attributi estesi possono essere costituiti arbitrariamente da dati
+testuali o binari); se quest'ultima non è sufficiente si avrà un errore di
+\errcode{ERANGE}.
 
 Per evitare di dover indovinare la dimensione di un attributo per tentativi si
 può eseguire una interrogazione utilizzando un valore nullo per \param{size};
 in questo caso non verrà letto nessun dato, ma verrà restituito come valore di
 ritorno della funzione chiamata la dimensione totale dell'attributo esteso
 richiesto, che si potrà usare come stima per allocare un buffer di dimensioni
-sufficienti.\footnote{si parla di stima perché anche se le funzioni
-  restituiscono la dimensione esatta dell'attributo al momento in cui sono
-  eseguite, questa potrebbe essere modificata in qualunque momento da un
-  successivo accesso eseguito da un altro processo.}
+sufficienti.
 
-Un secondo gruppo di funzioni è quello che consente di impostare il valore di
-un attributo esteso, queste sono \funcd{setxattr}, \funcd{lsetxattr} e
-\funcd{fsetxattr}, e consentono di operare rispettivamente su un file, su un
-collegamento simbolico o specificando un file descriptor; i loro prototipi sono:
+Si tenga conto che questa è comunque una stima perché anche se le funzioni
+restituiscono la dimensione esatta dell'attributo al momento in cui sono
+eseguite, questa potrebbe essere modificata in qualunque momento da un
+successivo accesso eseguito da un altro processo, pertanto si verifichi sempre
+il valore di ritorno ed il codice di errore della funzione usata, senza dare
+per scontato che essa abbia sempre successo.
+
+Un secondo gruppo di funzioni sono quelle che consentono di impostare il
+valore di un attributo esteso, le funzioni sono \funcd{setxattr},
+\funcd{lsetxattr} e \funcd{fsetxattr} e consentono di operare rispettivamente
+su un file, su un collegamento simbolico o utilizzando un file descriptor; i
+rispettivi prototipi sono:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{attr/xattr.h}
-\fdecl{int setxattr(const char *path, const char *name, const void *value,
-  size\_t size, int flags)} 
-\fdecl{int lsetxattr(const char *path, const char *name, const void *value,
-  size\_t size, int flags)} 
-\fdecl{int fsetxattr(int filedes, const char *name, const void *value, size\_t
-  size, int flags)} 
+\fdecl{int setxattr(const char *path, const char *name, const void *value,\\
+  \phantom{int setxattr(}size\_t size, int flags)} 
+\fdecl{int lsetxattr(const char *path, const char *name, const void *value,\\
+  \phantom{int lsetxattr(}size\_t size, int flags)} 
+\fdecl{int fsetxattr(int filedes, const char *name, const void *value,\\
+  \phantom{int fsetxattr(}size\_t size, int flags)} 
 \fdesc{Impostano il valore di un attributo esteso.} 
 }
 
@@ -5025,28 +5236,33 @@ collegamento simbolico o specificando un file descriptor; i loro prototipi sono:
   permessi di accesso all'attributo.}
 \end{funcproto}
 
-Le tre funzioni prendono come primo argomento un valore adeguato al loro
-scopo, usato in maniera del tutto identica a quanto visto in precedenza per le
-analoghe che leggono gli attributi estesi. Il secondo argomento \param{name}
-deve indicare, anche in questo caso con gli stessi criteri appena visti per le
-analoghe \func{getxattr}, \func{lgetxattr} e \func{fgetxattr}, il nome
-(completo di suffisso) dell'attributo su cui si vuole operare. 
-
-Il valore che verrà assegnato all'attributo dovrà essere preparato nel buffer
-puntato da \param{value}, e la sua dimensione totale (in byte) sarà indicata
-dall'argomento \param{size}. Infine l'argomento \param{flag} consente di
-controllare le modalità di sovrascrittura dell'attributo esteso, esso può
-prendere due valori: con \const{XATTR\_REPLACE} si richiede che l'attributo
-esista, nel qual caso verrà sovrascritto, altrimenti si avrà errore, mentre
-con \const{XATTR\_CREATE} si richiede che l'attributo non esista, nel qual
-caso verrà creato, altrimenti si avrà errore ed il valore attuale non sarà
-modificato.  Utilizzando per \param{flag} un valore nullo l'attributo verrà
-modificato se è già presente, o creato se non c'è.
+Le tre funzioni prendono come primo argomento un valore adeguato al loro scopo
+(un \textit{pathname} le prime due, un file descriptor la terza), usato in
+maniera del tutto identica a quanto visto in precedenza per le analoghe che
+leggono gli attributi estesi.
+
+Il secondo argomento, \param{name}, deve indicare, anche in questo caso con
+gli stessi criteri appena visti per le analoghe \func{getxattr},
+\func{lgetxattr} e \func{fgetxattr}, il nome (completo di suffisso)
+dell'attributo su cui si vuole operare.  Il valore che verrà assegnato
+all'attributo dovrà essere preparato nel buffer puntato da \param{value}, e la
+sua dimensione totale (in byte) dovrà essere indicata dall'argomento
+\param{size}.
+
+Infine l'argomento \param{flag} consente di controllare le modalità di
+sovrascrittura dell'attributo esteso, esso può prendere due valori: con
+\constd{XATTR\_REPLACE} si richiede che l'attributo esista, nel qual caso
+verrà sovrascritto ed altrimenti si avrà errore; con \constd{XATTR\_CREATE} si
+richiede che l'attributo non esista, nel qual caso verrà creato, altrimenti si
+avrà errore ed il valore attuale non sarà modificato.  Utilizzando per
+\param{flag} un valore nullo l'attributo verrà 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 di sistema \funcd{listxattr},
-\funcd{llistxattr} e \funcd{flistxattr} i cui prototipi sono:
+estesi presenti su un file, ma sarebbe altrettanto utile poter sapere quali
+sono questi attributi; per questo sono disponibili le ulteriori tre funzioni
+di sistema \funcd{listxattr}, \funcd{llistxattr} e \funcd{flistxattr} i cui
+prototipi sono:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -5116,7 +5332,7 @@ un ultimo gruppo di funzioni di sistema: \funcd{removexattr},
 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
+rimuovere deve essere anche in 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.
@@ -5135,7 +5351,7 @@ estesi.
 Il modello classico dei permessi di Unix, per quanto funzionale ed efficiente,
 è comunque piuttosto limitato e per quanto possa aver coperto per lunghi anni
 le esigenze più comuni con un meccanismo semplice e potente, non è in grado di
-rispondere in maniera adeguata a situazioni che richiedono una gestione
+rispondere in maniera adeguata a situazioni che richiedono una gestione più
 complessa dei permessi di accesso.\footnote{già un requisito come quello di
   dare accesso in scrittura ad alcune persone ed in sola lettura ad altre non
   si può soddisfare in maniera semplice.}
@@ -5157,12 +5373,11 @@ 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, 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
-tramite una libreria, \texttt{libacl} che nasconde i dettagli implementativi
-delle ACL e presenta ai programmi una interfaccia che fa riferimento allo
-standard POSIX 1003.1e.
+scelto di realizzare le ACL attraverso l'uso degli \textit{Extended
+  Attributes} (appena trattati in sez.~\ref{sec:file_xattr}), e fornire tutte
+le relative funzioni di gestione tramite una libreria, \texttt{libacl} che
+nasconde i dettagli implementativi delle ACL e presenta ai programmi una
+interfaccia che fa riferimento allo standard POSIX 1003.1e.
 
 Anche in questo caso le funzioni di questa libreria non fanno parte della
 \acr{glibc} e devono essere installate a parte;\footnote{la versione corrente
@@ -5173,22 +5388,25 @@ indicare esplicitamente l'uso della libreria \texttt{libacl} invocando il
 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.
+  comuni, con l'eccezione di NFS per il quale esiste però il supporto per le
+  versioni NFSv2 e NFSv3 del protocollo, con NFSv4 esistono invece delle ACL
+  native che hanno una semantica diversa, su di esse possono mappare le ACL
+  POSIX, ma l'inverso è possibile solo in forma incompleta.} 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
-\textsl{qualificatore},\footnote{deve essere presente soltanto per le voci di
-  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
-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 capacità \itindex{capabilities} \const{CAP\_FOWNER}.
+costituita da un \textsl{tipo}, da un eventuale \textsl{qualificatore} (deve
+essere presente soltanto per le voci di 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 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 capacità
+\const{CAP\_FOWNER}.
 
 \begin{table}[htb]
   \centering
@@ -5198,21 +5416,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
+    \constd{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
+    \constd{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
+    \constd{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
+    \constd{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
+    \constd{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
+    \constd{ACL\_OTHER}    & Voce che contiene i diritti di accesso di chi
                              non corrisponde a nessuna altra voce dell'ACL.\\
     \hline
   \end{tabular}
@@ -5231,7 +5449,7 @@ 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
+Ovviamente ciascuna di queste voci dovrà fare riferimento a un utente o a 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
 presenza di una ed una sola voce di tipo \const{ACL\_MASK}, che negli altri
@@ -5242,28 +5460,26 @@ 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
-processo.
+nella stessa directory. Si ottiene così una sorta di \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
 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
-  ordinari si intende quelli mantenuti \itindex{inode} nell'\textit{inode},
-  che devono restare dato che un filesystem può essere montato senza abilitare
-  le ACL.}
+  ordinari si intende quelli mantenuti 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
+ordinari. 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
@@ -5275,17 +5491,17 @@ 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
-permessi ordinari da esse risultanti vengono automaticamente rimappati anche
-su una ACL di accesso assegnata automaticamente al nuovo file, che contiene
-soltanto le tre corrispondenti voci di tipo \const{ACL\_USER\_OBJ},
-\const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER}.
+\textit{umask} del processo, e la sola differenza è che i permessi ordinari da
+esse risultanti vengono automaticamente rimappati anche su una ACL di accesso
+assegnata automaticamente al nuovo file, che contiene 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, essa diventerà automaticamente anche la ACL di accesso di quest'ultimo,
@@ -5303,12 +5519,12 @@ 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}
+\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}.}
+    precisamente se si devono avere le 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,
@@ -5343,7 +5559,7 @@ quali viene stabilito se il processo ha il diritto di accesso 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
@@ -5353,13 +5569,15 @@ associati al gruppo proprietario del file (vale a dire su
 \const{ACL\_GROUP\_OBJ}).
 
 Per la gestione delle ACL lo standard \textit{POSIX 1003.1e Draft 17} ha
-previsto delle apposite funzioni ed tutta una serie di tipi di dati
-dedicati;\footnote{fino a definire un tipo di dato e delle costanti apposite
-  per identificare i permessi standard di lettura, scrittura ed esecuzione.}
-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
-è:
+previsto delle apposite funzioni ed tutta una serie di tipi di dati dedicati,
+arrivando fino a definire un tipo di dato e delle costanti apposite per
+identificare i permessi standard di lettura, scrittura ed esecuzione.  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 (si ricordi che come per
+tutte le altre per poterla usare occorre invocare il compilatore con l'opzione
+\texttt{-l acl}) è \funcd{acl\_init}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -5379,20 +5597,20 @@ queste funzioni che prendiamo in esame è \funcd{acl\_init}, il cui prototipo
 
 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
+voci. La funzione ritorna un valore di tipo \typed{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à, 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.}
+Si tenga presente che pur essendo \typed{acl\_t} un 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 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} (anche se, 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 +5619,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 +5635,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
@@ -5440,7 +5658,7 @@ con la funzione \funcd{acl\_dup}, il cui prototipo è:
 
 {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:
+  assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] l'argomento \param{acl} non è un puntatore valido
     per una ACL.
@@ -5484,42 +5702,43 @@ 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
 della ACL correntemente associata ad un file, che può essere identificato
 tramite un file descriptor usando \func{acl\_get\_fd} o con un
-\textit{pathname} usando \func{acl\_get\_file}. Nel caso di quest'ultima
-funzione, che può richiedere anche la ACL relativa ad una directory, il
-secondo argomento \param{type} consente di specificare se si vuole ottenere la
-ACL di default o quella di accesso. Questo argomento deve essere di tipo
-\type{acl\_type\_t} e può assumere solo i due valori riportati in
-tab.~\ref{tab:acl_type}.
+\textit{pathname} usando \func{acl\_get\_file}.
+
+Nel caso di quest'ultima funzione, che può richiedere anche la ACL relativa ad
+una directory, il secondo argomento \param{type} consente di specificare se si
+vuole ottenere la ACL di default o quella di accesso. Questo argomento deve
+essere di tipo \typed{acl\_type\_t} e può assumere solo i due valori riportati
+in tab.~\ref{tab:acl_type}.
 
 \begin{table}[htb]
   \centering
@@ -5529,8 +5748,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.\\  
+    \constd{ACL\_TYPE\_ACCESS} & Indica una ACL di accesso.\\
+    \constd{ACL\_TYPE\_DEFAULT}& Indica una ACL di default.\\  
     \hline
   \end{tabular}
   \caption{Le costanti che identificano il tipo di ACL.}
@@ -5545,7 +5764,7 @@ soltanto per una directory, e verrà restituita solo se presente, altrimenti
 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 è:
+testuale con la funzione \funcd{acl\_from\_text}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -5558,9 +5777,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}
@@ -5569,7 +5788,7 @@ La funzione prende come argomento il puntatore ad un buffer dove si è inserita
 la rappresentazione testuale della ACL che si vuole creare, la memoria
 necessaria viene automaticamente allocata ed in caso di successo viene
 restituito come valore di ritorno un oggetto di tipo \type{acl\_t} con il
-contenuto della stessa, che come per le precedenti funzioni, dovrà essere
+contenuto della stessa, che, come per le precedenti funzioni, dovrà essere
 disallocato esplicitamente al termine del suo utilizzo.
 
 La rappresentazione testuale di una ACL è quella usata anche dai comandi
@@ -5582,12 +5801,12 @@ 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.} 
+\texttt{group} ed indica l'utente o il gruppo a cui la voce si riferisce,
+mentre i permessi sono espressi con una tripletta di lettere analoga a quella
+usata per i permessi dei file, 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.
 
 Un possibile esempio di rappresentazione della ACL di un file ordinario a cui,
 oltre ai permessi ordinari, si è aggiunto un altro utente con un accesso in
@@ -5597,18 +5816,18 @@ user::rw-
 group::r--
 other::r--
 user:piccardi:r--
+group:gapil:r--
 \end{Example}
 
 Va precisato che i due tipi \texttt{user} e \texttt{group} sono usati
-rispettivamente per indicare delle voci relative ad utenti e
-gruppi,\footnote{cioè per voci di tipo \const{ACL\_USER\_OBJ} e
-  \const{ACL\_USER} per \texttt{user} e \const{ACL\_GROUP\_OBJ} e
-  \const{ACL\_GROUP} per \texttt{group}.} applicate sia a quelli proprietari
-del file che a quelli generici; quelle dei proprietari si riconoscono per
-l'assenza di un qualificatore, ed in genere si scrivono per prima delle altre.
-Il significato delle voci di tipo \texttt{mask} e \texttt{mark} è evidente. In
-questa forma si possono anche inserire dei commenti precedendoli con il
-carattere ``\texttt{\#}''.
+rispettivamente per indicare delle voci relative ad utenti e gruppi (cioè per
+voci di tipo \const{ACL\_USER\_OBJ} e \const{ACL\_USER} per \texttt{user} e
+\const{ACL\_GROUP\_OBJ} e \const{ACL\_GROUP} per \texttt{group}) applicate sia
+a quelli proprietari del file che a quelli generici. Quelle dei proprietari si
+riconoscono per l'assenza di un qualificatore, ed in genere si scrivono per
+prima delle altre.  Il significato delle voci di tipo \texttt{mask} e
+\texttt{mark} è evidente. Usando questa forma estesa si possono anche inserire
+dei commenti nel testo precedendoli con il carattere ``\texttt{\#}''.
 
 La forma breve prevede invece la scrittura delle singole voci su una riga,
 separate da virgole; come specificatori del tipo di voce si possono usare le
@@ -5623,7 +5842,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,29 +5850,30 @@ 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{EINVAL}] o \param{acl} non è un puntatore ad una ACL o la ACL
+    che esso indica non è valida o non può esser tradotta in forma testuale.
   \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{funcproto}
 
-La funzione restituisce il puntatore ad una stringa terminata da NUL
-contenente la rappresentazione in forma estesa della ACL passata come
+La funzione restituisce il puntatore ad una stringa, terminata da un NUL,
+contenente la rappresentazione testuale 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 (come \itindex{value~result~argument}
-\textit{value result argument}) la dimensione della stringa con la
-rappresentazione testuale, non comprendente il carattere nullo finale.
+essere liberata, quando non più necessaria, con \func{acl\_free}.  Se
+nell'argomento \param{len\_p} si passa come valore il puntatore ad una
+variabile intera, in questa verrà restituita (come \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 +5882,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}
 
@@ -5674,7 +5894,7 @@ singole voci; se l'argomento \param{prefix} non è nullo la stringa da esso
 indicata viene utilizzata come prefisso per le singole voci. 
 
 L'ultimo argomento, \param{options}, consente di controllare la modalità con
-cui viene generata la rappresentazione testuale. Un valore nullo fa si che
+cui viene generata la rappresentazione testuale. Un valore nullo fa sì che
 vengano usati gli identificatori standard \texttt{user}, \texttt{group},
 \texttt{other} e \texttt{mask} con i nomi di utenti e gruppi risolti rispetto
 ai loro valori numerici. Altrimenti si può specificare un valore in forma di
@@ -5689,23 +5909,24 @@ tab.~\ref{tab:acl_to_text_options}.
     \textbf{Tipo} & \textbf{Descrizione} \\
     \hline
     \hline
-    \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
+    \constd{TEXT\_ABBREVIATE}    & Stampa le voci in forma abbreviata.\\
+    \constd{TEXT\_NUMERIC\_IDS}  & Non effettua la risoluzione di
+                                   \ids{UID} e \ids{GID} lasciando i valori
+                                   numerici.\\
+    \constd{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
+    \constd{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
+    \constd{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 +5973,11 @@ 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 del buffer necessaria per potervi
+memorizzare una ACL questo dovrà potrà essere allocato direttamente con
+\func{malloc}, ed a questo punto vi si potrà salvare la rappresentazione
+binaria della precedente ACL utilizzando la funzione \funcd{acl\_copy\_ext},
+il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -5767,21 +5990,21 @@ potrà poi ottenere con la funzione \funcd{acl\_copy\_ext}, il cui prototipo è:
   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{EINVAL}] la ACL indicata da \param{acl} non è valida, o
+    \param{acl} non è un puntatore ad una ACL o \param{size} è negativo o
+    nullo.
   \item[\errcode{ERANGE}] il valore di \param{size} è più piccolo della
-    dimensione della rappresentazione della ACL.
+    dimensione della rappresentazione binaria della ACL.
   \end{errlist}
 }  
 \end{funcproto}
 
 La funzione scriverà la rappresentazione binaria della ACL indicata da
-\param{acl} sul buffer di dimensione \param{size}
-all'indirizzo \param{buf\_p}, restituendo la dimensione della stessa come
-valore di ritorno. Qualora la dimensione della rappresentazione ecceda il
-valore di \param{size} la funzione fallirà con un errore di
-\errcode{ERANGE}. La funzione non ha nessun effetto sulla ACL indicata
-da \param{acl}.
+\param{acl} sul buffer di dimensione \param{size} all'indirizzo
+\param{buf\_p}, restituendo la dimensione della stessa come valore di
+ritorno. Qualora la dimensione della rappresentazione ecceda il valore di
+\param{size} la funzione fallirà con un errore di \errcode{ERANGE}. La
+funzione non ha nessun effetto sulla ACL indicata da \param{acl}.
 
 Viceversa se si vuole ripristinare una ACL a partire da una rappresentazione
 binaria si potrà usare la funzione \funcd{acl\_copy\_int}, il cui prototipo è:
@@ -5811,76 +6034,56 @@ essere disallocato esplicitamente al termine del suo utilizzo.
 
 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 è:
+funzioni: \funcd{acl\_set\_file}, che opera sia su file che su directory
+usando un \textit{pathname}, e \funcd{acl\_set\_file} che opera solo su file
+usando un file descriptor; i rispettivi prototipi sono:
 
 \begin{funcproto}{
-\fhead{sys/types.}
+\fhead{sys/types.h}
 \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.} 
+\fdecl{int acl\_set\_fd(int fd, acl\_t acl)}
+\fdesc{Imposta una ACL su un file descriptor.} 
 }
 
-{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{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 un valore non corretto.
+    ha un valore non corretto per \func{acl\_set\_file} o o ha più voci di
+    quante se ne possono assegnare al file per \func{acl\_set\_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{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR},
-  \errval{EPERM}, \errval{EROFS} nel loro significato generico.}
+  ed inoltre nel loro significato generico \errval{EPERM}, \errval{EROFS} per
+  entrambe, \errval{EBADF} per \func{acl\_set\_fd}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOTDIR} per \func{acl\_set\_file}.}
 \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
-con \param{type} si indica il tipo di ACL utilizzando le costanti di
-tab.~\ref{tab:acl_type}, ma si tenga presente che le ACL di default possono
-essere solo impostate qualora \param{path} indichi una directory. Inoltre
-perché la funzione abbia successo la ACL dovrà essere valida, e contenere
-tutti le voci necessarie, unica eccezione è quella in cui si specifica una ACL
-vuota per cancellare la ACL di default associata a
-\param{path}.\footnote{questo però è una estensione della implementazione delle
-  ACL di Linux, la bozza di standard POSIX.1e prevedeva l'uso della apposita
-  funzione \funcd{acl\_delete\_def\_file}, che prende come unico argomento il
-  \textit{pathname} della directory di cui si vuole cancellare l'ACL di
-  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{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.} 
-}
-
-{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 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{EPERM}, \errval{EROFS} nel loro
-  significato generico.
-}
-\end{funcproto}
-
-La funzione è del tutto è analoga a \funcd{acl\_set\_file} ma opera
-esclusivamente sui file identificati tramite un file descriptor. Non dovendo
-avere a che fare con directory (e con la conseguente possibilità di avere una
-ACL di default) la funzione non necessita che si specifichi il tipo di ACL,
-che sarà sempre di accesso, e prende come unico argomento, a parte il file
+Con \func{acl\_set\_file} si assegna la ACL contenuta in \param{acl} al file o
+alla directory indicate da \param{path}, con \param{type} che indica il tipo
+di ACL con le costanti di tab.~\ref{tab:acl_type}; si tenga presente però che
+le ACL di default possono essere solo impostate qualora \param{path} indichi
+una directory. Inoltre perché la funzione abbia successo la ACL dovrà essere
+valida, e contenere tutti le voci necessarie, con l'eccezione si specifica una
+ACL vuota per cancellare la ACL di default associata a \param{path}, valida
+solo in caso di directory.\footnote{questo però è una estensione della
+  implementazione delle ACL di Linux, la bozza di standard POSIX.1e prevedeva
+  l'uso della apposita funzione \funcd{acl\_delete\_def\_file}, che prende
+  come unico argomento il \textit{pathname} della directory di cui si vuole
+  cancellare l'ACL di default, per i dettagli si ricorra alla pagina di
+  manuale.}
+
+La seconda funzione, \func{acl\_set\_fd}, è del tutto è analoga alla prima, ma
+non dovendo avere a che fare con directory (e la conseguente possibilità di
+avere una ACL di default) non necessita che si specifichi il tipo di ACL, che
+sarà sempre di accesso, e prende come unico argomento, a parte il file
 descriptor, la ACL da impostare.
 
 Le funzioni viste finora operano a livello di una intera ACL, eseguendo in una
@@ -5890,83 +6093,135 @@ 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 pagine di
+descrizione sommaria; chi fosse interessato p 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
+opportuni puntatori di tipo \typed{acl\_entry\_t}, che possono essere ottenuti
 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 \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
+\begin{figure}[!htb]
+  \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}
+
+Una volta ottenuti detti puntatori si potrà operare sui contenuti delle
+singole 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 corrispondenti
 \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 \funcm{acl\_copy\_entry} o eliminare una voce da una ACL con
-\funcm{acl\_delete\_entry}.
+\funcm{acl\_set\_permset} si potranno impostare i valori; in entrambi i casi
+vengono utilizzati tipi di dato ad hoc, descritti nelle pagine di manuale. Si
+possono poi copiare i valori di una voce da una ACL ad un altra con
+\funcm{acl\_copy\_entry} o eliminare una voce da una ACL con
+\funcm{acl\_delete\_entry} e verificarne la validità prima di usarla con
+\funcm{acl\_valid} o \funcm{acl\_check}.
 
 \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.
+
+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. 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
-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
+\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 essa deve essere attivata esplicitamente.\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.} 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 delle quote o sugli utenti o
 sui gruppi o su entrambi.
 
+Dal kernel 4.1, ed inizialmente solo per il filesystem XFS, sono diventate
+disponibili un terzo tipo di quote, dette \textit{project quota}, che
+consentono di applicare delle quote ad un ``\textsl{progetto}'', identificato
+come ramo di albero sotto una directory, per il quale possono essere imposti
+dei limiti (di nuovo in termini di spazio disco o \textit{inode}) per i file
+che ne fanno parte. Si può così porre dei limiti sul contenuto di un ramo di
+albero.
+
 Il meccanismo prevede che per ciascun filesystem che supporta le quote disco
-(i vari \textit{extN}, \textit{btrfs}, \textit{XFS}, \textit{JFS},
-\textit{ReiserFS}) il kernel provveda sia a mantenere aggiornati i dati
-relativi al consumo delle risorse da parte di utenti e/o gruppi che a far
+(i vari \acr{extN}, \acr{Btrfs}, \acr{XFS}, \acr{JFS}, \acr{ReiserFS}) il
+kernel provveda sia a mantenere aggiornati i dati relativi al consumo delle
+risorse da parte degli utenti e dei gruppi (e del progetto), che a far
 rispettare i limiti imposti dal sistema, con la generazione di un errore di
-\errval{EDQUOT} per tutte le operazioni sui file che porterebbero ad un
+\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 (uno per le quote utente e l'altro per le quote gruppo) nella
-directory radice del filesystem su cui si sono attivate le quote;\footnote{la
-  cosa vale per tutti i filesystem tranne \textit{XFS} che mantiene i dati
-  internamente.} con la versione 2 del supporto delle quote, l'unica rimasta
-in uso, questi file sono \texttt{aquota.user} e \texttt{aquota.group}, in
-precedenza erano \texttt{quota.user} e \texttt{quota.group}. 
-
-Dato che i file vengono aggiornati soltanto se il filesystem è stato montato
-con il supporto delle quote, se si abilita questo in un secondo tempo, o se si
-eseguono operazioni sul filesystem senza averlo abilitato, i dati contenuti
-possono non corrispondere esattamente allo stato corrente del consumo delle
-risorse. Per questo in genere prima di montare in scrittura un filesystem su
-cui sono abilitate le quote in genere viene utilizzato il comando
-\cmd{quotacheck} per verificare e aggiornare i dati.
-
-Le restrizioni sul consumo delle risorse prevedono due limiti, il primo viene
-detto \textit{soft limit} e può essere superato per brevi periodi di tempo, il
-secondo viene detto \textit{hard limit} non può mai essere superato. Il
-periodo di tempo per cui è possibile superare il \textit{soft limit} è detto
-``\textsl{periodo di grazia}'' (\textit{grace period}), passato questo tempo
-il passaggio del \textit{soft limit} viene trattato allo stesso modo
-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.
+riservati nella directory radice del filesystem su cui si sono attivate le
+quote, uno per le quote utente e l'altro per le quote gruppo.\footnote{la cosa
+  vale per tutti i filesystem tranne \textit{XFS} che mantiene i dati
+  internamente, compresi quelli per le \textit{project quota}, che pertanto,
+  essendo questo l'unico filesystem che le supporta, non hanno un file ad esse
+  riservato.} Con la versione 2 del supporto delle quote, che da anni è
+l'unica rimasta in uso, questi file sono \texttt{aquota.user} e
+\texttt{aquota.group}, in precedenza erano \texttt{quota.user} e
+\texttt{quota.group}.
+
+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 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 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}''
+(\textit{grace period}), che si attiva non appena si supera la quota da esso
+indicata. Se si continua a restare al di sopra del \textit{soft limit} una
+volta scaduto il \textit{grace period} questo verrà trattato allo stesso modo
+dell'\textit{hard limit} e si avrà l'emissione immediata di un errore.
+
+Si tenga presente infine che entrambi i tipi di limiti (\textit{soft limit} e
+\textit{hard limit}) possono essere disposti separatamente su entrambe le
+risorse di un filesystem, essi cioè possono essere presenti in maniera
+indipendente sia sullo spazio disco, con un massimo per il numero di blocchi,
+che sui file, con un massimo per il numero di \textit{inode}.
 
 La funzione di sistema che consente di controllare tutti i vari aspetti della
 gestione delle quote è \funcd{quotactl}, ed il suo prototipo è:
@@ -5982,16 +6237,19 @@ gestione delle quote è \funcd{quotactl}, ed il suo prototipo è:
   caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EACCES}] si è richiesto \const{Q\_QUOTAON}, ma il file delle
-    quote indicato da \param{addr} non esiste o non è un file ordinario.
+    quote indicato da \param{addr} esiste ma non è un file ordinario o no sta
+    su \param{dev}.
   \item[\errcode{EBUSY}] si è richiesto \const{Q\_QUOTAON}, ma le quote sono
     già attive.
+  \item[\errcode{EFAULT}] \param{addr} o \param{dev} non sono un puntatori
+    validi. 
   \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{ENODEV}] \param{dev} non corrisponde ad un
-    \itindex{mount~point} \textit{mount point} attivo.
+  \item[\errcode{ENODEV}] \param{dev} non corrisponde ad un \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.
@@ -6000,41 +6258,48 @@ gestione delle quote è \funcd{quotactl}, ed il suo prototipo è:
     \const{Q\_SETQUOTA}, \const{Q\_SETUSE}, \const{Q\_SETQLIM} per un
     filesystem senza quote attivate.
   \end{errlist}
-  ed inoltre \errval{EFAULT} e nel suo significato generico.
 }
 \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
-nome del file di dispositivo nell'argomento \param{dev}. Per le operazioni che
-lo richiedono inoltre si dovrà indicare con l'argomento \param{id} l'utente o
-il gruppo (specificati rispettivamente per \ids{UID} e \ids{GID}) su cui si
-vuole operare. Alcune operazioni usano l'argomento \param{addr} per indicare
-un indirizzo ad un area di memoria il cui utilizzo dipende dall'operazione
+La funzione richiede che il filesystem sul quale si vuole operare, che deve
+essere specificato con il nome del relativo file di dispositivo nell'argomento
+\param{dev}, sia montato con il supporto delle quote abilitato. Per le
+operazioni che lo richiedono inoltre si dovrà indicare con l'argomento
+\param{id} l'utente o il gruppo o il progetto (specificati rispettivamente per
+\ids{UID}, \ids{GID} o identificativo) su cui si vuole operare,\footnote{nel
+  caso di \textit{project quota} gli identificativi vengono associati alla
+  directory base del progetto nel file \file{/etc/projects}, ed impostati con
+  \cmd{xfs\_quota}, l'argomento è di natura sistemistica e va al di là dello
+  scopo di questo testo.} o altri dati relativi all'operazione. Alcune
+operazioni più complesse usano infine l'argomento \param{addr} per indicare un
+indirizzo ad un area di memoria il cui utilizzo dipende dall'operazione
 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}:
+La funzione prevede la possibilità di eseguire una serie operazioni sulle
+quote molto diverse fra loro, la scelta viene effettuata tramite il primo
+argomento, \param{cmd}, che però oltre all'operazione indica anche a quale
+tipo di quota (utente o gruppo) l'operazione deve applicarsi. Per questo il
+valore di questo argomento viene costruito con l'ausilio della di una apposita
+macro \macro{QCMD}:
 
 {\centering
 \vspace{3pt}
 \begin{funcbox}{
 \fhead{sys/quota.h}
-\fdecl{int \macro{QCMD}(subcmd,type)}
+\fdecl{int \macrod{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
-\const{GRPQUOTA}.
-
+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 o alle quote progetto. Questo viene indicato dall'argomento
+\param{type} che deve essere sempre definito ed assegnato ad uno fra i valori
+\const{USRQUOTA}, \const{GRPQUOTA} e \const{PRJQUOTA}.
 
 \begin{table}[htb]
   \centering
@@ -6044,7 +6309,7 @@ caso \param{type} deve essere rispettivamente \const{USRQUOTA} o
     \textbf{Comando} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{Q\_QUOTAON}  & Attiva l'applicazione delle quote disco per il
+    \constd{Q\_QUOTAON} & Attiva l'applicazione delle quote disco per il
                           filesystem indicato da \param{dev}, si deve passare
                           in \param{addr} il \textit{pathname} al file che
                           mantiene le quote, che deve esistere, e \param{id}
@@ -6052,11 +6317,11 @@ caso \param{type} deve essere rispettivamente \const{USRQUOTA} o
                           valori di tab.~\ref{tab:quotactl_id_format};
                           l'operazione richiede i privilegi di
                           amministratore.\\
-    \const{Q\_QUOTAOFF} & Disattiva l'applicazione delle quote disco per il
+    \constd{Q\_QUOTAOFF}& Disattiva l'applicazione delle quote disco per il
                           filesystem indicato da \param{dev}, \param{id}
                           e \param{addr} vengono ignorati; l'operazione
                           richiede i privilegi di amministratore.\\  
-    \const{Q\_GETQUOTA} & Legge i limiti ed i valori correnti delle quote nel
+    \constd{Q\_GETQUOTA}& Legge i limiti ed i valori correnti delle quote nel
                           filesystem indicato da \param{dev} per l'utente o
                           il gruppo specificato da \param{id}; si devono avere
                           i privilegi di amministratore per leggere i dati
@@ -6064,33 +6329,33 @@ caso \param{type} deve essere rispettivamente \const{USRQUOTA} o
                           parte, il risultato viene restituito in una struttura
                           \struct{dqblk} all'indirizzo indicato
                           da \param{addr}.\\
-    \const{Q\_SETQUOTA} & Imposta i limiti per le quote nel filesystem
+    \constd{Q\_SETQUOTA}& Imposta i limiti per le quote nel filesystem
                           indicato da \param{dev} per l'utente o il gruppo
                           specificato da \param{id} secondo i valori ottenuti
                           dalla struttura \struct{dqblk} puntata
                           da \param{addr}; l'operazione richiede i privilegi
                           di amministratore.\\ 
-    \const{Q\_GETINFO}  & Legge le informazioni (in sostanza i \textit{grace
+    \constd{Q\_GETINFO} & Legge le informazioni (in sostanza i \textit{grace
                             time}) delle quote del filesystem indicato
                           da \param{dev} sulla struttura \struct{dqinfo} 
                           puntata da \param{addr}, \param{id} viene ignorato.\\
-    \const{Q\_SETINFO}  & Imposta le informazioni delle quote del filesystem
+    \constd{Q\_SETINFO} & Imposta le informazioni delle quote del filesystem
                           indicato da \param{dev} come ottenuti dalla
                           struttura \struct{dqinfo} puntata
                           da \param{addr}, \param{id} viene ignorato;  
                           l'operazione richiede i privilegi di amministratore.\\
-    \const{Q\_GETFMT}   & Richiede il valore identificativo (quello di
+    \constd{Q\_GETFMT}  & Richiede il valore identificativo (quello di
                           tab.~\ref{tab:quotactl_id_format}) per il formato
                           delle quote attualmente in uso sul filesystem
                           indicato da \param{dev}, che sarà memorizzato
                           sul buffer di 4 byte puntato da \param{addr}.\\
-    \const{Q\_SYNC}     & Aggiorna la copia su disco dei dati delle quote del
+    \constd{Q\_SYNC}    & Aggiorna la copia su disco dei dati delle quote del
                           filesystem indicato da \param{dev}; in questo
                           caso \param{dev} può anche essere \val{NULL} nel
                           qual caso verranno aggiornati i dati per tutti i
                           filesystem con quote attive, \param{id}
                           e \param{addr} vengono comunque ignorati.\\ 
-    \const{Q\_GETSTATS} & Ottiene statistiche ed altre informazioni generali 
+    \constd{Q\_GETSTATS}& Ottiene statistiche ed altre informazioni generali 
                           relative al sistema delle quote per il filesystem
                           indicato da \param{dev}, richiede che si
                           passi come argomento \param{addr} l'indirizzo di una
@@ -6107,50 +6372,31 @@ caso \param{type} deve essere rispettivamente \const{USRQUOTA} o
   \label{tab:quotactl_commands}
 \end{table}
 
-
-Le diverse operazioni supportate da \func{quotactl}, da indicare con
-l'argomento \param{subcmd} di \macro{QCMD}, sono riportate in
-tab.~\ref{tab:quotactl_commands}. In generale le operazione di attivazione,
-disattivazione e di modifica dei limiti delle quote sono riservate e
-richiedono i privilegi di amministratore.\footnote{per essere precisi tutte le
-  operazioni indicate come privilegiate in tab.~\ref{tab:quotactl_commands}
-  richiedono la \textit{capability} \const{CAP\_SYS\_ADMIN}.} Inoltre gli
-utenti possono soltanto richiedere i dati relativi alle proprie quote, solo
-l'amministratore può ottenere i dati di tutti.
-
-\begin{table}[htb]
-  \centering
-  \footnotesize
-  \begin{tabular}{|l|p{10cm}|}
-    \hline
-    \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
-                            \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
-                            \ids{UID} e \ids{GID} a 32 bit e limiti fino a
-                            $2^{64}$ byte e $2^{64}$ file.\\
-    \hline
-  \end{tabular}
-  \caption{Valori di identificazione del formato delle quote.} 
-  \label{tab:quotactl_id_format}
-\end{table}
-
-Alcuni dei comandi di tab.~\ref{tab:quotactl_commands} sono alquanto complessi
-e richiedono un approfondimento maggiore, in particolare \const{Q\_GETQUOTA} e
-\const{Q\_SETQUOTA} fanno riferimento ad una specifica struttura
-\struct{dqblk}, la cui definizione è riportata in
+I possibili valori per l'argomento \param{subcmd} di \macro{QCMD} sono
+riportati in tab.~\ref{tab:quotactl_commands}, che illustra brevemente il
+significato delle operazioni associate a ciascuno di essi. In generale le
+operazioni di attivazione, disattivazione e di modifica dei limiti delle quote
+sono riservate e richiedono i privilegi di amministratore.\footnote{per essere
+  precisi tutte le operazioni indicate come privilegiate in
+  tab.~\ref{tab:quotactl_commands} richiedono la capacità
+  \const{CAP\_SYS\_ADMIN}.} Inoltre gli utenti possono soltanto richiedere i
+dati relativi alle proprie quote, solo l'amministratore può ottenere i dati di
+tutti.
+
+
+Alcune delle operazioni di tab.~\ref{tab:quotactl_commands} sono alquanto
+complesse e richiedono un approfondimento maggiore. Le due più rilevanti sono
+probabilmente \const{Q\_GETQUOTA} e \const{Q\_SETQUOTA}, che consentono la
+gestione dei limiti delle quote. Entrambe fanno riferimento ad una specifica
+struttura \struct{dqblk}, la cui definizione è riportata in
 fig.~\ref{fig:dqblk_struct},\footnote{la definizione mostrata è quella usata
   fino dal kernel 2.4.22, non prenderemo in considerazione le versioni
   obsolete.} nella quale vengono inseriti i dati relativi alle quote di un
-singolo utente.
+singolo utente o gruppo.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.95\textwidth}
     \includestruct{listati/dqblk.h}
   \end{minipage} 
   \normalsize 
@@ -6158,16 +6404,26 @@ singolo utente.
   \label{fig:dqblk_struct}
 \end{figure}
 
-La struttura viene usata sia con \const{Q\_GETQUOTA} per ottenere i valori
-correnti dei limiti e dell'occupazione delle risorse, che con
-\const{Q\_SETQUOTA} per effettuare modifiche ai limiti; come si può notare ci
-sono alcuni campi (in sostanza \val{dqb\_curspace}, \val{dqb\_curinodes},
-\val{dqb\_btime}, \val{dqb\_itime}) che hanno senso solo in lettura in quanto
-riportano uno stato non modificabile da \func{quotactl}, come l'uso corrente
-di spazio e \itindex{inode} \textit{inode} o il tempo che resta nel caso si
-sia superato un \textit{soft limit}.
+La struttura \struct{dqblk} viene usata sia con \const{Q\_GETQUOTA} per
+ottenere i valori correnti dei limiti e dell'occupazione delle risorse, che
+con \const{Q\_SETQUOTA} per effettuare modifiche ai limiti. Come si può notare
+ci sono alcuni campi (in sostanza \val{dqb\_curspace}, \val{dqb\_curinodes},
+\val{dqb\_btime}, \val{dqb\_itime}) che hanno senso solo in lettura, in quanto
+riportano uno stato non modificabile da \func{quotactl} come l'uso corrente di
+spazio disco ed \textit{inode}, o il tempo che resta nel caso si sia superato
+un \textit{soft limit}.
 
-\begin{table}[htb]
+Inoltre in caso di modifica di un limite si può voler operare solo su una
+delle risorse (blocchi o \textit{inode}),\footnote{non è possibile modificare
+  soltanto uno dei limiti (\textit{hard} o \textit{soft}) occorre sempre
+  rispecificarli entrambi.} per questo la struttura prevede un campo apposito,
+\val{dqb\_valid}, il cui scopo è quello di indicare quali sono gli altri campi
+che devono essere considerati validi. Questo campo è una maschera binaria che
+deve essere espressa nei termini di OR aritmetico delle apposite costanti di
+tab.~\ref{tab:quotactl_qif_const}, dove si è riportato il significato di
+ciascuna di esse ed i campi a cui fanno riferimento.
+
+\begin{table}[!htb]
   \centering
   \footnotesize
   \begin{tabular}{|l|p{10cm}|}
@@ -6175,71 +6431,85 @@ sia superato un \textit{soft limit}.
     \textbf{Costante} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{QIF\_BLIMITS}& Limiti sui blocchi di 
-                          spazio disco (\val{dqb\_bhardlimit} e
-                          \val{dqb\_bsoftlimit}).\\
-    \const{QIF\_SPACE}  & Uso corrente
-                          dello spazio disco (\val{dqb\_curspace}).\\
-    \const{QIF\_ILIMITS}& Limiti sugli \itindex{inode}  \textit{inode}
-                          (\val{dqb\_ihardlimit} e \val{dqb\_isoftlimit}).\\
-    \const{QIF\_INODES} & Uso corrente
-                          degli \textit{inode} (\val{dqb\_curinodes}).\\
-    \const{QIF\_BTIME}  & Tempo di
-                          sforamento del \textit{soft limit} sul numero di
-                          blocchi (\val{dqb\_btime}).\\
-    \const{QIF\_ITIME}  & Tempo di
-                          sforamento del \textit{soft limit} sul numero di
-                          \itindex{inode} \textit{inode} (\val{dqb\_itime}).\\ 
-    \const{QIF\_LIMITS} & L'insieme di \const{QIF\_BLIMITS} e
-                          \const{QIF\_ILIMITS}.\\
-    \const{QIF\_USAGE}  & L'insieme di \const{QIF\_SPACE} e
-                          \const{QIF\_INODES}.\\
-    \const{QIF\_TIMES}  & L'insieme di \const{QIF\_BTIME} e
-                          \const{QIF\_ITIME}.\\ 
-    \const{QIF\_ALL}    & Tutti i precedenti.\\
+    \constd{QIF\_BLIMITS}& Limiti sui blocchi di spazio disco
+                           (\val{dqb\_bhardlimit} e \val{dqb\_bsoftlimit}).\\
+    \constd{QIF\_SPACE}  & Uso corrente dello spazio disco
+                           (\val{dqb\_curspace}).\\
+    \constd{QIF\_ILIMITS}& Limiti sugli \textit{inode}
+                           (\val{dqb\_ihardlimit} e \val{dqb\_isoftlimit}).\\
+    \constd{QIF\_INODES} & Uso corrente degli \textit{inode}
+                           (\val{dqb\_curinodes}).\\
+    \constd{QIF\_BTIME}  & Tempo di sforamento del \textit{soft limit} sul
+                           numero di blocchi (\val{dqb\_btime}).\\
+    \constd{QIF\_ITIME}  & Tempo di sforamento del \textit{soft limit} sul
+                           numero di \textit{inode} (\val{dqb\_itime}).\\ 
+    \constd{QIF\_LIMITS} & L'insieme di \const{QIF\_BLIMITS} e
+                           \const{QIF\_ILIMITS}.\\
+    \constd{QIF\_USAGE}  & L'insieme di \const{QIF\_SPACE} e
+                           \const{QIF\_INODES}.\\
+    \constd{QIF\_TIMES}  & L'insieme di \const{QIF\_BTIME} e
+                           \const{QIF\_ITIME}.\\ 
+    \constd{QIF\_ALL}    & Tutti i precedenti.\\
     \hline
   \end{tabular}
   \caption{Costanti per il campo \val{dqb\_valid} di \struct{dqblk}.} 
   \label{tab:quotactl_qif_const}
 \end{table}
 
+In lettura con \const{Q\_SETQUOTA} eventuali valori presenti in \struct{dqblk}
+vengono comunque ignorati, al momento la funzione sovrascrive tutti i campi
+che restituisce e li marca come validi in \val{dqb\_valid}. Si possono invece
+usare \const{QIF\_BLIMITS} o \const{QIF\_ILIMITS} per richiedere di impostare
+solo la rispettiva tipologia di limiti con \const{Q\_SETQUOTA}. Si tenga
+presente che il sistema delle quote richiede che l'occupazione di spazio disco
+sia indicata in termini di blocchi e non di byte, dato che la dimensione dei
+blocchi dipende da come si è creato il filesystem potrà essere necessario
+effettuare qualche conversione per avere un valore in byte.\footnote{in genere
+  viene usato un default di 1024 byte per blocco, ma quando si hanno file di
+  dimensioni medie maggiori può convenire usare valori più alti per ottenere
+  prestazioni migliori in conseguenza di un minore frazionamento dei dati e di
+  indici più corti.}
+
+Come accennato la realizzazione delle quote disco ha visto diverse revisioni,
+con modifiche sia del formato delle stesse che dei nomi dei file
+utilizzati. Per questo alcune operazioni di gestione (in particolare
+\const{Q\_QUOTAON} e \const{Q\_GETFMT}) e possono fare riferimento a queste
+versioni, che vengono identificate tramite le costanti di
+tab.~\ref{tab:quotactl_id_format}.
 
-Inoltre in caso di modifica di un limite si può voler operare solo su una
-delle risorse (blocchi o \itindex{inode} \textit{inode});\footnote{non è
-  possibile modificare soltanto uno dei limiti (\textit{hard} o \textit{soft})
-  occorre sempre rispecificarli entrambi.} per questo la struttura prevede un
-campo apposito, \val{dqb\_valid}, il cui scopo è quello di indicare quali sono
-gli altri campi che devono essere considerati validi. Questo campo è una
-maschera binaria che deve essere espressa nei termini di OR aritmetico delle
-apposite costanti di tab.~\ref{tab:quotactl_qif_const}, dove si è riportato il
-significato di ciascuna di esse ed i campi a cui fanno riferimento.
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}{|l|p{10cm}|}
+    \hline
+    \textbf{Identificatore} & \textbf{Descrizione} \\
+    \hline
+    \hline
+    \constd{QFMT\_VFS\_OLD}& Il vecchio (ed obsoleto) formato delle quote.\\
+    \constd{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.\\
+    \constd{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
+  \end{tabular}
+  \caption{Valori di identificazione del formato delle quote.} 
+  \label{tab:quotactl_id_format}
+\end{table}
 
-In lettura con \const{Q\_SETQUOTA} eventuali valori presenti in \struct{dqblk}
-vengono comunque ignorati, al momento la funzione sovrascrive tutti i campi e
-li marca come validi in \val{dqb\_valid}. Si possono invece usare
-\const{QIF\_BLIMITS} o \const{QIF\_ILIMITS} per richiedere di impostare solo
-la rispettiva tipologia di limiti con \const{Q\_SETQUOTA}. Si tenga presente
-che il sistema delle quote richiede che l'occupazione di spazio disco sia
-indicata in termini di blocchi e non di byte; dato che questo dipende da come
-si è creato il filesystem potrà essere necessario effettuare qualche
-controllo.\footnote{in genere viene usato un default di 1024 byte per blocco,
-  ma quando si hanno file di dimensioni medie maggiori può convenire usare
-  valori più alti per ottenere prestazioni migliori in conseguenza di un
-  minore frazionamento dei dati e di indici più corti.}
-
-Altre due operazioni che necessitano di un approfondimento sono
-\const{Q\_GETINFO} e \const{Q\_SETINFO}, che sostanzialmente consentono di
-ottenere i dati relativi alle impostazioni delle altre proprietà delle quote,
-che si riducono poi alla durata del \textit{grace time} per i due tipi di
-limiti. In questo caso queste si proprietà generali sono identiche per tutti
-gli utenti, per cui viene usata una operazione distinta dalle
-precedenti. Anche in questo caso le due operazioni richiedono l'uso di una
-apposita struttura \struct{dqinfo}, la cui definizione è riportata in
-fig.~\ref{fig:dqinfo_struct}.
+Altre due operazioni che necessitano di ulteriori spiegazioni sono
+\const{Q\_GETINFO} e \const{Q\_SETINFO}, che consentono di ottenere i dati
+relativi alle impostazioni delle altre proprietà delle quote, che al momento
+sono solo la durata del \textit{grace time} per i due tipi di limiti. Queste
+sono due proprietà generali identiche per tutti gli utenti (e i gruppi), per
+cui viene usata una operazione distinta dalle precedenti. Anche in questo caso
+le due operazioni richiedono l'uso di una apposita struttura \struct{dqinfo},
+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 
@@ -6261,12 +6531,12 @@ significato di ciascuna di esse ed i campi a cui fanno riferimento.
     \textbf{Costante} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{IIF\_BGRACE}& Il \textit{grace period} per i blocchi
+    \constd{IIF\_BGRACE}& Il \textit{grace period} per i blocchi
                          (\val{dqi\_bgrace}).\\
-    \const{IIF\_IGRACE}& Il \textit{grace period} per gli \textit{inode} 
-                         \itindex{inode} (\val{dqi\_igrace}).\\ 
-    \const{IIF\_FLAGS} & I flag delle quote (\val{dqi\_flags}) (inusato ?).\\
-    \const{IIF\_ALL}   & Tutti i precedenti.\\
+    \constd{IIF\_IGRACE}& Il \textit{grace period} per gli \textit{inode} 
+                         (\val{dqi\_igrace}).\\ 
+    \constd{IIF\_FLAGS} & I flag delle quote (\val{dqi\_flags}) (inusato ?).\\
+    \constd{IIF\_ALL}   & Tutti i precedenti.\\
     \hline
   \end{tabular}
   \caption{Costanti per il campo \val{dqi\_valid} di \struct{dqinfo}.} 
@@ -6316,11 +6586,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
+relativi a uso corrente e limiti sia per i blocchi che per gli
+\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]
@@ -6337,1309 +6607,64 @@ 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}).
-
-
-\subsection{La gestione delle \textit{capabilities}}
-\label{sec:proc_capabilities}
-
-\itindbeg{capabilities} 
-
-Come accennato in sez.~\ref{sec:proc_access_id} l'architettura classica della
-gestione dei privilegi in un sistema unix-like ha il sostanziale problema di
-fornire all'amministratore dei poteri troppo ampi, questo comporta che anche
-quando si siano predisposte delle misure di protezione per in essere in grado
-di difendersi dagli effetti di una eventuale compromissione del
-sistema,\footnote{come montare un filesystem in sola lettura per impedirne
-  modifiche, o marcare un file come immutabile.} una volta che questa sia
-stata effettuata e si siano ottenuti i privilegi di amministratore, queste
-potranno essere comunque rimosse.\footnote{nei casi elencati nella precedente
-  nota si potrà sempre rimontare il sistema in lettura-scrittura, o togliere
-  la marcatura di immutabilità.}
-
-Il problema consiste nel fatto che nell'architettura tradizionale di un
-sistema unix-like i controlli di accesso sono basati su un solo livello di
-separazione: per i processi normali essi sono posti in atto, mentre per i
-processi con i privilegi di amministratore essi non vengono neppure eseguiti;
-per questo motivo non era previsto alcun modo per evitare che un processo con
-diritti di amministratore non potesse eseguire certe operazioni, o per cedere
-definitivamente alcuni privilegi da un certo momento in poi.
-
-Per ovviare a tutto ciò, a partire dai kernel della serie 2.2, è stato
-introdotto un meccanismo, detto \textit{capabilities}, che consentisse di
-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}''.
-
-\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
-singoli file eseguibili, in modo da poter stabilire quali capacità possono
-essere utilizzate quando viene messo in esecuzione uno specifico programma; ma
-il supporto per questa funzionalità, chiamata \textit{file capabilities}, è
-stato introdotto soltanto a partire dal kernel 2.6.24. Fino ad allora doveva
-essere il programma stesso ad eseguire una riduzione esplicita delle sue
-capacità, cosa che ha reso l'uso di questa funzionalità poco diffuso, vista la
-presenza di meccanismi alternativi per ottenere limitazioni delle capacità
-dell'amministratore a livello di sistema operativo, come \index{SELinux}
-SELinux.
-
-Con questo supporto e con le ulteriori modifiche introdotte con il kernel
-2.6.25 il meccanismo delle \textit{capabilities} è stato totalmente
-rivoluzionato, rendendolo più aderente alle intenzioni originali dello
-standard POSIX, rimuovendo il significato che fino ad allora aveva avuto la
-capacità \const{CAP\_SETPCAP} e cambiando le modalità di funzionamento del
-cosiddetto \itindex{capabilities~bounding~set} \textit{capabilities bounding
-  set}. Ulteriori modifiche sono state apportate con il kernel 2.6.26 per
-consentire la rimozione non ripristinabile dei privilegi di
-amministratore. Questo fa sì che il significato ed il comportamento del kernel
-finisca per dipendere dalla versione dello stesso e dal fatto che le nuove
-\textit{file capabilities} siano abilitate o meno. Per capire meglio la
-situazione e cosa è cambiato conviene allora spiegare con maggiori dettagli
-come funziona il meccanismo delle \textit{capabilities}.
-
-Il primo passo per frazionare i privilegi garantiti all'amministratore,
-supportato fin dalla introduzione iniziale del kernel 2.2, è stato quello in
-cui a ciascun processo sono stati associati tre distinti insiemi di
-\textit{capabilities}, denominati rispettivamente \textit{permitted},
-\textit{inheritable} ed \textit{effective}. Questi insiemi vengono mantenuti
-in forma di tre diverse maschere binarie,\footnote{il kernel li mantiene, come
-  i vari identificatori di sez.~\ref{sec:proc_setuid}, all'interno della
-  \struct{task\_struct} di ciascun processo (vedi
-  fig.~\ref{fig:proc_task_struct}), nei tre campi \texttt{cap\_effective},
-  \texttt{cap\_inheritable}, \texttt{cap\_permitted} del tipo
-  \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.
-
-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
-sono mantenuti i diversi insiemi di identificatori di
-sez.~\ref{sec:proc_setuid}; il loro significato, che è rimasto sostanzialmente
-lo stesso anche dopo le modifiche seguite alla introduzione delle
-\textit{file capabilities} è il seguente:
-\begin{basedescript}{\desclabelwidth{2.1cm}\desclabelstyle{\nextlinelabel}}
-\item[\textit{permitted}] l'insieme delle \textit{capabilities}
-  ``\textsl{permesse}'', cioè l'insieme di quelle capacità che un processo
-  \textsl{può} impostare come \textsl{effettive} o come
-  \textsl{ereditabili}. Se un processo cancella una capacità da questo insieme
-  non potrà più riassumerla.\footnote{questo nei casi ordinari, sono
-    previste però una serie di eccezioni, dipendenti anche dal tipo di
-    supporto, che vedremo meglio in seguito dato il notevole intreccio nella
-    casistica.}
-\item[\textit{inheritable}] l'insieme delle \textit{capabilities}
-  ``\textsl{ereditabili}'', cioè di quelle che verranno trasmesse come insieme
-  delle \textsl{permesse} ad un nuovo programma eseguito attraverso una
-  chiamata ad \func{exec}.
-\item[\textit{effective}] l'insieme delle \textit{capabilities}
-  ``\textsl{effettive}'', cioè di quelle che vengono effettivamente usate dal
-  kernel quando deve eseguire il controllo di accesso per le varie operazioni
-  compiute dal processo.
-\label{sec:capabilities_set}
-\end{basedescript}
-
-Con l'introduzione delle \textit{file capabilities} sono stati introdotti
-altri tre insiemi associabili a ciascun file.\footnote{la realizzazione viene
-  eseguita con l'uso di uno specifico attributo esteso,
-  \texttt{security.capability}, la cui modifica è riservata, (come illustrato
-  in sez.~\ref{sec:file_xattr}) ai processi dotato della capacità
-  \const{CAP\_SYS\_ADMIN}.} Le \textit{file capabilities} hanno effetto
-soltanto quando il file che le porta viene eseguito come programma con una
-\func{exec}, e forniscono un meccanismo che consente l'esecuzione dello stesso
-con maggiori privilegi; in sostanza sono una sorta di estensione del
-\acr{suid} bit limitato ai privilegi di amministratore. Anche questi tre
-insiemi sono identificati con gli stessi nomi di quello dei processi, ma il
-loro significato è diverso:
-\begin{basedescript}{\desclabelwidth{2.1cm}\desclabelstyle{\nextlinelabel}}
-\item[\textit{permitted}] (chiamato originariamente \textit{forced}) l'insieme
-  delle capacità che con l'esecuzione del programma verranno aggiunte alle
-  capacità \textsl{permesse} del processo.
-\item[\textit{inheritable}] (chiamato originariamente \textit{allowed})
-  l'insieme delle capacità che con l'esecuzione del programma possono essere
-  ereditate dal processo originario (che cioè non vengono tolte
-  dall'\textit{inheritable set} del processo originale all'esecuzione di
-  \func{exec}).
-\item[\textit{effective}] in questo caso non si tratta di un insieme ma di un
-  unico valore logico; se attivo all'esecuzione del programma tutte le
-  capacità che risulterebbero \textsl{permesse} verranno pure attivate,
-  inserendole automaticamente nelle \textsl{effettive}, se disattivato nessuna
-  capacità verrà attivata (cioè l'\textit{effective set} resterà vuoto).
-\end{basedescript}
-
-\itindbeg{capabilities~bounding~set}
-
-Infine come accennato, esiste un ulteriore insieme, chiamato
-\textit{capabilities bounding set}, il cui scopo è quello di costituire un
-limite alle capacità che possono essere attivate per un programma. Il suo
-funzionamento però è stato notevolmente modificato con l'introduzione delle
-\textit{file capabilities} e si deve pertanto prendere in considerazione una
-casistica assai complessa.
-
-Per i kernel fino al 2.6.25, o se non si attiva il supporto per le
-\textit{file capabilities}, il \textit{capabilities bounding set} è un
-parametro generale di sistema, il cui valore viene riportato nel file
-\sysctlfile{kernel/cap-bound}. Il suo valore iniziale è definito in
-sede di compilazione del kernel, e da sempre ha previsto come default la
-presenza di tutte le \textit{capabilities} eccetto \const{CAP\_SETPCAP}. In
-questa situazione solo il primo processo eseguito nel sistema (quello con
-\textsl{pid} 1, di norma \texttt{/sbin/init}) ha la possibilità di
-modificarlo; ogni processo eseguito successivamente, se dotato dei privilegi
-di amministratore, è in grado soltanto di rimuovere una delle
-\textit{capabilities} già presenti dell'insieme.\footnote{per essere precisi
-  occorreva la capacità \const{CAP\_SYS\_MODULE}.}
-
-In questo caso l'effetto complessivo del \textit{capabilities bounding set} è
-che solo le capacità in esso presenti possono essere trasmesse ad un altro
-programma attraverso una \func{exec}. Questo in sostanza significa che se un
-qualunque programma elimina da esso una capacità, considerato che
-\texttt{init} (almeno nelle versioni ordinarie) non supporta la reimpostazione
-del \textit{bounding set}, questa non sarà più disponibile per nessun processo
-a meno di un riavvio, eliminando così in forma definitiva quella capacità per
-tutti, compreso l'amministratore.\footnote{la qual cosa, visto il default
-  usato per il \textit{capabilities bounding set}, significa anche che
-  \const{CAP\_SETPCAP} non è stata praticamente mai usata nella sua forma
-  originale.}
-
-Con il kernel 2.6.25 e le \textit{file capabilities} il \textit{bounding set}
-è diventato una proprietà di ciascun processo, che viene propagata invariata
-sia attraverso una \func{fork} che una \func{exec}. In questo caso il file
-\sysctlfile{kernel/cap-bound} non esiste e \texttt{init} non ha nessun
-ruolo speciale, inoltre in questo caso all'avvio il valore iniziale prevede la
-presenza di tutte le capacità (compresa \const{CAP\_SETPCAP}). 
-
-Con questo nuovo meccanismo il \textit{bounding set} continua a ricoprire un
-ruolo analogo al precedente nel passaggio attraverso una \func{exec}, come
-limite alle capacità che possono essere aggiunte al processo in quanto
-presenti nel \textit{permitted set} del programma messo in esecuzione, in
-sostanza il nuovo programma eseguito potrà ricevere una capacità presente nel
-suo \textit{permitted set} (quello del file) solo se questa è anche nel
-\textit{bounding set} (del processo). In questo modo si possono rimuovere
-definitivamente certe capacità da un processo, anche qualora questo dovesse
-eseguire un programma privilegiato che prevede di riassegnarle.
-
-Si tenga presente però che in questo caso il \textit{bounding set} blocca
-esclusivamente le capacità indicate nel \textit{permitted set} del programma
-che verrebbero attivate in caso di esecuzione, e non quelle eventualmente già
-presenti nell'\textit{inheritable set} del processo (ad esempio perché
-presenti prima di averle rimosse dal \textit{bounding set}). In questo caso
-eseguendo un programma che abbia anche lui dette capacità nel suo
-\textit{inheritable set} queste verrebbero assegnate.
-
-In questa seconda versione inoltre il \textit{bounding set} costituisce anche
-un limite per le capacità che possono essere aggiunte all'\textit{inheritable
-  set} del processo stesso con \func{capset}, sempre nel senso che queste
-devono essere presenti nel \textit{bounding set} oltre che nel
-\textit{permitted set} del processo. Questo limite vale anche per processi con
-i privilegi di amministratore,\footnote{si tratta sempre di avere la
-  \textit{capability} \const{CAP\_SETPCAP}.} per i quali invece non vale la
-condizione che le \textit{capabilities} da aggiungere nell'\textit{inheritable
-  set} debbano essere presenti nel proprio \textit{permitted set}.\footnote{lo
-  scopo anche in questo caso è ottenere una rimozione definitiva della
-  possibilità di passare una capacità rimossa dal \textit{bounding set}.}
-
-Come si può notare per fare ricorso alle \textit{capabilities} occorre
-comunque farsi carico di una notevole complessità di gestione, aggravata dalla
-presenza di una radicale modifica del loro funzionamento con l'introduzione
-delle \textit{file capabilities}. Considerato che il meccanismo originale era
-incompleto e decisamente problematico nel caso di programmi che non ne
-sapessero tener conto,\footnote{c'è stato un grosso problema di sicurezza con
-  \texttt{sendmail}, riuscendo a rimuovere \const{CAP\_SETGID}
-  dall'\textit{inheritable set} di un processo si ottenne di far fallire
-  \func{setuid} in maniera inaspettata per il programma (che aspettandosi
-  sempre il successo della funzione non ne controllava lo stato di uscita) con
-  la conseguenza di effettuare come amministratore operazioni che altrimenti
-  sarebbero state eseguite, senza poter apportare danni, da utente normale.}
-ci soffermeremo solo sulla implementazione completa presente a partire dal
-kernel 2.6.25, tralasciando ulteriori dettagli riguardo la versione
-precedente.
-
-Riassumendo le regole finora illustrate tutte le \textit{capabilities} vengono
-ereditate senza modifiche attraverso una \func{fork} mentre, indicati con
-\texttt{orig\_*} i valori degli insiemi del processo chiamante, con
-\texttt{file\_*} quelli del file eseguito e con \texttt{bound\_set} il
-\textit{capabilities bounding set}, dopo l'invocazione di \func{exec} il
-processo otterrà dei nuovi insiemi di capacità \texttt{new\_*} secondo la
-formula (espressa in pseudo-codice C) di fig.~\ref{fig:cap_across_exec}; si
-noti come in particolare il \textit{capabilities bounding set} non viene
-comunque modificato e resta lo stesso sia attraverso una \func{fork} che
-attraverso una \func{exec}.
-
-\begin{figure}[!htbp]
-  \footnotesize \centering
-  \begin{minipage}[c]{12cm}
-    \includecodesnip{listati/cap-results.c}
-  \end{minipage}
-  \caption{Espressione della modifica delle \textit{capabilities} attraverso
-    una \func{exec}.}
-  \label{fig:cap_across_exec}
-\end{figure}
-
-\itindend{capabilities~bounding~set}
-
-A queste regole se ne aggiungono delle altre che servono a riprodurre il
-comportamento tradizionale di un sistema unix-like in tutta una serie di
-circostanze. La prima di queste è relativa a quello che avviene quando si
-esegue un file senza \textit{capabilities}; se infatti si considerasse questo
-equivalente al non averne assegnata alcuna, non essendo presenti capacità né
-nel \textit{permitted set} né nell'\textit{inheritable set} del file,
-nell'esecuzione di un qualunque programma l'amministratore perderebbe tutti i
-privilegi originali dal processo.
-
-Per questo motivo se un programma senza \textit{capabilities} assegnate viene
-eseguito da un processo con \ids{UID} reale 0, esso verrà trattato come
-se tanto il \textit{permitted set} che l'\textit{inheritable set} fossero con
-tutte le \textit{capabilities} abilitate, con l'\textit{effective set} attivo,
-col risultato di fornire comunque al processo tutte le capacità presenti nel
-proprio \textit{bounding set}. Lo stesso avviene quando l'eseguibile ha attivo
-il \acr{suid} bit ed appartiene all'amministratore, in entrambi i casi si
-riesce così a riottenere il comportamento classico di un sistema unix-like.
-
-Una seconda circostanza è quella relativa a cosa succede alle
-\textit{capabilities} di un processo nelle possibili transizioni da \ids{UID}
-nullo a \ids{UID} non nullo o viceversa (corrispondenti rispettivamente a
-cedere o riottenere i i privilegi di amministratore) che si possono effettuare
-con le varie funzioni viste in sez.~\ref{sec:proc_setuid}. In questo caso la
-casistica è di nuovo alquanto complessa, considerata anche la presenza dei
-diversi gruppi di identificatori illustrati in tab.~\ref{tab:proc_uid_gid}, si
-avrà allora che:
-\begin{enumerate*}
-\item se si passa da \ids{UID} effettivo nullo a non nullo
-  l'\textit{effective set} del processo viene totalmente azzerato, se
-  viceversa si passa da \ids{UID} effettivo non nullo a nullo il
-  \textit{permitted set} viene copiato nell'\textit{effective set};
-\item se si passa da \textit{file system} \ids{UID} nullo a non nullo verranno
-  cancellate dall'\textit{effective set} del processo tutte le capacità
-  attinenti i file, e cioè \const{CAP\_LINUX\_IMMUTABLE}, \const{CAP\_MKNOD},
-  \const{CAP\_DAC\_OVERRIDE}, \const{CAP\_DAC\_READ\_SEARCH},
-  \const{CAP\_MAC\_OVERRIDE}, \const{CAP\_CHOWN}, \const{CAP\_FSETID} e
-  \const{CAP\_FOWNER} (le prime due a partire dal kernel 2.2.30), nella
-  transizione inversa verranno invece inserite nell'\textit{effective set}
-  quelle capacità della precedente lista che sono presenti nel suo
-  \textit{permitted set}.
-\item se come risultato di una transizione riguardante gli identificativi dei
-  gruppi \textit{real}, \textit{saved} ed \textit{effective} in cui si passa
-  da una situazione in cui uno di questi era nullo ad una in cui sono tutti
-  non nulli,\footnote{in sostanza questo è il caso di quando si chiama
-    \func{setuid} per rimuovere definitivamente i privilegi di amministratore
-    da un processo.} verranno azzerati completamente sia il \textit{permitted
-    set} che l'\textit{effective set}.
-\end{enumerate*}
-\label{sec:capability-uid-transition}
-
-La combinazione di tutte queste regole consente di riprodurre il comportamento
-ordinario di un sistema di tipo Unix tradizionale, ma può risultare
-problematica qualora si voglia passare ad una configurazione di sistema
-totalmente basata sull'applicazione delle \textit{capabilities}; in tal caso
-infatti basta ad esempio eseguire un programma con \acr{suid} bit di proprietà
-dell'amministratore per far riottenere ad un processo tutte le capacità
-presenti nel suo \textit{bounding set}, anche se si era avuta la cura di
-cancellarle dal \textit{permitted set}.
-
-\itindbeg{securebits}
-
-Per questo motivo a partire dal kernel 2.6.26, se le \textit{file
-  capabilities} sono abilitate, ad ogni processo viene stata associata una
-ulteriore maschera binaria, chiamata \textit{securebits flags}, su cui sono
-mantenuti una serie di flag (vedi tab.~\ref{tab:securebits_values}) il cui
-valore consente di modificare queste regole speciali che si applicano ai
-processi con \ids{UID} nullo. La maschera viene sempre mantenuta
-attraverso una \func{fork}, mentre attraverso una \func{exec} viene sempre
-cancellato il flag \const{SECURE\_KEEP\_CAPS}.
-
-\begin{table}[htb]
-  \centering
-  \footnotesize
-  \begin{tabular}{|l|p{10cm}|}
-    \hline
-    \textbf{Flag} & \textbf{Descrizione} \\
-    \hline
-    \hline
-    \const{SECURE\_KEEP\_CAPS}& Il processo non subisce la cancellazione delle
-                                sue \textit{capabilities} quando tutti i suoi
-                                \ids{UID} passano ad un valore non
-                                nullo (regola di compatibilità per il cambio
-                                di \ids{UID} n.~3 del precedente
-                                elenco), sostituisce il precedente uso
-                                dell'operazione \const{PR\_SET\_KEEPCAPS} di
-                                \func{prctl}.\\
-    \const{SECURE\_NO\_SETUID\_FIXUP}&Il processo non subisce le modifiche
-                                delle sue \textit{capabilities} nel passaggio
-                                da nullo a non nullo degli \ids{UID}
-                                dei gruppi \textit{effective} e
-                                \textit{file system} (regole di compatibilità
-                                per il cambio di \ids{UID} nn.~1 e 2 del
-                                precedente elenco).\\
-    \const{SECURE\_NOROOT}    & Il processo non assume nessuna capacità
-                                aggiuntiva quando esegue un programma, anche
-                                se ha \ids{UID} nullo o il programma ha
-                                il \acr{suid} bit attivo ed appartiene
-                                all'amministratore (regola di compatibilità
-                                per l'esecuzione di programmi senza
-                                \textit{capabilities}).\\
-    \hline
-  \end{tabular}
-  \caption{Costanti identificative dei flag che compongono la maschera dei
-    \textit{securebits}.}  
-  \label{tab:securebits_values}
-\end{table}
-
-A ciascuno dei flag di tab.~\ref{tab:securebits_values} è inoltre abbinato un
-corrispondente flag di blocco, identificato da una costante omonima con
-l'estensione \texttt{\_LOCKED}, la cui attivazione è irreversibile ed ha
-l'effetto di rendere permanente l'impostazione corrente del corrispondente
-flag ordinario; in sostanza con \const{SECURE\_KEEP\_CAPS\_LOCKED} si rende
-non più modificabile \const{SECURE\_KEEP\_CAPS}, ed analogamente avviene con
-\const{SECURE\_NO\_SETUID\_FIXUP\_LOCKED} per
-\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
-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
-quest'ultima sono comunque necessari i privilegi di amministratore ed in
-particolare la capacità \const{CAP\_SETPCAP}. Prima dell'introduzione dei
-\textit{securebits} era comunque possibile ottenere lo stesso effetto di
-\const{SECURE\_KEEP\_CAPS} attraverso l'uso di un'altra operazione di
-\func{prctl}, \const{PR\_SET\_KEEPCAPS}.
-
-\itindend{securebits}
-
-Oltre alla gestione dei \textit{securebits} la nuova versione delle
-\textit{file capabilities} prevede l'uso di \func{prctl} anche per la gestione
-del \textit{capabilities bounding set}, attraverso altre due operazioni
-dedicate, \const{PR\_CAPBSET\_READ} per controllarne il valore e
-\const{PR\_CAPBSET\_DROP} per modificarlo; quest'ultima di nuovo è una
-operazione privilegiata che richiede la capacità \const{CAP\_SETPCAP} e che,
-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
-
-% TODO capire cosa cambia con i patch vari, vedi
-% http://lwn.net/Articles/280279/  
-% http://lwn.net/Articles/256519/
-% http://lwn.net/Articles/211883/
-
-
-Un elenco delle delle \textit{capabilities} disponibili su Linux, con una
-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
-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
-\textit{capabilities} attengono a singole funzionalità e sono molto
-specializzate, mentre altre hanno un campo di applicazione molto vasto, che è
-opportuno dettagliare maggiormente.
-
-\begin{table}[!h!btp]
-  \centering
-  \footnotesize
-  \begin{tabular}{|l|p{10.5cm}|}
-    \hline
-    \textbf{Capacità}&\textbf{Descrizione}\\
-    \hline
-    \hline
-%
-% POSIX-draft defined capabilities.
-%
-    \const{CAP\_AUDIT\_CONTROL}& La capacità di abilitare e disabilitare il
-                              controllo dell'auditing (dal kernel 2.6.11).\\ 
-    \const{CAP\_AUDIT\_WRITE}&La capacità di scrivere dati nel giornale di
-                              auditing del kernel (dal kernel 2.6.11).\\ 
-    % TODO verificare questa roba dell'auditing
-    \const{CAP\_CHOWN}      & La capacità di cambiare proprietario e gruppo
-                              proprietario di un file (vedi
-                              sez.~\ref{sec:file_ownership_management}).\\
-    \const{CAP\_DAC\_OVERRIDE}& La capacità di evitare il controllo dei
-                              permessi di lettura, scrittura ed esecuzione dei
-                              file,\footnotemark (vedi
-                              sez.~\ref{sec:file_access_control}).\\
-    \const{CAP\_DAC\_READ\_SEARCH}& La capacità di evitare il controllo dei
-                              permessi di lettura ed esecuzione per
-                              le directory (vedi
-                              sez.~\ref{sec:file_access_control}).\\
-    \const{CAP\_FOWNER}     & La capacità di evitare il controllo della
-                              proprietà di un file per tutte
-                              le operazioni privilegiate non coperte dalle
-                              precedenti \const{CAP\_DAC\_OVERRIDE} e
-                              \const{CAP\_DAC\_READ\_SEARCH}.\\
-    \const{CAP\_FSETID}     & La capacità di evitare la cancellazione
-                              automatica dei bit \itindex{suid~bit} \acr{suid}
-                              e \itindex{sgid~bit} \acr{sgid} quando un file
-                              per i quali sono impostati viene modificato da
-                              un processo senza questa capacità e la capacità
-                              di impostare il bit \acr{sgid} su un file anche
-                              quando questo è relativo ad un gruppo cui non si
-                              appartiene (vedi
-                              sez.~\ref{sec:file_perm_management}).\\ 
-    \const{CAP\_KILL}       & La capacità di mandare segnali a qualunque
-                              processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
-    \const{CAP\_SETFCAP}    & La capacità di impostare le
-                              \textit{capabilities} di un file (dal kernel
-                              2.6.24).\\  
-    \const{CAP\_SETGID}     & La capacità di manipolare i group ID dei
-                              processi, sia il principale che i supplementari,
-                              (vedi sez.~\ref{sec:proc_setgroups}) che quelli
-                              trasmessi tramite i socket \textit{unix domain}
-                              (vedi sez.~\ref{sec:unix_socket}).\\
-    \const{CAP\_SETUID}     & La capacità di manipolare gli user ID del
-                              processo (vedi sez.~\ref{sec:proc_setuid}) e di
-                              trasmettere un user ID arbitrario nel passaggio
-                              delle credenziali coi socket \textit{unix
-                                domain} (vedi sez.~\ref{sec:unix_socket}).\\ 
-%
-% Linux specific capabilities
-%
-\hline
-    \const{CAP\_IPC\_LOCK}  & La capacità di effettuare il \textit{memory
-                              locking} \itindex{memory~locking} con le
-                              funzioni \func{mlock}, \func{mlockall},
-                              \func{shmctl}, \func{mmap} (vedi
-                              sez.~\ref{sec:proc_mem_lock} e 
-                              sez.~\ref{sec:file_memory_map}). \\  
-    \const{CAP\_IPC\_OWNER} & La capacità di evitare il controllo dei permessi
-                              per le operazioni sugli oggetti di
-                              intercomunicazione fra processi (vedi
-                              sez.~\ref{sec:ipc_sysv}).\\  
-    \const{CAP\_LEASE}      & La capacità di creare dei \textit{file lease}
-                              \itindex{file~lease} (vedi
-                              sez.~\ref{sec:file_asyncronous_lease})
-                              pur non essendo proprietari del file (dal kernel
-                              2.4).\\ 
-    \const{CAP\_LINUX\_IMMUTABLE}& La capacità di 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}      & La capacità di 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} & La capacità di eseguire alcune operazioni
-                              privilegiate sulla rete.\\
-    \const{CAP\_NET\_BIND\_SERVICE}& La capacità di porsi in ascolto
-                              su porte riservate (vedi
-                              sez.~\ref{sec:TCP_func_bind}).\\ 
-    \const{CAP\_NET\_BROADCAST}& La capacità di consentire l'uso di socket in
-                              \itindex{broadcast} \textit{broadcast} e
-                              \itindex{multicast} \textit{multicast}.\\ 
-    \const{CAP\_NET\_RAW}   & La capacità di usare socket \texttt{RAW} e
-                              \texttt{PACKET} (vedi sez.~\ref{sec:sock_type}).\\
-    \const{CAP\_SETPCAP}    & La capacità di modifiche privilegiate alle
-                              \textit{capabilities}.\\   
-    \const{CAP\_SYS\_ADMIN} & La capacità di eseguire una serie di compiti
-                              amministrativi.\\
-    \const{CAP\_SYS\_BOOT}  & La capacità di fare eseguire un riavvio del
-                              sistema (vedi sez.~\ref{sec:sys_reboot}).\\
-    \const{CAP\_SYS\_CHROOT}& La capacità di eseguire la funzione
-                              \func{chroot} (vedi sez.~\ref{sec:file_chroot}).\\
-    \const{CAP\_MAC\_ADMIN} & La capacità amministrare il \textit{Mandatory
-                               Access Control} di Smack (dal kernel 2.6.25).\\  
-    \const{CAP\_MAC\_OVERRIDE}& La capacità evitare il  \textit{Mandatory
-                               Access Control} di Smack (dal kernel 2.6.25).\\  
-    \const{CAP\_SYS\_MODULE}& La capacità di caricare e rimuovere moduli del
-                              kernel.\\ 
-    \const{CAP\_SYS\_NICE}  & La capacità di modificare le varie priorità dei
-                              processi (vedi sez.~\ref{sec:proc_priority}).\\
-    \const{CAP\_SYS\_PACCT} & La capacità di 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} & La capacità di operare sulle porte
-                              di I/O con \func{ioperm} e \func{iopl} (vedi
-                              sez.~\ref{sec:process_io_port}).\\
-    \const{CAP\_SYS\_RESOURCE}& La capacità di superare le varie limitazioni
-                              sulle risorse.\\ 
-    \const{CAP\_SYS\_TIME}  & La capacità di modificare il tempo di sistema
-                              (vedi sez.~\ref{sec:sys_time}).\\ 
-    \const{CAP\_SYS\_TTY\_CONFIG}& La capacità di simulare un \textit{hangup}
-                              della console, con la funzione
-                              \func{vhangup}.\\
-    \const{CAP\_SYSLOG}     & La capacità di gestire il buffer dei messaggi
-                              del kernel, (vedi sez.~\ref{sec:sess_daemon}),
-                              introdotta dal kernel 2.6.38 come capacità
-                              separata da \const{CAP\_SYS\_ADMIN}.\\
-    \const{CAP\_WAKE\_ALARM}& La capacità di usare i timer di tipo
-                              \const{CLOCK\_BOOTTIME\_ALARM} e
-                              \const{CLOCK\_REALTIME\_ALARM}, vedi
-                              sez.~\ref{sec:sig_timer_adv} (dal kernel 3.0).\\  
-    \hline
-  \end{tabular}
-  \caption{Le costanti che identificano le \textit{capabilities} presenti nel
-    kernel.}
-\label{tab:proc_capabilities}
-\end{table}
-
-\footnotetext{vale a dire i permessi caratteristici del modello classico del
-  controllo di accesso chiamato \itindex{Discrectionary~Access~Control~(DAC)}
-  \textit{Discrectionary Access Control} (da cui il nome DAC).}
-
-
-Prima di dettagliare il significato della capacità più generiche, conviene
-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.
-
-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
-processo che non ha la proprietà di un file in un vasto campo di
-operazioni;\footnote{vale a dire la richiesta che l'\ids{UID} effettivo del
-  processo (o meglio l'\ids{UID} di filesystem, vedi
-  sez.~\ref{sec:proc_setuid}) coincida con quello del proprietario.}  queste
-comprendono i cambiamenti dei permessi e dei tempi del file (vedi
-sez.~\ref{sec:file_perm_management} e sez.~\ref{sec:file_file_times}), le
-impostazioni degli attributi dei file (vedi sez.~\ref{sec:file_ioctl}) e delle
-ACL (vedi 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.
-
-Una seconda capacità che copre diverse operazioni, in questo caso riguardanti
-la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni
-privilegiate dei socket (vedi sez.~\ref{sec:sock_generic_options}), abilitare
-il \itindex{multicast} \textit{multicasting}, eseguire la configurazione delle
-interfacce di rete (vedi sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la
-tabella di instradamento.
-
-Una terza \textit{capability} con vasto campo di applicazione è
-\const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
-come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e
-disattivare la swap, montare, rimontare e smontare filesystem (vedi
-sez.~\ref{sec:filesystem_mounting}), effettuare operazioni di controllo su
-qualunque oggetto dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare
-sugli attributi estesi dei file di classe \texttt{security} o \texttt{trusted}
-(vedi sez.~\ref{sec:file_xattr}), specificare un \ids{UID} arbitrario nella
-trasmissione delle credenziali dei socket (vedi
-sez.~\ref{sec:socket_credential_xxx}), assegnare classi privilegiate
-(\const{IOPRIO\_CLASS\_RT} e prima del kernel 2.6.25 anche
-\const{IOPRIO\_CLASS\_IDLE}) per lo scheduling dell'I/O (vedi
-sez.~\ref{sec:io_priority}), superare il limite di sistema sul numero massimo
-di file aperti,\footnote{quello indicato da \sysctlfile{fs/file-max}.}
-effettuare operazioni privilegiate sulle chiavi mantenute dal kernel (vedi
-sez.~\ref{sec:keyctl_management}), usare la funzione \func{lookup\_dcookie},
-usare \const{CLONE\_NEWNS} con \func{unshare} e \func{clone}, (vedi
-sez.~\ref{sec:process_clone}).
-
-Originariamente \const{CAP\_SYS\_NICE} riguardava soltanto la capacità di
-aumentare le priorità di esecuzione dei processi, come la diminuzione del
-valore di \textit{nice} (vedi sez.~\ref{sec:proc_sched_stand}), l'uso delle
-priorità \textit{real-time} (vedi sez.~\ref{sec:proc_real_time}), o
-l'impostazione delle affinità di processore (vedi
-sez.~\ref{sec:proc_sched_multiprocess}); ma con l'introduzione di priorità
-anche riguardo le operazioni di accesso al disco, e, nel caso di sistemi NUMA,
-alla memoria, essa viene a coprire anche la possibilità di assegnare priorità
-arbitrarie nell'accesso a disco (vedi sez.~\ref{sec:io_priority}) e nelle
-politiche di allocazione delle pagine di memoria ai nodi di un sistema NUMA.
-
-Infine la \textit{capability} \const{CAP\_SYS\_RESOURCE} attiene alla
-possibilità di superare i limiti imposti sulle risorse di sistema, come usare
-lo spazio disco riservato all'amministratore sui filesystem che lo supportano,
-usare la funzione \func{ioctl} per controllare il \textit{journaling} sul
-filesystem \acr{ext3}, non subire le quote disco, aumentare i limiti sulle
-risorse di un processo (vedi sez.~\ref{sec:sys_resource_limit}) e quelle sul
-numero di processi, ed i limiti sulle dimensioni dei messaggi delle code del
-SysV IPC (vedi sez.~\ref{sec:ipc_sysv_mq}).
-
-Per la gestione delle \textit{capabilities} il kernel mette a disposizione due
-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{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}.} 
-}
-
-{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
-      capacità non presente nell'insieme di quelle permesse negli insieme
-      delle effettive o ereditate, o si è cercato di impostare una
-      \textit{capability} di un altro processo senza avare
-      \const{CAP\_SETPCAP}. 
-  \end{errlist}
-  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
-fig.~\ref{fig:cap_kernel_struct}.  Per un certo periodo di tempo era anche
-indicato che per poterle utilizzare fosse necessario che la macro
-\macro{\_POSIX\_SOURCE} risultasse non definita (ed era richiesto di inserire
-una istruzione \texttt{\#undef \_POSIX\_SOURCE} prima di includere
-\headfile{sys/capability.h}) requisito che non risulta più
-presente.\footnote{e non è chiaro neanche quanto sia mai stato davvero
-  necessario.}
-
-Si tenga presente che le strutture di fig.~\ref{fig:cap_kernel_struct}, come i
-prototipi delle due funzioni \func{capget} e \func{capset}, sono soggette ad
-essere modificate con il cambiamento del kernel (in particolare i tipi di dati
-delle strutture) ed anche se finora l'interfaccia è risultata stabile, non c'è
-nessuna assicurazione che questa venga mantenuta,\footnote{viene però
-  garantito che le vecchie funzioni continuino a funzionare.} Pertanto se si
-vogliono scrivere programmi portabili che possano essere eseguiti senza
-modifiche o adeguamenti su qualunque versione del kernel è opportuno
-utilizzare le interfacce di alto livello che vedremo più avanti.
-
-\begin{figure}[!htb]
-  \footnotesize
-  \centering
-  \begin{minipage}[c]{\textwidth}
-    \includestruct{listati/cap_user_header_t.h}
-  \end{minipage} 
-  \normalsize 
-  \caption{Definizione delle strutture a cui fanno riferimento i puntatori
-    \structd{cap\_user\_header\_t} e \structd{cap\_user\_data\_t} usati per
-    l'interfaccia di gestione di basso livello delle \textit{capabilities}.}
-  \label{fig:cap_kernel_struct}
-\end{figure}
-
-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. 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
-gestione delle \textit{capabilities} utilizzando le funzioni di libreria a
-questo dedicate. Queste funzioni, che seguono quanto previsto nelle bozze
-dello standard POSIX.1e, non fanno parte della \acr{glibc} e sono fornite in
-una libreria a parte,\footnote{la libreria è \texttt{libcap2}, nel caso di
-  Debian può essere installata con il pacchetto omonimo.} pertanto se un
-programma le utilizza si dovrà indicare esplicitamente l'uso della suddetta
-libreria attraverso l'opzione \texttt{-lcap} del compilatore.
-
-Le funzioni dell'interfaccia delle bozze di POSIX.1e prevedono l'uso di un
-\index{tipo!opaco} tipo di dato opaco, \type{cap\_t}, come puntatore ai dati
-mantenuti nel cosiddetto \textit{capability state},\footnote{si tratta in
-  sostanza di un puntatore ad una struttura interna utilizzata dalle librerie,
-  i cui campi non devono mai essere acceduti direttamente.} in sono
-memorizzati tutti i dati delle \textit{capabilities}. In questo modo è
-possibile mascherare i dettagli della gestione di basso livello, che potranno
-essere modificati senza dover cambiare le funzioni dell'interfaccia, che
-faranno 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
-\type{cap\_t}.
-
-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{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
-non c'è memoria sufficiente ad allocare i dati) viene restituito \val{NULL}
-ed \var{errno} viene impostata a \errval{ENOMEM}.  La memoria necessaria a
-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{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
-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}.
-
-Infine si può creare una copia di un \textit{capability state} ottenuto in
-precedenza tramite la funzione \funcd{cap\_dup}, il cui prototipo è:
-
-\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
-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. }
-
-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{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,
-restituendo uno stato \textsl{vuoto}, analogo a quello che si ottiene nella
-creazione con \func{cap\_init}.
-
-\begin{table}[htb]
-  \centering
-  \footnotesize
-  \begin{tabular}[c]{|l|l|}
-    \hline
-    \textbf{Valore} & \textbf{Significato} \\
-    \hline
-    \hline
-    \const{CAP\_EFFECTIVE}  & Capacità dell'insieme \textsl{effettivo}.\\
-    \const{CAP\_PERMITTED}  & Capacità dell'insieme \textsl{permesso}.\\ 
-    \const{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\
-    \hline
-  \end{tabular}
-  \caption{Valori possibili per il tipo di dato \type{cap\_flag\_t} che
-    identifica gli insiemi delle \textit{capabilities}.}
-  \label{tab:cap_set_identifier}
-\end{table}
-
-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{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}.} 
-}
-
-{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
-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 \headfile{sys/capability.h}.} uno dei valori
-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{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{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
-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}:
-
-{\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
-valori di tab.~\ref{tab:cap_set_identifier}) dell'insieme che si intende
-controllare; restituirà un valore diverso da zero se le differenze rilevate da
-\func{cap\_compare} sono presenti nell'insieme indicato.
-
-Per la gestione dei singoli valori delle \textit{capabilities} presenti in un
-\textit{capability state} l'interfaccia prevede due funzioni specifiche,
-\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{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)}
-\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}.} 
-}
-
-{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}
-
-In entrambe le funzioni l'argomento \param{cap\_p} indica il puntatore al
-\textit{capability state} su cui operare, mentre l'argomento \param{flag}
-indica su quale dei tre insiemi si intende operare, sempre con i valori di
-tab.~\ref{tab:cap_set_identifier}.
-
-La capacità che si intende controllare o impostare invece deve essere
-specificata attraverso una variabile di tipo \type{cap\_value\_t}, che può
-prendere come valore uno qualunque di quelli riportati in
-tab.~\ref{tab:proc_capabilities}, in questo caso però non è possibile
-combinare diversi valori in una maschera binaria, una variabile di tipo
-\type{cap\_value\_t} può indicare una sola capacità.\footnote{in
-  \headfile{sys/capability.h} il tipo \type{cap\_value\_t} è definito come
-  \ctyp{int}, ma i valori validi sono soltanto quelli di
-  tab.~\ref{tab:proc_capabilities}.}
-
-Infine lo stato di una capacità è descritto ad una variabile di tipo
-\type{cap\_flag\_value\_t}, che a sua volta può assumere soltanto
-uno\footnote{anche questo è un tipo enumerato.} dei valori di
-tab.~\ref{tab:cap_value_type}.
-
-\begin{table}[htb]
-  \centering
-  \footnotesize
-  \begin{tabular}[c]{|l|l|}
-    \hline
-    \textbf{Valore} & \textbf{Significato} \\
-    \hline
-    \hline
-    \const{CAP\_CLEAR}& La capacità non è impostata.\\ 
-    \const{CAP\_SET}  & La capacità è impostata.\\
-    \hline
-  \end{tabular}
-  \caption{Valori possibili per il tipo di dato \type{cap\_flag\_value\_t} che
-    indica lo stato di una capacità.}
-  \label{tab:cap_value_type}
-\end{table}
-
-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} lo restituisce 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
-lo stato di una capacità alla volta.
-
-La funzione \func{cap\_set\_flag} può invece impostare in una sola chiamata
-più \textit{capabilities}, anche se solo all'interno dello stesso insieme ed
-allo stesso valore. Per questo motivo essa prende un vettore di valori di tipo
-\type{cap\_value\_t} nell'argomento \param{caps}, la cui dimensione viene
-specificata dall'argomento \param{ncap}. Il tipo di impostazione da eseguire
-(cancellazione o impostazione) per le capacità elencate in \param{caps} viene
-indicato dall'argomento \param{value} sempre con i valori di
-tab.~\ref{tab:cap_value_type}.
-
-Per semplificare la gestione delle \textit{capabilities} l'interfaccia prevede
-che sia possibile utilizzare anche una rappresentazione testuale del contenuto
-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{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}.} 
-}
-
-{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
-argomento, e, qualora l'argomento \param{length\_p} sia diverso da \val{NULL},
-restituisce 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}.
-
-La rappresentazione testuale, che viene usata anche di programmi di gestione a
-riga di comando, prevede che lo stato venga rappresentato con una stringa di
-testo composta da una serie di proposizioni separate da spazi, ciascuna delle
-quali specifica una operazione da eseguire per creare lo stato finale. Nella
-rappresentazione si fa sempre conto di partire da uno stato in cui tutti gli
-insiemi sono vuoti e si provvede a impostarne i contenuti.
-
-Ciascuna proposizione è nella forma di un elenco di capacità, espresso con i
-nomi di tab.~\ref{tab:proc_capabilities} separati da virgole, seguito da un
-operatore, e dall'indicazione degli insiemi a cui l'operazione si applica. I
-nomi delle capacità possono essere scritti sia maiuscoli che minuscoli, viene
-inoltre riconosciuto il nome speciale \texttt{all} che è equivalente a
-scrivere la lista completa. Gli insiemi sono identificati dalle tre lettere
-iniziali: ``\texttt{p}'' per il \textit{permitted}, ``\texttt{i}'' per
-l'\textit{inheritable} ed ``\texttt{e}'' per l'\textit{effective} che devono
-essere sempre minuscole e se ne può indicare più di uno.
-
-Gli operatori possibili sono solo tre: ``\texttt{+}'' che aggiunge le capacità
-elencate agli insiemi indicati, ``\texttt{-}'' che le toglie e ``\texttt{=}''
-che le assegna esattamente. I primi due richiedono che sia sempre indicato sia
-un elenco di capacità che gli insiemi a cui esse devono applicarsi, e
-rispettivamente attiveranno o disattiveranno le capacità elencate nell'insieme
-o negli insiemi specificati, ignorando tutto il resto. I due operatori possono
-anche essere combinati nella stessa proposizione, per aggiungere e togliere le
-capacità dell'elenco da insiemi diversi.
-
-L'assegnazione si applica invece su tutti gli insiemi allo stesso tempo,
-pertanto l'uso di ``\texttt{=}'' è equivalente alla cancellazione preventiva
-di tutte le capacità ed alla impostazione di quelle elencate negli insiemi
-specificati, questo significa che in genere lo si usa una sola volta
-all'inizio della stringa. In tal caso l'elenco delle capacità può non essere
-indicato e viene assunto che si stia facendo riferimento a tutte quante senza
-doverlo scrivere esplicitamente.
-
-Come esempi avremo allora che un processo non privilegiato di un utente, che
-non ha nessuna capacità attiva, avrà una rappresentazione nella forma
-``\texttt{=}'' che corrisponde al fatto che nessuna capacità viene assegnata a
-nessun insieme (vale la cancellazione preventiva), mentre un processo con
-privilegi di amministratore avrà una rappresentazione nella forma
-``\texttt{=ep}'' in cui tutte le capacità vengono assegnate agli insiemi
-\textit{permitted} ed \textit{effective} (e l'\textit{inheritable} è ignorato
-in quanto per le regole viste a pag.~\ref{sec:capability-uid-transition} le
-capacità verranno comunque attivate attraverso una \func{exec}). Infine, come
-esempio meno banale dei precedenti, otterremo per \texttt{init} una
-rappresentazione nella forma ``\texttt{=ep cap\_setpcap-e}'' dato che come
-accennato tradizionalmente \const{CAP\_SETPCAP} è sempre stata rimossa da
-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{funcproto}{
-\fhead{sys/capability.h}
-\fdecl{cap\_t cap\_from\_text(const char *string)}
-\fdesc{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}
-
-
-La funzione restituisce il puntatore ad un \textit{capability state}
-inizializzato con i valori indicati nella stringa \param{string} che ne
-contiene la rappresentazione testuale. La memoria per il \textit{capability
-  state} viene allocata automaticamente dalla funzione e dovrà essere liberata
-con \func{cap\_free}.
-
-Alle due funzioni citate se ne aggiungono altre due che consentono di
-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{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
-capacità \param{cap}, mentre la seconda restituisce nella variabile puntata
-da \param{cap\_p} il valore della capacità rappresentata dalla
-stringa \param{name}.
-
-Fin quei abbiamo trattato solo le funzioni di servizio relative alla
-manipolazione dei \textit{capability state} come strutture di dati;
-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{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
-\textit{capability state} contenente tutti i dati che provvede ad allocare
-autonomamente e che di nuovo occorrerà liberare con \func{cap\_free} quando
-non sarà più utilizzato.
-
-Se invece si vogliono leggere le \textit{capabilities} di un processo
-specifico occorre usare la funzione \funcd{capgetp}, il cui
-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{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
-con l'argomento \param{pid}, e restituisce il risultato nel \textit{capability
-  state} posto all'indirizzo indicato con l'argomento
-\param{cap\_d}; a differenza della precedente in questo caso il
-\textit{capability state} deve essere stato creato in precedenza. 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{Verbatim}
-...
-CapInh: 0000000000000000
-CapPrm: 00000000fffffeff
-CapEff: 00000000fffffeff  
-...
-\end{Verbatim}
-
-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{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
-possibile nei termini spiegati in precedenza (non sarà ad esempio possibile
-impostare capacità non presenti nell'insieme di quelle permesse). In caso di
-successo i nuovi valori saranno effettivi al ritorno della funzione, in caso
-di fallimento invece lo stato delle capacità resterà invariato. Si tenga
-presente che \textsl{tutte} le capacità specificate tramite \param{cap\_p}
-devono essere permesse; se anche una sola non lo è la funzione fallirà, e per
-quanto appena detto, lo stato delle \textit{capabilities} non verrà modificato
-(neanche per le parti eventualmente permesse).
-
-Come esempio di utilizzo di queste funzioni nei sorgenti allegati alla guida
-si è distribuito il programma \texttt{getcap.c}, che consente di leggere le
-\textit{capabilities} del processo corrente\footnote{vale a dire di sé stesso,
-  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.
-
-\begin{figure}[!htbp]
-  \footnotesize \centering
-  \begin{minipage}[c]{\codesamplewidth}
-    \includecodesample{listati/getcap.c}
-  \end{minipage} 
-  \normalsize
-  \caption{Corpo principale del programma \texttt{getcap.c}.}
-  \label{fig:proc_getcap}
-\end{figure}
-
-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
-leggere le \textit{capabilities} e nulla altrimenti. Nel primo caso
-(\texttt{\small 1--6}) si utilizza direttamente (\texttt{\small 2})
-\func{cap\_get\_proc} per ottenere lo stato delle capacità del processo, nel
-secondo (\texttt{\small 7--14}) prima si inizializza (\texttt{\small 8}) uno
-stato vuoto e poi (\texttt{\small 9}) si legge il valore delle capacità del
-processo indicato.
-
-Il passo successivo è utilizzare (\texttt{\small 16}) \func{cap\_to\_text} per
-tradurre in una stringa lo stato, e poi (\texttt{\small 17}) stamparlo; infine
-(\texttt{\small 19--20}) si libera la memoria allocata dalle precedenti
-funzioni con \func{cap\_free} per poi ritornare dal ciclo principale della
-funzione.
-
-\itindend{capabilities}
-
-% TODO vedi http://lwn.net/Articles/198557/ e 
-% http://www.madore.org/~david/linux/newcaps/
-
+con il valore di \var{errno} in caso di errore (\texttt{\small 12-13}).
 
 
 \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: 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
+% TODO Inheriting capabilities vedi http://lwn.net/Articles/632520/ eambient
+% capabilities introdotte con il kernel 4.3, vedi 
+% http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08
 
 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
-\itindsub{pathname}{assoluto}\textit{pathname} assoluti.\footnote{cioè quando
+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 dei file dell'intero
+sistema, ha per il processo il significato specifico di directory rispetto
+alla quale vengono risolti i \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
-\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.
+cambiando questa directory, così come si fa coi \textit{pathname} relativi
+cambiando la directory di lavoro.
+
+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 \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}
@@ -7650,59 +6675,59 @@ con la funzione \funcd{chroot}, il cui 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{EPERM}] l'\ids{UID} effettivo del processo non è zero.
+  \item[\errcode{EPERM}] non si hanno i privilegi di amministratore.
   \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} 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
-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
+La funzione imposta la directory radice del processo a quella specificata da
+\param{path} (che ovviamente deve esistere) ed ogni \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}.
 
-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
-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 root. 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}\textit{pathname} relativi, i quali,
-partendo dalla directory di lavoro che è 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 root
-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.
-
-
-
-% TODO: trattare la funzione setns e i namespace file descriptors (vedi
-% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0
+Solo un processo con i privilegi di amministratore può usare questa
+funzione,\footnote{più precisamente se possiede la 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 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 directory di lavoro al di fuori dalla \textit{chroot jail}, potrà accedere
+a tutto il resto del filesystem usando 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
+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: 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
@@ -7749,21 +6774,21 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  setresuid setfsuid IMMUTABLE immutable append only BIND SERVICE
 % LocalWords:  BROADCAST broadcast multicast multicasting RAW PACKET IPC LOCK
 % LocalWords:  memory mlock mlockall shmctl mmap MODULE RAWIO ioperm iopl PACCT
-% LocalWords:  ptrace accounting NICE RESOURCE TTY CONFIG hangup vhangup dell'
+% LocalWords:  ptrace accounting NICE RESOURCE TTY CONFIG hangup vhangup 
 % LocalWords:  LEASE lease SETFCAP AUDIT permitted inherited inheritable AND nn
 % LocalWords:  bounding execve fork capget capset header hdrp datap ESRCH undef
 % LocalWords:  version libcap lcap clear ncap caps pag capgetp CapInh CapPrm RT
 % LocalWords:  fffffeff CapEff getcap scheduling lookup  dqinfo SETINFO GETFMT
 % LocalWords:  NEWNS unshare nice NUMA ioctl journaling close XOPEN fdopendir
-% LocalWords:  btrfs mkostemp extN ReiserFS JFS Posix usrquota grpquota EDQUOT
+% LocalWords:  Btrfs mkostemp extN ReiserFS JFS Posix usrquota grpquota EDQUOT
 % LocalWords:  aquota quotacheck limit grace period quotactl cmd caddr addr dqb
 % LocalWords:  QUOTAON ENODEV ENOPKG ENOTBLK GETQUOTA SETQUOTA SETUSE SETQLIM
 % LocalWords:  forced allowed sendmail SYSLOG WAKE ALARM CLOCK BOOTTIME dqstats
 % LocalWords:  REALTIME securebits GETSTATS QFMT curspace curinodes btime itime
 % LocalWords:  QIF BLIMITS bhardlimit bsoftlimit ILIMITS ihardlimit isoftlimit
 % LocalWords:  INODES LIMITS USAGE valid dqi IIF BGRACE bgrace IGRACE igrace is
-% LocalWords:  Python Truelite Srl quotamodule Repository who nell' dall' KEEP
-% LocalWords:  SECURE KEEPCAPS prctl FIXUP NOROOT LOCKED dell'IPC dell'I IOPRIO
+% LocalWords:  Python Truelite Srl quotamodule Repository who  KEEP
+% LocalWords:  SECURE KEEPCAPS prctl FIXUP NOROOT LOCKED dell'IPC IOPRIO
 % LocalWords:  CAPBSET CLASS IDLE dcookie overflow DIFFERS Virtual everything
 % LocalWords:  dentry register resolution cache dcache operation llseek poll ln
 % LocalWords:  multiplexing fsync fasync seek block superblock gapil tex img du
@@ -7776,6 +6801,11 @@ 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 mygetfacl table Tb MSK
+%  LocalWords:  LAZYTIME submount peer protected hardlink symlinks silly RDWR
+%  LocalWords:  renames unreachable CLOEXEC mkstemps mkostemps suffixlen Aug
+%  LocalWords:  prefissoXXXXXXsuffisso fstatat statx drwxrwxrwt xattr
+%  LocalWords:  Disalloca project
 
 %%% Local Variables: 
 %%% mode: latex