Aggiornamento note copyright e I/O Asyncrono
[gapil.git] / filedir.tex
index 9eff764846c3b3ba271369bc92c0cfc786dda395..e174c5bb37040e7778c9677d6dfdca6bf86cbd27 100644 (file)
@@ -1,6 +1,6 @@
 %% filedir.tex
 %%
-%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2015 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -78,7 +78,7 @@ verrà inserita nella tabella, ed il nuovo filesystem comparirà in
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/file_system_type.h}
   \end{minipage}
   \normalsize 
@@ -178,7 +178,7 @@ struttura viene allocata e trascritti all'indietro se modificati.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/inode.h}
   \end{minipage}
   \normalsize 
@@ -213,7 +213,7 @@ tab.~\ref{tab:file_inode_operations} le più rilevanti.
     \hline
     \hline
     \textsl{\code{create}} & Chiamata per creare un nuovo file (vedi
-                             sez.~\ref{sec:file_open}).\\ 
+                             sez.~\ref{sec:file_open_close}).\\ 
     \textsl{\code{link}}   & Crea un \textit{hard link} (vedi
                              sez.~\ref{sec:link_symlink_rename}).\\
     \textsl{\code{unlink}} & Cancella un \textit{hard link} (vedi
@@ -260,13 +260,13 @@ tab.~\ref{tab:file_file_operations}.\footnote{essa può essere comunque
   detta funzione.} Questo avviene perché su Linux l'apertura di un file
 richiede comunque un'altra operazione che mette in gioco l'omonimo oggetto del
 VFS: l'allocazione di una struttura di tipo \kstruct{file} che viene associata
-ad ogni file aperto nel sistema.
-
-I motivi per cui viene usata una struttura a parte sono diversi, anzitutto,
-come illustrato in sez.~\ref{sec:file_fd}, questa è necessaria per le
-operazioni eseguite dai processi con l'interfaccia dei file descriptor; ogni
-processo infatti mantiene il riferimento ad una struttura \kstruct{file} per
-ogni file che ha aperto, ed è tramite essa che esegue le operazioni di I/O.
+ad ogni file aperto nel sistema.  I motivi per cui viene usata una struttura a
+parte sono diversi, anzitutto, come illustrato in sez.~\ref{sec:file_fd},
+questa è necessaria per le operazioni eseguite dai processi con l'interfaccia
+dei file descriptor. Ogni processo infatti mantiene il riferimento ad una
+struttura \kstruct{file} per ogni file che ha aperto, ed è tramite essa che
+esegue le operazioni di I/O. Inoltre il kernel mantiene un elenco di tutti i
+file aperti nella \itindex{file~table} \textit{file table}.
 
 Inoltre se le operazioni relative agli \textit{inode} fanno riferimento ad
 oggetti posti all'interno di un filesystem e vi si applicano quindi le
@@ -279,7 +279,7 @@ di dati) dovrà invece ricorrere a quelle fornite dal driver del dispositivo.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/file.h}
   \end{minipage}
   \normalsize 
@@ -304,14 +304,15 @@ tab.~\ref{tab:file_file_operations} le più significative.
     \textbf{Funzione} & \textbf{Operazione} \\
     \hline
     \hline
-    \textsl{\code{open}}   & Apre il file (vedi sez.~\ref{sec:file_open}).\\
+    \textsl{\code{open}}   & Apre il file (vedi
+                             sez.~\ref{sec:file_open_close}).\\ 
     \textsl{\code{read}}   & Legge dal file (vedi sez.~\ref{sec:file_read}).\\
     \textsl{\code{write}}  & Scrive sul file (vedi 
                              sez.~\ref{sec:file_write}).\\
     \textsl{\code{llseek}} & Sposta la posizione corrente sul file (vedi
                              sez.~\ref{sec:file_lseek}).\\
     \textsl{\code{ioctl}}  & Accede alle operazioni di controllo 
-                             (vedi sez.~\ref{sec:file_ioctl}).\\
+                             (vedi sez.~\ref{sec:file_fcntl_ioctl}).\\
     \textsl{\code{readdir}}& Legge il contenuto di una directory (vedi 
                              sez.~\ref{sec:file_dir_read}).\\
     \textsl{\code{poll}}   & Usata nell'I/O multiplexing (vedi
@@ -538,10 +539,10 @@ 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}
-\item i \textit{file attributes} consentono di modificare il comportamento del
-  kernel quando agisce su gruppi di file. Possono essere impostati su file e
-  directory e in quest'ultimo caso i nuovi file creati nella directory
-  ereditano i suoi attributi.
+\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
+  dei permessi sui file.
 \item sono supportate entrambe le semantiche di BSD e SVr4 come opzioni di
   montaggio. La semantica BSD comporta che i file in una directory sono creati
   con lo stesso identificatore di gruppo della directory che li contiene. La
@@ -558,11 +559,12 @@ le seguenti:
   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 i file immutabili (che possono solo essere letti) per
-  la protezione di file di configurazione sensibili, o file
-  \textit{append-only} che possono essere aperti in scrittura solo per
-  aggiungere dati (caratteristica utilizzabile per la protezione dei file di
-  log).
+\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}
 
 La struttura di \acr{ext2} è stata ispirata a quella del filesystem di BSD: un
@@ -811,7 +813,7 @@ nell'elenco seguente:
   tutte le directory del filesystem, ma su alcuni filesystem è possibile
   impostarla a livello di singole directory o per i sottorami di una directory
   con il comando \cmd{chattr}.\footnote{questo avviene tramite delle opportune
-    \texttt{ioctl} (vedi sez.~\ref{sec:file_ioctl}).}
+    \texttt{ioctl} (vedi sez.~\ref{sec:file_fcntl_ioctl}).}
 
   Questo consente di ridurre al minimo il rischio di perdita dei dati delle
   directory in caso di crollo improvviso del sistema, al costo di una certa
@@ -864,8 +866,8 @@ nell'elenco seguente:
   il controllo dei contenuti, in particolar modo quelli posti su dispositivi
   rimuovibili. In questo modo si evitano alla radice possibili situazioni in
   cui un utente malizioso inserisce su uno di questi filesystem dei file di
-  dispositivo con permessi ``opportunamente'' ampliati che gli consentano di
-  accedere anche a risorse cui non dovrebbe.
+  dispositivo con permessi ``opportunamente'' ampliati che gli consentirebbero
+  di accedere anche a risorse cui non dovrebbe.
 
 \item[\const{MS\_NODIRATIME}] Viene disabilitato sul filesystem
   l'aggiornamento degli \textit{access time} (vedi
@@ -1030,7 +1032,7 @@ nell'elenco seguente:
 \item[\const{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona richiedendo che
   ogni modifica al contenuto del filesystem venga immediatamente registrata su
   disco. Lo stesso comportamento può essere ottenuto con il flag
-  \const{O\_SYNC} di \func{open} (vedi sez.~\ref{sec:file_open}).
+  \const{O\_SYNC} di \func{open} (vedi sez.~\ref{sec:file_open_close}).
 
   Questa opzione consente di ridurre al minimo il rischio di perdita dei dati
   in caso di crollo improvviso del sistema, al costo di una pesante perdita di
@@ -1094,7 +1096,7 @@ prototipo è:
 \end{funcproto}
 
 \footnotetext{più precisamente la \itindex{capabilities} capacità
-  \texttt{CAP\_SYS\_ADMIN}.}
+  \const{CAP\_SYS\_ADMIN}, vedi sez.~\ref{sec:proc_capabilities}.}
 
 La funzione prende il nome della directory su cui il filesystem è montato e
 non il file o il dispositivo che è stato montato,\footnote{questo è vero a
@@ -1121,11 +1123,11 @@ un filesystem anche quando questo risulti occupato; il suo prototipo è:
 {La funzione ritorna  $0$ in caso di successo e $-1$ per un errore,
   nel qual caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
+     \item[\errcode{EAGAIN}] si è chiamata la funzione con \const{MNT\_EXPIRE}
+       ed il filesystem non era occupato.
      \item[\errcode{EBUSY}] \param{target} è la \index{directory~di~lavoro}
        directory di lavoro di qualche processo, o contiene dei file aperti, o un
        altro mount point.
-     \item[\errcode{EAGAIN}] si è chiamata la funzione con \const{MNT\_EXPIRE}
-       ed il filesystem non era occupato.
      \item[\errcode{EINVAL}] \param{target} non è un \itindex{mount~point}
        \textit{mount point} o si è usato \const{MNT\_EXPIRE} con
        \const{MNT\_FORCE} o \const{MNT\_DETACH} o si è specificato un flag non
@@ -1151,18 +1153,18 @@ eseguita una sincronizzazione dei dati.
     \textbf{Costante} & \textbf{Descrizione}\\
     \hline
     \hline
-    \const{MNT\_FORCE}  & forza lo smontaggio del filesystem anche se questo è
+    \const{MNT\_FORCE}  & Forza lo smontaggio del filesystem anche se questo è
                           occupato (presente dai kernel della serie 2.2).\\
-    \const{MNT\_DETACH} & esegue uno smontaggio ``\textsl{pigro}'', in cui si
+    \const{MNT\_DETACH} & Esegue uno smontaggio ``\textsl{pigro}'', in cui si
                           blocca l'accesso ma si aspetta che il filesystem si
                           liberi (presente dal kernel 2.4.11 e dalla
                           \acr{glibc} 2.11).\\ 
-    \const{MNT\_EXPIRE} & se non occupato marca un \itindex{mount~point} 
+    \const{MNT\_EXPIRE} & Se non occupato marca un \itindex{mount~point} 
                           \textit{mount point} come ``\textsl{in scadenza}'' in
                           modo che ad una successiva chiamata senza utilizzo
                           del filesystem questo venga smontato (presente dal
                           kernel 2.6.8 e dalla \acr{glibc} 2.11).\\ 
-    \const{UMOUNT\_NOFOLLOW}& non dereferenzia \param{target} se questo è un
+    \const{UMOUNT\_NOFOLLOW}& Non dereferenzia \param{target} se questo è un
                           collegamento simbolico (vedi
                           sez.~\ref{sec:link_symlink_rename}) evitando
                           problemi di sicurezza (presente dal kernel 2.6.34).\\ 
@@ -1242,7 +1244,7 @@ del filesystem stesso.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/statfs.h}
   \end{minipage}
   \normalsize 
@@ -1307,7 +1309,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.
 
@@ -1545,8 +1547,8 @@ Si noti che non si è specificato il comportamento delle funzioni che operano
 con i file descriptor (che tratteremo nel prossimo capitolo), in quanto la
 risoluzione del collegamento simbolico viene in genere effettuata dalla
 funzione che restituisce il file descriptor (normalmente la \func{open}, vedi
-sez.~\ref{sec:file_open}) e tutte le operazioni seguenti fanno riferimento
-solo a quest'ultimo.
+sez.~\ref{sec:file_open_close}) e tutte le operazioni seguenti fanno
+riferimento solo a quest'ultimo.
 
 Dato che, come indicato in tab.~\ref{tab:file_symb_effect}, funzioni come la
 \func{open} seguono i collegamenti simbolici, occorrono funzioni apposite per
@@ -1621,26 +1623,22 @@ Un altro punto da tenere sempre presente è che, come abbiamo accennato, un
 collegamento simbolico può fare riferimento anche ad un file che non esiste;
 ad esempio possiamo usare il comando \cmd{ln} per creare un collegamento
 simbolico nella nostra directory con:
-\begin{Command}
-$ ln -s /tmp/tmp_file symlink
-\end{Command}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ln -s /tmp/tmp_file symlink}
+\end{Console}
 %$
 e questo avrà successo anche se \file{/tmp/tmp\_file} non esiste:
-\begin{Command}
-$ ls symlink
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ls symlink}
 symlink
-\end{Terminal}
+\end{Console}
 %$
 ma questo può generare confusione, perché accedendo in sola lettura a
 \file{symlink}, ad esempio con \cmd{cat}, otterremmo un errore:
-\begin{Command}
-$ cat symlink
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{cat symlink}
 cat: symlink: No such file or directory
-\end{Terminal}
+\end{Console}
 %$
 con un errore che può sembrare sbagliato, dato che \cmd{ls} ci ha mostrato
 l'esistenza di \file{symlink}, se invece scrivessimo su \file{symlink}
@@ -1671,8 +1669,8 @@ nome come si può notare ha poco a che fare con il concetto di rimozione, è
 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
   nel qual caso \var{errno} assumerà uno dei valori:\footnotemark  
   \begin{errlist}
-  \item[\errcode{EACCES}] non si ha il permesso di scrivere sulla directory
-    contenente \param{pathname} o di attraversamento di una delle directory
+  \item[\errcode{EACCES}] non si ha il permesso di scrittura sulla directory
+    che contiene \param{pathname} o di attraversamento di una delle directory
     superiori. 
   \item[\errcode{EISDIR}] \param{pathname} si riferisce ad una
     directory.
@@ -1721,7 +1719,7 @@ sono stati cancellati: solo quando il numero di collegamenti mantenuto
 lo spazio occupato su disco viene liberato. Si tenga presente comunque che a
 questo si aggiunge sempre un'ulteriore condizione e cioè che non ci siano
 processi che abbiano il suddetto file aperto.\footnote{come vedremo in
-  cap.~\ref{cha:file_unix_interface} il kernel mantiene anche una tabella dei
+  sez.~\ref{sec:file_unix_interface} il kernel mantiene anche una tabella dei
   file aperti nei vari processi, che a sua volta contiene i riferimenti agli
   \itindex{inode} \textit{inode} ad essi relativi; prima di procedere alla
   cancellazione dello spazio occupato su disco dal contenuto di un file il
@@ -1788,13 +1786,13 @@ sistema \funcd{rename},\footnote{la funzione è definita dallo standard ANSI C,
     parte di qualche processo (come \index{directory~di~lavoro} directory di
     lavoro o come radice) o del sistema (come \itindex{mount~point}
     \textit{mount point}) ed il sistema non riesce a risolvere la situazione.
+  \item[\errcode{EEXIST}] \param{newpath} è una directory già esistente e
+    non è vuota (anche \errcode{ENOTEMPTY}).
   \item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di
     \param{oldpath} o più in generale si è cercato di creare una directory come
     sotto-directory di sé stessa.
   \item[\errcode{EISDIR}] \param{newpath} è una directory mentre
     \param{oldpath} non è una directory.
-  \item[\errcode{EEXIST}] \param{newpath} è una directory già esistente e
-    non è vuota (anche \errcode{ENOTEMPTY}).
   \item[\errcode{ENOTDIR}] uno dei componenti dei \textit{pathname} non è una
     directory o \param{oldpath} è una directory e 
     \param{newpath} esiste e non è una directory.
@@ -1942,11 +1940,11 @@ necessaria una specifica funzione di sistema, \funcd{rmdir}, il suo prototipo
     che contiene la directory che si vuole cancellare, o non c'è il permesso
     di attraversare (esecuzione) una delle directory specificate in
     \param{dirname}.
-  \item[\errcode{EINVAL}] si è usato ``\texttt{.}'' come ultimo componente
-    di \param{dirname}.
   \item[\errcode{EBUSY}] la directory specificata è la
     \index{directory~di~lavoro} directory di lavoro o la radice di qualche
     processo o un \itindex{mount~point} \textit{mount point}.
+  \item[\errcode{EINVAL}] si è usato ``\texttt{.}'' come ultimo componente
+    di \param{dirname}.
   \item[\errcode{EPERM}] il filesystem non supporta la cancellazione di
     directory, oppure la directory che contiene \param{dirname} ha lo
     \itindex{sticky~bit} \textit{sticky bit} impostato e non si è i
@@ -1987,11 +1985,12 @@ con le usuali funzioni di scrittura.
 Ma se la scrittura e l'aggiornamento dei dati delle directory è compito del
 kernel, sono molte le situazioni in cui i processi necessitano di poterne
 leggere il contenuto. Benché questo possa essere fatto direttamente (vedremo
-in sez.~\ref{sec:file_open} che è possibile aprire una directory come se fosse
-un file, anche se solo in sola lettura) in generale il formato con cui esse
-sono scritte può dipendere dal tipo di filesystem, tanto che, come riportato
-in tab.~\ref{tab:file_file_operations}, il \itindex{Virtual~File~System} VFS
-prevede una apposita funzione per la lettura delle directory.
+in sez.~\ref{sec:file_open_close} che è possibile aprire una directory come se
+fosse un file, anche se solo in sola lettura) in generale il formato con cui
+esse sono scritte può dipendere dal tipo di filesystem, tanto che, come
+riportato in tab.~\ref{tab:file_file_operations}, il
+\itindex{Virtual~File~System} VFS prevede una apposita funzione per la lettura
+delle directory.
 
 \itindbeg{directory~stream}
 
@@ -2000,7 +1999,7 @@ Tutto questo si riflette nello standard POSIX\footnote{le funzioni erano
 che ha introdotto una apposita interfaccia per la lettura delle directory,
 basata sui cosiddetti \textit{directory stream}, chiamati così per l'analogia
 con i \textit{file stream} dell'interfaccia standard ANSI C che vedremo in
-cap.~\ref{cha:files_std_interface}. La prima funzione di questa interfaccia è
+sez.~\ref{sec:files_std_interface}. La prima funzione di questa interfaccia è
 \funcd{opendir}, il cui prototipo è:
 
 \begin{funcproto}{
@@ -2165,7 +2164,7 @@ restituito il valore \val{NULL}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/dirent.c}
   \end{minipage} 
   \normalsize 
@@ -2223,8 +2222,8 @@ Ottenuta allora con \code{offsetof(struct dirent, d\_name)} la dimensione
 della parte iniziale della struttura, basterà sommarci la dimensione massima
 dei nomi dei file nel filesystem che si sta usando, che si può ottenere
 attraverso la funzione \func{pathconf} (per la quale si rimanda a
-sez.~\ref{sec:sys_pathconf}) più un ulteriore carattere per la terminazione
-della stringa. 
+sez.~\ref{sec:sys_file_limits}) più un ulteriore carattere per la terminazione
+della stringa.
 
 Per quanto riguarda il significato dei campi opzionali, il campo \var{d\_type}
 indica il tipo di file (se fifo, directory, collegamento simbolico, ecc.), e
@@ -2443,10 +2442,10 @@ la stampa della sintassi, anch'essa omessa, ma il codice completo può essere
 trovato coi sorgenti allegati alla guida nel file \file{myls.c}.
 
 In sostanza tutto quello che fa il programma, dopo aver controllato
-(\texttt{\small 12--15}) di avere almeno un argomento, che indicherà la
+(\texttt{\small 12-15}) di avere almeno un argomento, che indicherà la
 directory da esaminare, è chiamare (\texttt{\small 16}) la funzione
 \myfunc{dir\_scan} per eseguire la scansione, usando la funzione \code{do\_ls}
-(\texttt{\small 22--29}) per fare tutto il lavoro.
+(\texttt{\small 22-29}) per fare tutto il lavoro.
 
 Quest'ultima si limita (\texttt{\small 26}) a chiamare \func{stat} sul file
 indicato dalla directory entry passata come argomento (il cui nome è appunto
@@ -2473,15 +2472,15 @@ Tutto il grosso del lavoro è svolto dalla funzione \myfunc{dir\_scan},
 riportata in fig.~\ref{fig:file_dirscan}. La funzione è volutamente generica e
 permette di eseguire una funzione, passata come secondo argomento, su tutte le
 voci di una directory.  La funzione inizia con l'aprire (\texttt{\small
-  18--22}) uno \textit{stream} sulla directory passata come primo argomento,
+  18-22}) uno \textit{stream} sulla directory passata come primo argomento,
 stampando un messaggio in caso di errore.
 
-Il passo successivo (\texttt{\small 23--24}) è cambiare
+Il passo successivo (\texttt{\small 23-24}) è cambiare
 \index{directory~di~lavoro} directory di lavoro (vedi
 sez.~\ref{sec:file_work_dir}), usando in sequenza le funzioni \func{dirfd} e
 \func{fchdir} (in realtà si sarebbe potuto usare direttamente \func{chdir} su
 \var{dirname}), in modo che durante il successivo ciclo (\texttt{\small
-  26--30}) sulle singole voci dello \textit{stream} ci si trovi all'interno
+  26-30}) sulle singole voci dello \textit{stream} ci si trovi all'interno
 della directory.\footnote{questo è essenziale al funzionamento della funzione
   \code{do\_ls}, e ad ogni funzione che debba usare il campo \var{d\_name}, in
   quanto i nomi dei file memorizzati all'interno di una struttura
@@ -2618,7 +2617,7 @@ appunto per \textit{change directory}, il suo prototipo è:
     di \param{pathname}.
   \item[\errcode{ENOTDIR}] non si è specificata una directory.
   \end{errlist}
-  ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{EIO},
+  ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
   \errval{ENAMETOOLONG}, \errval{ENOENT} e \errval{ENOMEM} nel loro
   significato generico.}
 \end{funcproto}
@@ -2852,10 +2851,11 @@ sez.~\ref{sec:proc_race_cond}).
 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 ``\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.
+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.
 
 La \acr{glibc} provvede varie funzioni per generare nomi di file temporanei,
 di cui si abbia certezza di unicità al momento della generazione; storicamente
@@ -2873,10 +2873,10 @@ la prima di queste funzioni create a questo scopo era
 \end{funcproto}
 
 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
+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
-verrà copiato automaticamente; altrimenti il nome sarà generato in un buffer
+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 è
@@ -2907,11 +2907,11 @@ 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 è
+\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}).
-\item il valore dell'argomento \param{dir} (se diverso da \val{NULL}).
-\item Il valore della costante \const{P\_tmpdir}.
+  \itindex{sgid~bit} \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}.
 \end{itemize*}
 
@@ -2922,9 +2922,9 @@ file, un altro file o un collegamento simbolico con lo stesso nome. Per questo
 motivo quando si usa il nome ottenuto da una di queste funzioni occorre sempre
 assicurarsi che non si stia usando un collegamento simbolico e aprire il nuovo
 file in modalità di esclusione (cioè con l'opzione \const{O\_EXCL} per i file
-descriptor o con il flag \code{x} per gli \textit{stream}) che fa fallire
-l'apertura in caso il file sia già esistente. Essendo disponibili alternative
-migliori l'uso di queste funzioni è deprecato.
+descriptor o con il flag ``\texttt{x}'' per gli \textit{stream}) che fa
+fallire l'apertura in caso il file sia già esistente. Essendo disponibili
+alternative migliori l'uso di queste funzioni è deprecato.
 
 Per evitare di dovere effettuare a mano tutti questi controlli, lo standard
 POSIX definisce la funzione \funcd{tmpfile}, che permette di ottenere in
@@ -2960,8 +2960,8 @@ 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
 modificano una stringa di input che serve da modello e che deve essere
 conclusa da 6 caratteri ``\texttt{X}'' che verranno sostituiti da un codice
-unico. La prima delle due è analoga a \func{tmpnam} e genera un nome casuale,
-il suo prototipo è:
+unico. La prima delle due è analoga a \func{tmpnam} e genera soltanto un nome
+casuale, il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{stlib.h}
@@ -3000,9 +3000,9 @@ prototipo è:
   errore, nel qual 
   caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-    \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
     \item[\errcode{EEXIST}] non è riuscita a creare un file temporaneo, il
       contenuto di \param{template} è indefinito.
+    \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
   \end{errlist}}
 \end{funcproto}
 
@@ -3010,8 +3010,8 @@ prototipo è:
 Come per \func{mktemp} anche in questo caso \param{template} non può essere
 una stringa costante. La funzione apre un file in lettura/scrittura con la
 funzione \func{open}, usando l'opzione \const{O\_EXCL} (si veda
-sez.~\ref{sec:file_open}), in questo modo al ritorno della funzione si ha la
-certezza di essere stati i creatori del file, i cui permessi (si veda
+sez.~\ref{sec:file_open_close}), in questo modo al ritorno della funzione si
+ha la certezza di essere stati i creatori del file, i cui permessi (si veda
 sez.~\ref{sec:file_perm_overview}) sono impostati al valore \code{0600}
 (lettura e scrittura solo per il proprietario).\footnote{questo è vero a
   partire dalla \acr{glibc} 2.0.7, le versioni precedenti della \acr{glibc} e
@@ -3055,11 +3055,11 @@ In OpenBSD è stata introdotta un'altra funzione simile alle precedenti,
   più gli altri eventuali codici di errore di \func{mkdir}.}
 \end{funcproto}
 
-La funzione genera una directory il cui nome è ottenuto sostituendo le
-\code{XXXXXX} finali di \param{template} con permessi \code{0700} (al solito
-si veda cap.~\ref{cha:file_unix_interface} per i dettagli); dato che la
-creazione della directory è sempre esclusiva i precedenti problemi di
-\itindex{race~condition} \textit{race condition} non si pongono.
+La funzione crea una directory temporanea il cui nome è ottenuto sostituendo
+le \code{XXXXXX} finali di \param{template} con permessi \code{0700} (si veda
+sez.~\ref{sec:file_perm_overview} per i dettagli). Dato che la creazione della
+directory è sempre esclusiva i precedenti problemi di \itindex{race~condition}
+\textit{race condition} non si pongono.
 
 
 
@@ -3130,7 +3130,7 @@ sez.~\ref{sec:file_file_times}).
 \begin{figure}[!htb]
   \footnotesize
   \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/stat.h}
   \end{minipage} 
   \normalsize 
@@ -3147,7 +3147,7 @@ introdotti per rendersi indipendenti dalla piattaforma.
 
 Benché la descrizione dei commenti di fig.~\ref{fig:file_stat_struct} sia
 abbastanza chiara, vale la pena illustrare maggiormente il significato dei
-campi di \structd{stat} su cui non torneremo in maggior dettaglio nel resto di
+campi di \struct{stat} su cui non torneremo in maggior dettaglio nel resto di
 questa sezione:
 \begin{itemize*}
 
@@ -3207,13 +3207,13 @@ tipo di file in maniera standardizzata.
     \textbf{Macro} & \textbf{Tipo del file} \\
     \hline
     \hline
-    \macro{S\_ISREG}\texttt{(m)}  & file normale.\\
-    \macro{S\_ISDIR}\texttt{(m)}  & directory.\\
-    \macro{S\_ISCHR}\texttt{(m)}  & dispositivo a caratteri.\\
-    \macro{S\_ISBLK}\texttt{(m)}  & dispositivo a blocchi.\\
-    \macro{S\_ISFIFO}\texttt{(m)} & fifo.\\
-    \macro{S\_ISLNK}\texttt{(m)}  & collegamento simbolico.\\
-    \macro{S\_ISSOCK}\texttt{(m)} & socket.\\
+    \macro{S\_ISREG}\texttt{(m)}  & File normale.\\
+    \macro{S\_ISDIR}\texttt{(m)}  & Directory.\\
+    \macro{S\_ISCHR}\texttt{(m)}  & Dispositivo a caratteri.\\
+    \macro{S\_ISBLK}\texttt{(m)}  & Dispositivo a blocchi.\\
+    \macro{S\_ISFIFO}\texttt{(m)} & Fifo.\\
+    \macro{S\_ISLNK}\texttt{(m)}  & Collegamento simbolico.\\
+    \macro{S\_ISSOCK}\texttt{(m)} & Socket.\\
     \hline    
   \end{tabular}
   \caption{Macro per i tipi di file (definite in \headfile{sys/stat.h}).}
@@ -3246,9 +3246,11 @@ come argomento il valore di \var{st\_mode}.
     \const{S\_IFCHR}  &  0020000 & Dispositivo a caratteri.\\
     \const{S\_IFIFO}  &  0010000 & Fifo.\\
     \hline
-    \const{S\_ISUID}  &  0004000 & \itindex{suid~bit} \acr{suid} bit.\\
-    \const{S\_ISGID}  &  0002000 & \itindex{sgid~bit} \acr{sgid} bit.\\
-    \const{S\_ISVTX}  &  0001000 & \itindex{sticky~bit} \acr{sticky} bit.\\
+    \const{S\_ISUID}  &  0004000 & Set user ID \itindex{suid~bit} (\acr{suid})
+                                   bit.\\ 
+    \const{S\_ISGID}  &  0002000 & Set group ID \itindex{sgid~bit}
+                                   (\acr{sgid}) bit.\\
+    \const{S\_ISVTX}  &  0001000 & \itindex{sticky~bit} \acr{Sticky} bit.\\
     \hline
     \const{S\_IRWXU}  &  00700   & Maschera per i permessi del proprietario.\\
     \const{S\_IRUSR}  &  00400   & Il proprietario ha permesso di lettura.\\
@@ -3278,7 +3280,7 @@ memorizzati. Per questo sempre in \headfile{sys/stat.h} sono definite le varie
 costanti numeriche riportate in tab.~\ref{tab:file_mode_flags}, che
 definiscono le maschere che consentono di selezionare non solo i dati relativi
 al tipo di file, ma anche le informazioni relative ai permessi su cui
-torneremo in sez.~\ref{sec:file_access_control} ed identificare i rispettivi
+torneremo in sez.~\ref{sec:file_access_control}, ed identificare i rispettivi
 valori.
 
 Le costanti che servono per la identificazione del tipo di file sono riportate
@@ -3308,11 +3310,11 @@ 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 mentre per le fifo ed i file di dispositivo
+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 differenze con \var{st\_size} è che in questo caso si fa
+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.
 
@@ -3479,7 +3481,7 @@ 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 questo punto non ha
+mantenere costantemente aggiornata una informazione che 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.}
@@ -3626,7 +3628,7 @@ puntatore nullo verrà impostato il tempo corrente.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/utimbuf.h}
   \end{minipage} 
   \normalsize 
@@ -3641,9 +3643,9 @@ tempo corrente ed è sufficiente avere accesso in scrittura al file o essere
 proprietari del file o avere i privilegi di amministratore. Se invece si è
 specificato un valore diverso la funzione avrà successo solo se si è
 proprietari del file o se si hanno i privilegi di amministratore.\footnote{per
-  essere precisi la \itindex{capabilities} capacità \const{CAP\_FOWNER}.} In
-entrambi i casi per verificare la proprietà del file viene utilizzato
-l'\ids{UID} effettivo del processo.
+  essere precisi la \itindex{capabilities} capacità \const{CAP\_FOWNER}, vedi
+  sez.~\ref{sec:proc_capabilities}.} In entrambi i casi per verificare la
+proprietà del file viene utilizzato l'\ids{UID} effettivo del processo.
 
 Si tenga presente che non è possibile modificare manualmente il tempo di
 cambiamento di stato del file, che viene aggiornato direttamente dal kernel
@@ -3692,7 +3694,7 @@ puntatore nullo di nuovo verrà utilizzato il tempo corrente.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/timeval.h}
   \end{minipage} 
   \normalsize 
@@ -3725,18 +3727,19 @@ prototipi sono:
   \end{errlist}}  
 \end{funcproto}
 
-Le due funzioni anno lo stesso comportamento di \texttt{utimes} e richiedono
+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
+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.
 
-Nonostante il kernel, come accennato, supporti 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, \funcd{futimens} e \func{utimensat}, in grado di eseguire questo
-compito; i rispettivi prototipi sono:
+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:
 
 \begin{funcproto}{
 \fhead{sys/time.h}
@@ -3746,22 +3749,45 @@ compito; i rispettivi prototipi sono:
     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: 
   \begin{errlist}
-  \item[\errcode{EBADF}] da fare
+  \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{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})
   \end{errlist}
-  ed inoltre nel loro significato generico.}
+  ed inoltre per entrambe \errval{EROFS} e per \func{utimensat}
+  \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR} nel
+  loro significato generico.}
 \end{funcproto}
 
 Entrambe le funzioni utilizzano per indicare i valori dei tempi un
-vettore \param{times} di due strutture \struct{timespec} che permette di
-specificare un valore di tempo con una precisione fino al nanosecondo, la cui
-definizione è riportata in fig.~\ref{fig:sys_timespec_struct}.
+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.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/timespec.h}
   \end{minipage} 
   \normalsize 
@@ -3782,23 +3808,39 @@ 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; sono state introdotte a partire dal kernel 2.6.22, e
-supportate dalla \acr{glibc} a partire dalla versione 2.6.\footnote{in
-  precedenza, a partire dal kernel 2.6.16, era stata introdotta la funzione
-  \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 la tratteremo.} 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, come vedremo in sez.~\ref{sec:file_openat}
-consente una indicazione sicura dei \itindsub{pathname}{relativo}
-\textit{pathname relativi} specificando la directory da usare come riferimento
-in \param{dirfd} e la possibilità di usare per \param{flags} il valore
-\const{AT\_SYMLINK\_NOFOLLOW} per indicare alla funzione di non dereferenziare
-i collegamenti simbolici; si rimanda pertanto la spiegazione del significato
-degli argomenti aggiuntivi alla trattazione generica delle varie funzioni che
-usano la stessa sintassi, effettuata in sez.~\ref{sec:file_openat}.
+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}.
+
+
 
 
 \section{Il controllo di accesso ai file}
@@ -3807,25 +3849,28 @@ usano la stessa sintassi, effettuata in sez.~\ref{sec:file_openat}.
 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 disponibili
-  anche una serie di altri filesystem, come quelli di Windows e del Mac, che
-  non supportano queste caratteristiche.} In questa sezione ne esamineremo i
-concetti essenziali e le funzioni usate per gestirne i vari aspetti.
+  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}
 \label{sec:file_perm_overview}
 
-Ad ogni file Linux associa sempre l'utente che ne è proprietario (il
-cosiddetto \textit{owner}) ed un gruppo di appartenenza, secondo il meccanismo
-degli identificatori di utente e gruppo (\ids{UID} e \ids{GID}). Questi valori
-sono accessibili da programma tramite la funzione \func{stat}, e sono
-mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura
-\struct{stat} (si veda sez.~\ref{sec:file_stat}).\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 i permessi vengono assegnati in maniera fissa con un opzione in
-  fase di montaggio.}
+Ad ogni file Linux associa sempre, oltre ad un insieme di permessi, l'utente
+che ne è proprietario (il cosiddetto \textit{owner}) ed un gruppo di
+appartenenza, indicati dagli identificatori di utente e gruppo (\ids{UID} e
+\ids{GID}) di cui abbiamo già parlato in
+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}.
 
 Il controllo di accesso ai file segue un modello abbastanza semplice che
 prevede tre permessi fondamentali strutturati su tre livelli di accesso.
@@ -3833,10 +3878,11 @@ 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 \textit{mandatory access control} di SE-Linux.} 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:
+  sofisticati come il \itindex{Mandatory~Access~Control~(MAC)}
+  \textit{mandatory access control} di SE-Linux 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*}
 \item il permesso di lettura (indicato con la lettera \texttt{r}, dall'inglese
   \textit{read}).
@@ -3870,24 +3916,24 @@ 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 è
-riportato in fig.~\ref{fig:file_perm_bit}.
-
-Anche i permessi, come tutte le altre informazioni pertinenti al file, sono
-memorizzati \itindex{inode} nell'\textit{inode}; in particolare essi sono
-contenuti in alcuni bit del campo \var{st\_mode} della struttura \struct{stat}
-(si veda di nuovo fig.~\ref{fig:file_stat_struct}).
+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 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} sono riportate in
-tab.~\ref{tab:file_bit_perm}.
+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}.
 
 \begin{table}[htb]
   \centering
@@ -3924,41 +3970,52 @@ La prima regola è che per poter accedere ad un file attraverso il suo
 \textit{pathname} occorre il permesso di esecuzione in ciascuna delle
 directory che compongono il \textit{pathname}; lo stesso vale per aprire un
 file nella directory corrente (per la quale appunto serve il diritto di
-esecuzione).
-
-Per una directory infatti il permesso di esecuzione significa che essa può
-essere attraversata nella risoluzione del \textit{pathname}, ed è distinto dal
-permesso di lettura che invece implica che si può leggere il contenuto della
-directory.
+esecuzione). Per una directory infatti il permesso di esecuzione significa che
+essa può essere attraversata nella risoluzione del \textit{pathname}, e per
+questo viene anche chiamato permesso di attraversamento. Esso è sempre
+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 in una directory (se si hanno i
-permessi opportuni per il medesimo) ma non si potrà vederlo con \cmd{ls}
-(mentre per crearlo occorrerà anche il permesso di scrittura per la
-directory).
+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
+\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.
+il contenuto, lo stesso permesso è necessario per poter troncare il file o per
+aggiornare il suo tempo di ultima modifica al tempo corrente, ma non per
+modificare arbitrariamente quest'ultimo, operazione per la quale, come per
+buona parte delle modifiche effettuate sui metadati del file, occorre esserne
+i proprietari.
 
 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
+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), non è necessario nessun tipo di permesso per il file stesso (infatti
-esso non viene toccato, viene solo modificato il contenuto della directory,
-rimuovendo la voce che ad esso fa riferimento).
-
-Per poter eseguire un file (che sia un programma compilato od uno script di
-shell, od un altro tipo di file eseguibile riconosciuto dal kernel), occorre
-avere il permesso di esecuzione, inoltre solo i file regolari possono essere
-eseguiti.
+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
+vanno a modificare.
+
+Per poter eseguire un file, che sia un programma compilato od uno script di
+shell, od un altro tipo di file eseguibile riconosciuto dal kernel, occorre
+oltre al permesso di lettura per accedere al contenuto avere anche il permesso
+di esecuzione. Inoltre solo i file regolari possono essere eseguiti. Per i
+file di dispositivo i permessi validi sono solo quelli di lettura e scrittura,
+che corrispondono al poter eseguire dette operazioni sulla periferica
+sottostante. 
 
 I permessi per un collegamento simbolico sono ignorati, contano quelli del
 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
+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}
@@ -3986,36 +4043,79 @@ I passi attraverso i quali viene stabilito se il processo possiede il diritto
 di accesso sono i seguenti:
 \begin{enumerate*}
 \item Se l'\ids{UID} effettivo del processo è zero (corrispondente
-  all'amministratore) l'accesso è sempre garantito senza nessun ulteriore
-  controllo. Per questo motivo \textsl{root} ha piena libertà di accesso a
-  tutti i file.
+  all'amministratore) l'accesso è sempre garantito senza nessun controllo. Per
+  questo motivo l'amministratore ha piena libertà di accesso a tutti i file.
 \item Se l'\ids{UID} effettivo del processo è uguale all'\ids{UID} del
   proprietario del file (nel qual caso si dice che il processo è proprietario
   del file) allora:
   \begin{itemize*}
-  \item se il relativo\footnote{per relativo si intende il bit di user-read se
-      il processo vuole accedere in lettura, quello di user-write per
-      l'accesso in scrittura, ecc.} bit dei permessi d'accesso dell'utente è
-    impostato, l'accesso è consentito
-  \item altrimenti l'accesso è negato
+  \item se il relativo\footnote{per relativo si intende il bit di
+      \textit{user-read} se il processo vuole accedere in lettura, quello di
+      \textit{user-write} per l'accesso in scrittura, ecc.} bit dei permessi
+    d'accesso dell'utente è impostato, l'accesso è consentito;
+  \item altrimenti l'accesso è negato.
   \end{itemize*}
 \item Se il \ids{GID} effettivo del processo o uno dei \ids{GID} supplementari
-  dei processi corrispondono al \ids{GID} del file allora:
+  del processo corrispondono al \ids{GID} del file allora:
   \begin{itemize*}
   \item se il bit dei permessi d'accesso del gruppo è impostato, l'accesso è
-    consentito
-  \item altrimenti l'accesso è negato
+    consentito;
+  \item altrimenti l'accesso è negato.
   \end{itemize*}
 \item Se il bit dei permessi d'accesso per tutti gli altri è impostato,
   l'accesso è consentito, altrimenti l'accesso è negato.
 \end{enumerate*}
 
 Si tenga presente che questi passi vengono eseguiti esattamente in
-quest'ordine. Questo vuol dire che se un processo è il proprietario di un file,
-l'accesso è consentito o negato solo sulla base dei permessi per l'utente; i
-permessi per il gruppo non vengono neanche controllati. Lo stesso vale se il
-processo appartiene ad un gruppo appropriato, in questo caso i permessi per
-tutti gli altri non vengono controllati.
+quest'ordine. Questo vuol dire che se un processo è il proprietario di un
+file, l'accesso è consentito o negato solo sulla base dei permessi per
+l'utente; i permessi per il gruppo non vengono neanche controllati. Lo stesso
+vale se il processo appartiene ad un gruppo appropriato, in questo caso i
+permessi per tutti gli altri non vengono controllati. 
+
+Questo significa che se si è proprietari di un file ma non si ha il permesso
+di scrittura, non vi si potrà scrivere anche se questo fosse scrivibile per
+tutti gli altri. Permessi di questo tipo sono ovviamente poco ortodossi, e
+comunque, come vedremo in sez.~\ref{sec:file_perm_management}, il proprietario
+di un file può sempre modificarne i permessi, e riassegnarsi un eventuale
+permesso di scrittura mancante.
+
+\itindbeg{file~attributes} 
+
+A questi che sono i permessi ordinari si aggiungono, per i filesystem che
+supportano questa estensione, due permessi speciali mantenuti nei cosiddetti
+\textit{file attributes}, che si possono leggere ed impostare con i comandi
+\cmd{lsattr} e \cmd{chattr}.\footnote{per l'utilizzo di questi comandi e per
+  le spiegazioni riguardo tutti gli altri \textit{file attributes} si rimanda
+  alla sezione 1.4.4 di \cite{AGL}.}
+
+Il primo è il cosiddetto attributo di immutabilità (\textit{immutable},
+identificato dalla lettera \texttt{i}) che impedisce ogni modifica al file,
+\textit{inode} compreso. Questo significa non solo che non se ne può cambiare
+il contenuto, ma neanche nessuna delle sue proprietà, ed in particolare non si
+può modificare nei permessi o nei tempi o nel proprietario ed inoltre, visto
+che non se può modificare il \textit{link count}, non si può neanche
+cancellare, rinominare, o creare \textit{hard link} verso di esso.
+
+Il secondo è il cosiddetto attributo di \textit{append-only}, (identificato
+dalla lettera \texttt{a}) che consente soltanto la scrittura in coda al
+file. Il file cioè può essere soltanto esteso nel contenuto, ma i suoi
+metadati, a parte i tempi che però possono essere impostati al valore
+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 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}, 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}
+
 
 
 \subsection{I bit dei permessi speciali}
@@ -4038,22 +4138,26 @@ identificatori del gruppo \textit{effective} del nuovo processo al valore dei
 corrispondenti del gruppo \textit{real} del processo corrente, che normalmente
 corrispondono a quelli dell'utente con cui si è entrati nel sistema.
 
-Se però il file del programma (che ovviamente deve essere
-eseguibile\footnote{per motivi di sicurezza il kernel ignora i bit \acr{suid}
-  e \acr{sgid} per gli script eseguibili.}) ha il bit \acr{suid} impostato, il
-kernel assegnerà come \ids{UID} effettivo al nuovo processo l'\ids{UID} del
-proprietario del file al posto dell'\ids{UID} del processo originario.  Avere
-il bit \acr{sgid} impostato ha lo stesso effetto sul \ids{GID} effettivo del
-processo.
+Se però il file del programma, che ovviamente deve essere
+eseguibile,\footnote{anzi più precisamente un binario eseguibile: per motivi
+  di sicurezza il kernel ignora i bit \acr{suid} e \acr{sgid} per gli script
+  eseguibili.} ha il bit \acr{suid} impostato, il kernel assegnerà come
+\ids{UID} effettivo al nuovo processo l'\ids{UID} del proprietario del file al
+posto dell'\ids{UID} del processo originario.  Avere il bit \acr{sgid}
+impostato ha lo stesso effetto sul \ids{GID} effettivo del processo. É
+comunque possibile riconoscere questa situazione perché il cambiamento viene
+effettuato solo sugli identificativi del gruppo \textit{effective}, mentre
+quelli dei gruppi \textit{real} e \textit{saved} restano quelli dell'utente
+che ha eseguito il programma.
 
 I bit \acr{suid} e \acr{sgid} vengono usati per permettere agli utenti normali
-di usare programmi che richiedono privilegi speciali; l'esempio classico è il
+di usare programmi che richiedono privilegi speciali. L'esempio classico è il
 comando \cmd{passwd} che ha la necessità di modificare il file delle password,
 quest'ultimo ovviamente può essere scritto solo dall'amministratore, ma non è
 necessario chiamare l'amministratore per cambiare la propria password. Infatti
-il comando \cmd{passwd} appartiene a root ma ha il bit \acr{suid} impostato
-per cui quando viene lanciato da un utente normale parte con i privilegi di
-root.
+il comando \cmd{passwd} appartiene in genere all'utente \textit{root} ma ha il
+bit \acr{suid} impostato, per cui quando viene lanciato da un utente normale
+ottiene comunque  i privilegi di amministratore.
 
 Chiaramente avere un processo che ha privilegi superiori a quelli che avrebbe
 normalmente l'utente che lo ha lanciato comporta vari rischi, e questo tipo di
@@ -4062,14 +4166,15 @@ usati per guadagnare privilegi non consentiti (l'argomento è affrontato in
 dettaglio in sez.~\ref{sec:proc_perms}).
 
 La presenza dei bit \acr{suid} e \acr{sgid} su un file può essere rilevata con
-il comando \cmd{ls -l}, che visualizza una lettera \cmd{s} al posto della
-\cmd{x} in corrispondenza dei permessi di utente o gruppo. La stessa lettera
-\cmd{s} può essere usata nel comando \cmd{chmod} per impostare questi bit.
-Infine questi bit possono essere controllati all'interno di \var{st\_mode} con
-l'uso delle due costanti \const{S\_ISUID} e \const{S\_IGID}, i cui valori sono
-riportati in tab.~\ref{tab:file_mode_flags}.
-
-Gli stessi bit vengono ad assumere in significato completamente diverso per le
+il comando \cmd{ls -l}, che visualizza una lettera ``\cmd{s}'' al posto della
+``\cmd{x}'' in corrispondenza dei permessi di utente o gruppo. La stessa
+lettera ``\cmd{s}'' può essere usata nel comando \cmd{chmod} per impostare
+questi bit.  Infine questi bit possono essere controllati all'interno di
+\var{st\_mode} con l'uso delle due costanti \const{S\_ISUID} e
+\const{S\_IGID}, i cui valori sono riportati in
+tab.~\ref{tab:file_mode_flags}.
+
+Gli stessi bit vengono ad assumere un significato completamente diverso per le
 directory, normalmente infatti Linux usa la convenzione di SVr4 per indicare
 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
@@ -4101,7 +4206,7 @@ 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.
+``\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
@@ -4117,25 +4222,29 @@ impostato un file potrà essere rimosso dalla directory soltanto se l'utente ha
 il permesso di scrittura su di essa ed inoltre è vera una delle seguenti
 condizioni:
 \begin{itemize*}
-\item l'utente è proprietario del file
-\item l'utente è proprietario della directory
-\item l'utente è l'amministratore 
+\item l'utente è proprietario del file,
+\item l'utente è proprietario della directory,
+\item l'utente è l'amministratore.
 \end{itemize*}
-un classico esempio di directory che ha questo bit impostato è \file{/tmp}, i
-permessi infatti di solito sono i seguenti:
-\begin{verbatim}
-$ ls -ld /tmp
+
+Un classico esempio di directory che ha questo bit impostato è \file{/tmp}, i
+cui permessi infatti di solito sono i seguenti:
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ls -ld /tmp}
 drwxrwxrwt    6 root     root         1024 Aug 10 01:03 /tmp
-\end{verbatim}%$
+\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
-suggerisce il nome, è normalmente utilizzata per la creazione di file
-temporanei), ma solo l'utente che ha creato un certo file potrà cancellarlo o
+utente nel sistema può creare dei file in questa directory, che come
+suggerisce il nome è normalmente utilizzata per la creazione di file
+temporanei, ma solo l'utente che ha creato un certo file potrà cancellarlo o
 rinominarlo. In questo modo si evita che un utente possa, più o meno
 consapevolmente, cancellare i file temporanei creati degli altri utenti.
 
 \itindend{sticky~bit}
 
+
+
 \subsection{Le funzioni per la gestione dei permessi dei file}
 \label{sec:file_perm_management}
 
@@ -4147,7 +4256,8 @@ reale ed il \ids{GID} reale, vale a dire usando i valori di \ids{UID} e
 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 \funcd{access}, il cui prototipo è:
+Per far questo si può usare la funzione di sistema \funcd{access}, il cui
+prototipo è:
 
 \begin{funcproto}{
 \fhead{unistd.h}
@@ -4157,16 +4267,18 @@ Per far questo si può usare la funzione \funcd{access}, 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{EINVAL}] il valore di \param{mode} non è valido.
+  \begin{errlist} 
   \item[\errcode{EACCES}] l'accesso al file non è consentito, o non si ha il
     permesso di attraversare una delle directory di \param{pathname}.
+  \item[\errcode{EINVAL}] il valore di \param{mode} non è valido.
   \item[\errcode{EROFS}] si è richiesto l'accesso in scrittura per un file su
     un filesystem montato in sola lettura.
+  \item[\errcode{ETXTBSY}] si è richiesto l'accesso in scrittura per un
+    eseguibile binario correntemente in esecuzione.
   \end{errlist}
-  ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
-  \errval{ENOTDIR}, \errval{ELOOP}, \errval{EIO}
nel loro significato generico.}
+  ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
+  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR} nel loro
+  significato generico.}
 \end{funcproto}
 
 La funzione verifica i permessi di accesso, indicati da \param{mode}, per il
@@ -4179,12 +4291,15 @@ o anche direttamente \func{stat}. Nel caso in cui \param{pathname} si
 riferisca ad un collegamento simbolico, questo viene seguito ed il controllo è
 fatto sul file a cui esso fa riferimento.
 
-La funzione controlla solo i bit dei permessi di accesso, si ricordi che il
-fatto che una directory abbia permesso di scrittura non significa che ci si
-possa scrivere come in un file, e il fatto che un file abbia permesso di
-esecuzione non comporta che contenga un programma eseguibile. La funzione
-ritorna zero solo se tutte i permessi controllati sono disponibili, in caso
-contrario (o di errore) ritorna -1.
+La funzione controlla solo i bit dei permessi di accesso per \param{pathname},
+ma occorre poter risolvere quest'ultimo, e se non c'è il permesso di
+esecuzione per una qualunque delle sue componenti la funzione fallirà
+indipendentemente dai permessi del file.  Si tenga presente poi che il fatto
+che una directory abbia permesso di scrittura non significa che vi si possa
+scrivere come fosse un file, e che se un file ha il permesso di esecuzione non
+è detto che sia eseguibile. La funzione ha successo solo se tutti i permessi
+controllati sono disponibili.
+
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -4199,7 +4314,7 @@ contrario (o di errore) ritorna -1.
     \const{F\_OK} & Verifica l'esistenza del file. \\
     \hline
   \end{tabular}
-  \caption{Valori possibile per l'argomento \param{mode} della funzione 
+  \caption{Valori possibili per l'argomento \param{mode} della funzione 
     \func{access}.}
   \label{tab:file_access_mode_val}
 \end{table}
@@ -4207,14 +4322,20 @@ contrario (o di errore) ritorna -1.
 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.
-
-Del tutto analoghe a \func{access} sono le due funzioni \funcd{euidaccess} e
-\funcd{eaccess} che ripetono lo stesso controllo usando però gli
+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}.
+
+Del tutto analoghe a \func{access} sono le due funzioni \funcm{euidaccess} e
+\funcm{eaccess} che ripetono lo stesso controllo usando però gli
 identificatori del gruppo effettivo, verificando quindi le effettive capacità
 di accesso ad un file. Le funzioni hanno entrambe lo stesso
-prototipo\footnote{in realtà \func{eaccess} è solo un sinonimo di
-  \func{euidaccess} fornita per compatibilità con l'uso di questo nome in
+prototipo\footnote{in realtà \funcm{eaccess} è solo un sinonimo di
+  \funcm{euidaccess} fornita per compatibilità con l'uso di questo nome in
   altri sistemi.} che è del tutto identico a quello di \func{access}. Prendono
 anche gli stessi valori e restituiscono gli stessi risultati e gli stessi
 codici di errore.
@@ -4239,13 +4360,13 @@ filename e su un file descriptor, i loro prototipi sono:
   caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EPERM}] l'\ids{UID} effettivo non corrisponde a quello del
-    proprietario del file o non è zero.
+    proprietario del file o non si hanno i privilegi di amministratore.
   \item[\errcode{EROFS}] il file è su un filesystem in sola lettura.
   \end{errlist}
-  ed inoltre per entrambe \errval{EIO}, per  \func{chmod} \errval{EFAULT},
-  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR},
-  \errval{EACCES}, \errval{ELOOP}, per \func{fchmod} \errval{EBADF}
nel loro significato generico.}
+  ed inoltre per entrambe \errval{EIO}, per \func{chmod} \errval{EACCES},
+  \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT},
+  \errval{ENOMEM}, \errval{ENOTDIR}, per \func{fchmod} \errval{EBADF} nel loro
+  significato generico.}
 \end{funcproto}
 
 
@@ -4262,9 +4383,9 @@ file.
     \textbf{\param{mode}} & \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{S\_ISUID} & 04000 & Set user ID \itindex{suid~bit}.\\
-    \const{S\_ISGID} & 02000 & Set group ID \itindex{sgid~bit}.\\
-    \const{S\_ISVTX} & 01000 & Sticky bit \itindex{sticky~bit}.\\
+    \const{S\_ISUID} & 04000 & Set user ID \itindex{suid~bit} bit.\\
+    \const{S\_ISGID} & 02000 & Set group ID \itindex{sgid~bit} bit.\\
+    \const{S\_ISVTX} & 01000 & Sticky \itindex{sticky~bit} bit.\\
     \hline
     \const{S\_IRWXU} & 00700 & L'utente ha tutti i permessi.\\
     \const{S\_IRUSR} & 00400 & L'utente ha il permesso di lettura.\\
@@ -4288,12 +4409,13 @@ file.
 \end{table}
 
 Le costanti con cui specificare i singoli bit di \param{mode} sono riportate
-in tab.~\ref{tab:file_permission_const}. 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 si utilizzo dei bit illustrato in
+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
 fig.~\ref{fig:file_perm_bit}.
 
 Ad esempio i permessi standard assegnati ai nuovi file (lettura e scrittura
@@ -4312,20 +4434,20 @@ 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}
+\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
+  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).
-\end{enumerate}
+  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
@@ -4342,11 +4464,11 @@ un'eventuale modifica comporterà la perdita di questo privilegio.
 Le funzioni \func{chmod} e \func{fchmod} ci permettono di modificare i
 permessi di un file, resta però il problema di quali sono i permessi assegnati
 quando il file viene creato. Le funzioni dell'interfaccia nativa di Unix, come
-vedremo in sez.~\ref{sec:file_open}, permettono di indicare esplicitamente i
-permessi di creazione di un file, ma questo non è possibile per le funzioni
-dell'interfaccia standard ANSI C che non prevede l'esistenza di utenti e
-gruppi, ed inoltre il problema si pone anche per l'interfaccia nativa quando i
-permessi non vengono indicati esplicitamente. 
+vedremo in sez.~\ref{sec:file_open_close}, permettono di indicare
+esplicitamente i permessi di creazione di un file, ma questo non è possibile
+per le funzioni dell'interfaccia standard ANSI C che non prevede l'esistenza
+di utenti e gruppi, ed inoltre il problema si pone anche per l'interfaccia
+nativa quando i permessi non vengono indicati esplicitamente.
 
 \itindbeg{umask} 
 
@@ -4365,8 +4487,8 @@ nuovo file viene creato.\footnote{l'operazione viene fatta sempre: anche
   creazione che lo consentono, i permessi contenuti nella \textit{umask}
   verranno tolti.}
 
-La funzione che permette di impostare il valore di questa maschera di
-controllo è \funcd{umask}, ed il suo prototipo è:
+La funzione di sistema che permette di impostare il valore di questa maschera
+di controllo è \funcd{umask}, ed il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{stat.h}
@@ -4378,14 +4500,15 @@ controllo è \funcd{umask}, ed il suo prototipo è:
   previste condizioni di errore.}
 \end{funcproto}
 
-La funzione imposta maschera dei permessi dei bit al valore specificato
-da \param{mask} (di cui vengono presi solo i 9 bit meno significativi).  In
+La funzione imposta la maschera dei permessi dei bit al valore specificato
+da \param{mask}, di cui vengono presi solo i 9 bit meno significativi.  In
 genere si usa questa maschera per impostare un valore predefinito che escluda
-preventivamente alcuni permessi (usualmente quello di scrittura per il gruppo
-e gli altri, corrispondente ad un valore per \param{mask} pari a $022$).  In
-questo modo è possibile cancellare automaticamente i permessi non voluti.  Di
-norma questo valore viene impostato una volta per tutte al login a $022$, e
-gli utenti non hanno motivi per modificarlo.
+preventivamente alcuni permessi, il caso più comune è eliminare il permesso di
+scrittura per il gruppo e gli altri, corrispondente ad un valore
+per \param{mask} pari a $022$.  In questo modo è possibile cancellare
+automaticamente i permessi non voluti.  Di norma questo valore viene impostato
+una volta per tutte al login (a $022$ se non indicato altrimenti), e gli
+utenti non hanno motivi per modificarlo.
 
 \itindend{umask} 
 
@@ -4393,7 +4516,7 @@ gli 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
@@ -4404,43 +4527,50 @@ Lo standard POSIX prescrive che l'\ids{UID} del nuovo file corrisponda
 all'\ids{UID} effettivo del processo che lo crea; per il \ids{GID} invece
 prevede due diverse possibilità:
 \begin{itemize*}
-\item il \ids{GID} del file corrisponde al \ids{GID} effettivo del processo.
-\item il \ids{GID} del file corrisponde al \ids{GID} della directory in cui
-  esso è creato.
+\item che il \ids{GID} del file corrisponda al \ids{GID} effettivo del
+  processo.
+\item che il \ids{GID} del file corrisponda al \ids{GID} della directory in
+  cui esso è creato.
 \end{itemize*}
-in genere BSD usa sempre la seconda possibilità, che viene per questo chiamata
-semantica BSD. Linux invece segue quella che viene chiamata semantica SVr4; di
-norma cioè il nuovo file viene creato, seguendo la prima opzione, con il
-\ids{GID} del processo, se però la directory in cui viene creato il file ha il
-bit \acr{sgid} impostato allora viene usata la seconda opzione.
+
+In genere BSD usa sempre la seconda possibilità, che viene per questo chiamata
+semantica BSD. Linux invece segue normalmente quella che viene chiamata
+semantica SVr4: di norma un nuovo file viene creato, seguendo la prima
+opzione, con il \ids{GID} del processo, se però la directory in cui viene
+creato ha il bit \acr{sgid} impostato allora viene usata la seconda
+opzione. L'adozione di questa semantica però può essere controllata,
+all'interno di alcuni filesystem,\footnote{con il kernel 2.6.25 questi erano
+  \acr{ext2}, \acr{ext3}, \acr{ext4}, e XFS.}  con l'uso dell'opzione di
+montaggio \texttt{grpid}, che se attivata fa passare all'uso della semantica
+BSD.
 
 Usare la semantica BSD ha il vantaggio che il \ids{GID} viene sempre
 automaticamente propagato, restando coerente a quello della directory di
-partenza, in tutte le sotto-directory. 
-
-La semantica SVr4 offre la possibilità di scegliere, ma per ottenere lo stesso
-risultato di coerenza che si ha con BSD necessita che quando si creano nuove
-directory venga anche propagato anche il bit \acr{sgid}. Questo è il
-comportamento predefinito del comando \cmd{mkdir}, ed è in questo modo ad
-esempio che le varie distribuzioni assicurano che le sotto-directory create
-nella home di un utente restino sempre con il \ids{GID} del gruppo primario
-dello stesso.
+partenza, in tutte le sotto-directory. La semantica SVr4 offre la possibilità
+di scegliere, ma per ottenere lo stesso risultato di coerenza che si ha con
+quella di BSD necessita che quando si creano nuove directory venga propagato
+il bit \acr{sgid}. Questo è il comportamento predefinito del comando
+\cmd{mkdir}, ed è in questo modo ad esempio che le varie distribuzioni
+assicurano che le sotto-directory create nella home di un utente restino
+sempre con il \ids{GID} del gruppo primario dello stesso.
 
 La presenza del bit \acr{sgid} è inoltre molto comoda quando si hanno
-directory contenenti file condivisi all'intero di un gruppo in cui possono
+directory contenenti file condivisi da un gruppo di utenti in cui possono
 scrivere tutti i membri dello stesso, dato che assicura che i file che gli
-utenti vi creano appartengano sempre allo stesso gruppo. Questo non risolve
-però completamente i problemi di accesso da parte di altri utenti dello stesso
-gruppo, in quanto i permessi assegnati al gruppo potrebbero non essere
-sufficienti; in tal caso si deve aver cura di usare un valore di
-\itindex{umask} \textit{umask} che ne lasci di sufficienti.\footnote{in tal
-  caso si può assegnare agli utenti del gruppo una \textit{umask} di $002$,
-  anche se la soluzione migliore in questo caso è usare una ACL di default
-  (vedi sez.~\ref{sec:file_ACL}).}
-
-Come avviene nel caso dei permessi il sistema fornisce anche delle funzioni,
-\funcd{chown}, \funcd{fchown} e \funcd{lchown}, che permettono di cambiare sia
-l'utente che il gruppo a cui un file appartiene; i rispettivi prototipi sono:
+utenti vi creano appartengano allo gruppo stesso. Questo non risolve però
+completamente i problemi di accesso da parte di altri utenti dello stesso
+gruppo, in quanto di default i permessi assegnati al gruppo non sono
+sufficienti per un accesso in scrittura; in questo caso si deve aver cura di
+usare prima della creazione dei file un valore per \itindex{umask}
+\textit{umask} lasci il permesso di scrittura.\footnote{in tal caso si può
+  assegnare agli utenti del gruppo una \textit{umask} di $002$, anche se la
+  soluzione migliore in questo caso è usare una ACL di default (vedi
+  sez.~\ref{sec:file_ACL}).}
+
+Come avviene nel caso dei permessi esistono anche delle appropriate funzioni
+di sistema, \funcd{chown} \funcd{fchown} e \funcd{lchown}, che permettono di
+cambiare sia l'utente che il gruppo a cui un file appartiene; i rispettivi
+prototipi sono:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -4455,11 +4585,11 @@ l'utente che il gruppo a cui un file appartiene; i rispettivi prototipi sono:
   caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EPERM}] l'\ids{UID} effettivo non corrisponde a quello del
-    proprietario del file o non è zero, o utente e gruppo non sono validi
+    proprietario del file o non è zero, o utente e gruppo non sono validi.
   \end{errlist}
   ed inoltre per tutte \errval{EROFS} e \errval{EIO}, per \func{chown}
-  \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM},
-  \errval{ENOTDIR}, \errval{EACCES}, \errval{ELOOP}, per \func{fchown}
+  \errval{EACCES}, \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, per \func{fchown}
   \errval{EBADF} nel loro significato generico.}
 \end{funcproto}
 
@@ -4486,7 +4616,7 @@ rispetto allo standard POSIX è che specificando -1 come valore
 per \param{owner} e \param{group} i valori restano immutati.
 
 Quando queste funzioni sono chiamate con successo da un processo senza i
-privilegi di root entrambi i bit \itindex{suid~bit} \acr{suid} e
+privilegi di amministratore entrambi i bit \itindex{suid~bit} \acr{suid} e
 \itindex{sgid~bit} \acr{sgid} vengono cancellati. Questo non avviene per il
 bit \acr{sgid} nel caso in cui esso sia usato (in assenza del corrispondente
 permesso di esecuzione) per indicare che per il file è attivo il
@@ -4615,18 +4745,20 @@ informazioni siano estremamente ridotte.  Questo è dovuto al fatto che Unix
 origina negli anni '70, quando le risorse di calcolo e di spazio disco erano
 minime. Con il venir meno di queste restrizioni è incominciata ad emergere
 l'esigenza di poter associare ai file delle ulteriori informazioni astratte
-(quelli che vengono chiamati i \textsl{meta-dati}) che però non potevano
-trovare spazio nei dati classici mantenuti negli \itindex{inode}
+(quelli che abbiamo chiamato genericamente \textsl{metadati}) che però non
+potevano trovare spazio nei dati classici mantenuti negli \itindex{inode}
 \textit{inode}.
 
 Per risolvere questo problema alcuni sistemi unix-like (e fra questi anche
 Linux) hanno introdotto un meccanismo generico, detto \textit{Extended
-  Attributes} che consenta di associare delle informazioni ai singoli
-file.\footnote{l'uso più comune è quello della ACL, che tratteremo nella
-  prossima sezione.} Gli \textsl{attributi estesi} non sono altro che delle
-coppie nome/valore che sono associate permanentemente ad un oggetto sul
-filesystem, analoghi di quello che sono le variabili di ambiente (vedi
-sez.~\ref{sec:proc_environ}) per un processo.
+  Attributes} che consente di associare delle informazioni ulteriori ai
+singoli file.\footnote{essi ad esempio vengono usati per le ACL, che
+  tratteremo in sez.~\ref{sec:file_ACL} e le \itindex{file~capabilities}
+  \textit{file capabilities}, che vedremo in
+  sez.~\ref{sec:proc_capabilities}.} Gli \textsl{attributi estesi} non sono
+altro che delle coppie nome/valore che sono associate permanentemente ad un
+oggetto sul filesystem, analoghi di quello che sono le variabili di ambiente
+(vedi sez.~\ref{sec:proc_environ}) per un processo.
 
 Altri sistemi (come Solaris, MacOS e Windows) hanno adottato un meccanismo
 diverso in cui ad un file sono associati diversi flussi di dati, su cui
@@ -4652,9 +4784,9 @@ presenti solo sui vari \textsl{extN}, \textsl{ReiserFS}, \textsl{JFS},
 Inoltre a seconda della implementazione ci possono essere dei limiti sulla
 quantità di attributi che si possono utilizzare.\footnote{ad esempio nel caso
   di \textsl{ext2} ed \textsl{ext3} è richiesto che essi siano contenuti
-  all'interno di un singolo blocco (pertanto con dimensioni massime pari a
+  all'interno di un singolo bloccopertanto con dimensioni massime pari a
   1024, 2048 o 4096 byte a seconda delle dimensioni di quest'ultimo impostate
-  in fase di creazione del filesystem), mentre con \textsl{XFS} non ci sono
+  in fase di creazione del filesystem, mentre con \textsl{XFS} non ci sono
   limiti ed i dati vengono memorizzati in maniera diversa (nell'\textit{inode}
   stesso, in un blocco a parte, o in una struttura ad albero dedicata) per
   mantenerne la scalabilità.} Infine lo spazio utilizzato per mantenere gli
@@ -4676,7 +4808,7 @@ classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}.
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}{|l|p{12cm}|}
+  \begin{tabular}{|l|p{8cm}|}
     \hline
     \textbf{Nome} & \textbf{Descrizione} \\
     \hline
@@ -4711,14 +4843,14 @@ classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}.
 \end{table}
 
 
-Dato che uno degli usi degli \textit{Extended Attributes} è quello che li
-impiega per realizzare delle estensioni (come le
-\itindex{Access~Control~List~(ACL)} ACL, \index{SELinux} SELinux, ecc.) al
-tradizionale meccanismo dei controlli di accesso di Unix, l'accesso ai loro
-valori viene regolato in maniera diversa a seconda sia della loro classe sia
-di quali, fra le estensioni che li utilizzano, sono poste in uso. In
-particolare, per ciascuna delle classi riportate in
-tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
+Dato che uno degli usi degli \textit{Extended Attributes} è di impiegarli per
+realizzare delle estensioni (come le \itindex{Access~Control~List~(ACL)} ACL,
+\index{SELinux} SELinux, ecc.) al tradizionale meccanismo dei controlli di
+accesso di Unix, l'accesso ai loro valori viene regolato in maniera diversa a
+seconda sia della loro classe che di quali, fra le estensioni che li
+utilizzano, sono poste in uso. In particolare, per ciascuna delle classi
+riportate in tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti
+casi:
 \begin{basedescript}{\desclabelwidth{1.7cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{security}] L'accesso agli \textit{extended security attributes}
   dipende dalle politiche di sicurezza stabilite da loro stessi tramite
@@ -4787,7 +4919,7 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
   per evitare eventuali abusi, se una directory ha lo \itindex{sticky~bit}
   \textit{sticky bit} attivo sarà consentito scrivere i suoi \textit{extended
     user attributes} soltanto se si è proprietari della stessa, o si hanno i
-  privilegi amministrativi della capability \itindex{capabilities}
+  privilegi amministrativi della capacità \itindex{capabilities}
   \const{CAP\_FOWNER}.
 \end{basedescript}
 
@@ -4799,10 +4931,11 @@ installata a parte;\footnote{la versione corrente della libreria è
 esplicitamente l'uso della suddetta libreria invocando il compilatore con
 l'opzione \texttt{-lattr}.  
 
-Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni,
-\funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che consentono
-rispettivamente di richiedere gli attributi relativi a un file, a un
-collegamento simbolico e ad un file descriptor; i rispettivi prototipi sono:
+Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni
+di sistema, \funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che
+consentono rispettivamente di richiedere gli attributi relativi a un file, a
+un collegamento simbolico e ad un file descriptor; i rispettivi prototipi
+sono:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -4821,13 +4954,13 @@ collegamento simbolico e ad un file descriptor; i rispettivi prototipi sono:
   caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{ENOATTR}] l'attributo richiesto non esiste.
-  \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
-    non è sufficiente per contenere il risultato.
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
+  \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
+    non è sufficiente per contenere il risultato.
   \end{errlist}
   ed inoltre tutti gli errori delle analoghe della famiglia \func{stat} con lo
-  stesso significato ed in particolare \errcode{EPERM} se non si hanno i
+  stesso significato, ed in particolare \errcode{EPERM} se non si hanno i
   permessi di accesso all'attributo.}
 \end{funcproto}
 
@@ -4879,10 +5012,10 @@ collegamento simbolico o specificando un file descriptor; i loro prototipi sono:
 {Le funzioni ritornano un $0$ in caso di successo e $-1$ per un errore, nel qual
   caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{ENOATTR}] si è usato il flag \const{XATTR\_REPLACE} e
-    l'attributo richiesto non esiste.
   \item[\errcode{EEXIST}] si è usato il flag \const{XATTR\_CREATE} ma
     l'attributo esiste già.
+  \item[\errcode{ENOATTR}] si è usato il flag \const{XATTR\_REPLACE} e
+    l'attributo richiesto non esiste.
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
   \end{errlist}
@@ -4911,7 +5044,7 @@ modificato se è già presente, o creato se non c'è.
 
 Le funzioni finora illustrate permettono di leggere o scrivere gli attributi
 estesi, ma sarebbe altrettanto utile poter vedere quali sono gli attributi
-presenti; a questo provvedono le funzioni \funcd{listxattr},
+presenti; a questo provvedono le funzioni di sistema \funcd{listxattr},
 \funcd{llistxattr} e \funcd{flistxattr} i cui prototipi sono:
 
 \begin{funcproto}{
@@ -4927,10 +5060,10 @@ presenti; a questo provvedono le funzioni \funcd{listxattr},
   in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà
   uno dei valori:
   \begin{errlist}
-  \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
-    non è sufficiente per contenere il risultato.
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
+  \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
+    non è sufficiente per contenere il risultato.
   \end{errlist}
   ed inoltre tutti gli errori delle analoghe della famiglia \func{stat} con lo
   stesso significato ed in particolare \errcode{EPERM} se non si hanno i
@@ -4955,8 +5088,8 @@ valore di ritorno della funzione una stima della dimensione totale della lista
 usando per \param{size} un valore nullo. 
 
 Infine per rimuovere semplicemente un attributo esteso, si ha a disposizione
-un ultimo gruppo di funzioni: \funcd{removexattr}, \funcd{lremovexattr} e
-\funcd{fremovexattr}; i rispettivi prototipi sono:
+un ultimo gruppo di funzioni di sistema: \funcd{removexattr},
+\funcd{lremovexattr} e \funcd{fremovexattr}; i rispettivi prototipi sono:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -4979,12 +5112,13 @@ un ultimo gruppo di funzioni: \funcd{removexattr}, \funcd{lremovexattr} e
   permessi di accesso all'attributo.}
 \end{funcproto}
 
-Le tre funzioni rimuovono l'attributo esteso indicato dall'argomento
-\param{name} rispettivamente di un file, un collegamento simbolico o
-specificando un file descriptor, da specificare con il loro primo argomento.
-Anche in questo caso l'argomento \param{name} deve essere specificato con le
-modalità già illustrate in precedenza per le altre funzioni relative agli
-attributi estesi.
+Le tre funzioni rimuovono un attributo esteso operando rispettivamente su di
+un file, su un collegamento simbolico o un file descriptor, che vengono
+specificati dal valore passato con il loro primo argomento.  L'attributo da
+rimuovere deve essere 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.
 
 \itindend{Extended~Attributes}
 
@@ -5013,15 +5147,15 @@ creato un gruppo di lavoro il cui scopo era estendere lo standard POSIX 1003
 attraverso due nuovi insiemi di specifiche, la POSIX 1003.1e per l'interfaccia
 di programmazione e la POSIX 1003.2c per i comandi di shell.
 
-Gli obiettivi erano però forse troppo ambizioni, e nel gennaio del 1998 i
-finanziamenti vennero ritirati senza che si fosse arrivati alla definizione di
-uno standard, dato però che una parte della documentazione prodotta era di
-alta qualità venne deciso di rilasciare al pubblico la diciassettesima bozza
-del documento, quella che va sotto il nome di \textit{POSIX 1003.1e Draft 17},
-che è divenuta la base sulla quale si definiscono le cosiddette \textit{Posix
-  ACL}.
+Gli obiettivi del gruppo di lavoro erano però forse troppo ambizioni, e nel
+gennaio del 1998 i finanziamenti vennero ritirati senza che si fosse arrivati
+alla definizione dello standard richiesto. Dato però che una parte della
+documentazione prodotta era di alta qualità venne deciso di rilasciare al
+pubblico la diciassettesima bozza del documento, quella che va sotto il nome
+di \textit{POSIX 1003.1e Draft 17}, che è divenuta la base sulla quale si
+definiscono le cosiddette \textit{Posix ACL}.
 
-A differenza di altri sistemi (ad esempio FreeBSD) nel caso di Linux si è
+A differenza di altri sistemi, come ad esempio FreeBSD, nel caso di Linux si è
 scelto di realizzare le ACL attraverso l'uso degli
 \itindex{Extended~Attributes} \textit{Extended Attributes} (appena trattati in
 sez.~\ref{sec:file_xattr}), e fornire tutte le relative funzioni di gestione
@@ -5035,13 +5169,13 @@ Anche in questo caso le funzioni di questa libreria non fanno parte della
   installare con il pacchetto omonimo e con il collegato \texttt{libacl1-dev}
   per i file di sviluppo.}  pertanto se un programma le utilizza si dovrà
 indicare esplicitamente l'uso della libreria \texttt{libacl} invocando il
-compilatore con l'opzione \texttt{-lacl}. Si tenga presente inoltre che per
-poterle utilizzare le ACL devono essere attivate esplicitamente montando il
-filesystem\footnote{che deve supportarle, ma questo è ormai vero per
-  praticamente tutti i filesystem più comuni, con l'eccezione di NFS per il
-  quale esiste però un supporto sperimentale.} su cui le si vogliono
-utilizzare con l'opzione \texttt{acl} attiva. Dato che si tratta di una
-estensione è infatti opportuno utilizzarle soltanto laddove siano necessarie.
+compilatore con l'opzione \texttt{-lacl}. Si tenga presente inoltre che le ACL
+devono essere attivate esplicitamente montando il filesystem\footnote{che deve
+  supportarle, ma questo è ormai vero per praticamente tutti i filesystem più
+  comuni, con l'eccezione di NFS per il quale esiste però un supporto
+  sperimentale.} su cui le si vogliono utilizzare con l'opzione \texttt{acl}
+attiva. Dato che si tratta di una estensione è infatti opportuno utilizzarle
+soltanto laddove siano necessarie.
 
 Una ACL è composta da un insieme di voci, e ciascuna voce è a sua volta
 costituita da un \textsl{tipo}, da un eventuale
@@ -5049,11 +5183,11 @@ costituita da un \textsl{tipo}, da un eventuale
   tipo \const{ACL\_USER} e \const{ACL\_GROUP}.} e da un insieme di permessi.
 Ad ogni oggetto sul filesystem si può associare una ACL che ne governa i
 permessi di accesso, detta \textit{access ACL}.  Inoltre per le directory si
-può impostare una ACL aggiuntiva, detta \textit{default ACL}, che serve ad
+può impostare una ACL aggiuntiva, detta ``\textit{Default ACL}'', che serve ad
 indicare quale dovrà essere la ACL assegnata di default nella creazione di un
 file all'interno della directory stessa. Come avviene per i permessi le ACL
 possono essere impostate solo del proprietario del file, o da un processo con
-la capability \itindex{capabilities} \const{CAP\_FOWNER}.
+la capacità \itindex{capabilities} \const{CAP\_FOWNER}.
 
 \begin{table}[htb]
   \centering
@@ -5063,21 +5197,21 @@ la capability \itindex{capabilities} \const{CAP\_FOWNER}.
     \textbf{Tipo} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{ACL\_USER\_OBJ} & voce che contiene i diritti di accesso del
+    \const{ACL\_USER\_OBJ} & Voce che contiene i diritti di accesso del
                              proprietario del file.\\
-    \const{ACL\_USER}      & voce che contiene i diritti di accesso per
+    \const{ACL\_USER}      & Voce che contiene i diritti di accesso per
                              l'utente indicato dal rispettivo
                              qualificatore.\\  
-    \const{ACL\_GROUP\_OBJ}& voce che contiene i diritti di accesso del
+    \const{ACL\_GROUP\_OBJ}& Voce che contiene i diritti di accesso del
                              gruppo proprietario del file.\\
-    \const{ACL\_GROUP}     & voce che contiene i diritti di accesso per
+    \const{ACL\_GROUP}     & Voce che contiene i diritti di accesso per
                              il gruppo indicato dal rispettivo
                              qualificatore.\\
-    \const{ACL\_MASK}      & voce che contiene la maschera dei massimi
+    \const{ACL\_MASK}      & Voce che contiene la maschera dei massimi
                              permessi di accesso che possono essere garantiti
                              da voci del tipo \const{ACL\_USER},
                              \const{ACL\_GROUP} e \const{ACL\_GROUP\_OBJ}.\\
-    \const{ACL\_OTHER}     & voce che contiene i diritti di accesso di chi
+    \const{ACL\_OTHER}     & Voce che contiene i diritti di accesso di chi
                              non corrisponde a nessuna altra voce dell'ACL.\\
     \hline
   \end{tabular}
@@ -5095,50 +5229,55 @@ tipi.
 
 Una ACL può poi contenere un numero arbitrario di voci di tipo
 \const{ACL\_USER} e \const{ACL\_GROUP}, ciascuna delle quali indicherà i
-permessi assegnati all'utente e al gruppo indicato dal relativo qualificatore;
-ovviamente ciascuna di queste voci dovrà fare riferimento ad un utente o ad un
+permessi assegnati all'utente e al gruppo indicato dal relativo qualificatore.
+Ovviamente ciascuna di queste voci dovrà fare riferimento ad un utente o ad un
 gruppo diverso, e non corrispondenti a quelli proprietari del file. Inoltre se
-in una ACL esiste una voce di uno di questi due tipi è obbligatoria anche la
+in una ACL esiste una voce di uno di questi due tipi, è obbligatoria anche la
 presenza di una ed una sola voce di tipo \const{ACL\_MASK}, che negli altri
 casi è opzionale.
 
-Quest'ultimo tipo di voce contiene la maschera dei permessi che possono essere
-assegnati tramite voci di tipo \const{ACL\_USER}, \const{ACL\_GROUP} e
-\const{ACL\_GROUP\_OBJ}; se in una di queste voci si fosse specificato un
-permesso non presente in \const{ACL\_MASK} questo verrebbe ignorato. L'uso di
-una ACL di tipo \const{ACL\_MASK} è di particolare utilità quando essa
-associata ad una \textit{default ACL} su una directory, in quanto i permessi
-così specificati verranno ereditati da tutti i file creati nella stessa
-directory. Si ottiene così una sorta di \itindex{umask} \textit{umask}
-associata ad un oggetto sul filesystem piuttosto che a un processo.
+Una voce di tipo \const{ACL\_MASK} serve a mantenere la maschera dei permessi
+che possono essere assegnati tramite voci di tipo \const{ACL\_USER},
+\const{ACL\_GROUP} e \const{ACL\_GROUP\_OBJ}. Se in una di queste voci si
+fosse specificato un permesso non presente in \const{ACL\_MASK} questo
+verrebbe ignorato. L'uso di una ACL di tipo \const{ACL\_MASK} è di particolare
+utilità quando essa associata ad una \textit{Default ACL} su una directory, in
+quanto i permessi così specificati verranno ereditati da tutti i file creati
+nella stessa directory. Si ottiene così una sorta di \itindex{umask}
+\textit{umask} associata ad un oggetto sul filesystem piuttosto che a un
+processo.
 
 Dato che le ACL vengono a costituire una estensione dei permessi ordinari, uno
 dei problemi che si erano posti nella loro standardizzazione era appunto
 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\footnote{per permessi ordinari si
-  intende quelli mantenuti \itindex{inode} nell'\textit{inode}, che devono
-  restare dato che un filesystem può essere montato senza abilitare le ACL.} e
-viceversa. In realtà la mappatura è diretta solo per le voci
-\const{ACL\_USER\_OBJ} e \const{ACL\_OTHER}, nel caso di
-\const{ACL\_GROUP\_OBJ} questo vale soltanto se non è presente una voce di
-tipo \const{ACL\_MASK}, se invece questa è presente verranno tolti dai
-permessi di \const{ACL\_GROUP\_OBJ} tutti quelli non presenti in
-\const{ACL\_MASK}.\footnote{questo diverso comportamento a seconda delle
-  condizioni è stato introdotto dalla standardizzazione \textit{POSIX 1003.1e
-    Draft 17} per mantenere il comportamento invariato sui sistemi dotati di
-  ACL per tutte quelle applicazioni che sono conformi soltanto all'ordinario
-  standard \textit{POSIX 1003.1}.}
+riflesso sui permessi ordinari dei file e viceversa.\footnote{per permessi
+  ordinari si intende quelli mantenuti \itindex{inode} nell'\textit{inode},
+  che devono restare dato che un filesystem può essere montato senza abilitare
+  le ACL.}
+
+In realtà la mappatura è diretta solo per le voci \const{ACL\_USER\_OBJ} e
+\const{ACL\_OTHER}, nel caso di \const{ACL\_GROUP\_OBJ} questo vale soltanto
+se non è presente una voce di tipo \const{ACL\_MASK}, che è quanto avviene
+normalmente se non sono presenti ACL aggiuntive rispetto ai permessi
+ordinari. Se invece questa è presente verranno tolti dai permessi di
+\const{ACL\_GROUP\_OBJ} (cioè dai permessi per il gruppo proprietario del
+file) tutti quelli non presenti in \const{ACL\_MASK}.\footnote{questo diverso
+  comportamento a seconda delle condizioni è stato introdotto dalla
+  standardizzazione \textit{POSIX 1003.1e Draft 17} per mantenere il
+  comportamento invariato sui sistemi dotati di ACL per tutte quelle
+  applicazioni che sono conformi soltanto all'ordinario standard \textit{POSIX
+    1003.1}.}
 
 Un secondo aspetto dell'incidenza delle ACL sul comportamento del sistema è
 quello relativo alla creazione di nuovi file,\footnote{o oggetti sul
   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 contiene quel file.
+presenza di una \textit{Default ACL} sulla directory che andrà a contenerli.
 Se questa non c'è valgono le regole usuali illustrate in
 sez.~\ref{sec:file_perm_management}, per cui essi sono determinati dalla
 \itindex{umask} \textit{umask} del processo, e la sola differenza è che i
@@ -5148,23 +5287,27 @@ soltanto le tre corrispondenti voci di tipo \const{ACL\_USER\_OBJ},
 \const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER}.
 
 Se invece è presente una ACL di default sulla directory che contiene il nuovo
-file questa diventerà automaticamente la sua ACL di accesso, a meno di non
-aver indicato, nelle funzioni di creazione che lo consentono, uno specifico
-valore per i permessi ordinari;\footnote{tutte le funzioni citate in
-  precedenza supportano un argomento \var{mode} che indichi un insieme di
-  permessi iniziale.} in tal caso saranno eliminati dalle voci corrispondenti
-nella ACL tutti quelli non presenti in tale indicazione.
+file, essa diventerà automaticamente anche la ACL di accesso di quest'ultimo,
+a meno di non aver indicato, nelle funzioni di creazione che lo consentono,
+uno specifico valore per i permessi ordinari.\footnote{tutte le funzioni
+  citate in precedenza supportano un argomento \var{mode} che indichi un
+  insieme di permessi iniziale.} In tal caso saranno eliminati dalle voci
+corrispondenti che deriverebbero dalla ACL di default, tutti i permessi non
+presenti in tale indicazione.
 
 Dato che questa è la ragione che ha portato alla loro creazione, la principale
-modifica introdotta con la presenza della ACL è quella alle regole del
-controllo di accesso ai file illustrate in sez.~\ref{sec:file_perm_overview}.
-Come nel caso ordinario per il controllo vengono sempre utilizzati gli
-identificatori del gruppo \textit{effective} del processo, ma in presenza di
-ACL i passi attraverso i quali viene stabilito se esso ha diritto di accesso
-sono i seguenti:
-\begin{enumerate*}
-\item Se l'\ids{UID} del processo è nullo l'accesso è sempre garantito senza
-  nessun controllo.
+modifica introdotta nel sistema con la presenza della ACL è quella alle regole
+del controllo di accesso ai file che si sono illustrate in
+sez.~\ref{sec:file_perm_overview}.  Come nel caso ordinario per il controllo
+vengono sempre utilizzati gli identificatori del gruppo \textit{effective} del
+processo, ma in caso di presenza di una ACL sul file, i passi attraverso i
+quali viene stabilito se il processo ha il diritto di accesso sono i seguenti:
+\begin{enumerate}
+\item Se l'\ids{UID} del processo è nullo (se cioè si è l'amministratore)
+  l'accesso è sempre garantito senza nessun controllo.\footnote{più
+    precisamente se si devono avere le \itindex{capabilities} capacità
+    \const{CAP\_DAC\_OVERRIDE} per i file e \const{CAP\_DAC\_READ\_SEARCH} per
+    le directory, vedi sez.~\ref{sec:proc_capabilities}.}
 \item Se l'\ids{UID} del processo corrisponde al proprietario del file allora:
   \begin{itemize*}
   \item se la voce \const{ACL\_USER\_OBJ} contiene il permesso richiesto,
@@ -5199,7 +5342,7 @@ sono i seguenti:
   \end{itemize*}
 \item Se la voce \const{ACL\_USER\_OBJ} contiene il permesso richiesto,
   l'accesso è consentito, altrimenti l'accesso è negato.
-\end{enumerate*}
+\end{enumerate}
 
 I passi di controllo vengono eseguiti esattamente in questa sequenza, e la
 decisione viene presa non appena viene trovata una corrispondenza con gli
@@ -5216,79 +5359,87 @@ tutte le operazioni devono essere effettuate attraverso tramite questi tipi di
 dati, che incapsulano tutte le informazioni contenute nelle ACL. La prima di
 queste funzioni che prendiamo in esame è \funcd{acl\_init}, il cui prototipo
 è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{acl\_t acl\_init(int count)}
 
-  Inizializza un'area di lavoro per una ACL di \param{count} voci.
-  
-  \bodydesc{La funzione restituisce un puntatore all'area di lavoro in caso di
-    successo e \val{NULL} in caso di errore, nel qual caso \var{errno}
-    assumerà uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_init(int count)}
+\fdesc{Inizializza un'area di lavoro per una ACL.} 
+}
+
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] il valore di \param{count} è negativo.
   \item[\errcode{ENOMEM}] non c'è sufficiente memoria disponibile.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione alloca ed inizializza un'area di memoria che verrà usata per
 mantenere i dati di una ACL contenente fino ad un massimo di \param{count}
-voci. La funzione ritorna un valore di tipo \type{acl\_t}, da usare in tutte
-le altre funzioni che operano sulla ACL. La funzione si limita alla
-allocazione iniziale e non inserisce nessun valore nella ACL che resta vuota.
+voci. La funzione ritorna un valore di tipo \type{acl\_t} da usare in tutte le
+altre funzioni che operano sulla ACL. La funzione si limita alla allocazione
+iniziale e non inserisce nessun valore nella ACL che resta vuota. 
+
 Si tenga presente che pur essendo \type{acl\_t} un \index{tipo!opaco} tipo
 opaco che identifica ``\textsl{l'oggetto}'' ACL, il valore restituito dalla
 funzione non è altro che un puntatore all'area di memoria allocata per i dati
-richiesti; pertanto in caso di fallimento verrà restituito un puntatore nullo
-e si dovrà confrontare il valore di ritorno della funzione con
-``\code{(acl\_t) NULL}''.
+richiesti. Pertanto in caso di fallimento verrà restituito un puntatore nullo
+di tipo ``\code{(acl\_t) NULL}'' e si dovrà, in questa come in tutte le
+funzioni seguenti che restituiscono un oggetto di tipo \type{acl\_t},
+confrontare il valore di ritorno della funzione con \val{NULL}.\footnote{a
+  voler essere estremamente pignoli si dovrebbe usare ``\code{(acl\_t)
+    NULL}'', ma è sufficiente fare un confronto direttamente con \val{NULL}
+  essendo cura del compilatore fare le conversioni necessarie.}
 
 Una volta che si siano completate le operazioni sui dati di una ACL la memoria
-allocata dovrà essere liberata esplicitamente attraverso una chiamata alla
-funzione \funcd{acl\_free}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{int acl\_free(void * obj\_p)}
+allocata per un oggetto \type{acl\_t} dovrà essere liberata esplicitamente
+attraverso una chiamata alla funzione \funcd{acl\_free}, il cui prototipo è:
 
-  Disalloca la memoria riservata per i dati di una ACL.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ se
-    \param{obj\_p} non è un puntatore valido, nel qual caso \var{errno}
-    assumerà il valore \errcode{EINVAL} 
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{int acl\_free(void *obj\_p)}
+\fdesc{Disalloca la memoria riservata per una ACL.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} può assumere solo il valore:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] \param{obj\_p} non è valido.
+  \end{errlist}
 }
-\end{functions}
-
-Si noti come la funzione richieda come argomento un puntatore di tipo
-``\ctyp{void *}'', essa infatti può essere usata non solo per liberare la
-memoria allocata per i dati di una ACL, ma anche per quella usata per creare
-le stringhe di descrizione testuale delle ACL o per ottenere i valori dei
-qualificatori di una voce; pertanto a seconda dei casi occorrerà eseguire un
-\textit{cast} a ``\ctyp{void *}'' del tipo di dato di cui si vuole eseguire la
-disallocazione.  Si tenga presente poi che oltre a \func{acl\_init} esistono
-molte altre funzioni che possono allocare memoria per i dati delle ACL, è
-pertanto opportuno tenere traccia di tutte queste funzioni perché alla fine
-delle operazioni tutta la memoria allocata dovrà essere liberata con
+\end{funcproto}
+
+Si noti come la funzione usi come argomento un puntatore di tipo ``\ctyp{void
+  *}'', essa infatti può essere usata non solo per liberare la memoria
+allocata per i dati di una ACL, ma anche per quella usata per creare le
+stringhe di descrizione testuale delle ACL o per ottenere i valori dei
+qualificatori della una voce di una ACL. 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
 riferimento ad oggetto di tipo \type{acl\_t} questi potranno essere copiati
 con la funzione \funcd{acl\_dup}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{acl\_t acl\_dup(acl\_t acl)}
 
-  Crea una copia della ACL \param{acl}.
-  
-  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
-    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
-    \var{errno} assumerà uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_dup(acl\_t acl)}
+\fdesc{Crea una copia di una ACL.} 
+}
+
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo in
+  caso di successo e \val{NULL} per un errore, nel qual caso \var{errno}
+  assumerà assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] l'argomento \param{acl} non è un puntatore valido
     per una ACL.
@@ -5296,7 +5447,7 @@ con la funzione \funcd{acl\_dup}, il cui prototipo è:
     la copia.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione crea una copia dei dati della ACL indicata tramite l'argomento
 \param{acl}, allocando autonomamente tutto spazio necessario alla copia e
@@ -5310,20 +5461,19 @@ Se si deve creare una ACL manualmente l'uso di \func{acl\_init} è scomodo,
 dato che la funzione restituisce una ACL vuota, una alternativa allora è usare
 \funcd{acl\_from\_mode} che consente di creare una ACL a partire da un valore
 di permessi ordinari, il prototipo della funzione è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{acl\_t acl\_from\_mode(mode\_t mode)}
-
-  Crea una ACL inizializzata con i permessi di \param{mode}.
-  
-  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
-    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
-    \var{errno} assumerà il valore \errval{ENOMEM}.
 
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_from\_mode(mode\_t mode)}
+\fdesc{Crea una ACL inizializzata con i permessi ordinari.} 
 }
-\end{functions}
+
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} può assumere solo
+  il valore \errval{ENOMEM}.}
+\end{funcproto}
+
 
 La funzione restituisce una ACL inizializzata con le tre voci obbligatorie
 \const{ACL\_USER\_OBJ}, \const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER} già
@@ -5333,32 +5483,32 @@ 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:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{acl\_t acl\_get\_file(const char *path\_p, acl\_type\_t type)}
-  \funcdecl{acl\_t acl\_get\_fd(int fd)}
+\funcd{acl\_get\_fd} e \funcd{acl\_get\_file}, che consentono di leggere la
+ACL di un file; i rispettivi prototipi sono:
 
-  Ottiene i dati delle ACL di un file.
-  
-  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
-    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
-    \var{errno} assumerà uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_get\_file(const char *path\_p, acl\_type\_t type)}
+\fdecl{acl\_t acl\_get\_fd(int fd)}
+\fdesc{Leggono i dati delle ACL di un file.} 
+}
+
+{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}, ed \errval{EINVAL} per
-  valori scorretti di \param{type} e tutti i possibili errori per l'accesso ad
-  un file per \func{acl\_get\_file}.
-
-}
-\end{functions}
+  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
@@ -5378,8 +5528,8 @@ tab.~\ref{tab:acl_type}.
     \textbf{Tipo} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{ACL\_TYPE\_ACCESS} & indica una ACL di accesso.\\
-    \const{ACL\_TYPE\_DEFAULT}& indica una ACL di default.\\  
+    \const{ACL\_TYPE\_ACCESS} & Indica una ACL di accesso.\\
+    \const{ACL\_TYPE\_DEFAULT}& Indica una ACL di default.\\  
     \hline
   \end{tabular}
   \caption{Le costanti che identificano il tipo di ACL.}
@@ -5395,25 +5545,24 @@ verrà restituita una ACL vuota.
 
 Infine si potrà creare una ACL direttamente dalla sua rappresentazione
 testuale con la funzione  \funcd{acl\_from\_text}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{acl\_t acl\_from\_text(const char *buf\_p)}
 
-  Crea una ACL a partire dalla sua rappresentazione testuale.
-  
-  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
-    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
-    \var{errno} assumerà uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_from\_text(const char *buf\_p)}
+\fdesc{Crea una ACL a partire dalla sua rappresentazione testuale.} 
+}
+
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
+  dei valori:
   \begin{errlist}
-  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
   \item[\errcode{EINVAL}] la rappresentazione testuale all'indirizzo
     \param{buf\_p} non è valida.
-  \end{errlist}
-
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
+   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione prende come argomento il puntatore ad un buffer dove si è inserita
 la rappresentazione testuale della ACL che si vuole creare, la memoria
@@ -5427,17 +5576,27 @@ ordinari per la gestione delle ACL (\texttt{getfacl} e \texttt{setfacl}), che
 prevede due diverse forme, estesa e breve, entrambe supportate da
 \func{acl\_from\_text}. La forma estesa prevede che sia specificata una voce
 per riga, nella forma:
-\begin{Verbatim}
-  tipo:qualificatore:permessi
-\end{Verbatim}
+\begin{Example}
+tipo:qualificatore:permessi
+\end{Example}
 dove il tipo può essere uno fra \texttt{user}, \texttt{group}, \texttt{other}
 e \texttt{mask}. Il qualificatore è presente solo per \texttt{user} e
 \texttt{group} e indica l'utente o il gruppo a cui la voce si riferisce; i
 permessi sono espressi con una tripletta di lettere analoga a quella usata per
-i permessi dei file.\footnote{vale a dire \texttt{r} per il permesso di
-  lettura, \texttt{w} per il permesso di scrittura, \texttt{x} per il permesso
-  di esecuzione (scritti in quest'ordine) e \texttt{-} per l'assenza del
-  permesso.}
+i permessi dei file.\footnote{vale a dire ``\texttt{r}'' per il permesso di
+  lettura, ``\texttt{w}'' per il permesso di scrittura, ``\texttt{x}'' per il
+  permesso di esecuzione (scritti in quest'ordine) e ``\texttt{-}'' per
+  l'assenza del permesso.} 
+
+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
+lettura, è il seguente:
+\begin{Example}
+user::rw-
+group::r--
+other::r--
+user:piccardi: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
@@ -5457,58 +5616,56 @@ iniziali dei valori usati nella forma estesa (cioè ``\texttt{u}'',
 voce sono le stesse. In questo caso non sono consentiti permessi.
 
 Per la conversione inversa, che consente di ottenere la rappresentazione
-testuale di una ACL, sono invece disponibili due funzioni, la prima delle due,
-di uso più immediato, è \funcd{acl\_to\_text}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{char * acl\_to\_text(acl\_t acl, ssize\_t *len\_p)}
+testuale di una ACL, sono invece disponibili due funzioni. La prima delle due,
+di uso più immediato, è \funcd{acl\_to\_text}, ed il suo prototipo è:
 
-  Produce la rappresentazione testuale di una ACL.
-  
-  \bodydesc{La funzione restituisce il puntatore ad una stringa con la
-    rappresentazione testuale della ACL in caso di successo e
-    \code(acl\_t){NULL} in caso di errore, nel qual caso \var{errno} assumerà
-    uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{char *acl\_to\_text(acl\_t acl, ssize\_t *len\_p)}
+\fdesc{Produce la rappresentazione testuale di una ACL.} 
+}
+
+{La funzione ritorna il puntatore ad una stringa con la rappresentazione
+  testuale della ACL in caso di successo e \var{NULL} per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
   \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida.
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
   \end{errlist}
-
-}
-\end{functions}
+}  
+\end{funcproto}
 
 La funzione restituisce il puntatore ad una stringa terminata da NUL
 contenente la rappresentazione in forma estesa della ACL passata come
 argomento, ed alloca automaticamente la memoria necessaria. Questa dovrà poi
 essere liberata, quando non più necessaria, con \func{acl\_free}. Se
 nell'argomento \param{len\_p} si passa un valore puntatore ad una variabile
-intera in questa verrà restituita la dimensione della stringa con la
-rappresentazione testuale (non comprendente il carattere nullo finale). 
-
-La seconda funzione, \funcd{acl\_to\_any\_text}, permette di controllare con
-dovizia di dettagli la generazione della stringa contenente la
-rappresentazione testuale della ACL, il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{char * acl\_to\_any\_text(acl\_t acl, const char *prefix, char
-    separator, int options)}
+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.
 
-  Produce la rappresentazione testuale di una ACL.
+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 è:
 
-  \bodydesc{La funzione restituisce il puntatore ad una stringa con la
-    rappresentazione testuale della ACL in caso di successo e \val{NULL} in
-    caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{char *acl\_to\_any\_text(acl\_t acl, const char *prefix, char
+    separator, int options)}
+\fdesc{Produce la rappresentazione testuale di una ACL.} 
+}
+
+{La funzione ritorna il puntatore ad una stringa con la rappresentazione
+  testuale della ACL in caso di successo e \val{NULL} per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
   \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida.
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
   \end{errlist}
-
-}
-\end{functions}
+}  
+\end{funcproto}
 
 La funzione converte in formato testo la ACL indicata dall'argomento
 \param{acl}, usando il carattere \param{separator} come separatore delle
@@ -5531,23 +5688,23 @@ tab.~\ref{tab:acl_to_text_options}.
     \textbf{Tipo} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{TEXT\_ABBREVIATE}     & stampa le voci in forma abbreviata.\\
+    \const{TEXT\_ABBREVIATE}     & Stampa le voci in forma abbreviata.\\
     \const{TEXT\_NUMERIC\_IDS}   & non effettua la risoluzione numerica di
                                    \ids{UID} e \ids{GID}.\\
-    \const{TEXT\_SOME\_EFFECTIVE}& per ciascuna voce che contiene permessi che
+    \const{TEXT\_SOME\_EFFECTIVE}& Per ciascuna voce che contiene permessi che
                                    vengono eliminati dalla \const{ACL\_MASK}
                                    viene generato un commento con i permessi 
                                    effettivamente risultanti; il commento è
                                    separato con un tabulatore.\\
-    \const{TEXT\_ALL\_EFFECTIVE} & viene generato un commento con i permessi
+    \const{TEXT\_ALL\_EFFECTIVE} & Viene generato un commento con i permessi
                                    effettivi per ciascuna voce che contiene
                                    permessi citati nella \const{ACL\_MASK},
                                    anche quando questi non vengono modificati
                                    da essa; il commento è separato con un
                                    tabulatore.\\
-    \const{TEXT\_SMART\_INDENT}  & da usare in combinazione con le precedenti
-                                   \const{TEXT\_SOME\_EFFECTIVE} e
-                                   \const{TEXT\_ALL\_EFFECTIVE} aumenta
+    \const{TEXT\_SMART\_INDENT}  & Da usare in combinazione con le precedenti
+                                   opzioni \const{TEXT\_SOME\_EFFECTIVE} e
+                                   \const{TEXT\_ALL\_EFFECTIVE}, aumenta
                                    automaticamente il numero di spaziatori
                                    prima degli eventuali commenti in modo da
                                    mantenerli allineati.\\
@@ -5565,134 +5722,121 @@ disallocato con una chiamata ad \func{acl\_free}. Si tenga presente infine che
 questa funzione è una estensione specifica di Linux, e non è presente nella
 bozza dello standard POSIX.1e.
 
-Per quanto utile per la visualizzazione o l'impostazione da comando delle ACL,
-la forma testuale non è la più efficiente per poter memorizzare i dati
-relativi ad una ACL, ad esempio quando si vuole eseguirne una copia a scopo di
-archiviazione. Per questo è stata prevista la possibilità di utilizzare una
-rappresentazione delle ACL in una apposita forma binaria contigua e
-persistente. È così possibile copiare il valore di una ACL in un buffer e da
-questa rappresentazione tornare indietro e generare una ACL. 
+Per quanto utile per la visualizzazione o l'impostazione da riga di comando
+delle ACL, la forma testuale non è la più efficiente per poter memorizzare i
+dati relativi ad una ACL, ad esempio quando si vuole eseguirne una copia a
+scopo di archiviazione. Per questo è stata prevista la possibilità di
+utilizzare una rappresentazione delle ACL in una apposita forma binaria
+contigua e persistente. È così possibile copiare il valore di una ACL in un
+buffer e da questa rappresentazione tornare indietro e generare una ACL.
 
 Lo standard POSIX.1e prevede a tale scopo tre funzioni, la prima e più
 semplice è \funcd{acl\_size}, che consente di ottenere la dimensione che avrà
 la citata rappresentazione binaria, in modo da poter allocare per essa un
 buffer di dimensione sufficiente, il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{ssize\_t acl\_size(acl\_t acl)}
 
-  Determina la dimensione della rappresentazione binaria di una ACL.
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{ssize\_t acl\_size(acl\_t acl)}
+\fdesc{Determina la dimensione della rappresentazione binaria di una ACL.} 
+}
 
-  \bodydesc{La funzione restituisce in caso di successo la dimensione in byte
-    della rappresentazione binaria della ACL indicata da \param{acl} e $-1$ in
-    caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna la dimensione in byte della rappresentazione binaria
+  della ACL in caso di successo e $-1$ per un errore, nel qual caso
+  \var{errno} può assumere solo il valore:
   \begin{errlist}
   \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida.
   \end{errlist}
+}  
+\end{funcproto}
 
-}
-\end{functions}
-
-Prima di effettuare la lettura della rappresentazione binaria è sempre
-necessario allocare un buffer di dimensione sufficiente a contenerla, pertanto
-prima si dovrà far ricorso a \funcd{acl\_size} per ottenere tale dimensione e
-poi allocare il buffer con una delle funzioni di
-sez.~\ref{sec:proc_mem_alloc}. Una volta terminato l'uso della
-rappresentazione binaria, il buffer dovrà essere esplicitamente disallocato.
-
-La funzione che consente di leggere la rappresentazione binaria di una ACL è
-\funcd{acl\_copy\_ext}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{ssize\_t acl\_copy\_ext(void *buf\_p, acl\_t acl, ssize\_t size)}
+Ottenuta con \func{acl\_size} la dimensione per il buffer di una ACL lo si
+potrà allocare direttamente con \func{malloc}. La rappresentazione binaria di
+una ACL si potrà invece ottenere con la funzione \funcd{acl\_copy\_ext}, il
+cui prototipo è:
 
-  Ottiene la rappresentazione binaria di una ACL.
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/acl.h}
+\fdecl{ssize\_t acl\_copy\_ext(void *buf\_p, acl\_t acl, ssize\_t size)}
+\fdesc{Ottiene la rappresentazione binaria di una ACL.} 
+}
 
-  \bodydesc{La funzione restituisce in caso di successo la dimensione in byte
-    della rappresentazione binaria della ACL indicata da \param{acl} e $-1$ in
-    caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna la dimensione in byte della rappresentazione binaria
+  della ACL in caso di successo e $-1$ per un errore, nel qual caso
+  \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida o
     \param{size} è negativo o nullo.
   \item[\errcode{ERANGE}] il valore di \param{size} è più piccolo della
     dimensione della rappresentazione della ACL.
   \end{errlist}
+}  
+\end{funcproto}
 
-}
-\end{functions}
-
-La funzione salverà la rappresentazione binaria della ACL indicata da
-\param{acl} sul buffer posto all'indirizzo \param{buf\_p} e lungo \param{size}
-byte, 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 dalla rappresentazione
-binaria della stessa disponibile in un buffer si potrà usare la funzione 
-\funcd{acl\_copy\_int}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{ssize\_t acl\_copy\_int(const void *buf\_p)}
+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}.
 
-  Ripristina la rappresentazione binaria di una 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 è:
+
+\begin{funcproto}{
+\fhead{sys/types.h} 
+\fhead{sys/acl.h}
+\fdecl{acl\_t acl\_copy\_int(const void *buf\_p)}
+\fdesc{Ripristina la rappresentazione binaria di una ACL.} 
+}
 
-  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
-    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
-    \var{errno} assumerà uno dei valori:
+{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] il buffer all'indirizzo \param{buf\_p} non contiene
     una rappresentazione corretta di una ACL.
   \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare un oggetto
     \type{acl\_t} per la ACL richiesta.
   \end{errlist}
-
 }
-\end{functions}
+\end{funcproto}
 
-La funzione in caso di successo alloca autonomamente un oggetto di tipo
-\type{acl\_t} che viene restituito come valore di ritorno con il contenuto
-della ACL rappresentata dai dati contenuti nel buffer puntato da
-\param{buf\_p}. Si ricordi che come per le precedenti funzioni l'oggetto
-\type{acl\_t} dovrà essere disallocato esplicitamente al termine del suo
-utilizzo.
+La funzione alloca autonomamente un oggetto di tipo \type{acl\_t}, restituito
+come valore di ritorno, con il contenuto della ACL rappresentata dai dati del
+buffer puntato da \param{buf\_p}. Al solito l'oggetto \type{acl\_t} dovrà
+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 è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{int acl\_set\_file(const char *path, acl\_type\_t type, acl\_t
-    acl)}
 
-  Imposta una ACL su un file o una directory.
+\begin{funcproto}{
+\fhead{sys/types.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.} 
+}
 
-  \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EACCES}] o un generico errore di accesso a \param{path} o il
     valore di \param{type} specifica una ACL il cui tipo non può essere
     assegnato a \param{path}.
   \item[\errcode{EINVAL}] o \param{acl} non è una ACL valida, o \param{type}
-    ha in valore non corretto.
+    ha un valore non corretto.
   \item[\errcode{ENOSPC}] non c'è spazio disco sufficiente per contenere i
     dati aggiuntivi della ACL.
   \item[\errcode{ENOTSUP}] si è cercato di impostare una ACL su un file
     contenuto in un filesystem che non supporta le ACL.
   \end{errlist}
-  ed inoltre \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENAMETOOLONG},
-  \errval{EROFS}, \errval{EPERM}.
-}
-\end{functions}
+  ed inoltre \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR},
+  \errval{EPERM}, \errval{EROFS} nel loro significato generico.}
+\end{funcproto}
 
 La funzione consente di assegnare la ACL contenuta in \param{acl} al file o
 alla directory indicate dal \textit{pathname} \param{path}, mentre
@@ -5709,27 +5853,28 @@ vuota per cancellare la ACL di default associata a
   default, per i dettagli si ricorra alla pagina di manuale.}  La seconda
 funzione che consente di impostare una ACL è \funcd{acl\_set\_fd}, ed il suo
 prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/acl.h}
-  
-  \funcdecl{int acl\_set\_fd(int fd, acl\_t acl)}
 
-  Imposta una ACL su un file descriptor.
+\begin{funcproto}{
+\fhead{sys/types.h} 
+\fhead{sys/acl.h}
+\fdecl{int acl\_set\_fd(int fd, acl\_t acl)}
+\fdesc{Imposta una ACL su un file descriptor.} 
+}
 
-  \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EINVAL}] o \param{acl} non è una ACL valida, o \param{type}
-    ha in valore non corretto.
+  \item[\errcode{EINVAL}] o \param{acl} non è una ACL valida, o ha più voci di
+    quante se ne possono assegnare al file indicato da \param{fd}.
   \item[\errcode{ENOSPC}] non c'è spazio disco sufficiente per contenere i
     dati aggiuntivi della ACL.
   \item[\errcode{ENOTSUP}] si è cercato di impostare una ACL su un file
     contenuto in un filesystem che non supporta le ACL.
   \end{errlist}
-  ed inoltre \errval{EBADF}, \errval{EROFS}, \errval{EPERM}.
+  ed inoltre \errval{EBADF}, \errval{EPERM}, \errval{EROFS} nel loro
+  significato generico.
 }
-\end{functions}
+\end{funcproto}
 
 La funzione è del tutto è analoga a \funcd{acl\_set\_file} ma opera
 esclusivamente sui file identificati tramite un file descriptor. Non dovendo
@@ -5745,106 +5890,151 @@ voce direttamente con le funzioni previste dallo standard POSIX.1e.  Queste
 funzioni però sono alquanto macchinose da utilizzare per cui è molto più
 semplice operare direttamente sulla rappresentazione testuale. Questo è il
 motivo per non tratteremo nei dettagli dette funzioni, fornendone solo una
-descrizione sommaria; chi fosse interessato potrà ricorrere alle pagina di
+descrizione sommaria; chi fosse interessato potrà ricorrere alle pagine di
 manuale.
 
 Se si vuole operare direttamente sui contenuti di un oggetto di tipo
 \type{acl\_t} infatti occorre fare riferimento alle singole voci tramite gli
 opportuni puntatori di tipo \type{acl\_entry\_t}, che possono essere ottenuti
-dalla funzione \funcd{acl\_get\_entry} (per una voce esistente) o dalla
-funzione \funcd{acl\_create\_entry} per una voce da aggiungere. Nel caso della
+dalla funzione \funcm{acl\_get\_entry} (per una voce esistente) o dalla
+funzione \funcm{acl\_create\_entry} per una voce da aggiungere. Nel caso della
 prima funzione si potrà poi ripetere la lettura per ottenere i puntatori alle
 singole voci successive alla prima.
 
 Una volta ottenuti detti puntatori si potrà operare sui contenuti delle singole
-voci; con le funzioni \funcd{acl\_get\_tag\_type}, \funcd{acl\_get\_qualifier},
-\funcd{acl\_get\_permset} si potranno leggere rispettivamente tipo,
+voci; con le funzioni \funcm{acl\_get\_tag\_type}, \funcm{acl\_get\_qualifier},
+\funcm{acl\_get\_permset} si potranno leggere rispettivamente tipo,
 qualificatore e permessi mentre con le corrispondente funzioni
-\funcd{acl\_set\_tag\_type}, \funcd{acl\_set\_qualifier},
-\funcd{acl\_set\_permset} si possono impostare i valori; in entrambi i casi
+\funcm{acl\_set\_tag\_type}, \funcm{acl\_set\_qualifier},
+\funcm{acl\_set\_permset} si possono impostare i valori; in entrambi i casi
 vengono utilizzati tipi di dato ad hoc.\footnote{descritti nelle singole
   pagine di manuale.} Si possono poi copiare i valori di una voce da una ACL
-ad un altra con \funcd{acl\_copy\_entry} o eliminare una voce da una ACL con
-\funcd{acl\_delete\_entry}.
+ad un altra con \funcm{acl\_copy\_entry} o eliminare una voce da una ACL con
+\funcm{acl\_delete\_entry} 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.
+
+\begin{figure}[!htbp]
+  \footnotesize \centering
+  \begin{minipage}[c]{\codesamplewidth}
+    \includecodesample{listati/mygetfacl.c}
+  \end{minipage} 
+  \normalsize
+  \caption{Corpo principale del programma \texttt{mygetfacl.c}.}
+  \label{fig:proc_mygetfacl}
+\end{figure}
+
+La sezione principale del programma, da cui si è rimossa la sezione sulla
+gestione delle opzioni, è riportata in fig.~\ref{fig:proc_mygetfacl}. Il
+programma richiede un unico argomento (\texttt{\small 16-20}) che indica il
+file di cui si vuole leggere la ACL. Se questo è presente si usa
+(\texttt{\small 22}) la funzione \func{get\_acl\_file} per leggerne la ACL, e
+si controlla (\texttt{\small 23-26}) se l'operazione ha successo, uscendo con
+un messaggio di errore in caso contrario. 
+
+Ottenuta la ACL la si converte in formato testuale (\texttt{\small 27}) con la
+funzione \func{acl\_to\_text}, controllando di nuovo se l'operazione ha
+successo (\texttt{\small 28-31}) ed uscendo in caso contrario.  Si provvede
+infine a stampare la rappresentazione testuale (\texttt{\small 32}) e dopo
+aver liberato (\texttt{\small 33-34}) le risorse allocate automaticamente, si
+conclude l'esecuzione.
+
 
 \subsection{La gestione delle quote disco}
 \label{sec:disk_quota}
 
-Quella delle quote disco è una funzionalità introdotta inizialmente da BSD, e
+Quella delle quote disco è una funzionalità introdotta inizialmente da BSD e
 presente in Linux fino dai kernel dalla serie 2.0, che consente di porre dei
 tetti massimi al consumo delle risorse di un filesystem (spazio disco e
-\itindex{inode} \textit{inode}) da parte di utenti e gruppi. 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 tramite due distinte opzioni di
-montaggio, \texttt{usrquota} e \texttt{grpquota} che abilitano le quote
-rispettivamente per gli utenti e per i gruppi. Grazie a questo è possibile
-usare le limitazioni sulle quote solo sugli utenti o solo sui gruppi.
+\itindex{inode} \textit{inode}) da parte di utenti e gruppi.
+
+Dato che la funzionalità ha senso solo per i filesystem su cui si mantengono i
+dati degli utenti\footnote{in genere la si attiva sul filesystem che contiene
+  le \textit{home} degli utenti, dato che non avrebbe senso per i file di
+  sistema che in genere appartengono all'amministratore.} essa deve essere
+attivata esplicitamente. Questo si fa, per tutti i filesystem che le
+supportano, tramite due distinte opzioni di montaggio, \texttt{usrquota} e
+\texttt{grpquota} che abilitano le quote rispettivamente per gli utenti e per
+i gruppi. Così è possibile usare le limitazioni sulle quote o sugli utenti o
+sui gruppi o su entrambi.
 
 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
-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
+relativi al consumo delle risorse da parte degli utenti e dei gruppi, che a
+far rispettare i limiti imposti dal sistema, con la generazione di un errore
+di \errcode{EDQUOT} per tutte le operazioni sui file che porterebbero ad un
 superamento degli stessi. Si tenga presente che questi due compiti sono
-separati, il primo si attiva al montaggio del filesystem con le quote
-attivate, il secondo deve essere abilitato esplicitamente.
+separati, il primo si attiva al montaggio del filesystem con il supporto per
+le quote, il secondo deve essere abilitato esplicitamente.
 
 Per il mantenimento dei dati di consumo delle risorse vengono usati due file
-riservati (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.
-
-La funzione che consente di controllare tutti i vari aspetti della gestione
-delle quote è \funcd{quotactl}, ed il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/quota.h}
-  
-  \funcdecl{quotactl(int cmd, const char *dev, int id, caddr\_t addr)}
+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.} 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 \itindex{inode} \textit{inode}.
+
+La funzione di sistema che consente di controllare tutti i vari aspetti della
+gestione delle quote è \funcd{quotactl}, ed il suo prototipo è:
 
-  Esegue una operazione di controllo sulle quote disco.
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/quota.h}
+\fdecl{int quotactl(int cmd, const char *dev, int id, caddr\_t addr)}
+\fdesc{Esegue una operazione di controllo sulle quote disco.} 
+}
 
-  \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EACCES}] il file delle quote non è un file ordinario.
-  \item[\errcode{EBUSY}] si è richiesto \const{Q\_QUOTAON} ma le quote sono
+  \item[\errcode{EACCES}] si è richiesto \const{Q\_QUOTAON}, ma il file delle
+    quote indicato da \param{addr} non esiste o non è un file ordinario.
+  \item[\errcode{EBUSY}] si è richiesto \const{Q\_QUOTAON}, ma le quote sono
     già attive.
-  \item[\errcode{EFAULT}] l'indirizzo \param{addr} non è valido.
+  \item[\errcode{EFAULT}] \param{addr} non è un puntatore valido.
+  \item[\errcode{EINVAL}] o \param{cmd} non è un comando valido,
+    o il dispositivo \param{dev} non esiste.
   \item[\errcode{EIO}] errore di lettura/scrittura sul file delle quote.
   \item[\errcode{EMFILE}] non si può aprire il file delle quote avendo
     superato il limite sul numero di file aperti nel sistema. 
-  \item[\errcode{EINVAL}] o \param{cmd} non è un comando valido,
-    o il dispositivo \param{dev} non esiste.
-  \item[\errcode{ENODEV}] \param{dev} non corrisponde ad un \textit{mount
-      point} attivo.
+  \item[\errcode{ENODEV}] \param{dev} non corrisponde ad un
+    \itindex{mount~point} \textit{mount point} attivo.
   \item[\errcode{ENOPKG}] il kernel è stato compilato senza supporto per le
     quote. 
   \item[\errcode{ENOTBLK}] \param{dev} non è un dispositivo a blocchi.
@@ -5854,29 +6044,43 @@ delle quote è \funcd{quotactl}, ed il suo prototipo è:
     filesystem senza quote attivate.
   \end{errlist}
 }
-\end{functions}
-
-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
-stessa.
-
-Il tipo di operazione che si intende effettuare deve essere indicato tramite
-il primo argomento \param{cmd}, questo in genere viene specificato con
-l'ausilio della macro \macro{QCMD}:
-\begin{functions}
-  \funcdecl{int QCMD(subcmd,type)} Imposta il comando \param{subcmd} per il
-  tipo di quote (utente o gruppo) \param{type}.
-\end{functions}
-\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}.
+\end{funcproto}
+
+% TODO rivedere gli errori
+
+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 (specificati rispettivamente per
+\ids{UID} e \ids{GID}) su cui si vuole operare, 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.
+
+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)}
+\fdesc{Imposta il comando \param{subcmd} per il tipo di quote (utente o
+  gruppo) \param{type}.}
+} 
+\end{funcbox}
+}
 
+La macro consente di specificare, oltre al tipo di operazione, da indicare con
+l'argomento \param{subcmd} se questa deve applicarsi alle quote utente o alle
+quote gruppo. Questo viene indicato dall'argomento \param{type} che deve
+essere sempre definito ed assegnato ad uno fra i due valori \const{USRQUOTA} o
+\const{GRPQUOTA}.
 
 \begin{table}[htb]
   \centering
@@ -5949,50 +6153,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 \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.
+
+
+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.9\textwidth}
     \includestruct{listati/dqblk.h}
   \end{minipage} 
   \normalsize 
@@ -6000,16 +6185,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 \itindex{inode} \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 \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}|}
@@ -6045,43 +6240,61 @@ sia superato un \textit{soft limit}.
   \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 realizzazione delle quote disco ha visto diverse revisioni, con
+modifiche sia del formato delle stesse che dei nomi dei file utilizzate. 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
+    \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}
 
-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 
@@ -6158,11 +6371,11 @@ quote.\footnote{questi vengono passati come argomenti dalle funzioni mappate
 con \macro{QCMD} al comando \const{Q\_GETQUOTA} per ottenere i dati.
 
 La funzione viene eseguita all'interno di un condizionale (\texttt{\small
-  5--16}) che in caso di successo provvede a costruire (\texttt{\small 6--12})
+  5-16}) che in caso di successo provvede a costruire (\texttt{\small 6-12})
 opportunamente una risposta restituendo tramite la opportuna funzione di
 interfaccia un oggetto Python contenente i dati della struttura \struct{dqblk}
 relativi a uso corrente e limiti sia per i blocchi che per gli \itindex{inode} 
-\textit{inode}. In caso di errore (\texttt{\small 13--15}) si usa un'altra
+\textit{inode}. In caso di errore (\texttt{\small 13-15}) si usa un'altra
 funzione dell'interfaccia per passare il valore di \var{errno} come eccezione.
 
 \begin{figure}[!htbp]
@@ -6179,16 +6392,16 @@ riportata in fig.~\ref{fig:set_block_quota}, che prende gli stessi argomenti
 della precedente, con lo stesso significato, a cui si aggiungono i valori per
 il \textit{soft limit} e l'\textit{hard limit}. In questo caso occorrerà,
 prima di chiamare \func{quotactl}, inizializzare opportunamente
-(\texttt{\small 5--7}) i campi della struttura \struct{dqblk} che si vogliono
+(\texttt{\small 5-7}) i campi della struttura \struct{dqblk} che si vogliono
 utilizzare (quelli relativi ai limiti sui blocchi) e specificare gli stessi
 con \const{QIF\_BLIMITS} in \var{dq.dqb\_valid}. 
 
 Fatto questo la chiamata a \func{quotactl}, stavolta con il comando
 \const{Q\_SETQUOTA}, viene eseguita come in precedenza all'interno di un
-condizionale (\texttt{\small 9--14}). In questo caso non essendovi da
+condizionale (\texttt{\small 9-14}). In questo caso non essendovi da
 restituire nessun dato in caso di successo si usa (\texttt{\small 10}) una
 apposita funzione di uscita, mentre si restituisce come prima una eccezione
-con il valore di \var{errno} in caso di errore (\texttt{\small 12--13}).
+con il valore di \var{errno} in caso di errore (\texttt{\small 12-13}).
 
 
 \subsection{La gestione delle \textit{capabilities}}
@@ -6198,21 +6411,21 @@ con il valore di \var{errno} in caso di errore (\texttt{\small 12--13}).
 
 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
+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à.}
+misure potranno essere comunque rimosse.\footnote{nei casi elencati nella
+  precedente nota si potrà sempre rimontare il sistema in lettura-scrittura, o
+  togliere l'attributo 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
+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.
 
@@ -6222,8 +6435,10 @@ suddividere i vari privilegi tradizionalmente associati all'amministratore in
 un insieme di \textsl{capacità} distinte.  L'idea era che queste capacità
 potessero essere abilitate e disabilitate in maniera indipendente per ciascun
 processo con privilegi di amministratore, permettendo così una granularità
-molto più fine nella distribuzione degli stessi che evitasse la originaria
-situazione di ``\textsl{tutto o nulla}''.
+molto più fine nella distribuzione degli stessi che evitasse la situazione
+originaria di ``\textsl{tutto o nulla}''.
+
+\itindbeg{file~capabilities}
 
 Il meccanismo completo delle \textit{capabilities}\footnote{l'implementazione
   si rifà ad una bozza di quello che doveva diventare lo standard POSIX.1e,
@@ -6265,7 +6480,7 @@ in forma di tre diverse maschere binarie,\footnote{il kernel li mantiene, come
   \texttt{kernel\_cap\_t}; questo era, fino al kernel 2.6.25 definito come
   intero a 32 bit per un massimo di 32 \textit{capabilities} distinte,
   attualmente è stato aggiornato ad un vettore in grado di mantenerne fino a
-  64.}  in cui ciascun bit corrisponde ad una capacità diversa. 
+  64.} in cui ciascun bit corrisponde ad una capacità diversa.
 
 L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile
 per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui
@@ -6333,15 +6548,15 @@ 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
+\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}.}
+  occorre 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
@@ -6414,20 +6629,24 @@ ereditate senza modifiche attraverso una \func{fork} mentre, indicati 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}.
+formula espressa dal seguente pseudo-codice C:
+
+\includecodesnip{listati/cap-results.c}
+
+% \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}
+
+\noindent e si noti come in particolare il \textit{capabilities bounding set}
+non venga comunque modificato e resti 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}
 
@@ -6548,7 +6767,7 @@ non più modificabile \const{SECURE\_KEEP\_CAPS}, ed analogamente avviene con
 \const{SECURE\_NO\_SETUID\_FIXUP} e con \const{SECURE\_NOROOT\_LOCKED} per
 \const{SECURE\_NOROOT}.
 
-Per l'impostazione di questi flag sono stata predisposte due specifiche
+Per l'impostazione di questi flag sono state predisposte due specifiche
 operazioni di \func{prctl} (vedi sez.~\ref{sec:process_prctl}),
 \const{PR\_GET\_SECUREBITS}, che consente di ottenerne il valore, e
 \const{PR\_SET\_SECUREBITS}, che consente di modificarne il valore; per
@@ -6570,10 +6789,13 @@ 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}.
 
-% 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
+\itindend{file~capabilities}
+
+
+% NOTE per dati relativi al process capability bounding set, vedi:
+% http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
 
-% TODO capire cosa cambia con i patch vari, vedi
+% NOTE riferimenti ai vari cambiamenti vedi:
 % http://lwn.net/Articles/280279/  
 % http://lwn.net/Articles/256519/
 % http://lwn.net/Articles/211883/
@@ -6584,7 +6806,7 @@ breve descrizione ed il nome delle costanti che le identificano, è riportato
 in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa
   tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man
     capabilities}) e dalle definizioni in
-  \texttt{include/linux/capabilities.h}, è aggiornato al kernel 2.6.26.} la
+  \texttt{include/linux/capabilities.h}, è aggiornato al kernel 3.2.} la
 tabella è divisa in due parti, la prima riporta le \textit{capabilities}
 previste anche nella bozza dello standard POSIX1.e, la seconda quelle
 specifiche di Linux.  Come si può notare dalla tabella alcune
@@ -6595,7 +6817,7 @@ opportuno dettagliare maggiormente.
 \begin{table}[!h!btp]
   \centering
   \footnotesize
-  \begin{tabular}{|l|p{10.5cm}|}
+  \begin{tabular}{|l|p{10cm}|}
     \hline
     \textbf{Capacità}&\textbf{Descrizione}\\
     \hline
@@ -6603,28 +6825,28 @@ opportuno dettagliare maggiormente.
 %
 % POSIX-draft defined capabilities.
 %
-    \const{CAP\_AUDIT\_CONTROL}& La capacità di abilitare e disabilitare il
+    \const{CAP\_AUDIT\_CONTROL}& Abilitare e disabilitare il
                               controllo dell'auditing (dal kernel 2.6.11).\\ 
-    \const{CAP\_AUDIT\_WRITE}&La capacità di scrivere dati nel giornale di
+    \const{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
                               auditing del kernel (dal kernel 2.6.11).\\ 
     % TODO verificare questa roba dell'auditing
-    \const{CAP\_CHOWN}      & La capacità di cambiare proprietario e gruppo
+    \const{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare 
+                              la sospensione del sistema (dal kernel 3.5).\\ 
+    \const{CAP\_CHOWN}      & Cambiare proprietario e gruppo
                               proprietario di un file (vedi
                               sez.~\ref{sec:file_ownership_management}).\\
-    \const{CAP\_DAC\_OVERRIDE}& La capacità di evitare il controllo dei
+    \const{CAP\_DAC\_OVERRIDE}& 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
+                              file, (vedi sez.~\ref{sec:file_access_control}).\\
+    \const{CAP\_DAC\_READ\_SEARCH}& 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\_FOWNER}     & 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
+    \const{CAP\_FSETID}     & 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
@@ -6633,17 +6855,17 @@ opportuno dettagliare maggiormente.
                               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
+    \const{CAP\_KILL}       & Mandare segnali a qualunque
                               processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
-    \const{CAP\_SETFCAP}    & La capacità di impostare le
+    \const{CAP\_SETFCAP}    & Impostare le
                               \textit{capabilities} di un file (dal kernel
                               2.6.24).\\  
-    \const{CAP\_SETGID}     & La capacità di manipolare i group ID dei
+    \const{CAP\_SETGID}     & 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
+    \const{CAP\_SETUID}     & 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
@@ -6652,76 +6874,72 @@ opportuno dettagliare maggiormente.
 % Linux specific capabilities
 %
 \hline
-    \const{CAP\_IPC\_LOCK}  & La capacità di effettuare il \textit{memory
+    \const{CAP\_IPC\_LOCK}  & 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
+                              sez.~\ref{sec:file_memory_map}). \\ 
+% TODO verificare l'interazione con SHM_HUGETLB
+    \const{CAP\_IPC\_OWNER} & Evitare il controllo dei permessi
                               per le operazioni sugli oggetti di
                               intercomunicazione fra processi (vedi
                               sez.~\ref{sec:ipc_sysv}).\\  
-    \const{CAP\_LEASE}      & La capacità di creare dei \textit{file lease}
+    \const{CAP\_LEASE}      & 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} (se
-                              supportati).\\
-    \const{CAP\_MKNOD}      & La capacità di creare
-                              \index{file!di~dispositivo} file di dispositivo
-                              con \func{mknod} (vedi
+    \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi 
+                              \textit{immutable} e \itindex{append~mode}
+                              \textit{append-only} (vedi
+                              sez.~\ref{sec:file_perm_overview}) se
+                              supportati.\\
+    \const{CAP\_MKNOD}      & Creare \index{file!di~dispositivo} file di 
+                              dispositivo con \func{mknod} (vedi
                               sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\ 
-    \const{CAP\_NET\_ADMIN} & La capacità di eseguire alcune operazioni
+    \const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni
                               privilegiate sulla rete.\\
-    \const{CAP\_NET\_BIND\_SERVICE}& La capacità di porsi in ascolto
-                              su porte riservate (vedi
+    \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi 
                               sez.~\ref{sec:TCP_func_bind}).\\ 
-    \const{CAP\_NET\_BROADCAST}& La capacità di consentire l'uso di socket in
+    \const{CAP\_NET\_BROADCAST}& 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
+    \const{CAP\_NET\_RAW}   & Usare socket \texttt{RAW} e \texttt{PACKET}
+                              (vedi sez.~\ref{sec:sock_type}).\\ 
+    \const{CAP\_SETPCAP}    & Effettuare modifiche privilegiate alle
                               \textit{capabilities}.\\   
-    \const{CAP\_SYS\_ADMIN} & 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
+    \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\
+    \const{CAP\_SYS\_BOOT}  & Eseguire un riavvio del sistema (vedi
+                              sez.~\ref{sec:sys_reboot}).\\ 
+    \const{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi 
+                              sez.~\ref{sec:file_chroot}).\\
+    \const{CAP\_MAC\_ADMIN} & Amministrare il \textit{Mandatory
                                Access Control} di Smack (dal kernel 2.6.25).\\  
-    \const{CAP\_MAC\_OVERRIDE}& La capacità evitare il  \textit{Mandatory
+    \const{CAP\_MAC\_OVERRIDE}& 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\_MODULE}& Caricare e rimuovere moduli del kernel.\\ 
+    \const{CAP\_SYS\_NICE}  & Modificare le varie priorità dei processi (vedi 
+                              sez.~\ref{sec:proc_priority}).\\
+    \const{CAP\_SYS\_PACCT} & Usare le funzioni di \textit{accounting} dei 
+                              processi (vedi
+                              sez.~\ref{sec:sys_bsd_accounting}).\\  
     \const{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
                               \func{ptrace} (vedi 
                               sez.~\ref{sec:process_ptrace}).\\
-    \const{CAP\_SYS\_RAWIO} & La capacità di operare sulle porte
-                              di I/O con \func{ioperm} e \func{iopl} (vedi
+    \const{CAP\_SYS\_RAWIO} & Operare sulle porte di I/O con \func{ioperm} e
+                               \func{iopl} (vedi
                               sez.~\ref{sec:process_io_port}).\\
-    \const{CAP\_SYS\_RESOURCE}& 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
+    \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\ 
+    \const{CAP\_SYS\_TIME}  & Modificare il tempo di sistema (vedi 
+                              sez.~\ref{sec:sys_time}).\\ 
+    \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
+                              con la funzione \func{vhangup}.\\
+    \const{CAP\_SYSLOG}     & Gestire il buffer dei messaggi
                               del kernel, (vedi sez.~\ref{sec:sess_daemon}),
                               introdotta dal kernel 2.6.38 come capacità
                               separata da \const{CAP\_SYS\_ADMIN}.\\
-    \const{CAP\_WAKE\_ALARM}& La capacità di usare i timer di tipo
+    \const{CAP\_WAKE\_ALARM}& 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).\\  
@@ -6732,9 +6950,9 @@ opportuno dettagliare maggiormente.
 \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).}
+\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
@@ -6742,23 +6960,24 @@ 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 \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}.
+\textit{capabilities} presenti nel suo \textit{permitted set} su un qualunque
+altro processo. In realtà questo non è mai stato l'uso inteso nelle bozze
+dallo standard POSIX, ed inoltre, come si è già accennato, dato che questa
+capacità è sempre stata assente (a meno di specifiche ricompilazioni del
+kernel) nel \textit{capabilities bounding set} usato di default, essa non è
+neanche mai stata realmente disponibile.
+
+Con l'introduzione \itindex{file~capabilities} \textit{file capabilities} e
+il cambiamento del significato del \textit{capabilities bounding set} la
+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
@@ -6768,12 +6987,13 @@ operazioni;\footnote{vale a dire la richiesta che l'\ids{UID} effettivo del
   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
+impostazioni degli attributi dei file 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.
+sez.~\ref{sec:file_open_close} e sez.~\ref{sec:file_fcntl_ioctl}) senza
+restrizioni.
 
 Una seconda capacità che copre diverse operazioni, in questo caso riguardanti
 la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni
@@ -6823,34 +7043,37 @@ 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{functions}
-  \headdecl{sys/capability.h}
+tre insiemi illustrati in precedenza. Queste due funzioni di sistema sono
+\funcd{capget} e \funcd{capset} e costituiscono l'interfaccia di gestione
+basso livello; i loro rispettivi prototipi sono:
 
-  \funcdecl{int capget(cap\_user\_header\_t hdrp, cap\_user\_data\_t datap)}
-  Legge le \textit{capabilities}.
-
-  \funcdecl{int capset(cap\_user\_header\_t hdrp, const cap\_user\_data\_t
-    datap)} 
-  Imposta le \textit{capabilities}.
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int capget(cap\_user\_header\_t hdrp, cap\_user\_data\_t datap)}
+\fdesc{Legge le \textit{capabilities}.} 
+\fdecl{int capset(cap\_user\_header\_t hdrp, const cap\_user\_data\_t datap)} 
+\fdesc{Imposta le \textit{capabilities}.} 
+}
 
-  
-  \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 in caso
-    di errore, nel qual caso \var{errno} può assumere i valori:
-    \begin{errlist}
-    \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}. 
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
+  \begin{errlist}
+  \item[\errcode{EFAULT}] si è indicato un puntatore sbagliato o nullo
+    per \param{hdrp} o \param{datap} (quest'ultimo può essere nullo solo se si
+    usa \func{capget} per ottenere la versione delle \textit{capabilities}
+    usata dal kernel).
+  \item[\errcode{EINVAL}] si è specificato un valore non valido per uno dei
+    campi di \param{hdrp}, in particolare una versione non valida della
+    versione delle \textit{capabilities}.
+  \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}.
+  \item[\errcode{ESRCH}] si è fatto riferimento ad un processo inesistente.
   \end{errlist}
-  ed inoltre \errval{EFAULT} ed \errval{EINVAL}.
 }
-\end{functions}
+\end{funcproto}
 
 Queste due funzioni prendono come argomenti due tipi di dati dedicati,
 definiti come puntatori a due strutture specifiche di Linux, illustrate in
@@ -6862,20 +7085,10 @@ una istruzione \texttt{\#undef \_POSIX\_SOURCE} prima di includere
 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}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/cap_user_header_t.h}
   \end{minipage} 
   \normalsize 
@@ -6885,27 +7098,45 @@ utilizzare le interfacce di alto livello che vedremo più avanti.
   \label{fig:cap_kernel_struct}
 \end{figure}
 
+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.
+
 La struttura a cui deve puntare l'argomento \param{hdrp} serve ad indicare,
-tramite il campo \var{pid}, il PID del processo del quale si vogliono leggere
-o modificare le \textit{capabilities}. Con \func{capset} questo, se si usano
-le \textit{file capabilities}, può essere solo 0 o PID del processo chiamante,
-che sono equivalenti. Il campo \var{version} deve essere impostato al valore
-della versione delle stesse usata dal kernel (quello indicato da una delle
-costanti \texttt{\_LINUX\_CAPABILITY\_VERSION\_n} di
-fig.~\ref{fig:cap_kernel_struct}) altrimenti le funzioni ritorneranno con un
-errore di \errcode{EINVAL}, restituendo nel campo stesso il valore corretto
-della versione in uso. La versione due è comunque deprecata e non deve essere
-usata (il kernel stamperà un avviso). I valori delle \textit{capabilities}
-devono essere passati come maschere binarie;\footnote{e si tenga presente che
-  i valori di tab.~\ref{tab:proc_capabilities} non possono essere combinati
-  direttamente, indicando il numero progressivo del bit associato alla
-  relativa capacità.} con l'introduzione delle \textit{capabilities} a 64 bit
-inoltre il puntatore \param{datap} non può essere più considerato come
-relativo ad una singola struttura, ma ad un vettore di due
-strutture.\footnote{è questo cambio di significato che ha portato a deprecare
-  la versione 2, che con \func{capget} poteva portare ad un buffer overflow
-  per vecchie applicazioni che continuavano a considerare \param{datap} come
-  puntatore ad una singola struttura.}
+tramite il campo \var{pid}, il \ids{PID} del processo del quale si vogliono
+leggere o modificare le \textit{capabilities}. Con \func{capset} questo, se si
+usano le \itindex{file~capabilities} \textit{file capabilities}, può essere
+solo 0 o il \ids{PID} del processo chiamante, che sono equivalenti. Non
+tratteremo, essendo comunque di uso irrilevante, il caso in cui, in mancanza
+di tale supporto, la funzione può essere usata per modificare le
+\textit{capabilities} di altri processi, per il quale si rimanda, se
+interessati, alla lettura della pagina di manuale.
+
+Il campo \var{version} deve essere impostato al valore della versione delle
+stesse usata dal kernel (quello indicato da una delle costanti
+\texttt{\_LINUX\_CAPABILITY\_VERSION\_n} di fig.~\ref{fig:cap_kernel_struct})
+altrimenti le funzioni ritorneranno con un errore di \errcode{EINVAL},
+restituendo nel campo stesso il valore corretto della versione in uso. La
+versione due è comunque deprecata e non deve essere usata, ed il kernel
+stamperà un avviso se lo si fa.
+
+I valori delle \textit{capabilities} devono essere passati come maschere
+binarie;\footnote{e si tenga presente che i valori di
+  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
@@ -6914,109 +7145,143 @@ 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}.
+programma le utilizza si dovrà indicare esplicitamente al compilatore l'uso
+della suddetta libreria attraverso l'opzione \texttt{-lcap}.
+
+\itindbeg{capability~state}
+
+Le funzioni dell'interfaccia alle \textit{capabilities} definite nelle bozze
+dello standard 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 fanno riferimento soltanto ad oggetti di questo tipo.
+L'interfaccia pertanto non soltanto fornisce le funzioni per modificare e
+leggere le \textit{capabilities}, ma anche quelle per gestire i dati
+attraverso i \textit{capability state}, che presentano notevoli affinità,
+essendo parte di bozze dello stesso standard, con quelle già viste per le ACL.
 
 La prima funzione dell'interfaccia è quella che permette di inizializzare un
 \textit{capability state}, allocando al contempo la memoria necessaria per i
 relativi dati. La funzione è \funcd{cap\_init} ed il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{cap\_t cap\_init(void)} 
-  Crea ed inizializza un \textit{capability state}.
-  
-  \bodydesc{La funzione ritorna un valore non nullo in caso di successo e
-    \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà il
-    valore \errval{ENOMEM}.
-  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{cap\_t cap\_init(void)}
+\fdesc{Crea ed inizializza un \textit{capability state}.} 
+}
+
+{La funzione ritorna un \textit{capability state} 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{functions}
-  \headdecl{sys/capability.h}
+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}
 
-  \funcdecl{int cap\_free(void *obj\_d)} 
-  Disalloca la memoria allocata per i dati delle \textit{capabilities}.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà il valore \errval{EINVAL}.
-  }
-\end{functions}
 
 La funzione permette di liberare la memoria allocata dalle altre funzioni
 della libreria sia per un \textit{capability state}, nel qual caso l'argomento
-dovrà essere un dato di tipo \type{cap\_t}, che per una descrizione testuale
-dello stesso,\footnote{cioè quanto ottenuto tramite la funzione
-  \func{cap\_to\_text}.} nel qual caso l'argomento dovrà essere un dato di
-tipo \texttt{char *}. Per questo motivo l'argomento \param{obj\_d} è
-dichiarato come \texttt{void *} e deve sempre corrispondere ad un puntatore
-ottenuto tramite le altre funzioni della libreria, altrimenti la funzione
-fallirà con un errore di \errval{EINVAL}.
+sarà un dato di tipo \type{cap\_t}, che per una descrizione testuale dello
+stesso,\footnote{cioè quanto ottenuto tramite la funzione
+  \func{cap\_to\_text}.} nel qual caso l'argomento sarà un dato di tipo
+\texttt{char *}. Per questo motivo l'argomento \param{obj\_d} è dichiarato
+come \texttt{void *}, per evitare la necessità di eseguire un \textit{cast},
+ma dovrà comunque corrispondere ad un puntatore ottenuto tramite le altre
+funzioni della libreria, altrimenti la funzione fallirà con un errore di
+\errval{EINVAL}.
 
 Infine si può creare una copia di un \textit{capability state} ottenuto in
 precedenza tramite la funzione \funcd{cap\_dup}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{cap\_t cap\_dup(cap\_t cap\_p)} 
-  Duplica un \textit{capability state} restituendone una copia.
-  
-  \bodydesc{La funzione ritorna un valore non nullo in caso di successo e
-    \val{NULL} in caso di errore, nel qual caso \var{errno} potrà assumere i
-    valori \errval{ENOMEM} o \errval{EINVAL}.  
-  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{cap\_t cap\_dup(cap\_t cap\_p)}
+\fdesc{Duplica un \textit{capability state} restituendone una copia.} 
+}
+
+{La funzione ritorna un \textit{capability state} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà i 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. }
+potranno essere modificati in maniera completamente indipendente, ed alla fine
+delle operazioni si dovrà disallocare anche la copia, oltre all'originale.
 
 Una seconda classe di funzioni di servizio previste dall'interfaccia sono
 quelle per la gestione dei dati contenuti all'interno di un \textit{capability
   state}; la prima di queste è \funcd{cap\_clear}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{int cap\_clear(cap\_t cap\_p)} 
-  Inizializza un \textit{capability state} cancellando tutte le
-  \textit{capabilities}.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà il valore \errval{EINVAL}.
-  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int cap\_clear(cap\_t cap\_p)}
+\fdesc{Inizializza un \textit{capability state} cancellando tutte le
+  \textit{capabilities}.}
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.
+}
+\end{funcproto}
 
 La funzione si limita ad azzerare tutte le \textit{capabilities} presenti nel
 \textit{capability state} all'indirizzo \param{cap\_p} passato come argomento,
 restituendo uno stato \textsl{vuoto}, analogo a quello che si ottiene nella
 creazione con \func{cap\_init}.
 
+Una variante di \func{cap\_clear} è \funcd{cap\_clear\_flag} che cancella da
+un \textit{capability state} tutte le \textit{capabilities} di un certo
+insieme fra quelli elencati a 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{Cancella delle \textit{capabilities} da un \textit{capability state}.} 
+}
+
+{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
+da \param{cap\_p} con l'argomento \param{flag}. Questo deve essere specificato
+con una variabile di tipo \type{cap\_flag\_t} che può assumere
+esclusivamente\footnote{si tratta in effetti di un tipo enumerato, come si può
+  verificare dalla sua definizione che si trova in
+  \headfile{sys/capability.h}.} uno dei valori illustrati in
+tab.~\ref{tab:cap_set_identifier}.
+
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -7035,41 +7300,20 @@ creazione con \func{cap\_init}.
   \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{functions}
-  \headdecl{sys/capability.h}
-
-  \funcdecl{int cap\_clear\_flag(cap\_t cap\_p, cap\_flag\_t flag)} 
-
-  Cancella dal \textit{capability state} \param{cap\_p} tutte le
-  \textit{capabilities} dell'insieme \param{flag}.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà il valore \errval{EINVAL}.  }
-\end{functions}
-
-La funzione 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{functions}
-  \headdecl{sys/capability.h}
-  \funcdecl{int cap\_compare(cap\_t cap\_a, cap\_t cap\_b)}
 
-  Confronta due \textit{capability state}.
-  
-  \bodydesc{La funzione ritorna 0 se i \textit{capability state} sono identici
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int cap\_compare(cap\_t cap\_a, cap\_t cap\_b)}
+\fdesc{Confronta due \textit{capability state}.} 
+}
+
+{La funzione ritorna $0$ se i \textit{capability state} sono identici
     ed un valore positivo se differiscono, non sono previsti errori.}
-\end{functions}
+\end{funcproto}
+
 
 La funzione esegue un confronto fra i due \textit{capability state} passati
 come argomenti e ritorna in un valore intero il risultato, questo è nullo se
@@ -7077,12 +7321,19 @@ sono identici o positivo se vi sono delle differenze. Il valore di ritorno
 della funzione consente inoltre di per ottenere ulteriori informazioni su
 quali sono gli insiemi di \textit{capabilities} che risultano differenti.  Per
 questo si può infatti usare la apposita macro \macro{CAP\_DIFFERS}:
-\begin{functions}
-  \funcdecl{int CAP\_DIFFERS(value, flag)} Controlla lo stato di eventuali
-  differenze delle \textit{capabilities} nell'insieme \texttt{flag}.
-\end{functions}
 
-La macro che richiede si passi nell'argomento \texttt{value} il risultato
+{\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 richiede che 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
@@ -7093,33 +7344,33 @@ Per la gestione dei singoli valori delle \textit{capabilities} presenti in un
 \funcd{cap\_get\_flag} e \funcd{cap\_set\_flag}, che permettono
 rispettivamente di leggere o impostare il valore di una capacità all'interno
 in uno dei tre insiemi già citati; i rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{int cap\_get\_flag(cap\_t cap\_p, cap\_value\_t cap, cap\_flag\_t
-    flag, cap\_flag\_value\_t *value\_p)}
-  Legge il valore di una \textit{capability}.
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{int cap\_get\_flag(cap\_t cap\_p, cap\_value\_t cap, cap\_flag\_t 
+flag,\\
+\phantom{int cap\_get\_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, \\
+\phantom{int cap\_set\_flag(}cap\_flag\_value\_t value)} 
+\fdesc{Imposta il valore di una \textit{capability}.} 
+}
 
-  \funcdecl{int cap\_set\_flag(cap\_t cap\_p, cap\_flag\_t flag, int ncap,
-    cap\_value\_t *caps, cap\_flag\_value\_t value)} 
-  Imposta il valore di una \textit{capability}.
-  
-  \bodydesc{Le funzioni ritornano 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà il valore \errval{EINVAL}.
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.  
 }
-\end{functions}
+\end{funcproto}
 
 In entrambe le funzioni l'argomento \param{cap\_p} indica il puntatore al
 \textit{capability state} su cui operare, mentre l'argomento \param{flag}
 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
+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}.}
@@ -7148,7 +7399,8 @@ tab.~\ref{tab:cap_value_type}.
 
 La funzione \func{cap\_get\_flag} legge lo stato della capacità indicata
 dall'argomento \param{cap} all'interno dell'insieme indicato dall'argomento
-\param{flag} lo restituisce nella variabile puntata
+\param{flag} e lo restituisce come \itindex{value~result~argument}
+\textit{value result argument} nella variabile puntata
 dall'argomento \param{value\_p}. Questa deve essere di tipo
 \type{cap\_flag\_value\_t} ed assumerà uno dei valori di
 tab.~\ref{tab:cap_value_type}. La funzione consente pertanto di leggere solo
@@ -7159,7 +7411,7 @@ 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
+(cancellazione o attivazione) per le capacità elencate in \param{caps} viene
 indicato dall'argomento \param{value} sempre con i valori di
 tab.~\ref{tab:cap_value_type}.
 
@@ -7169,28 +7421,28 @@ di un \textit{capability state} e fornisce le opportune funzioni di
 gestione;\footnote{entrambe erano previste dalla bozza dello standard
   POSIX.1e.} la prima di queste, che consente di ottenere la rappresentazione
 testuale, è \funcd{cap\_to\_text}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{char * cap\_to\_text(cap\_t caps, ssize\_t * length\_p)}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{char *cap\_to\_text(cap\_t caps, ssize\_t *length\_p)}
+\fdesc{Genera una visualizzazione testuale delle \textit{capabilities}.} 
+}
 
-  Genera una visualizzazione testuale delle \textit{capabilities}.
-  
-  \bodydesc{La funzione ritorna un puntatore alla stringa con la descrizione
-    delle \textit{capabilities} in caso di successo e \val{NULL} in caso di
-    errore, nel qual caso \var{errno} può assumere i valori \errval{EINVAL} o
-    \errval{ENOMEM}.
-  }
-\end{functions}
+{La funzione ritorna un puntatore alla stringa con la descrizione delle
+  \textit{capabilities} in caso di successo e \val{NULL} per un errore, nel
+  qual caso \var{errno} assumerà i valori \errval{EINVAL} o \errval{ENOMEM}
+  nel loro significato generico.}
+\end{funcproto}
 
 La funzione ritorna l'indirizzo di una stringa contente la descrizione
 testuale del contenuto del \textit{capability state} \param{caps} passato come
 argomento, e, qualora l'argomento \param{length\_p} sia diverso da \val{NULL},
-restituisce nella variabile intera da questo puntata la lunghezza della
+restituisce come \itindex{value~result~argument} \textit{value result
+  argument} nella variabile intera da questo puntata la lunghezza della
 stringa. La stringa restituita viene allocata automaticamente dalla funzione e
 pertanto dovrà essere liberata con \func{cap\_free}.
 
-La rappresentazione testuale, che viene usata anche di programmi di gestione a
+La rappresentazione testuale, che viene usata anche dai 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
@@ -7205,7 +7457,7 @@ 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.
+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{=}''
@@ -7238,20 +7490,20 @@ 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{functions}
-  \headdecl{sys/capability.h}
+Viceversa per ottenere un \textit{capability state} dalla sua rappresentazione
+testuale si può usare la funzione \funcd{cap\_from\_text}, il cui prototipo è:
 
-  \funcdecl{cap\_t cap\_from\_text(const char *string)}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{cap\_t cap\_from\_text(const char *string)}
+\fdesc{Crea un \textit{capability state} dalla sua rappresentazione testuale.} 
+}
 
-  Crea un \textit{capability state} dalla sua rappresentazione testuale.
+{La funzione ritorna un \textit{capability state} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
+  \errval{EINVAL} o \errval{ENOMEM} nel loro significato generico.}
+\end{funcproto}
 
-  \bodydesc{La funzione ritorna un puntatore valido in caso di successo e
-    \val{NULL} in caso di errore, nel qual caso \var{errno} può assumere i
-    valori \errval{EINVAL} o \errval{ENOMEM}.}
-\end{functions}
 
 La funzione restituisce il puntatore ad un \textit{capability state}
 inizializzato con i valori indicati nella stringa \param{string} che ne
@@ -7264,25 +7516,31 @@ convertire i valori delle costanti di tab.~\ref{tab:proc_capabilities} nelle
 stringhe usate nelle rispettive rappresentazioni e viceversa. Le due funzioni,
 \funcd{cap\_to\_name} e \funcd{cap\_from\_name}, sono estensioni specifiche di
 Linux ed i rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{char * cap\_to\_name(cap\_value\_t cap)}
-  \funcdecl{int cap\_from\_name(const char *name, cap\_value\_t *cap\_p)}
-  Convertono le \textit{capabilities} dalle costanti alla rappresentazione
-  testuale e viceversa.
-  
-  \bodydesc{La funzione \func{cap\_to\_name} ritorna un valore diverso da
-    \val{NULL} in caso di successo e \val{NULL} in caso di errore, mentre
-    \func{cap\_to\_name} ritorna rispettivamente 0 e $-1$; per entrambe in
-    caso di errore \var{errno} può assumere i valori \errval{EINVAL} o
-    \errval{ENOMEM}.  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{char *cap\_to\_name(cap\_value\_t cap)}
+\fdesc{Converte il valore numerico di una \textit{capabilities} alla sua
+  rappresentazione testuale.} 
+\fdecl{int cap\_from\_name(const char *name, cap\_value\_t *cap\_p)}
+
+\fdesc{Converte la rappresentazione testuale di una \textit{capabilities} al
+  suo valore numerico.} 
+}
+
+{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$ per un errore, per entrambe in caso di errore
+  \var{errno} assumerà i valori \errval{EINVAL} o \errval{ENOMEM} nel loro
+  significato generico.  
+}
+\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
+da \param{cap\_p}, come \itindex{value~result~argument} \textit{value result
+  argument}, il valore della capacità rappresentata dalla
 stringa \param{name}.
 
 Fin quei abbiamo trattato solo le funzioni di servizio relative alla
@@ -7291,16 +7549,18 @@ l'interfaccia di gestione prevede però anche le funzioni per trattare le
 \textit{capabilities} presenti nei processi. La prima di queste funzioni è
 \funcd{cap\_get\_proc} che consente la lettura delle \textit{capabilities} del
 processo corrente, il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{cap\_t cap\_get\_proc(void)}
-  Legge le \textit{capabilities} del processo corrente.
-  
-  \bodydesc{La funzione ritorna un valore diverso da \val{NULL} in caso di
-    successo e \val{NULL} in caso di errore, nel qual caso \var{errno} può
-    assumere i valori \errval{EINVAL}, \errval{EPERM} o \errval{ENOMEM}.  }
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{cap\_t cap\_get\_proc(void)}
+\fdesc{Legge le \textit{capabilities} del processo corrente.} 
+}
+
+{La funzione ritorna un \textit{capability state} 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
@@ -7309,67 +7569,81 @@ 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
+specifico occorre usare la funzione \funcd{cap\_get\_pid}, 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{functions}
-  \headdecl{sys/capability.h}
 
-  \funcdecl{int capgetp(pid\_t pid, cap\_t cap\_d)}
-  Legge le \textit{capabilities} del processo indicato da \param{pid}.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} può assumere i valori \errval{EINVAL},
-    \errval{EPERM} o \errval{ENOMEM}.  
-  }
-\end{functions}
-%TODO controllare e correggere i codici di errore!!!
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\fdecl{cap\_t cap\_get\_pid(pid\_t pid)}
+\fdesc{Legge le \textit{capabilities} di un processo.} 
+}
+
+{La funzione ritorna un \textit{capability state} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
+  \errval{ESRCH} o \errval{ENOMEM} nel loro significato generico.  }
+\end{funcproto}
 
 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}
+con l'argomento \param{pid}, e restituisce il risultato tramite il puntatore
+ad un \textit{capability state} contenente tutti i dati che provvede ad
+allocare autonomamente e che al solito deve essere disallocato con
+\func{cap\_free}. Qualora il processo indicato non esista si avrà un errore di
+\errval{ESRCH}. Gli stessi valori possono essere letti direttamente nel
+filesystem \textit{proc}, nei file \texttt{/proc/<pid>/status}; ad esempio per
+\texttt{init} si otterrà qualcosa del tipo:
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{cat /proc/1/status}
 ...
 CapInh: 0000000000000000
 CapPrm: 00000000fffffeff
 CapEff: 00000000fffffeff  
 ...
-\end{Verbatim}
+\end{Console}
+%$
 
-Infine per impostare le \textit{capabilities} del processo corrente (non
-esiste una funzione che permetta di cambiare le \textit{capabilities} di un
-altro processo) si deve usare la funzione \funcd{cap\_set\_proc}, il cui
-prototipo è:
-\begin{functions}
-  \headdecl{sys/capability.h}
+\itindend{capability~state}
 
-  \funcdecl{int cap\_set\_proc(cap\_t cap\_p)}
-  Imposta le \textit{capabilities} del processo corrente.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} può assumere i valori \errval{EINVAL},
-    \errval{EPERM} o \errval{ENOMEM}.  
-  }
-\end{functions}
+Infine per impostare le \textit{capabilities} del processo corrente (nella
+bozza dello standard POSIX.1e non esiste una funzione che permetta di cambiare
+le \textit{capabilities} di un altro processo) si deve usare la funzione
+\funcd{cap\_set\_proc}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/capability.h}
+\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:
+  \begin{errlist}
+  \item[\errcode{EPERM}] si è cercato di attivare una capacità non permessa.
+  \end{errlist} ed inoltre \errval{EINVAL} nel suo 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).
+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).
+
+Oltre a queste funzioni su Linux sono presenti due ulteriori funzioni,
+\funcm{capgetp} e \funcm{capsetp}, che svolgono un compito analogo. Queste
+funzioni risalgono alla implementazione iniziale delle \textit{capabilities}
+ed in particolare \funcm{capsetp} consentirebbe anche, come possibile in quel
+caso, di cambiare le capacità di un altro processo. Le due funzioni oggi sono
+deprecate e pertanto eviteremo di trattarle, per chi fosse interessato si
+rimanda alla lettura della loro pagina di manuale.
 
 Come esempio di utilizzo di queste funzioni nei sorgenti allegati alla guida
 si è distribuito il programma \texttt{getcap.c}, che consente di leggere le
@@ -7377,7 +7651,7 @@ si è distribuito il programma \texttt{getcap.c}, che consente di leggere le
   quando lo si lancia, il che può sembrare inutile, ma serve a mostrarci quali
   sono le \textit{capabilities} standard che ottiene un processo lanciato
   dalla riga di comando.} o tramite l'opzione \texttt{-p}, quelle di un
-processo qualunque il cui pid viene passato come parametro dell'opzione.
+processo qualunque il cui \ids{PID} viene passato come parametro dell'opzione.
 
 \begin{figure}[!htbp]
   \footnotesize \centering
@@ -7392,17 +7666,16 @@ processo qualunque il cui pid viene passato come parametro dell'opzione.
 La sezione principale del programma è riportata in fig.~\ref{fig:proc_getcap},
 e si basa su una condizione sulla variabile \var{pid} che se si è usato
 l'opzione \texttt{-p} è impostata (nella sezione di gestione delle opzioni,
-che si è tralasciata) al valore del \textsl{pid} del processo di cui si vuole
+che si è tralasciata) al valore del \ids{PID} del processo di cui si vuole
 leggere le \textit{capabilities} e nulla altrimenti. Nel primo caso
-(\texttt{\small 1--6}) si utilizza 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
+(\texttt{\small 1-6}) si utilizza (\texttt{\small 2}) \func{cap\_get\_proc}
+per ottenere lo stato delle capacità del processo, nel secondo (\texttt{\small
+  7-13}) si usa invece \func{cap\_get\_pid} (\texttt{\small 8}) per leggere
+il valore delle capacità del processo indicato.
+
+Il passo successivo è utilizzare (\texttt{\small 15}) \func{cap\_to\_text} per
+tradurre in una stringa lo stato, e poi (\texttt{\small 16}) stamparlo; infine
+(\texttt{\small 18-19}) si libera la memoria allocata dalle precedenti
 funzioni con \func{cap\_free} per poi ritornare dal ciclo principale della
 funzione.
 
@@ -7416,105 +7689,121 @@ funzione.
 \subsection{La gestione dei {chroot}}
 \label{sec:file_chroot}
 
-% TODO introdurre nuova sezione sulle funzionalità di sicurezza avanzate, con
-% dentro chroot SELinux e AppArmor, Tomoyo, Smack, cgroup o che altro ???
+% TODO: valutare se introdurre una nuova sezione sulle funzionalità di
+% sicurezza avanzate, con dentro chroot SELinux e AppArmor, Tomoyo, Smack,
+% cgroup o altro
+
+% TODO: trattare la funzione setns e i namespace file descriptors (vedi
+% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0, altre
+% informazioni su setns qui: http://lwn.net/Articles/532748/
+% http://lwn.net/Articles/531498/
+
+
+% TODO: spostare chroot e le funzioni affini relative ai container da qualche
+% parte diversa se è il caso. 
 
-% inserire setns (introdotta con il 3.0, vedi http://lwn.net/Articles/407495/)
-% e le funzionalità di isolamento dei container
 
 Benché non abbia niente a che fare con permessi, utenti e gruppi, la funzione
 \func{chroot} viene usata spesso per restringere le capacità di accesso di un
 programma ad una sezione limitata del filesystem, per cui ne parleremo in
 questa sezione.
 
-% TODO riferimenti ai bind mount, link simbolici ecc.
-
 Come accennato in sez.~\ref{sec:proc_fork} ogni processo oltre ad una
 \index{directory~di~lavoro} directory di lavoro, ha anche una directory
 \textsl{radice}\footnote{entrambe sono contenute in due campi (rispettivamente
   \var{pwd} e \var{root}) di \kstruct{fs\_struct}; vedi
   fig.~\ref{fig:proc_task_struct}.} che, pur essendo di norma corrispondente
-alla radice dell'albero di file e directory come visto dal kernel (ed
-illustrato in sez.~\ref{sec:file_pathname}), ha per il processo il significato
-specifico di directory rispetto alla quale vengono risolti i
+alla radice dell'albero dei file dell'intero sistema, ha per il processo il
+significato specifico di directory rispetto alla quale vengono risolti i
 \itindsub{pathname}{assoluto}\textit{pathname} assoluti.\footnote{cioè quando
   un processo chiede la risoluzione di un \textit{pathname}, il kernel usa
   sempre questa directory come punto di partenza.} Il fatto che questo valore
 sia specificato per ogni processo apre allora la possibilità di modificare le
-modalità di risoluzione dei \textit{pathname} assoluti da parte di un processo
-cambiando questa directory, così come si fa coi
-\itindsub{pathname}{relativo}\textit{pathname} relativi cambiando la
+modalità di risoluzione dei \itindsub{pathname}{assoluto} \textit{pathname}
+assoluti da parte di un processo cambiando questa directory, così come si fa
+coi \itindsub{pathname}{relativo} \textit{pathname} relativi cambiando la
 \index{directory~di~lavoro} directory di lavoro.
 
-Normalmente la directory radice di un processo coincide anche con la radice
-del filesystem usata dal kernel, e dato che il suo valore viene ereditato dal
-padre da ogni processo figlio, in generale i processi risolvono i
-\itindsub{pathname}{assoluto} \textit{pathname} assoluti a partire sempre
-dalla stessa directory, che corrisponde alla radice del sistema.
+Normalmente la directory radice di un processo coincide con la radice generica
+dell'albero dei file, che è la directory che viene montata direttamente dal
+kernel all'avvio secondo quanto illustrato in sez.~\ref{sec:file_pathname}.
+Questo avviene perché, come visto in sez.~\ref{cha:process_handling} la
+directory radice di un processo viene ereditata dal padre attraverso una
+\func{fork} e mantenuta attraverso una \func{exec}, e siccome tutti i processi
+derivano da \cmd{init}, che ha come radice quella montata dal kernel, questa
+verrà mantenuta.
 
 In certe situazioni però è utile poter impedire che un processo possa accedere
-a tutto il filesystem; per far questo si può cambiare la sua directory radice
-con la funzione \funcd{chroot}, il cui prototipo è:
-\begin{prototype}{unistd.h}{int chroot(const char *path)}
-  Cambia la directory radice del processo a quella specificata da
-  \param{path}.
-  
-\bodydesc{La funzione restituisce zero in caso di successo e -1 per
-    un errore, in caso di errore \var{errno} può assumere i valori:
+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}
+\fdecl{int chroot(const char *path)}
+\fdesc{Cambia la directory radice del processo.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EPERM}] l'\ids{UID} effettivo del processo non è zero.
+  \item[\errcode{EPERM}] non si hanno i privilegi di amministratore.
   \end{errlist}
   ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
   \errval{ENOMEM}, \errval{ENOTDIR}, \errval{EACCES}, \errval{ELOOP};
-  \errval{EROFS} e \errval{EIO}.}
-\end{prototype}
-\noindent in questo modo la directory radice del processo diventerà
+  \errval{EROFS} e \errval{EIO} nel loro significato generico.}
+\end{funcproto}
+
+La funzione imposta la directory radice del processo a quella specificata da
 \param{path} (che ovviamente deve esistere) ed ogni
-\itindsub{pathname}{assoluto}\textit{pathname} assoluto usato dalle funzioni
+\itindsub{pathname}{assoluto} \textit{pathname} assoluto usato dalle funzioni
 chiamate nel processo sarà risolto a partire da essa, rendendo impossibile
-accedere alla parte di albero sovrastante.  Si ha così quella che viene
+accedere alla parte di albero sovrastante. Si ha così quella che viene
 chiamata una \textit{chroot jail}, in quanto il processo non può più accedere
 a file al di fuori della sezione di albero in cui è stato
-\textsl{imprigionato}. 
-
-Solo un processo con i privilegi di amministratore può usare questa funzione,
-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
+\textsl{imprigionato}.
+
+Solo un processo con i privilegi di amministratore può usare questa
+funzione,\footnote{più precisamente se possiede la \itindex{capabilities}
+  capacità \const{CAP\_SYS\_CHROOT}.} e la nuova radice, per quanto detto in
+sez.~\ref{sec:proc_fork}, sarà ereditata da tutti i suoi processi figli. Si
+tenga presente però che la funzione non cambia la directory di lavoro del
+processo, che potrebbe restare fuori dalla \textit{chroot jail}.
+
+Questo è il motivo per cui la funzione è efficace nel restringere un processo
+ad un ramo di albero solo se dopo averla eseguita si cedono i privilegi di
+amministratore. Infatti se per un qualunque motivo il processo resta con la
+sua \index{directory~di~lavoro} directory di lavoro al di fuori dalla
+\textit{chroot jail}, potrà accedere a tutto il resto del filesystem usando
+\itindsub{pathname}{relativo} dei \textit{pathname} relativi, dato che in tal
+caso è possibile, grazie all'uso di ``\texttt{..}'', risalire all'indietro
+fino alla radice effettiva dell'albero dei file.
+
+Potrebbe sembrare che per risolvere il problema sia sufficiente ricordarsi di
+eseguire preventivamente anche una \func{chdir} sulla directory su cui si
+andrà ad eseguire \func{chroot}, così da assicurarsi che le directory di
+lavoro sia all'interno della \textit{chroot jail}.  Ma se ad un processo
+restano i privilegi di amministratore esso potrà comunque portare la sua
+\index{directory~di~lavoro} directory di lavoro fuori dalla \textit{chroot
+  jail} in cui si trova. Basterà infatti eseguire di nuovo \func{chroot} su
+una qualunque directory contenuta nell'attuale directory di lavoro perché
+quest'ultima risulti al di fuori della nuova \textit{chroot jail}.  Per questo
+motivo l'uso di questa funzione non ha molto senso quando un processo di cui
+si vuole limitare l'accesso necessita comunque dei privilegi di amministratore
 per le sue normali operazioni.
 
-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.
-
+Nonostante queste limitazioni la funzione risulta utile qualora la si possa
+applicare correttamente cedendo completamente i privilegi di amministratore
+una volta eseguita.  Ed esempio caso tipico di uso di \func{chroot} è quello
+di un server FTP anonimo in si vuole che il server veda solo i file che deve
+trasferire. In tal caso si esegue una \func{chroot} sulla directory che
+contiene i file, che il server dovrà in grado di leggere come utente
+ordinario, e poi si cedono tutti i privilegi di amministratore.  Si tenga
+presente però che in casi come questo occorrerà fornire all'interno della
+\textit{chroot jail} un accesso anche a tutti i file (in genere programmi e
+librerie) di cui il server potrebbe avere bisogno.
 
 
-% TODO: trattare la funzione setns e i namespace file descriptors (vedi
-% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0
-
-% TODO: spostare chroot e le funzioni affini relative ai container da qualche
-% parte diversa se è il caso. 
-
 % LocalWords:  sez like filesystem unlink MacOS Windows VMS inode kernel unistd
 % LocalWords:  int const char oldpath newpath errno EXDEV EPERM st Smack SysV
 % LocalWords:  EEXIST EMLINK EACCES ENAMETOOLONG ENOTDIR EFAULT ENOMEM EROFS ls
@@ -7586,7 +7875,8 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  subtree SILENT log unbindable BUSY EAGAIN EXPIRE DETACH NOFOLLOW
 % 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
+% LocalWords:  member scan attack EOVERFLOW BITS blkcnt rdev FDCWD functions
+% LocalWords:  faccessat grpid lacl AppArmor capsetp mygetfacl
 
 %%% Local Variables: 
 %%% mode: latex