Note kernel 3.2 + prototipi delle funzioni
[gapil.git] / filedir.tex
index 3c3271509fd045fe11fa868b76ae50b2327f2296..9eff764846c3b3ba271369bc92c0cfc786dda395 100644 (file)
@@ -218,13 +218,13 @@ tab.~\ref{tab:file_inode_operations} le più rilevanti.
                              sez.~\ref{sec:link_symlink_rename}).\\
     \textsl{\code{unlink}} & Cancella un \textit{hard link} (vedi
                              sez.~\ref{sec:link_symlink_rename}).\\
-    \textsl{\code{symlink}}& Crea un link simbolico (vedi
+    \textsl{\code{symlink}}& Crea un collegamento simbolico (vedi
                              sez.~\ref{sec:link_symlink_rename}).\\
     \textsl{\code{mkdir}}  & Crea una directory (vedi
                              sez.~\ref{sec:file_dir_creat_rem}).\\
     \textsl{\code{rmdir}}  & Rimuove una directory (vedi
                              sez.~\ref{sec:file_dir_creat_rem}).\\
-    \textsl{\code{mknod}}  & Crea un file speciale (vedi
+    \textsl{\code{mknod}}  & Crea un \index{file!speciali} file speciale (vedi
                              sez.~\ref{sec:file_mknod}).\\
     \textsl{\code{rename}} & Cambia il nome di un file (vedi
                              sez.~\ref{sec:link_symlink_rename}).\\
@@ -553,8 +553,8 @@ le seguenti:
 \item l'amministratore può scegliere la dimensione dei blocchi del filesystem
   in fase di creazione, a seconda delle sue esigenze: blocchi più grandi
   permettono un accesso più veloce, ma sprecano più spazio disco.
-\item il filesystem implementa link simbolici veloci, in cui il nome del file
-  non è salvato su un blocco, ma tenuto all'interno \itindex{inode}
+\item il filesystem implementa collegamenti simbolici veloci, in cui il nome
+  del file non è salvato su un blocco, ma tenuto all'interno \itindex{inode}
   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).
@@ -576,7 +576,7 @@ per una maggiore affidabilità e possibilità di recupero in caso di corruzione
 del \itindex{superblock} \textit{superblock} principale. L'utilizzo di
 raggruppamenti di blocchi ha inoltre degli effetti positivi nelle prestazioni
 dato che viene ridotta la distanza fra i dati e la tabella degli
-\itindex{inode} inode.
+\itindex{inode} \textit{inode}.
 
 \begin{figure}[!htb]
   \centering
@@ -587,10 +587,10 @@ dato che viene ridotta la distanza fra i dati e la tabella degli
 
 Le directory sono implementate come una \itindex{linked~list} \textit{linked
   list} con voci di dimensione variabile. Ciascuna voce della lista contiene
-il numero di inode \itindex{inode}, la sua lunghezza, il nome del file e la sua
-lunghezza, secondo lo schema in fig.~\ref{fig:file_ext2_dirs}; in questo modo
-è possibile implementare nomi per i file anche molto lunghi (fino a 1024
-caratteri) senza sprecare spazio disco.
+il numero di \itindex{inode} \textit{inode}, la sua lunghezza, il nome del
+file e la sua lunghezza, secondo lo schema in fig.~\ref{fig:file_ext2_dirs};
+in questo modo è possibile implementare nomi per i file anche molto lunghi
+(fino a 1024 caratteri) senza sprecare spazio disco.
 
 Con l'introduzione del filesystem \textit{ext3} sono state introdotte diverse
 modifiche strutturali, la principale di queste è quella che \textit{ext3} è un
@@ -629,14 +629,13 @@ memorizzati. L'operazione di attivazione del filesystem è chiamata
   specifica di Linux che usa la omonima \textit{system call} e non è
   portabile.}
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/mount.h} 
 \fdecl{mount(const char *source, const char *target, const char
   *filesystemtype, \\ 
 \phantom{mount(}unsigned long mountflags, const void *data)}
 \fdesc{Monta un filesystem.} 
 }
-
 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
   caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
@@ -657,7 +656,7 @@ memorizzati. L'operazione di attivazione del filesystem è chiamata
     \textit{mount point} o è la radice.
   \item[\errcode{ELOOP}] si è cercato di spostare un \itindex{mount~point}
     \textit{mount point} su una sottodirectory di \param{source} o si sono
-    incontrati troppi link simbolici nella risoluzione di un nome.
+    incontrati troppi collegamenti simbolici nella risoluzione di un nome.
   \item[\errcode{EMFILE}] in caso di filesystem virtuale, la tabella dei
     dispositivi fittizi (chiamati \textit{dummy} nella documentazione inglese)
     è piena.
@@ -742,8 +741,9 @@ solo i 16 meno significativi. Oggi invece, con un numero di opzioni superiore,
 sono utilizzati tutti e 32 i bit, ma qualora nei 16 più significativi sia
 presente detto valore, che non esprime una combinazione valida, esso viene
 ignorato. Il valore dell'argomento deve essere espresso come maschera binaria
-e i vari bit devono essere impostati con un OR aritmetico dei rispettivi flag,
-identificati dalle costanti riportate nell'elenco seguente:
+e i vari bit che lo compongono, detti anche \textit{mount flags}, devono
+essere impostati con un OR aritmetico dei valori dalle costanti riportate
+nell'elenco seguente:
 
 \begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
 \itindbeg{bind~mount}
@@ -757,8 +757,8 @@ identificati dalle costanti riportate nell'elenco seguente:
   e \param{data} vengono ignorati.
 
   In sostanza quello che avviene è che in corrispondenza del \textit{pathname}
-  indicato da \param{target} viene montato l'\textit{inode} di \param{source},
-  così che la porzione di albero dei file presente sotto
+  indicato da \param{target} viene montato \itindex{inode} l'\textit{inode}
+  di \param{source}, così che la porzione di albero dei file presente sotto
   \param{source} diventi visibile allo stesso modo sotto
   \param{target}. Trattandosi esattamente dei dati dello stesso filesystem,
   ogni modifica fatta in uno qualunque dei due rami di albero sarà visibile
@@ -768,9 +768,9 @@ identificati dalle costanti riportate nell'elenco seguente:
   Dal punto di vista del \itindex{Virtual~File~System} VFS l'operazione è
   analoga al montaggio di un filesystem proprio nel fatto che anche in questo
   caso si inserisce in corrispondenza della \textit{dentry} di \texttt{target}
-  un diverso \textit{inode}, che stavolta, invece di essere quello della
-  radice del filesystem indicato da un file di dispositivo, è quello di una
-  directory già montata.
+  un diverso \itindex{inode} \textit{inode}, che stavolta, invece di essere
+  quello della radice del filesystem indicato da un file di dispositivo, è
+  quello di una directory già montata.
 
   Si tenga presente che proprio per questo sotto \param{target} comparirà il
   contenuto che è presente sotto \param{source} all'interno del filesystem in
@@ -800,7 +800,7 @@ identificati dalle costanti riportate nell'elenco seguente:
   alla porzione dell'albero dei file di un filesystem presente a partire da
   una certa directory, utilizzando una qualunque altra directory, anche se
   questa sta su un filesystem diverso. Si può così fornire una alternativa
-  all'uso dei link simbolici (di cui parleremo in
+  all'uso dei collegamenti simbolici (di cui parleremo in
   sez.~\ref{sec:link_symlink_rename}) che funziona correttamente anche
   all'intero di un \textit{chroot} (argomento su cui torneremo in
   sez.~\ref{sec:file_chroot}).  \itindend{bind~mount}
@@ -1076,7 +1076,7 @@ Una volta che non si voglia più utilizzare un certo filesystem è possibile
 ``\textsl{smontarlo}'' usando la funzione di sistema \funcd{umount}, il cui
 prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/mount.h}
 \fdecl{umount(const char *target)}
 \fdesc{Smonta un filesystem.} 
@@ -1113,7 +1113,7 @@ Linux provvede inoltre una seconda funzione di sistema, \funcd{umount2}, che
 consente un maggior controllo delle operazioni, come forzare lo smontaggio di
 un filesystem anche quando questo risulti occupato; il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/mount.h}
 \fdecl{umount2(const char *target, int flags)}
 \fdesc{Smonta un filesystem.} 
@@ -1163,7 +1163,7 @@ eseguita una sincronizzazione dei dati.
                           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
-                          link simbolico (vedi
+                          collegamento simbolico (vedi
                           sez.~\ref{sec:link_symlink_rename}) evitando
                           problemi di sicurezza (presente dal kernel 2.6.34).\\ 
     \hline
@@ -1190,20 +1190,21 @@ un meccanismo che smonti automaticamente i filesystem che restano inutilizzati
 per un certo periodo di tempo.
 
 Infine il flag \const{UMOUNT\_NOFOLLOW} non dereferenzia \param{target} se
-questo è un link simbolico (vedi sez.~\ref{sec:link_symlink_rename}). Questa è
-una misura di sicurezza introdotta per evitare, per quei filesystem per il
-quale è prevista una gestione diretta da parte degli utenti, come quelli
-basati su FUSE,\footnote{il \textit{Filesystem in USEr space} (FUSE) è una
-  delle più interessanti applicazioni del \itindex{Virtual~File~System} VFS
-  che consente, tramite un opportuno modulo, di implementarne le funzioni in
+questo è un collegamento simbolico (vedi
+sez.~\ref{sec:link_symlink_rename}). Questa è una misura di sicurezza
+introdotta per evitare, per quei filesystem per il quale è prevista una
+gestione diretta da parte degli utenti, come quelli basati su
+FUSE,\footnote{il \textit{Filesystem in USEr space} (FUSE) è una delle più
+  interessanti applicazioni del \itindex{Virtual~File~System} VFS che
+  consente, tramite un opportuno modulo, di implementarne le funzioni in
   \textit{user space}, così da rendere possibile l'implementazione di un
-  qualunque filesystem (con applicazioni di grande interesse come il filesystem
-  cifrato \textit{encfs} o il filesystem di rete \textit{sshfs}) che possa
-  essere usato direttamente per conto degli utenti.}  che si possano passare
-ai programmi che effettuano lo smontaggio dei filesystem, che in genere sono
-privilegiati ma consentono di agire solo sui propri \textit{mount point}, dei
-link simbolici che puntano ad altri \textit{mount point}, ottenendo così la
-possibilità di smontare qualunque filesystem.
+  qualunque filesystem (con applicazioni di grande interesse come il
+  filesystem cifrato \textit{encfs} o il filesystem di rete \textit{sshfs})
+  che possa essere usato direttamente per conto degli utenti.}  che si possano
+passare ai programmi che effettuano lo smontaggio dei filesystem, che in
+genere sono privilegiati ma consentono di agire solo sui propri \textit{mount
+  point}, dei collegamenti simbolici che puntano ad altri \textit{mount
+  point}, ottenendo così la possibilità di smontare qualunque filesystem.
 
 
 Altre due funzioni di sistema specifiche di Linux,\footnote{esse si trovano
@@ -1211,7 +1212,7 @@ Altre due funzioni di sistema specifiche di Linux,\footnote{esse si trovano
 diretta informazioni riguardo al filesystem su cui si trova un certo file,
 sono \funcd{statfs} e \funcd{fstatfs}, i cui prototipi sono:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/vfs.h}
 \fdecl{int statfs(const char *path, struct statfs *buf)}
 \fdecl{int fstatfs(int fd, struct statfs *buf)}
@@ -1270,12 +1271,12 @@ aggiornato correttamente (cosa che è impossibile se la radice è montata in
 sola lettura) il suo contenuto diventa fuorviante.
 
 Per questo motivo il suo utilizzo viene deprecato ed in molti casi viene già
-oggi sostituito da un link simbolico a \procfile{/proc/mounts}, che contiene
-una versione degli stessi contenuti (vale a dire l'elenco dei filesystem
-montati) generata direttamente dal kernel, e quindi sempre disponibile e
-sempre aggiornata. Per questo motivo tralasceremo la trattazione, di queste
-funzioni, rimandando al manuale della \acr{glibc} \cite{GlibcMan} per la
-documentazione completa.
+oggi sostituito da un collegamento simbolico a \procfile{/proc/mounts}, che
+contiene una versione degli stessi contenuti (vale a dire l'elenco dei
+filesystem montati) generata direttamente dal kernel, e quindi sempre
+disponibile e sempre aggiornata. Per questo motivo tralasceremo la
+trattazione, di queste funzioni, rimandando al manuale della \acr{glibc}
+\cite{GlibcMan} per la documentazione completa.
 
 % TODO (bassa priorità) scrivere delle funzioni (getfsent e getmntent &C)
 % TODO (bassa priorità) documentare ? swapon e swapoff (man 2 ...) 
@@ -1285,7 +1286,7 @@ documentazione completa.
 \label{sec:file_dir}
 
 In questa sezione esamineremo le funzioni usate per la manipolazione dei nomi
-file e directory, per la creazione di link simbolici e diretti, per la
+file e directory, per la creazione di collegamenti simbolici e diretti, per la
 gestione e la lettura delle directory.  In particolare ci soffermeremo sulle
 conseguenze che derivano dalla architettura di un filesystem unix-like
 illustrata in sez.~\ref{sec:file_filesystem} per quanto attiene il
@@ -1316,25 +1317,26 @@ sono due metodi sostanzialmente diversi per fare questa operazione.
 In sez.~\ref{sec:file_filesystem} abbiamo spiegato come la capacità di
 chiamare un file con nomi diversi sia connaturata con l'architettura di un
 filesystem per un sistema Unix, in quanto il nome del file che si trova in una
-directory è solo un'etichetta che viene associata ad un puntatore per ottenere
-il riferimento ad un \textit{inode}, ed è questa la struttura che il kernel
-usa per identifica univocamente gli oggetti su un filesystem.
+directory è solo un'etichetta associata ad un puntatore che permette di
+ottenere il riferimento ad un \itindex{inode} \textit{inode}, e che è
+quest'ultimo che viene usato dal kernel per identificare univocamente gli
+oggetti sul filesystem.
 
 Questo significa che fintanto che si resta sullo stesso filesystem la
-realizzazione di un collegamento è immediata ed uno stesso file può avere
-tanti nomi diversi, dati da altrettante associazioni diverse allo stesso
+realizzazione di un \textit{link} è immediata: uno stesso file può avere tanti
+nomi diversi, dati da altrettante associazioni diverse allo stesso
 \itindex{inode} \textit{inode} effettuate tramite ``etichette'' diverse in
 directory diverse. Si noti anche come nessuno di questi nomi possa assumere
 una particolare preferenza o originalità rispetto agli altri, in quanto tutti
-fanno comunque riferimento allo stesso \itindex{inode} \textit{inode} che è
-l'oggetto che identifica effettivamente il file.
+fanno comunque riferimento allo stesso \itindex{inode} \textit{inode} e quindi
+tutti otterranno lo stesso file.
 
 Quando si vuole aggiungere ad una directory una voce che faccia riferimento ad
 un file già esistente nella modalità appena descritta, per ottenere quello che
 viene denominato ``\textsl{collegamento diretto}'' (o \textit{hard link}), si
 deve usare la funzione di sistema \funcd{link}, il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int link(const char *oldpath, const char *newpath)}
 \fdesc{Crea un nuovo collegamento diretto (\textit{hard link}).} 
@@ -1344,11 +1346,11 @@ deve usare la funzione di sistema \funcd{link}, il cui prototipo è:
   \begin{errlist}
   \item[\errcode{EEXIST}] un file (o una directory) di nome \param{newpath}
     esiste già.
-  \item[\errcode{EMLINK}] ci sono troppi link al file \param{oldpath} (il
-    numero massimo è specificato dalla variabile \const{LINK\_MAX}, vedi
+  \item[\errcode{EMLINK}] ci sono troppi collegamenti al file \param{oldpath}
+    (il numero massimo è specificato dalla variabile \const{LINK\_MAX}, vedi
     sez.~\ref{sec:sys_limits}).
   \item[\errcode{EPERM}] il filesystem che contiene \param{oldpath} e
-    \param{newpath} non supporta i link diretti o è una directory.
+    \param{newpath} non supporta i collegamenti diretti o è una directory.
   \item[\errcode{EXDEV}] i file \param{oldpath} e \param{newpath} non fanno
     riferimento ad un filesystem montato sullo stesso \itindex{mount~point}
     \textit{mount point}.
@@ -1360,7 +1362,7 @@ deve usare la funzione di sistema \funcd{link}, il cui prototipo è:
 
 La funzione crea in \param{newpath} un collegamento diretto al file indicato
 da \param{oldpath}. Per quanto detto la creazione di un nuovo collegamento
-diretto non copia il contenuto del file, ma si limita a creare una voce
+diretto non copia il contenuto del file, ma si limita a creare la voce
 specificata da \param{newpath} nella directory corrispondente e l'unica
 proprietà del file che verrà modificata sarà il numero di riferimenti al file
 (il campo \var{i\_nlink} della struttura \kstruct{inode}, vedi
@@ -1385,10 +1387,12 @@ l'amministratore è in grado di creare un collegamento diretto ad un'altra
 directory: questo viene fatto perché con una tale operazione è possibile
 creare dei \textit{loop} nel filesystem (vedi fig.~\ref{fig:file_link_loop})
 che molti programmi non sono in grado di gestire e la cui rimozione
-diventerebbe piuttosto complicata (in genere per questo tipo di errori occorre
-eseguire il programma \cmd{fsck} per riparare il filesystem).
+diventerebbe piuttosto complicata.\footnote{in genere per questo tipo di
+  errori occorre eseguire il programma \cmd{fsck} per riparare il filesystem,
+  in quanto in caso di \textit{loop} la directory creata non sarebbe vuota e
+  non si potrebbe più rimuoverla.}
 
-Data la pericolosità di questa operazione e la disponibilità dei link
+Data la pericolosità di questa operazione e la disponibilità dei collegamenti
 simbolici (che vedremo a breve) e dei \itindex{bind~mount} \textit{bind mount}
 (già visti in sez.~\ref{sec:filesystem_mounting}) che possono fornire la
 stessa funzionalità senza questi problemi, nel caso di Linux questa capacità è
@@ -1410,7 +1414,7 @@ comportamento iniziale di Linux ma a partire dai kernel della serie
 che non segue più lo standard per cui l'\textit{hard link} viene creato nei
 confronti del collegamento simbolico, e non del file cui questo punta. La
 revisione POSIX.1-2008 lascia invece il comportamento dipendente
-dall'implementazione, cosa che rende Linux aderente a questa versione
+dall'implementazione, cosa che rende Linux conforme a questa versione
 successiva dello standard.
 
 \itindbeg{symbolic~link}
@@ -1418,7 +1422,7 @@ successiva dello standard.
 \index{collegamento!simbolico|(}
 
 La ragione di questa differenza rispetto al vecchio standard, presente anche
-in altri sistemi unix-like, sono dovute al fatto che un collegamento simbolico
+in altri sistemi unix-like, è dovuta al fatto che un collegamento simbolico
 può fare riferimento anche ad un file non esistente o a una directory, per i
 quali l'\textit{hard link} non può essere creato, per cui la scelta di seguire
 il collegamento simbolico è stata ritenuta una scelta scorretta nella
@@ -1446,7 +1450,7 @@ unix-like supportano un'altra forma di collegamento, detta
 \textit{symbolic link}). In questo caso si tratta, come avviene in altri
 sistemi operativi, di file speciali che contengono semplicemente il
 riferimento ad un altro file (o directory). In questo modo è possibile
-effettuare collegamenti anche attraverso filesystem diversi, a file posti in
+effettuare \textit{link} anche attraverso filesystem diversi, a file posti in
 filesystem che non supportano i collegamenti diretti, a delle directory, ed
 anche a file che non esistono ancora.
 
@@ -1455,8 +1459,8 @@ anche a file che non esistono ancora.
 
 Il meccanismo funziona in quanto i \textit{symbolic link} sono riconosciuti
 come tali dal kernel\footnote{è uno dei diversi tipi di file visti in
-  tab.~\ref{tab:file_file_types}, contrassegnato come tale
-  nell'\textit{inode}, e riconoscibile dal valore del campo \var{st\_mode}
+  tab.~\ref{tab:file_file_types}, contrassegnato come tale \itindex{inode}
+  nell'\textit{inode} e riconoscibile dal valore del campo \var{st\_mode}
   della struttura \struct{stat} (vedi sez.~\ref{sec:file_stat}).} e tutta una
 serie di funzioni di sistema (come \func{open} o \func{stat}) quando ricevono
 come argomento il \textit{pathname} di un collegamento simbolico vanno
@@ -1464,7 +1468,7 @@ automaticamente ad operare sul file da esso specificato. La funzione di
 sistema che permette di creare un nuovo collegamento simbolico è
 \funcd{symlink}, ed il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int symlink(const char *oldpath, const char *newpath)}
 \fdesc{Crea un nuovo collegamento simbolico (\textit{symbolic link}).} 
@@ -1538,10 +1542,11 @@ invece possono operare direttamente sui loro contenuti.
   dallo standard POSIX.1-2001.}
 
 Si noti che non si è specificato il comportamento delle funzioni che operano
-con i file descriptor, in quanto la risoluzione del link 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.
+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.
 
 Dato che, come indicato in tab.~\ref{tab:file_symb_effect}, funzioni come la
 \func{open} seguono i collegamenti simbolici, occorrono funzioni apposite per
@@ -1549,7 +1554,7 @@ accedere alle informazioni del collegamento invece che a quelle del file a cui
 esso fa riferimento. Quando si vuole leggere il contenuto di un collegamento
 simbolico si usa la funzione di sistema \funcd{readlink}, il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int readlink(const char *path, char *buff, size\_t size)}
 \fdesc{Legge il contenuto di un collegamento simbolico.} 
@@ -1558,8 +1563,8 @@ simbolico si usa la funzione di sistema \funcd{readlink}, il cui prototipo è:
   di successo e $-1$ per un errore,  nel qual caso \var{errno} assumerà uno
   dei valori:
   \begin{errlist}
-  \item[\errcode{EINVAL}] \param{path} non è un link simbolico o \param{size}
-    non è positiva.
+  \item[\errcode{EINVAL}] \param{path} non è un collegamento simbolico
+    o \param{size} non è positiva.
   \end{errlist} ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{EIO},
   \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM} e
   \errval{ENOTDIR} nel loro significato generico.}
@@ -1588,23 +1593,24 @@ una directory, anche se in questo caso si potranno ottenere anche dei
 \textit{loop}. La situazione è illustrata in fig.~\ref{fig:file_link_loop},
 che riporta la struttura della directory \file{/boot}. Come si vede si è
 creato al suo interno un collegamento simbolico che punta di nuovo a
-\file{/boot}.\footnote{il loop mostrato in fig.~\ref{fig:file_link_loop} è un
-  usato per poter permettere a \cmd{grub} (un bootloader in grado di leggere
-  direttamente da vari filesystem il file da lanciare come sistema operativo)
-  di vedere i file contenuti nella directory \file{/boot} con lo stesso
-  \textit{pathname} con cui verrebbero visti dal sistema operativo, anche se
-  essi si trovano, come accade spesso, su una partizione separata (che
-  \cmd{grub}, all'avvio, vede come radice).}
-
-Questo può causare problemi per tutti quei programmi che effettuano la
+\file{/boot}.\footnote{il \textit{loop} mostrato in
+  fig.~\ref{fig:file_link_loop} è stato usato per poter permettere a
+  \cmd{grub} (un bootloader in grado di leggere direttamente da vari
+  filesystem il file da lanciare come sistema operativo) di vedere i file
+  contenuti nella directory \file{/boot} con lo stesso \textit{pathname} con
+  cui verrebbero visti dal sistema operativo, anche se essi si trovano, come
+  accade spesso, su una partizione separata (che \cmd{grub} all'avvio vedrebbe 
+  come \file{/}).}
+
+Questo però può causare problemi per tutti quei programmi che effettuano la
 scansione di una directory senza tener conto dei collegamenti simbolici, ad
 esempio se lanciassimo un comando del tipo \code{grep -r linux *}, il loop
 nella directory porterebbe il comando ad esaminare \file{/boot},
 \file{/boot/boot}, \file{/boot/boot/boot} e così via.
 
 Per questo motivo il kernel e le librerie prevedono che nella risoluzione di
-un \textit{pathname} possano essere seguiti un numero limitato di collegamenti
-simbolici, il cui valore limite è specificato dalla costante
+un \textit{pathname} possano essere seguiti fino ad un certo numero massimo di
+collegamenti simbolici, il cui valore limite è specificato dalla costante
 \const{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un
 errore ed \var{errno} viene impostata al valore \errcode{ELOOP}, che nella
 quasi totalità dei casi indica appunto che si è creato un collegamento
@@ -1637,81 +1643,82 @@ cat: symlink: No such file or directory
 \end{Terminal}
 %$
 con un errore che può sembrare sbagliato, dato che \cmd{ls} ci ha mostrato
-l'esistenza di \file{symlink}, mentre se invece scrivessimo su \file{symlink}
-otterremmo semplicemente la creazione di \file{/tmp/tmp\_file}.
+l'esistenza di \file{symlink}, se invece scrivessimo su \file{symlink}
+otterremmo la creazione di \file{/tmp/tmp\_file} senza errori.
 
 
 \itindend{symbolic~link}
 \index{collegamento!simbolico|)}
 
 
-
 Un'altra funzione relativa alla gestione dei nomi dei file, anche se a prima
-vista parrebbe fare riferimento ad un argomento completamente diverso, è
-quella che consente la cancellazione di un file. Il punto è che in realtà una
-funzione che serva proprio a cancellare un file non esiste neanche, perché
-come accennato in sez.~\ref{sec:file_filesystem}, quando in un sistema
-unix-like si richiede la rimozione di un file quello che si va a cancellare è
-soltanto la voce che referenzia il suo \textit{inode} all'interno di una
-directory.
+vista parrebbe riguardare un argomento completamente diverso, è quella che per
+la cancellazione di un file. In realtà una \textit{system call} che serva
+proprio a cancellare un file non esiste neanche perché, come accennato in
+sez.~\ref{sec:file_filesystem}, quando in un sistema unix-like si richiede la
+rimozione di un file quella che si va a cancellare è soltanto la voce che
+referenzia il suo \itindex{inode} \textit{inode} all'interno di una directory.
 
 La funzione di sistema che consente di effettuare questa operazione, il cui
 nome come si può notare ha poco a che fare con il concetto di rimozione, è
 \funcd{unlink}, ed il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int unlink(const char *pathname)}
 \fdesc{Cancella un file.} 
 }
 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
-  nel qual caso \var{errno} assumerà uno dei valori: 
+  nel qual caso \var{errno} assumerà uno dei valori:\footnotemark  
   \begin{errlist}
+  \item[\errcode{EACCES}] non si ha il permesso di scrivere sulla directory
+    contenente \param{pathname} o di attraversamento di una delle directory
+    superiori. 
   \item[\errcode{EISDIR}] \param{pathname} si riferisce ad una
-    directory.\footnotemark 
-  \item[\errcode{EROFS}] \param{pathname} è su un filesystem montato in sola
-  lettura.
-  \item[\errcode{EISDIR}] \param{pathname} fa riferimento a una directory.
-  \end{errlist} ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{ENOENT},
-  \errval{ENOTDIR}, \errval{ENOMEM}, \errval{EROFS}, \errval{ELOOP},
-  \errval{EIO} nel loro significato generico.}
+    directory.
+  \item[\errcode{EPERM}] il filesystem non consente l'operazione, o la
+    directory che contiene \param{pathname} ha lo \itindex{sticky~bit}
+    \textit{sticky bit} e non si è il proprietario o non si hanno privilegi
+    amministrativi. 
+  \end{errlist} ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
+  \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errval{EROFS} nel loro
+  significato generico.}
 \end{funcproto}
 
-\footnotetext{questo è un valore specifico ritornato da Linux che non consente
-  l'uso di \func{unlink} con le directory.  Non è conforme allo standard
-  POSIX, che prescrive invece l'uso di \errcode{EPERM} in caso l'operazione
-  non sia consentita o il processo non abbia privilegi sufficienti.}
+\footnotetext{questa funzione su Linux ha alcune peculiarità nei codici di
+  errore, in particolare riguardo la rimozione delle directory che non è mai
+  permessa e che causa l'errore \errcode{EISDIR}; questo è un valore specifico
+  di Linux non conforme allo standard POSIX che prescrive invece l'uso di
+  \errcode{EPERM} in caso l'operazione non sia consentita o il processo non
+  abbia privilegi sufficienti, valore che invece Linux usa anche se il
+  filesystem non supporta la funzione, inoltre il codice \errcode{EBUSY} nel
+  caso la directory sia occupata su Linux non esiste.}
 
 La funzione elimina il nome specificato dall'argomento \param{pathname} nella
 directory che lo contiene e decrementa il numero di riferimenti nel relativo
-\itindex{inode} \textit{inode}. Nel caso di socket, fifo o file di dispositivo
+\itindex{inode} \textit{inode}.\footnote{come per \func{link} queste due
+  operazioni sono effettuate all'interno della \textit{system call} in maniera
+  atomica.} Nel caso di socket, fifo o file di dispositivo
 \index{file!di~dispositivo} rimuove il nome, ma come per i file normali i
 processi che hanno aperto uno di questi oggetti possono continuare ad
-utilizzarli.  Solo nel caso di cancellazione di un collegamento simbolico, che
+utilizzarli.  Nel caso di cancellazione di un collegamento simbolico, che
 consiste solo nel rimando ad un altro file, questo viene immediatamente
 eliminato.
 
 Per cancellare una voce in una directory è necessario avere il permesso di
 scrittura su di essa, dato che si va a rimuovere una voce dal suo contenuto, e
-il diritto di esecuzione sulla directory che la contiene (affronteremo in
-dettaglio l'argomento dei permessi di file e directory in
+il diritto di esecuzione/attraversamento sulla directory che la contiene
+(affronteremo in dettaglio l'argomento dei permessi di file e directory in
 sez.~\ref{sec:file_access_control}). Se inoltre lo \itindex{sticky~bit}
 \textit{sticky bit} (vedi sez.~\ref{sec:file_special_perm}) è impostato
 occorrerà anche essere proprietari del file o proprietari della directory o
 avere i privilegi di amministratore.
 
-Una delle caratteristiche comuni fra \func{link} ed \func{unlink} è che la
-creazione/rimozione del nome dalla directory e l'incremento/decremento del
-numero di riferimenti \itindex{inode} nell'\textit{inode} sono sempre
-effettuati in maniera atomica (si veda sez.~\ref{sec:proc_atom_oper}) senza
-possibili interruzioni fra le due operazioni, questo entrambe queste funzioni
-sono realizzate tramite una \textit{system call}.
-
-Si ricordi inoltre che anche se ne è rimosso il nome da una directory un file
-non viene eliminato dal disco fintanto che tutti i riferimenti ad esso sono
-stati cancellati: solo quando il numero di collegamenti mantenuto
-\itindex{inode} nell'\textit{inode} diventa nullo, questo viene disallocato lo
-spazio occupato su disco viene liberato. Si tenga presente comunque che a
+Si ricordi inoltre che anche se se ne è rimosso il nome da una directory, un
+file non viene eliminato dal disco fintanto che tutti i riferimenti ad esso
+sono stati cancellati: solo quando il numero di collegamenti mantenuto
+\itindex{inode} nell'\textit{inode} diventa nullo, questo viene disallocato e
+lo spazio occupato su disco viene liberato. Si tenga presente comunque che a
 questo si aggiunge sempre un'ulteriore condizione e cioè che non ci siano
 processi che abbiano il suddetto file aperto.\footnote{come vedremo in
   cap.~\ref{cha:file_unix_interface} il kernel mantiene anche una tabella dei
@@ -1721,27 +1728,27 @@ processi che abbiano il suddetto file aperto.\footnote{come vedremo in
   kernel controlla anche questa tabella, per verificare che anche in essa non
   ci sia più nessun riferimento all'\textit{inode} in questione.}
 
-Questa caratteristica del sistema viene spesso usata per essere sicuri di non
-lasciare file temporanei su disco in caso di crash dei programmi. La tecnica è
-quella di creare un nuovo file e chiamare \func{unlink} subito dopo, in questo
-modo il contenuto del file sarà sempre disponibile all'interno del processo
-attraverso il suo file descriptor (vedi sez.~\ref{sec:file_fd}) fintanto che
-il processo non chiude il file, ma non ne resta traccia in nessuna directory,
-e lo spazio occupato su disco viene immediatamente rilasciato alla conclusione
-del processo (quando tutti i file vengono chiusi).
+Questa caratteristica del sistema può essere usata per essere sicuri di non
+lasciare file temporanei su disco in caso di crash di un programma. La tecnica
+è quella di aprire un nuovo file e chiamare \func{unlink} su di esso subito
+dopo, in questo modo il contenuto del file sarà sempre disponibile all'interno
+del processo attraverso il suo file descriptor (vedi sez.~\ref{sec:file_fd}),
+ma non ne resta traccia in nessuna directory, e lo spazio occupato su disco
+viene immediatamente rilasciato alla conclusione del processo, quando tutti i
+file vengono chiusi.
 
 Al contrario di quanto avviene con altri Unix, in Linux non è possibile usare
-la funzione \func{unlink} sulle directory, per le quali si otterrebbe un
-errore di \errcode{EISDIR}. Per cancellare una directory si può usare la
+la funzione \func{unlink} sulle directory, nel qual caso si otterrebbe un
+errore di \errcode{EISDIR}. Per cancellare una directory si deve usare la
 apposita funzione di sistema \func{rmdir} (che vedremo in
 sez.~\ref{sec:file_dir_creat_rem}), oppure la funzione \func{remove}.
-Quest'ultima è la funzione prevista dallo standard ANSI C per effeettuare una
+Quest'ultima è la funzione prevista dallo standard ANSI C per effettuare una
 cancellazione generica di un file o di una directory e funziona anche per i
 sistemi operativo che non supportano gli \textit{hard link}. Nei sistemi
 unix-like \funcd{remove} è equivalente ad usare in maniera trasparente
 \func{unlink} per i file ed \func{rmdir} per le directory; il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{int remove(const char *pathname)}
 \fdesc{Cancella un file o una directory.} 
@@ -1765,7 +1772,7 @@ sistema \funcd{rename},\footnote{la funzione è definita dallo standard ANSI C,
   ma si applica solo per i file, lo standard POSIX estende la funzione anche
   alle directory.} il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{int rename(const char *oldpath, const char *newpath)}
 \fdesc{Rinomina un file o una directory.} 
@@ -1815,10 +1822,9 @@ contengono \param{newpath} ed \param{oldpath}.
 Il vantaggio nell'uso di questa funzione al posto della chiamata successiva di
 \func{link} e \func{unlink} è che l'operazione è eseguita atomicamente, non
 c'è modifica, per quanto temporanea, al \textit{link count} del file e non può
-esistere cioè nessun istante in cui un altro processo possa trovare attivi
-entrambi i nomi dello stesso file (a parte il caso di sovrascrittura), o, in
-caso di sostituzione di un file esistente, non trovare quest'ultimo prima che
-la sostituzione sia stata eseguita.
+esistere un istante in cui un altro processo possa trovare attivi entrambi i
+nomi per lo stesso file se la destinazione non esiste o in cui questa sparisca
+temporaneamente se già esiste.
 
 Dato che opera in maniera analoga la funzione è soggetta alle stesse
 restrizioni di \func{link}, quindi è necessario che \param{oldpath}
@@ -1826,24 +1832,25 @@ e \param{newpath} siano nello stesso filesystem e facciano riferimento allo
 stesso \itindex{mount~point} \textit{mount point}, e che il filesystem
 supporti questo tipo di operazione. Qualora questo non avvenga si dovrà
 effettuare l'operazione in maniera non atomica copiando il file a destinazione
-e poi cancellando l'orginale.
+e poi cancellando l'originale.
 
 Il comportamento della funzione è diverso a seconda che si voglia rinominare
 un file o una directory. Se ci riferisce ad un file allora \param{newpath}, se
 esiste, non deve essere una directory, altrimenti si avrà un errore di
 \errcode{EISDIR}. Se \param{newpath} indica un file già esistente questo verrà
-rimpiazzato atomicamente, ma nel caso in cui \func{rename} fallisca esso non
-sarà toccato. I caso di sovrascrittura esisterà però una breve finestra di
-tempo in cui sia \param{oldpath} che \param{newpath} potranno fare entrambi
-riferimento al file che viene rinominato.
+rimpiazzato atomicamente, ma nel caso in cui \func{rename} fallisca il kernel
+assicura che esso non sarà toccato. I caso di sovrascrittura però potrà
+esistere una breve finestra di tempo in cui sia \param{oldpath}
+che \param{newpath} potranno fare entrambi riferimento al file che viene
+rinominato.
 
 Se \param{oldpath} è una directory allora \param{newpath}, se esistente, deve
 essere una directory vuota, altrimenti si avranno gli errori \errcode{ENOTDIR}
 (se non è una directory) o \errcode{ENOTEMPTY} o \errcode{EEXIST} (se non è
 vuota). Chiaramente \param{newpath} non potrà contenere \param{oldpath} nel
-suo \textit{pathname}, non essendo possibile rendere una directory
-sottodirectory di sé stessa, nel qual caso si avrà un errore di
-\errcode{EINVAL}.
+suo \textit{pathname}, non essendo possibile rendere una directory una
+sottodirectory di sé stessa, se questo fosse il caso si otterrebbe un errore
+di \errcode{EINVAL}.
 
 Se \param{oldpath} si riferisce ad un collegamento simbolico questo sarà
 rinominato restando tale senza nessun effetto sul file a cui fa riferimento.
@@ -1873,13 +1880,13 @@ elenchi di nomi con riferimenti ai rispettivi \itindex{inode} \textit{inode},
 non è possibile trattarle come file ordinari e devono essere create
 direttamente dal kernel attraverso una opportuna \textit{system
   call}.\footnote{questo è quello che permette anche, attraverso l'uso del
-  VFS, l'utilizzo di diversi formati per la gestione dei suddetti elenchi,
-  dalle semplici liste a strutture complesse come alberi binari, hash,
-  ecc. che consentono una ricerca veloce quando il numero di file è molto
-  grande.}  La funzione di sistema usata per creare una directory è
-\funcd{mkdir}, ed il suo prototipo è:
+  \itindex{Virtual~File~System} VFS, l'utilizzo di diversi formati per la
+  gestione dei suddetti elenchi, dalle semplici liste a strutture complesse
+  come alberi binari, hash, ecc. che consentono una ricerca veloce quando il
+  numero di file è molto grande.}  La funzione di sistema usata per creare una
+directory è \funcd{mkdir}, ed il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/stat.h}
 \fhead{sys/types.h}
 \fdecl{int mkdir(const char *dirname, mode\_t mode)}
@@ -1888,10 +1895,11 @@ direttamente dal kernel attraverso una opportuna \textit{system
 {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{EEXIST}] un file (o una directory) con quel nome esiste di
-    già.
   \item[\errcode{EACCES}] non c'è il permesso di scrittura per la directory in
-    cui si vuole inserire la nuova directory.
+    cui si vuole inserire la nuova directory o di attraversamento per le
+    directory al di sopra di essa.
+  \item[\errcode{EEXIST}] un file o una directory o un collegamento simbolico
+    con quel nome esiste già.
   \item[\errcode{EMLINK}] la directory in cui si vuole creare la nuova
     directory contiene troppi file; sotto Linux questo normalmente non avviene
     perché il filesystem standard consente la creazione di un numero di file
@@ -1901,78 +1909,80 @@ direttamente dal kernel attraverso una opportuna \textit{system
   \item[\errcode{ENOSPC}] non c'è abbastanza spazio sul file system per creare
     la nuova directory o si è esaurita la quota disco dell'utente.
   \end{errlist}
-  ed inoltre \errval{EPERM}, \errval{EFAULT}, \errval{ENAMETOOLONG},
-  \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP},
+  ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errval{EPERM},
   \errval{EROFS} nel loro significato generico.}
 \end{funcproto}
 
-
-
 La funzione crea una nuova directory vuota, che contiene cioè solo le due voci
-standard presenti in ogni directory (cioè ``\file{.}'' e ``\file{..}''), con
-il nome indicato dall'argomento \param{dirname}. Il nome può essere indicato
-sia come \itindsub{pathname}{assoluto} \textit{pathname} assoluto che come
-\itindsub{pathname}{relativo} \textit{pathname} relativo.
+standard presenti in ogni directory (``\file{.}'' e ``\file{..}''), con il
+nome indicato dall'argomento \param{dirname}. 
 
 I permessi di accesso (vedi sez.~\ref{sec:file_access_control}) con cui la
 directory viene creata sono specificati dall'argomento \param{mode}, i cui
 possibili valori sono riportati in tab.~\ref{tab:file_permission_const}; si
 tenga presente che questi sono modificati dalla maschera di creazione dei file
 (si veda sez.~\ref{sec:file_perm_management}).  La titolarità della nuova
-directory è impostata secondo quanto riportato in
+directory è impostata secondo quanto illustrato in
 sez.~\ref{sec:file_ownership_management}.
 
-La funzione che permette la cancellazione di una directory è invece
-\funcd{rmdir}, ed il suo prototipo è:
-\begin{prototype}{sys/stat.h}{int rmdir(const char *dirname)} 
-  Cancella una directory.
+Come accennato in precedenza per eseguire la cancellazione di una directory è
+necessaria una specifica funzione di sistema, \funcd{rmdir}, il suo prototipo
+è:
 
-  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
-    errore, nel qual caso \var{errno} assumerà i valori:
+\begin{funcproto}{
+\fhead{sys/stat.h}
+\fdecl{int rmdir(const char *dirname)}
+\fdesc{Cancella una directory.} 
+}
+{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}] 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 l'\ids{UID} effettivo
-    del processo non corrisponde al proprietario della directory.
   \item[\errcode{EACCES}] non c'è il permesso di scrittura per la directory
     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.
-  \item[\errcode{ENOTEMPTY}] la directory non è vuota.
+    processo o un \itindex{mount~point} \textit{mount point}.
+  \item[\errcode{EPERM}] il filesystem non supporta la cancellazione di
+    directory, oppure la directory che contiene \param{dirname} ha lo
+    \itindex{sticky~bit} \textit{sticky bit} impostato e non si è i
+    proprietari della directory o non si hanno privilegi amministrativi. 
   \end{errlist}
-  ed inoltre anche \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
-  \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP}, \errval{EROFS}.}
-\end{prototype}
+  ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errcode{ENOTEMPTY} e
+  \errval{EROFS} nel loro significato generico.}
+\end{funcproto}
 
-La funzione cancella la directory \param{dirname}, che deve essere vuota (la
-directory deve cioè contenere soltanto le due voci standard ``\file{.}'' e
-``\file{..}'').  Il nome può essere indicato con il \textit{pathname} assoluto
-o relativo.
 
-La modalità con cui avviene la cancellazione è analoga a quella di
-\func{unlink}: fintanto che il numero di collegamenti \itindex{inode}
-all'\textit{inode} della directory non diventa nullo e nessun processo ha la
-directory aperta lo spazio occupato su disco non viene rilasciato. Se un
-processo ha la directory aperta la funzione rimuove il collegamento
-\itindex{inode} all'\textit{inode} e nel caso sia l'ultimo, pure le voci
-standard ``\file{.}''  e ``\file{..}'', a questo punto il kernel non
-consentirà di creare più nuovi file nella directory.
+La funzione cancella la directory \param{dirname}, che deve essere vuota, la
+directory deve cioè contenere le due voci standard ``\file{.}'' e
+``\file{..}'' e niente altro.  Il nome può essere indicato con un
+\textit{pathname} assoluto o relativo, ma si deve fare riferimento al nome
+nella directory genitrice, questo significa che \textit{pathname} terminanti
+in ``\file{.}'' e ``\file{..}'' anche se validi in altri contesti, causeranno
+il fallimento della funzione.
 
+Se la directory cancellata risultasse aperta in qualche processo per una
+lettura dei suoi contenuti (vedi sez.~\ref{sec:file_dir_read}), pur
+scomparendo dal filesystem e non essendo più possibile accedervi o crearvi
+altri file, le risorse ad essa associate verrebbero disallocate solo alla
+chiusura di tutti questi ulteriori riferimenti.
 
 
-\subsection{Accesso alle directory}
+\subsection{Lettura e scansione delle directory}
 \label{sec:file_dir_read}
 
 Benché le directory alla fine non siano altro che dei file che contengono
-delle liste di nomi ed \itindex{inode} \textit{inode}, per il ruolo che
-rivestono nella struttura del sistema, non possono essere trattate come dei
-normali file di dati. Ad esempio, onde evitare inconsistenze all'interno del
-filesystem, solo il kernel può scrivere il contenuto di una directory, e non
-può essere un processo a inserirvi direttamente delle voci con le usuali
-funzioni di scrittura.
+delle liste di nomi associati ai relativi \itindex{inode} \textit{inode}, per
+il ruolo che rivestono nella struttura del sistema non possono essere trattate
+come dei normali file di dati. Ad esempio, onde evitare inconsistenze
+all'interno del filesystem, solo il kernel può scrivere il contenuto di una
+directory, e non può essere un processo a inserirvi direttamente delle voci
+con le usuali funzioni di scrittura.
 
 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
@@ -1980,41 +1990,45 @@ 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 VFS del kernel prevede una apposita
-funzione per la lettura delle directory.
+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}
 
 Tutto questo si riflette nello standard POSIX\footnote{le funzioni erano
   presenti in SVr4 e 4.3BSD, la loro specifica è riportata in POSIX.1-2001.}
 che ha introdotto una apposita interfaccia per la lettura delle directory,
-basata sui cosiddetti \textit{directory stream} (chiamati così per l'analogia
-con i file stream dell'interfaccia standard ANSI C di
-cap.~\ref{cha:files_std_interface}). La prima funzione di questa interfaccia è
+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 è
 \funcd{opendir}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{DIR * opendir(const char *dirname)} 
-  
-  Apre un \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce un puntatore al \textit{directory stream}
-    in caso di successo e \val{NULL} per un errore, nel qual caso \var{errno}
-    assumerà i valori \errval{EACCES}, \errval{EMFILE}, \errval{ENFILE},
-    \errval{ENOENT}, \errval{ENOMEM} e \errval{ENOTDIR}.}
-\end{functions}
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{DIR *opendir(const char *dirname)}
+\fdesc{Apre un \textit{directory stream}.} 
+}
+{La funzione ritorna un puntatore al \textit{directory stream} in caso di
+  successo e \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
+  dei valori \errval{EACCES}, \errval{EMFILE}, \errval{ENFILE},
+  \errval{ENOENT}, \errval{ENOMEM} e \errval{ENOTDIR} nel loro significato
+  generico.}
+\end{funcproto}
 
 La funzione apre un \textit{directory stream} per la directory
 \param{dirname}, ritornando il puntatore ad un oggetto di tipo \type{DIR} (che
 è il \index{tipo!opaco} tipo opaco usato dalle librerie per gestire i
 \textit{directory stream}) da usare per tutte le operazioni successive, la
-funzione inoltre posiziona lo stream sulla prima voce contenuta nella
-directory. 
+funzione inoltre posiziona lo \textit{stream} sulla prima voce contenuta nella
+directory.
 
 Si tenga presente che comunque la funzione opera associando il
 \textit{directory stream} ad un opportuno file descriptor sottostante, sul
 quale vengono compiute le operazioni. Questo viene sempre aperto impostando il
-flag di \itindex{close-on-exec} \textit{close-on-exec}, così da evitare che
-resti aperto in caso di esecuzione di un altro programma.
+flag di \itindex{close-on-exec} \textit{close-on-exec} (si ricordi quanto
+detto in sez.~\ref{sec:proc_exec}), così da evitare che resti aperto in caso
+di esecuzione di un altro programma.
 
 Nel caso in cui sia necessario conoscere il \textit{file descriptor} associato
 ad un \textit{directory stream} si può usare la funzione
@@ -2026,16 +2040,24 @@ ad un \textit{directory stream} si può usare la funzione
   \macro{\_SVID\_SOURCE}, dalla versione 2.10 si possono usare anche
   \texttt{\macro{\_POSIX\_C\_SOURCE} >= 200809L} o
   \texttt{\macro{\_XOPEN\_SOURCE} >= 700}.}  il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{int dirfd(DIR * dir)} 
-  
-  Restituisce il file descriptor associato ad un \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce il file descriptor (un valore positivo) in
-    caso di successo e -1 in caso di errore.}
-\end{functions}
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{int dirfd(DIR *dir)}
+\fdesc{Legge il file descriptor associato ad un \textit{directory stream}.} 
+}
+{La funzione ritorna un valore positivo corrispondente al file descriptor in
+  caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà
+  uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] \param{dir} non è un puntatore ad un
+    \textit{directory stream}. 
+  \item[\errcode{ENOTSUP}] l'implementazione non supporta l'uso di un file
+    descriptor per la directory.
+  \end{errlist}
+}
+\end{funcproto}
 
 La funzione restituisce il file descriptor associato al \textit{directory
   stream} \param{dir}. Di solito si utilizza questa funzione in abbinamento a
@@ -2053,17 +2075,17 @@ possibile associarvi un \textit{directory stream} con la funzione
   \macro{\_GNU\_SOURCE}, dalla versione 2.10 si possono usare anche
   \texttt{\macro{\_POSIX\_C\_SOURCE} >= 200809L} o \texttt{\_XOPEN\_SOURCE >=
     700} .}  il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h}
-  
-  \funcdecl{DIR * fdopendir(int fd)} 
-  
-  Associa un \textit{directory stream} al file descriptor \param{fd}.
-  
-  \bodydesc{La funzione restituisce un puntatore al \textit{directory stream}
-    in caso di successo e \val{NULL} per un errore, nel qual caso \var{errno}
-    assumerà il valore \errval{EBADF}.}
-\end{functions}
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{DIR *fdopendir(int fd)}
+\fdesc{Associa un \textit{directory stream} ad un file descriptor.} 
+}
+{La funzione ritorna un puntatore al \textit{directory stream} in caso di
+  successo e \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
+  dei valori \errval{EBADF} o \errval{ENOMEM} nel loro significato generico.}
+\end{funcproto}
 
 La funzione è identica a \func{opendir}, ma ritorna un \textit{directory
   stream} facendo riferimento ad un file descriptor \param{fd} che deve essere
@@ -2074,33 +2096,72 @@ sez.~\ref{sec:file_openat}.
 
 Una volta utilizzata il file descriptor verrà usato internamente dalle
 funzioni che operano sul \textit{directory stream} e non dovrà essere più
-utilizzato all'interno del proprio programma; in particolare dovrà essere
-chiuso con \func{closedir} e non direttamente. Si tenga presente inoltre che
-\func{fdopendir} non modifica lo stato di un eventuale flag di
-\itindex{close-on-exec} \textit{close-on-exec}, che pertanto dovrà essere
-impostato esplicitamente in fase di apertura del file descriptor.
+utilizzato all'interno del proprio programma. In particolare dovrà essere
+chiuso attraverso il \textit{directory stream} con \func{closedir} e non
+direttamente. Si tenga presente inoltre che \func{fdopendir} non modifica lo
+stato di un eventuale flag di \itindex{close-on-exec} \textit{close-on-exec},
+che pertanto dovrà essere impostato esplicitamente in fase di apertura del
+file descriptor.
 
 Una volta che si sia aperto un \textit{directory stream} la lettura del
 contenuto della directory viene effettuata attraverso la funzione
-\funcd{readdir}; il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{struct dirent *readdir(DIR *dir)}
-  
-  Legge una voce dal \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce il puntatore alla struttura contenente i
-    dati in caso di successo e \val{NULL} altrimenti, in caso di
-    \textit{directory stream} non valido \var{errno} assumerà il valore
-    \errval{EBADF}, il valore \val{NULL} viene restituito anche quando si
-    raggiunge la fine dello stream.}
-\end{functions}
+\funcd{readdir}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{struct dirent *readdir(DIR *dir)}
+\fdesc{Legge una voce dal \textit{directory stream}.} 
+}
+{La funzione ritorna il puntatore alla struttura contenente i dati in caso di
+  successo e \val{NULL} per un errore o se si è raggiunta la fine dello
+  \textit{stream}. Il solo codice di errore restituito in \var{errno} è
+  \errval{EBADF} qualora \param{dir} non indichi un \textit{directory stream}
+  valido.}
+\end{funcproto}
 
 La funzione legge la voce corrente nella directory, posizionandosi sulla voce
 successiva. Pertanto se si vuole leggere l'intero contenuto di una directory
 occorrerà ripetere l'esecuzione della funzione fintanto che non si siano
-esaurite tutte le voci in essa presenti.
+esaurite tutte le voci in essa presenti, che viene segnalata dalla
+restituzione di \val{NULL} come valore di ritorno. Si può distinguere questa
+condizione da un errore in quanto in questo caso \var{errno} non verrebbe
+modificata.
+
+I dati letti da \func{readdir} vengono memorizzati in una struttura
+\struct{dirent}, la cui definizione è riportata in
+fig.~\ref{fig:file_dirent_struct}.\footnote{la definizione è quella usata da
+  Linux, che si trova nel file \file{/usr/include/bits/dirent.h}, essa non
+  contempla la presenza del campo \var{d\_namlen} che indica la lunghezza del
+  nome del file.} La funzione non è rientrante e restituisce il puntatore ad
+una struttura allocata staticamente, che viene sovrascritta tutte le volte che
+si ripete la lettura di una voce sullo stesso \textit{directory stream}.
+
+Di questa funzione esiste anche una versione \index{funzioni!rientranti}
+rientrante, \funcd{readdir\_r},\footnote{per usarla è necessario definire una
+  qualunque delle macro \texttt{\macro{\_POSIX\_C\_SOURCE} >= 1},
+  \macro{\_XOPEN\_SOURCE}, \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE},
+  \macro{\_POSIX\_SOURCE}.} che non usa una struttura allocata staticamente, e
+può essere utilizzata anche con i \itindex{thread} \textit{thread}, il suo
+prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{int readdir\_r(DIR *dir, struct dirent *entry, struct dirent **result)}
+\fdesc{Legge una voce dal \textit{directory stream}.} 
+}
+{La funzione ritorna $0$ in caso di successo ed un numero positivo per un
+  errore, nel qual caso \var{errno} assumerà gli stessi valori di
+  \func{readdir}.} 
+\end{funcproto}
+
+La funzione restituisce in \param{result} come \itindex{value~result~argument}
+\textit{value result argument} l'indirizzo della struttura \struct{dirent}
+dove sono stati salvati i dati, che deve essere allocata dal chiamante, ed il
+cui indirizzo deve essere indicato con l'argomento \param{entry}.  Se si è
+raggiunta la fine del \textit{directory stream} invece in \param{result} viene
+restituito il valore \val{NULL}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2113,61 +2174,70 @@ esaurite tutte le voci in essa presenti.
   \label{fig:file_dirent_struct}
 \end{figure}
 
-I dati vengono memorizzati in una struttura \struct{dirent}, la cui
-definizione è riportata in fig.~\ref{fig:file_dirent_struct}.\footnote{la
-  definizione è quella usata da Linux, che si trova nel file
-  \file{/usr/include/bits/dirent.h}, essa non contempla la presenza del campo
-  \var{d\_namlen} che indica la lunghezza del nome del file.} La funzione
-restituisce il puntatore alla struttura; si tenga presente però che
-quest'ultima è allocata staticamente, per cui viene sovrascritta tutte le
-volte che si ripete la lettura di una voce sullo stesso \textit{directory
-  stream}.
-
-Di questa funzione esiste anche una versione \index{funzioni!rientranti}
-rientrante, \funcd{readdir\_r},\footnote{per usarla è necessario definire una
-  qualunque delle macro \texttt{\macro{\_POSIX\_C\_SOURCE} >= 1},
-  \macro{\_XOPEN\_SOURCE}, \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE},
-  \macro{\_POSIX\_SOURCE}.} che non usa una struttura allocata staticamente, e
-può essere utilizzata anche con i \itindex{thread} \textit{thread}, il suo
-prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{int readdir\_r(DIR *dir, struct dirent *entry,
-          struct dirent **result)}
-  
-  Legge una voce dal \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-    errore, gli errori sono gli stessi di \func{readdir}.}
-\end{functions}
+% Lo spazio per la \struct{dirent} dove vengono restituiti i dati della
+% directory deve essere allocato a cura del chiamante, dato che la dimensione
 
-La funzione restituisce in \param{result} (come
-\itindex{value~result~argument} \textit{value result argument}) l'indirizzo
-dove sono stati salvati i dati, che di norma corrisponde a quello della
-struttura precedentemente allocata e specificata dall'argomento \param{entry},
-anche se non è assicurato che la funzione usi lo spazio fornito dall'utente.
 
 I vari campi di \struct{dirent} contengono le informazioni relative alle voci
-presenti nella directory; sia BSD che SVr4 prevedono che siano sempre presenti
-il campo \var{d\_name},\footnote{lo standard POSIX prevede invece solo la
-  presenza del campo \var{d\_fileno}, identico \var{d\_ino}, che in Linux è
-  definito come alias di quest'ultimo; il campo \var{d\_name} è considerato
-  dipendente dall'implementazione.} che contiene il nome del file nella forma
-di una stringa terminata da uno zero,\footnote{lo standard POSIX non specifica
-  una lunghezza, ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del
-  campo è definita come \code{NAME\_MAX+1} che di norma porta al valore di 256
-  byte usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero
-di \textit{inode} cui il file è associato e corrisponde al campo \var{st\_ino}
-di \struct{stat}.
-
-La presenza di ulteriori campi opzionali oltre i due citati è segnalata dalla
-definizione di altrettante macro nella forma \code{\_DIRENT\_HAVE\_D\_XXX}
-dove \code{XXX} è il nome del relativo campo; nel caso di Linux sono pertanto
-definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
+presenti nella directory. Sia BSD che SVr4 che POSIX.1-2001\footnote{il
+  vecchio standard POSIX prevedeva invece solo la presenza del campo
+  \var{d\_fileno}, identico \var{d\_ino}, che in Linux era definito come alias
+  di quest'ultimo, mentre il campo \var{d\_name} era considerato dipendente
+  dall'implementazione.}  prevedono che siano sempre presenti il campo
+\var{d\_name}, che contiene il nome del file nella forma di una stringa
+terminata da uno zero, ed il campo \var{d\_ino}, che contiene il numero di
+\itindex{inode} \textit{inode} cui il file è associato e corrisponde al campo
+\var{st\_ino} di \struct{stat}.  La presenza di ulteriori campi opzionali
+oltre i due citati è segnalata dalla definizione di altrettante macro nella
+forma \code{\_DIRENT\_HAVE\_D\_XXX} dove \code{XXX} è il nome del relativo
+campo. Come si può evincere da fig.~\ref{fig:file_dirent_struct} nel caso di
+Linux sono pertanto definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
 \macro{\_DIRENT\_HAVE\_D\_OFF} e \macro{\_DIRENT\_HAVE\_D\_RECLEN}, mentre non
 è definita la macro \macro{\_DIRENT\_HAVE\_D\_NAMLEN}.
 
+Dato che possono essere presenti campi opzionali e che lo standard
+POSIX.1-2001 non specifica una dimensione definita per il nome dei file (che
+può variare a seconda del filesystem), ma solo un limite superiore pari a
+\const{NAME\_MAX} (vedi tab.~\ref{tab:sys_file_macro}), in generale per
+allocare una struttura \struct{dirent} in maniera portabile occorre eseguire
+un calcolo per ottenere le dimensioni appropriate per il proprio
+sistema.\footnote{in SVr4 la lunghezza del campo è definita come
+  \code{NAME\_MAX+1} che di norma porta al valore di 256 byte usato anche in
+  fig.~\ref{fig:file_dirent_struct}.} Lo standard però richiede che il campo
+\var{d\_name} sia sempre l'ultimo della struttura, questo ci consente di
+ottenere la dimensione della prima parte con la macro di utilità generica
+\macro{offsetof}, che si può usare con il seguente prototipo:
+
+{\centering
+\vspace{3pt}
+\begin{funcbox}{
+\fhead{stddef.h}
+\fdecl{size\_t \macro{offsetof}(type, member)}
+\fdesc{Restituisce la posizione del campo \param{member} nella
+  struttura \param{type}.}
+} 
+\end{funcbox}
+}
+
+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. 
+
+Per quanto riguarda il significato dei campi opzionali, il campo \var{d\_type}
+indica il tipo di file (se fifo, directory, collegamento simbolico, ecc.), e
+consente di evitare una successiva chiamata a \func{lstat} (vedi
+sez.~\ref{sec:file_stat}) per determinarlo. I suoi possibili valori sono
+riportati in tab.~\ref{tab:file_dtype_macro}. Si tenga presente che questo
+valore è disponibile solo per i filesystem che ne supportano la restituzione
+(fra questi i più noti sono \textsl{btrfs}, \textsl{ext2}, \textsl{ext3}, e
+\textsl{ext4}), per gli altri si otterrà sempre il valore
+\const{DT\_UNKNOWN}.\footnote{inoltre fino alla versione 2.1 della
+  \acr{glibc}, pur essendo il campo \var{d\_type} presente, il suo uso non era
+  implementato, e veniva restituito comunque il valore \const{DT\_UNKNOWN}.}
+
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -2191,83 +2261,88 @@ definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
   \label{tab:file_dtype_macro}
 \end{table}
 
-Per quanto riguarda il significato dei campi opzionali, il campo \var{d\_type}
-indica il tipo di file (se fifo, directory, collegamento simbolico, ecc.), e consente
-di evitare una successiva chiamata a \func{lstat} per determinarlo. I suoi
-possibili valori sono riportati in tab.~\ref{tab:file_dtype_macro}. Si tenga
-presente che questo valore è disponibile solo per i filesystem che ne
-supportano la restituzione (fra questi i più noti sono \textsl{btrfs},
-\textsl{ext2}, \textsl{ext3}, e \textsl{ext4}), per gli altri si otterrà
-sempre il valore \const{DT\_UNKNOWN}.\footnote{inoltre fino alla versione 2.1
-  della \acr{glibc}, pur essendo il campo \var{d\_type} presente, il suo uso
-  non era implementato, e veniva restituito comunque il valore
-  \const{DT\_UNKNOWN}.}
-
 Per la conversione da e verso l'analogo valore mantenuto dentro il campo
-\var{st\_mode} di \struct{stat} sono definite anche due macro di conversione,
-\macro{IFTODT} e \macro{DTTOIF}:
-\begin{functions}
-  \funcdecl{int IFTODT(mode\_t MODE)} Converte il tipo di file dal formato di
-  \var{st\_mode} a quello di \var{d\_type}.
-  
-  \funcdecl{mode\_t DTTOIF(int DTYPE)} Converte il tipo di file dal formato di
-  \var{d\_type} a quello di \var{st\_mode}.
-\end{functions}
+\var{st\_mode} di \struct{stat} (vedi fig.~\ref{fig:file_stat_struct}) sono
+definite anche due macro di conversione, \macro{IFTODT} e \macro{DTTOIF}:
+
+{\centering
+\vspace{3pt}
+\begin{funcbox}{
+\fhead{dirent.h}
+\fdecl{int \macro{IFTODT}(mode\_t MODE)}
+\fdesc{Converte il tipo di file dal formato di \var{st\_mode} a quello di
+  \var{d\_type}.}
+\fdecl{mode\_t \macro{DTTOIF}(int DTYPE)}
+\fdesc{Converte il tipo di file dal formato di \var{d\_type} a quello di
+  \var{st\_mode}.}  
+} 
+\end{funcbox}
+}
 
 Il campo \var{d\_off} contiene invece la posizione della voce successiva della
 directory, mentre il campo \var{d\_reclen} la lunghezza totale della voce
 letta. Con questi due campi diventa possibile, determinando la posizione delle
-varie voci, spostarsi all'interno dello stream usando la funzione
+varie voci, spostarsi all'interno dello \textit{stream} usando la funzione
 \funcd{seekdir},\footnote{sia questa funzione che \func{telldir}, sono
   estensioni prese da BSD, ed introdotte nello standard POSIX solo a partire
   dalla revisione POSIX.1-2001, per poterle utilizzare deve essere definita
   una delle macro \macro{\_XOPEN\_SOURCE}, \macro{\_BSD\_SOURCE} o
   \macro{\_SVID\_SOURCE}.} il cui prototipo è:
-\begin{prototype}{dirent.h}{void seekdir(DIR *dir, off\_t offset)}
-  Cambia la posizione all'interno di un \textit{directory stream}.
-\end{prototype}
+
+\begin{funcproto}{
+\fhead{dirent.h}
+\fdecl{void seekdir(DIR *dir, off\_t offset)}
+\fdesc{Cambia la posizione all'interno di un \textit{directory stream}.} 
+}
+{La funzione non ritorna niente e non imposta errori.}
+\end{funcproto}
 
 La funzione non ritorna nulla e non segnala errori, è però necessario che il
-valore dell'argomento \param{offset} sia valido per lo stream \param{dir};
-esso pertanto deve essere stato ottenuto o dal valore di \var{d\_off} di
-\struct{dirent} o dal valore restituito dalla funzione \funcd{telldir}, che
-legge la posizione corrente; il prototipo di quest'ultima è:\footnote{prima
-  della \acr{glibc} 2.1.1 la funzione restituiva un valore di tipo
-  \type{off\_t}, sostituito a partire dalla versione 2.1.2 da \ctyp{long} per
-  conformità a POSIX.1-2001.}
-\begin{prototype}{dirent.h}{long telldir(DIR *dir)}
-  Ritorna la posizione corrente in un \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce la posizione corrente nello stream (un
-    numero positivo) in caso di successo, e -1 altrimenti, nel qual caso
-    \var{errno} assume solo il valore di \errval{EBADF}, corrispondente ad un
-    valore errato per \param{dir}.}
-\end{prototype}
+valore dell'argomento \param{offset} sia valido per lo
+\textit{stream} \param{dir}; esso pertanto deve essere stato ottenuto o dal
+valore di \var{d\_off} di \struct{dirent} o dal valore restituito dalla
+funzione \funcd{telldir}, che legge la posizione corrente; il cui prototipo
+è:\footnote{prima della \acr{glibc} 2.1.1 la funzione restituiva un valore di
+  tipo \type{off\_t}, sostituito a partire dalla versione 2.1.2 da \ctyp{long}
+  per conformità a POSIX.1-2001.}
+
+\begin{funcproto}{
+\fhead{dirent.h}
+\fdecl{long telldir(DIR *dir)}
+\fdesc{Ritorna la posizione corrente in un \textit{directory stream}.} 
+}
+{La funzione ritorna la posizione corrente nello \textit{stream} (un numero
+  positivo) in caso di successo e $-1$ per un errore, nel qual caso
+  \var{errno} assume solo il valore di \errval{EBADF}, corrispondente ad un
+  valore errato per \param{dir}.  }
+\end{funcproto}
 
-La sola funzione di posizionamento nello stream prevista originariamente dallo
-standard POSIX è \funcd{rewinddir}, che riporta la posizione a quella
-iniziale; il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{void rewinddir(DIR *dir)}
-  
-  Si posiziona all'inizio di un \textit{directory stream}.
-\end{functions}
+La sola funzione di posizionamento per un \textit{directory stream} prevista
+originariamente dallo standard POSIX è \funcd{rewinddir}, che riporta la
+posizione a quella iniziale; il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{void rewinddir(DIR *dir)}
+\fdesc{Si posiziona all'inizio di un \textit{directory stream}.} 
+}
+{La funzione non ritorna niente e non imposta errori.}
+\end{funcproto}
 
 Una volta completate le operazioni si può chiudere il \textit{directory
   stream}, ed il file descriptor ad esso associato, con la funzione
 \funcd{closedir}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{int closedir(DIR * dir)} 
-  
-  Chiude un \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 altrimenti, nel
-    qual caso \var{errno} assume il valore \errval{EBADF}.}
-\end{functions}
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{int closedir(DIR *dir)}
+\fdesc{Chiude un \textit{directory stream}.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assume solo il valore \errval{EBADF}.}
+\end{funcproto}
 
 A parte queste funzioni di base in BSD 4.3 venne introdotta un'altra funzione
 che permette di eseguire una scansione completa, con tanto di ricerca ed
@@ -2275,21 +2350,24 @@ ordinamento, del contenuto di una directory; la funzione è
 \funcd{scandir}\footnote{in Linux questa funzione è stata introdotta fin dalle
   \acr{libc4} e richiede siano definite le macro \macro{\_BSD\_SOURCE} o
   \macro{\_SVID\_SOURCE}.} ed il suo prototipo è:
-\begin{prototype}{dirent.h}{int scandir(const char *dir, 
-    struct dirent ***namelist, int(*filter)(const struct dirent *),
-    int(*compar)(const struct dirent **, const struct dirent **))} 
-  
-  Esegue una scansione di un \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce in caso di successo il numero di voci
-    trovate, e -1 altrimenti.}
-\end{prototype}
+
+\begin{funcproto}{
+\fhead{dirent.h}
+\fdecl{int scandir(const char *dir, struct dirent ***namelist, \\
+\phantom{int scandir(}int(*filter)(const struct dirent *), \\
+\phantom{int scandir(}int(*compar)(const struct dirent **, const struct dirent **))}
+\fdesc{Esegue una scansione di un \textit{directory stream}.} 
+}
+{La funzione ritorna il numero di voci trovate in caso di successo e $-1$ per
+  un errore, nel qual caso \var{errno} può assumere solo il valore
+  \errval{ENOMEM}.}
+\end{funcproto}
 
 Al solito, per la presenza fra gli argomenti di due puntatori a funzione, il
 prototipo non è molto comprensibile; queste funzioni però sono quelle che
-controllano rispettivamente la selezione di una voce (quella passata con
-l'argomento \param{filter}) e l'ordinamento di tutte le voci selezionate
-(quella specificata dell'argomento \param{compar}).
+controllano rispettivamente la selezione di una voce, passata con
+l'argomento \param{filter}, e l'ordinamento di tutte le voci selezionate,
+specificata dell'argomento \param{compar}.
 
 La funzione legge tutte le voci della directory indicata dall'argomento
 \param{dir}, passando un puntatore a ciascuna di esse (una struttura
@@ -2312,35 +2390,35 @@ alla fine l'indirizzo della lista ordinata dei puntatori alle strutture
   deve essere dichiarato come \code{struct dirent **namelist} ed alla funzione
   si deve passare il suo indirizzo.}
 
+\itindend{directory~stream}
+
 Per l'ordinamento, vale a dire come valori possibili per l'argomento
-\param{compar} sono disponibili due funzioni predefinite, \funcd{alphasort} e
+\param{compar}, sono disponibili due funzioni predefinite, \funcd{alphasort} e
 \funcd{versionsort}, i cui prototipi sono:
-\begin{functions}
-  \headdecl{dirent.h} 
-  
-  \funcdecl{int alphasort(const void *a, const void *b)} 
 
-  \funcdecl{int versionsort(const void *a, const void *b)} 
-  
-  Funzioni per l'ordinamento delle voci di \textit{directory stream}.
-  
-  \bodydesc{Le funzioni restituiscono un valore minore, uguale o maggiore di
-    zero qualora il primo argomento sia rispettivamente minore, uguale o
-    maggiore del secondo.}
-\end{functions}
+\begin{funcproto}{
+\fhead{dirent.h}
+\fdecl{int alphasort(const void *a, const void *b)}
+\fdecl{int versionsort(const void *a, const void *b)}
+\fdesc{Riordinano le voci di \textit{directory stream}.} 
+}
+{Le funzioni restituiscono un valore minore, uguale o maggiore di zero qualora
+  il primo argomento sia rispettivamente minore, uguale o maggiore del secondo
+  e non forniscono errori.}
+\end{funcproto}
 
 La funzione \func{alphasort} deriva da BSD ed è presente in Linux fin dalle
 \acr{libc4}\footnote{la versione delle \acr{libc4} e \acr{libc5} usa però come
   argomenti dei puntatori a delle strutture \struct{dirent}; la glibc usa il
   prototipo originario di BSD, mostrato anche nella definizione, che prevede
   puntatori a \ctyp{void}.} e deve essere specificata come argomento
-\param{compar} per ottenere un ordinamento alfabetico (secondo il valore del
-campo \var{d\_name} delle varie voci). La \acr{glibc} prevede come
+\param{compar} per ottenere un ordinamento alfabetico secondo il valore del
+campo \var{d\_name} delle varie voci. La \acr{glibc} prevede come
 estensione\footnote{la \acr{glibc}, a partire dalla versione 2.1, effettua
   anche l'ordinamento alfabetico tenendo conto delle varie localizzazioni,
   usando \funcm{strcoll} al posto di \funcm{strcmp}.} anche
-\func{versionsort}, che ordina i nomi tenendo conto del numero di versione
-(cioè qualcosa per cui \texttt{file10} viene comunque dopo \texttt{file4}.)
+\func{versionsort}, che ordina i nomi tenendo conto del numero di versione,
+cioè qualcosa per cui \texttt{file10} viene comunque dopo \texttt{file4}.
 
 \begin{figure}[!htbp]
   \footnotesize \centering
@@ -2356,18 +2434,18 @@ Un semplice esempio dell'uso di queste funzioni è riportato in
 fig.~\ref{fig:file_my_ls}, dove si è riportata la sezione principale di un
 programma che, usando la funzione di scansione illustrata in
 fig.~\ref{fig:file_dirscan}, stampa i nomi dei file contenuti in una directory
-e la relativa dimensione (in sostanza una versione semplificata del comando
-\cmd{ls}).
+e la relativa dimensionein sostanza una versione semplificata del comando
+\cmd{ls}.
 
 Il programma è estremamente semplice; in fig.~\ref{fig:file_my_ls} si è omessa
-la parte di gestione delle opzioni (che prevede solo l'uso di una funzione per
-la stampa della sintassi, anch'essa omessa) ma il codice completo potrà essere
-trovato coi sorgenti allegati nel file \file{myls.c}.
+la parte di gestione delle opzioniche prevede solo l'uso di una funzione per
+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
-directory da esaminare) è chiamare (\texttt{\small 16}) la funzione
-\func{DirScan} per eseguire la scansione, usando la funzione \code{do\_ls}
+(\texttt{\small 12--15}) di avere almeno un argomentoche 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.
 
 Quest'ultima si limita (\texttt{\small 26}) a chiamare \func{stat} sul file
@@ -2376,7 +2454,7 @@ indicato dalla directory entry passata come argomento (il cui nome è appunto
 dati ad esso relativi, per poi provvedere (\texttt{\small 27}) a stampare il
 nome del file e la dimensione riportata in \var{data}.
 
-Dato che la funzione verrà chiamata all'interno di \func{DirScan} per ogni
+Dato che la funzione verrà chiamata all'interno di \myfunc{dir\_scan} per ogni
 voce presente questo è sufficiente a stampare la lista completa dei file e
 delle relative dimensioni. Si noti infine come si restituisca sempre 0 come
 valore di ritorno per indicare una esecuzione senza errori.
@@ -2384,27 +2462,27 @@ valore di ritorno per indicare una esecuzione senza errori.
 \begin{figure}[!htbp]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
-    \includecodesample{listati/DirScan.c}
+    \includecodesample{listati/dir_scan.c}
   \end{minipage}
   \caption{Codice della funzione di scansione di una directory contenuta nel
-    file \file{DirScan.c}.} 
+    file \file{dir\_scan.c}.} 
   \label{fig:file_dirscan}
 \end{figure}
 
-Tutto il grosso del lavoro è svolto dalla funzione \func{DirScan}, 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
-stream sulla directory passata come primo argomento, stampando un messaggio in
-caso di errore.
+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,
+stampando un messaggio in caso di errore.
 
 Il passo successivo (\texttt{\small 23--24}) è cambiare
 \index{directory~di~lavoro} directory di lavoro (vedi
 sez.~\ref{sec:file_work_dir}), usando in sequenza le funzioni \func{dirfd} e
 \func{fchdir} (in realtà si sarebbe potuto usare direttamente \func{chdir} su
 \var{dirname}), in modo che durante il successivo ciclo (\texttt{\small
-  26--30}) sulle singole voci dello stream ci si trovi all'interno della
-directory.\footnote{questo è essenziale al funzionamento della funzione
+  26--30}) sulle singole voci dello \textit{stream} ci si trovi all'interno
+della directory.\footnote{questo è essenziale al funzionamento della funzione
   \code{do\_ls}, e ad ogni funzione che debba usare il campo \var{d\_name}, in
   quanto i nomi dei file memorizzati all'interno di una struttura
   \struct{dirent} sono sempre relativi alla directory in questione, e senza
@@ -2420,8 +2498,8 @@ voce valida, cioè un puntatore diverso da \val{NULL}, si esegue
 caso sarà \code{do\_ls}), ritornando con un codice di errore (\texttt{\small
   28}) qualora questa presenti una anomalia, identificata da un codice di
 ritorno negativo. Una volta terminato il ciclo la funzione si conclude con la
-chiusura (\texttt{\small 32}) dello stream\footnote{nel nostro caso, uscendo
-  subito dopo la chiamata, questo non servirebbe, in generale però
+chiusura (\texttt{\small 32}) dello \textit{stream}\footnote{nel nostro caso,
+  uscendo subito dopo la chiamata, questo non servirebbe, in generale però
   l'operazione è necessaria, dato che la funzione può essere invocata molte
   volte all'interno dello stesso processo, per cui non chiudere i
   \textit{directory stream} comporterebbe un consumo progressivo di risorse,
@@ -2429,6 +2507,7 @@ chiusura (\texttt{\small 32}) dello stream\footnote{nel nostro caso, uscendo
 (\texttt{\small 32}) del codice di operazioni concluse con successo.
 
 
+
 \subsection{La directory di lavoro}
 \label{sec:file_work_dir}
 
@@ -2447,35 +2526,38 @@ dove il ``\textsl{relativa}'' fa riferimento appunto a questa directory.
 Quando un utente effettua il login, questa directory viene impostata alla
 \textit{home directory} del suo account. Il comando \cmd{cd} della shell
 consente di cambiarla a piacere, spostandosi da una directory ad un'altra, il
-comando \cmd{pwd} la stampa sul terminale.  Siccome la directory corrente
+comando \cmd{pwd} la stampa sul terminale.  Siccome la directory di lavoro
 resta la stessa quando viene creato un processo figlio (vedi
-sez.~\ref{sec:proc_fork}), la directory corrente della shell diventa anche la
-directory corrente di qualunque comando da essa lanciato.
+sez.~\ref{sec:proc_fork}), la directory di lavoro della shell diventa anche la
+directory di lavoro di qualunque comando da essa lanciato.
 
 Dato che è il kernel che tiene traccia per ciascun processo \itindex{inode}
 dell'\textit{inode} della directory di lavoro, per ottenerne il
-\textit{pathname} occorre usare una apposita funzione di libreria,
+\textit{pathname} occorre usare una apposita funzione,
 \funcd{getcwd},\footnote{con Linux \func{getcwd} è una \textit{system call}
   dalla versione 2.1.9, in precedenza il valore doveva essere ottenuto tramite
   il filesystem \texttt{/proc} da \procfile{/proc/self/cwd}.} il cui prototipo
 è:
-\begin{prototype}{unistd.h}{char *getcwd(char *buffer, size\_t size)}
-  Legge il \textit{pathname} della directory di lavoro corrente.
-  
-  \bodydesc{La funzione restituisce il puntatore \param{buffer} se riesce,
-    \val{NULL} se fallisce, in quest'ultimo caso la variabile
-    \var{errno} è impostata con i seguenti codici di errore:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{char *getcwd(char *buffer, size\_t size)}
+\fdesc{Legge il \textit{pathname} della directory di lavoro corrente.} 
+}
+{La funzione ritorna il puntatore a \param{buffer} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
+  \item[\errcode{EACCES}] manca il permesso di lettura o di attraversamento  su
+    uno dei componenti del \textit{pathname} (cioè su una delle directory
+    superiori alla corrente).
   \item[\errcode{EINVAL}] l'argomento \param{size} è zero e \param{buffer} non
     è nullo.
+  \item[\errcode{ENOENT}] la directory di lavoro è stata eliminata. 
   \item[\errcode{ERANGE}] l'argomento \param{size} è più piccolo della
     lunghezza del \textit{pathname}. 
-  \item[\errcode{EACCES}] manca il permesso di lettura o di ricerca su uno dei
-    componenti del \textit{pathname} (cioè su una delle directory superiori
-    alla corrente).
-  \item[\errcode{ENOENT}] la directory di lavoro è stata eliminata.
-  \end{errlist}}
-\end{prototype}
+  \end{errlist}
+  ed inoltre \errcode{EFAULT} nel suo significato generico.}
+\end{funcproto}
 
 La funzione restituisce il \textit{pathname} completo della directory di
 lavoro corrente nella stringa puntata da \param{buffer}, che deve essere
@@ -2490,130 +2572,145 @@ Si può anche specificare un puntatore nullo come
   supportata da Linux e dalla \acr{glibc}.} nel qual caso la stringa sarà
 allocata automaticamente per una dimensione pari a \param{size} qualora questa
 sia diversa da zero, o della lunghezza esatta del \textit{pathname}
-altrimenti. In questo caso ci si deve ricordare di disallocare la stringa una
-volta cessato il suo utilizzo.
-
-Di questa funzione esiste una versione \code{char *getwd(char *buffer)} fatta
-per compatibilità all'indietro con BSD, che non consente di specificare la
-dimensione del buffer; esso deve essere allocato in precedenza ed avere una
-dimensione superiore a \const{PATH\_MAX} (di solito 256 byte, vedi
-sez.~\ref{sec:sys_limits}); il problema è che in Linux non esiste una
-dimensione superiore per un \textit{pathname}, per cui non è detto che il
-buffer sia sufficiente a contenere il nome del file, e questa è la ragione
-principale per cui questa funzione è deprecata.
-
-Un uso comune di \func{getcwd} è quello di salvare la directory di lavoro
-iniziale per poi potervi tornare in un tempo successivo, un metodo alternativo
-più veloce, se non si è a corto di file descriptor, è invece quello di aprire
-la directory corrente (vale a dire ``\texttt{.}'') e tornarvi in seguito con
-\func{fchdir}. 
-
-Una seconda funzione usata per ottenere la directory di lavoro è \code{char
-  *get\_current\_dir\_name(void)} che è sostanzialmente equivalente ad una
-\code{getcwd(NULL, 0)}, con la sola differenza che essa ritorna il valore
-della variabile di ambiente \envvar{PWD}, che essendo costruita dalla shell
-può contenere un \textit{pathname} comprendente anche dei collegamenti
-simbolici. Usando \func{getcwd} infatti, essendo il \textit{pathname} ricavato
-risalendo all'indietro l'albero della directory, si perderebbe traccia di ogni
-passaggio attraverso eventuali collegamenti simbolici.
-
-Per cambiare la directory di lavoro si può usare la funzione \funcd{chdir}
-(equivalente del comando di shell \cmd{cd}) il cui nome sta appunto per
-\textit{change directory}, il suo prototipo è:
-\begin{prototype}{unistd.h}{int chdir(const char *pathname)} 
-  Cambia la directory di lavoro in \param{pathname}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 per un errore,
-    nel qual caso \var{errno} assumerà i valori:
+altrimenti. In questo caso ci si deve ricordare di disallocare la stringa con
+\func{free} una volta cessato il suo utilizzo.
+
+Un uso comune di \func{getcwd} è quello di salvarsi la directory di lavoro
+all'avvio del programma per poi potervi tornare in un tempo successivo, un
+metodo alternativo più veloce, se non si è a corto di file descriptor, è
+invece quello di aprire all'inizio la directory corrente (vale a dire
+``\texttt{.}'') e tornarvi in seguito con \func{fchdir}.
+
+Di questa funzione esiste una versione alternativa per compatibilità
+all'indietro con BSD, \funcm{getwd}, che non prevede l'argomento \param{size}
+e quindi non consente di specificare la dimensione di \param{buffer} che
+dovrebbe essere allocato in precedenza ed avere una dimensione sufficiente
+(per BSD maggiore \const{PATH\_MAX}, che di solito 256 byte, vedi
+sez.~\ref{sec:sys_limits}). Il problema è che su Linux non esiste una
+dimensione superiore per la lunghezza di un \textit{pathname}, per cui non è
+detto che il buffer sia sufficiente a contenere il nome del file, e questa è
+la ragione principale per cui questa funzione è deprecata, e non la tratteremo.
+
+Una seconda funzione usata per ottenere la directory di lavoro è
+\funcm{get\_current\_dir\_name},\footnote{la funzione è una estensione GNU e
+  presente solo nella \acr{glibc}.} che non prende nessun argomento ed è
+sostanzialmente equivalente ad una \code{getcwd(NULL, 0)}, con la differenza
+che se disponibile essa ritorna il valore della variabile di ambiente
+\envvar{PWD}, che essendo costruita dalla shell può contenere un
+\textit{pathname} comprendente anche dei collegamenti simbolici. Usando
+\func{getcwd} infatti, essendo il \textit{pathname} ricavato risalendo
+all'indietro l'albero della directory, si perderebbe traccia di ogni passaggio
+attraverso eventuali collegamenti simbolici.
+
+Per cambiare la directory di lavoro si può usare la funzione di sistema
+\funcd{chdir}, equivalente del comando di shell \cmd{cd}, il cui nome sta
+appunto per \textit{change directory}, il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int chdir(const char *pathname)}
+\fdesc{Cambia la directory di lavoro per \textit{pathname}.} 
+}
+{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{ENOTDIR}] non si è specificata una directory.
   \item[\errcode{EACCES}] manca il permesso di ricerca su uno dei componenti
-    di \param{path}.
+    di \param{pathname}.
+  \item[\errcode{ENOTDIR}] non si è specificata una directory.
   \end{errlist}
-  ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
-  \errval{ENOMEM}, \errval{ELOOP} e \errval{EIO}.}
-\end{prototype}
-\noindent ed ovviamente \param{pathname} deve indicare una directory per la
-quale si hanno i permessi di accesso.
-
-Dato che anche le directory sono file, è possibile riferirsi ad esse anche
-tramite il file descriptor, e non solo tramite il \textit{pathname}, per fare
-questo si usa \funcd{fchdir}, il cui prototipo è:
-\begin{prototype}{unistd.h}{int fchdir(int fd)} 
-  Identica a \func{chdir}, ma usa il file descriptor \param{fd} invece del
-  \textit{pathname}.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
-    errore, in caso di errore \var{errno} assumerà i valori \errval{EBADF} o
-    \errval{EACCES}.}
-\end{prototype}
-\noindent anche in questo caso \param{fd} deve essere un file descriptor
-valido che fa riferimento ad una directory. Inoltre l'unico errore di accesso
-possibile (tutti gli altri sarebbero occorsi all'apertura di \param{fd}), è
-quello in cui il processo non ha il permesso di accesso alla directory
-specificata da \param{fd}.
+  ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{EIO},
+  \errval{ENAMETOOLONG}, \errval{ENOENT} e \errval{ENOMEM} nel loro
+  significato generico.}
+\end{funcproto}
+
+La funzione cambia la directory di lavoro in \param{pathname} ed
+ovviamente \param{pathname} deve indicare una directory per la quale si hanno
+i permessi di accesso.
+
+Dato che ci si può riferire ad una directory anche tramite un file descriptor,
+per cambiare directory di lavoro è disponibile anche la funzione di sistema
+\funcd{fchdir}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int fchdir(int fd)}
+\fdesc{Cambia la directory di lavoro per file descriptor.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà i valori \errval{EBADF} o \errval{EACCES} nel loro
+  significato generico.}
+\end{funcproto}
+
+La funzione è identica a \func{chdir}, ma prende come argomento un file
+descriptor \param{fd} invece di un \textit{pathname}. Anche in questo
+caso \param{fd} deve essere un file descriptor valido che fa riferimento ad
+una directory. Inoltre l'unico errore di accesso possibile (tutti gli altri
+sarebbero occorsi all'apertura di \param{fd}), è quello in cui il processo non
+ha il permesso di attraversamento alla directory specificata da \param{fd}.
 
 \index{directory~di~lavoro|)} 
 
 
-\subsection{La creazione di file speciali}
+\subsection{La creazione dei \textsl{file speciali}}
 \label{sec:file_mknod}
 
 \index{file!di~dispositivo|(} 
+\index{file!speciali|(} 
 
-Finora abbiamo parlato esclusivamente di file, directory e link simbolici; in
-sez.~\ref{sec:file_file_types} abbiamo visto però che il sistema prevede pure
-degli altri tipi di file speciali, come i file di dispositivo, le fifo ed i
-socket (questi ultimi sono un caso a parte, essendo associati anche alla
-comunicazione via rete, per cui ci saranno trattati in dettaglio a partire da
-cap.~\ref{cha:socket_intro}).
-
-La manipolazione delle caratteristiche di questi diversi tipi di file e la
-loro cancellazione può essere effettuata con le stesse funzioni che operano
-sui file regolari; ma quando li si devono creare sono necessarie delle
-funzioni apposite. La prima di queste funzioni è \funcd{mknod}, il cui
-prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h}
-  \headdecl{sys/stat.h}
-  \headdecl{fcntl.h}
-  \headdecl{unistd.h}
-  \funcdecl{int mknod(const char *pathname, mode\_t mode, dev\_t dev)} 
-  
-  Crea un \textit{inode} del tipo specificato sul filesystem.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
-    errore, nel qual caso \var{errno} assumerà i valori:
+Finora abbiamo parlato esclusivamente di file, directory e collegamenti
+simbolici, ma in sez.~\ref{sec:file_file_types} abbiamo visto che il sistema
+prevede anche degli altri tipi di file, che in genere vanno sotto il nome
+generico di \textsl{file speciali}, come i file di dispositivo, le fifo ed i
+socket.
+
+La manipolazione delle caratteristiche di questi file speciali, il cambiamento
+di nome o la loro cancellazione può essere effettuata con le stesse funzioni
+che operano sugli altri file, ma quando li si devono creare sono necessarie,
+come per le directory, delle funzioni apposite. La prima di queste è la
+funzione di sistema \funcd{mknod}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/stat.h}
+\fhead{fcntl.h}
+\fhead{unistd.h}
+\fdecl{int mknod(const char *pathname, mode\_t mode, dev\_t dev)}
+\fdesc{Crea un file speciale sul filesystem.} 
+}
+{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}] non si hanno privilegi sufficienti a creare
-    l'\texttt{inode}, o il filesystem su cui si è cercato di
-    creare \param{pathname} non supporta l'operazione.
+  \item[\errcode{EEXIST}] \param{pathname} esiste già o è un collegamento
+    simbolico. 
   \item[\errcode{EINVAL}] il valore di \param{mode} non indica un file, una
     fifo, un socket o un dispositivo.
-  \item[\errcode{EEXIST}] \param{pathname} esiste già o è un link simbolico.
+  \item[\errcode{EPERM}] non si hanno privilegi sufficienti a creare
+    \itindex{inode} l'\texttt{inode}, o il filesystem su cui si è cercato di
+    creare \param{pathname} non supporta l'operazione.
   \end{errlist}
-  ed inoltre anche \errval{EFAULT}, \errval{EACCES}, \errval{ENAMETOOLONG},
-  \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP},
-  \errval{ENOSPC}, \errval{EROFS}.}
-\end{functions}
+  ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{ELOOP},
+  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOSPC},
+  \errval{ENOTDIR} e \errval{EROFS} nel loro significato generico.}
+\end{funcproto}
 
-La funzione, come suggerisce il nome, permette di creare un ``\textsl{nodo}''
-sul filesystem, e viene in genere utilizzata per creare i file di dispositivo,
-ma si può usare anche per creare file regolari. L'argomento
-\param{mode} specifica sia il tipo di file che si vuole creare che i relativi
-permessi, secondo i valori riportati in tab.~\ref{tab:file_mode_flags}, che
-vanno combinati con un OR binario. I permessi sono comunque modificati nella
-maniera usuale dal valore di \itindex{umask} \textit{umask} (si veda
-sez.~\ref{sec:file_perm_management}).
+La funzione permette di creare un \itindex{inode} \textit{inode} di tipo
+generico sul filesystem, e viene in genere utilizzata per creare i file di
+dispositivo, ma si può usare anche per creare qualunque tipo di file speciale
+ed anche file regolari. L'argomento \param{mode} specifica sia il tipo di file
+che si vuole creare che i relativi permessi, secondo i valori riportati in
+tab.~\ref{tab:file_mode_flags}, che vanno combinati con un OR aritmetico. I
+permessi sono comunque modificati nella maniera usuale dal valore di
+\itindex{umask} \textit{umask} (si veda sez.~\ref{sec:file_perm_management}).
 
 Per il tipo di file può essere specificato solo uno fra i seguenti valori:
 \const{S\_IFREG} per un file regolare (che sarà creato vuoto),
 \const{S\_IFBLK} per un dispositivo a blocchi, \const{S\_IFCHR} per un
 dispositivo a caratteri, \const{S\_IFSOCK} per un socket e \const{S\_IFIFO}
 per una fifo;\footnote{con Linux la funzione non può essere usata per creare
-  directory o link simbolici, si dovranno usare le funzioni \func{mkdir} e
-  \func{symlink} a questo dedicate.} un valore diverso comporterà l'errore
-\errcode{EINVAL}.  
+  directory o collegamenti simbolici, si dovranno usare le funzioni
+  \func{mkdir} e \func{symlink} a questo dedicate.} un valore diverso
+comporterà l'errore \errcode{EINVAL}. Inoltre \param{pathname} non deve
+esistere, neanche come collegamento simbolico.
 
 Qualora si sia specificato in \param{mode} un file di dispositivo (vale a dire
 o \const{S\_IFBLK} o \const{S\_IFCHR}), il valore di \param{dev} dovrà essere
@@ -2631,18 +2728,19 @@ Linux\footnote{questo è un comportamento specifico di Linux, la funzione non è
 di un socket è consentito anche agli utenti normali.
 
 I nuovi \itindex{inode} \textit{inode} creati con \func{mknod} apparterranno
-al proprietario e al gruppo del processo che li ha creati, a meno che non si
-sia attivato il bit \acr{sgid} per la directory o sia stata attivata la
-semantica BSD per il filesystem (si veda
-sez.~\ref{sec:file_ownership_management}) in cui si va a creare
-\itindex{inode} l'\textit{inode}.
+al proprietario e al gruppo del processo (usando \ids{UID} e \ids{GID} del
+gruppo effettivo) che li ha creati a meno non sia presente il bit \acr{sgid}
+per la directory o sia stata attivata la semantica BSD per il filesystem (si
+veda sez.~\ref{sec:file_ownership_management}) in cui si va a creare
+\itindex{inode} l'\textit{inode}, nel qual caso per il gruppo verrà usato il
+\ids{GID} del proprietario della directory.
 
 Nella creazione di un file di dispositivo occorre poi specificare
 correttamente il valore di \param{dev}; questo infatti è di tipo
 \type{dev\_t}, che è un tipo primitivo (vedi
 tab.~\ref{tab:intro_primitive_types}) riservato per indicare un
-\textsl{numero} di dispositivo; il kernel infatti identifica ciascun
-dispositivo con un valore numerico. Originariamente questo era un intero a 16
+\textsl{numero} di dispositivo. Il kernel infatti identifica ciascun
+dispositivo con un valore numerico, originariamente questo era un intero a 16
 bit diviso in due parti di 8 bit chiamate rispettivamente
 \itindex{major~number} \textit{major number} e \itindex{minor~number}
 \textit{minor number}, che sono poi i due numeri mostrati dal comando
@@ -2652,9 +2750,9 @@ dispositivo.
 Il \itindex{major~number} \textit{major number} identifica una classe di
 dispositivi (ad esempio la seriale, o i dischi IDE) e serve in sostanza per
 indicare al kernel quale è il modulo che gestisce quella classe di
-dispositivi; per identificare uno specifico dispositivo di quella classe (ad
-esempio una singola porta seriale, o una partizione di un disco) si usa invece
-il \itindex{minor~number} \textit{minor number}. L'elenco aggiornato di questi
+dispositivi. Per identificare uno specifico dispositivo di quella classe (ad
+esempio una singola porta seriale, o uno dei dischi presenti) si usa invece il
+\itindex{minor~number} \textit{minor number}. L'elenco aggiornato di questi
 numeri con le relative corrispondenze ai vari dispositivi può essere trovato
 nel file \texttt{Documentation/devices.txt} allegato alla documentazione dei
 sorgenti del kernel.
@@ -2664,59 +2762,80 @@ massimo di 256 si è rivelato troppo basso, e nel passaggio dai kernel della
 serie 2.4 alla serie 2.6 è stata aumentata a 32 bit la dimensione del tipo
 \type{dev\_t}, con delle dimensioni passate a 12 bit per il
 \itindex{major~number} \textit{major number} e 20 bit per il
-\itindex{minor~number} \textit{minor number}. La transizione però ha anche
-comportato il passaggio di \type{dev\_t} a \index{tipo!opaco} tipo opaco, e la
-necessità di specificare il numero tramite delle opportune macro, così da non
-avere problemi di compatibilità con eventuali ulteriori estensioni.
-
-Le macro sono definite nel file \headfile{sys/sysmacros.h}, che viene
-automaticamente incluso quando si include \headfile{sys/types.h}; si possono
+\itindex{minor~number} \textit{minor number}. La transizione però ha
+comportato il fatto che \type{dev\_t} è diventato un \index{tipo!opaco} tipo
+opaco, e la necessità di specificare il numero tramite delle opportune macro,
+così da non avere problemi di compatibilità con eventuali ulteriori
+estensioni.
+
+Le macro sono definite nel file \headfile{sys/sysmacros.h},\footnote{se si usa
+  la \acr{glibc} dalla versione 2.3.3 queste macro sono degli alias alle
+  versioni specifiche di questa libreria, \macro{gnu\_dev\_major},
+  \macro{gnu\_dev\_minor} e \macro{gnu\_dev\_makedev} che si possono usare
+  direttamente, al costo di una minore portabilità.} che viene
+automaticamente incluso quando si include \headfile{sys/types.h}. Si possono
 pertanto ottenere i valori del \itindex{major~number} \textit{major number} e
 \itindex{minor~number} \textit{minor number} di un dispositivo rispettivamente
 con le macro \macro{major} e \macro{minor}:
-\begin{functions}
-  \headdecl{sys/types.h}
-  \funcdecl{int \macro{major}(dev\_t dev)}
-  Restituisce il \itindex{major~number} \textit{major number} del dispositivo
-  \param{dev}.
-  
-  \funcdecl{int \macro{minor}(dev\_t dev)}
-  Restituisce il \itindex{minor~number} \textit{minor number} del dispositivo
-  \param{dev}.
-\end{functions}
+
+{\centering
+\vspace{3pt}
+\begin{funcbox}{
+\fhead{sys/types.h}
+\fdecl{int \macro{major}(dev\_t dev)}
+\fdesc{Restituisce il \itindex{major~number} \textit{major number} del
+  dispositivo \param{dev}.}
+\fdecl{int \macro{minor}(dev\_t dev)}
+\fdesc{Restituisce il \itindex{minor~number} \textit{minor number} del
+  dispositivo \param{dev}.}  
+} 
+\end{funcbox}
+}
+
 \noindent mentre una volta che siano noti \itindex{major~number} \textit{major
   number} e \itindex{minor~number} \textit{minor number} si potrà costruire il
 relativo identificativo con la macro \macro{makedev}:
-\begin{functions}
-  \headdecl{sys/types.h}
-  \funcdecl{dev\_t \macro{minor}(int major, int minor)}
 
-  Restituisce l'identificativo di un dispositivo dati \itindex{major~number}
-  \textit{major number} e \itindex{minor~number} \textit{minor number}.
-\end{functions}
+{\centering
+\vspace{3pt}
+\begin{funcbox}{
+\fhead{sys/types.h}
+\fdecl{dev\_t \macro{makedev}(int major, int minor)}
+\fdesc{Dati \itindex{major~number} \textit{major number} e
+  \itindex{minor~number} \textit{minor number} restituisce l'identificativo di
+  un dispositivo.} 
+} 
+\end{funcbox}
+}
 
 \index{file!di~dispositivo|)}
 
-Infine con lo standard POSIX.1-2001 è stata introdotta una funzione specifica
-per creare una fifo (tratteremo le fifo in in sez.~\ref{sec:ipc_named_pipe});
-la funzione è \funcd{mkfifo} ed il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{sys/stat.h} 
-  
-  \funcdecl{int mkfifo(const char *pathname, mode\_t mode)} 
-  
-  Crea una fifo.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
-    errore, nel qual caso \var{errno} assumerà i valori \errval{EACCES},
-    \errval{EEXIST}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOSPC},
-    \errval{ENOTDIR} e \errval{EROFS}.}
-\end{functions}
+Dato che la funzione di sistema \func{mknod} presenta diverse varianti nei
+vari sistemi unix-like, lo standard POSIX.1-2001 la dichiara portabile solo in
+caso di creazione delle fifo, ma anche in questo caso alcune combinazioni
+degli argomenti restano non specificate, per cui nello stesso standard è stata
+introdotta una funzione specifica per creare una fifo deprecando l'uso di
+\func{mknod} a tale riguardo.  La funzione è \funcd{mkfifo} ed il suo
+prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/stat.h}
+\fdecl{int mkfifo(const char *pathname, mode\_t mode)}
+\fdesc{Crea una fifo.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà \errval{EACCES}, \errval{EEXIST},
+  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOSPC}, \errval{ENOTDIR} e
+  \errval{EROFS} nel loro significato generico.}
+\end{funcproto}
 
 La funzione crea la fifo \param{pathname} con i permessi \param{mode}. Come
-per \func{mknod} il file \param{pathname} non deve esistere (neanche come link
-simbolico); al solito i permessi specificati da \param{mode} vengono
-modificati dal valore di \itindex{umask} \textit{umask}.
+per \func{mknod} il file \param{pathname} non deve esistere (neanche come
+collegamento simbolico); al solito i permessi specificati da \param{mode}
+vengono modificati dal valore di \itindex{umask} \textit{umask}.
+
+\index{file!speciali|)} 
 
 
 \subsection{I file temporanei}
@@ -2730,17 +2849,28 @@ controllo e la creazione si ha giusto lo spazio per una possibile
 \itindex{race~condition} \textit{race condition} (si ricordi quanto visto in
 sez.~\ref{sec:proc_race_cond}).
 
+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.
+
 La \acr{glibc} provvede varie funzioni per generare nomi di file temporanei,
 di cui si abbia certezza di unicità al momento della generazione; storicamente
 la prima di queste funzioni create a questo scopo era
 \funcd{tmpnam},\footnote{la funzione è stata deprecata nella revisione
   POSIX.1-2008 dello standard POSIX.} il cui prototipo è:
-\begin{prototype}{stdio.h}{char *tmpnam(char *string)}
-  Genera un nome univoco per un file temporaneo.
-  \bodydesc{La funzione ritorna il puntatore alla stringa con il nome o
-  \val{NULL} in caso di fallimento. Non sono definiti errori.}
-\end{prototype}
+
+\begin{funcproto}{
+\fhead{stdio.h}
+\fdecl{char *tmpnam(char *string)}
+\fdesc{Genera un nome univoco per un file temporaneo.} 
+}
+{La funzione ritorna il puntatore alla stringa con il nome in caso di successo
+  e \val{NULL} in caso di fallimento, non sono definiti errori.}
+\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
@@ -2759,13 +2889,16 @@ Di questa funzione esiste una versione \index{funzioni!rientranti} rientrante,
 \funcm{tmpnam\_r}, che non fa nulla quando si passa \val{NULL} come argomento.
 Una funzione simile, \funcd{tempnam}, permette di specificare un prefisso per
 il file esplicitamente, il suo prototipo è:
-\begin{prototype}{stdio.h}{char *tempnam(const char *dir, const char *pfx)}
-  Genera un nome univoco per un file temporaneo.
 
-  \bodydesc{La funzione ritorna il puntatore alla stringa con il nome o
-  \val{NULL} in caso di fallimento, \var{errno} viene impostata a
-  \errval{ENOMEM} qualora fallisca l'allocazione della stringa.}
-\end{prototype}
+\begin{funcproto}{
+\fhead{stdio.h}
+\fdecl{char *tempnam(const char *dir, const char *pfx)}
+\fdesc{Genera un nome univoco per un file temporaneo.} 
+}
+{La funzione ritorna il puntatore alla stringa con il nome in caso di successo
+  e \val{NULL} per un errore, nel qual caso \var{errno} potrà assumere solo il
+  valore \errval{ENOMEM} qualora fallisca l'allocazione della stringa.}
+\end{funcproto}
 
 La funzione alloca con \code{malloc} la stringa in cui restituisce il nome,
 per cui è sempre \index{funzioni!rientranti} rientrante, occorre però
@@ -2782,58 +2915,67 @@ verificando che esista e sia accessibile, la prima valida fra le seguenti:
 \item la directory \file{/tmp}.
 \end{itemize*}
 
-In ogni caso, anche se la generazione del nome è casuale, ed è molto difficile
-ottenere un nome duplicato, nulla assicura che un altro processo non possa
-avere creato, fra l'ottenimento del nome e l'apertura del file, un altro file
-con lo stesso nome; per questo motivo quando si usa il nome ottenuto da una di
-queste funzioni occorre sempre 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 stream) che fa fallire l'apertura in caso il file sia già
-esistente.
+In ogni caso, anche se con queste funzioni la generazione del nome è casuale,
+ed è molto difficile ottenere un nome duplicato, nulla assicura che un altro
+processo non possa avere creato, fra l'ottenimento del nome e l'apertura del
+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.
 
 Per evitare di dovere effettuare a mano tutti questi controlli, lo standard
 POSIX definisce la funzione \funcd{tmpfile}, che permette di ottenere in
 maniera sicura l'accesso ad un file temporaneo, il suo prototipo è:
-\begin{prototype}{stdio.h}{FILE *tmpfile(void)}
-  Restituisce un file temporaneo aperto in lettura/scrittura.
-  
-  \bodydesc{La funzione ritorna il puntatore allo stream associato al file
-    temporaneo in caso di successo e \val{NULL} in caso di errore, nel qual
-    caso \var{errno} assumerà i valori:
-    \begin{errlist}
-    \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
+
+\begin{funcproto}{
+\fhead{stdio.h}
+\fdecl{FILE *tmpfile(void)}
+\fdesc{Apre un file temporaneo in lettura/scrittura.} 
+}
+{La funzione ritorna il puntatore allo \textit{stream} associato al file
+  temporaneo in caso di successo e \val{NULL} per un errore, nel qual caso
+  \var{errno} assumerà uno dei valori:
+  \begin{errlist}
     \item[\errcode{EEXIST}] non è stato possibile generare un nome univoco.
-    \end{errlist}
-    ed inoltre \errval{EFAULT}, \errval{EMFILE}, \errval{ENFILE},
-    \errval{ENOSPC}, \errval{EROFS} e \errval{EACCES}.}
-\end{prototype}
+    \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
+  \end{errlist}
+  ed inoltre \errval{EFAULT}, \errval{EMFILE}, \errval{ENFILE},
+  \errval{ENOSPC}, \errval{EROFS} e \errval{EACCES} nel loro significato
+  generico.}
+\end{funcproto}
+
 
-La funzione restituisce direttamente uno stream già aperto (in modalità
-\code{r+b}, si veda sez.~\ref{sec:file_fopen}) e pronto per l'uso, che viene
-automaticamente cancellato alla sua chiusura o all'uscita dal programma. Lo
-standard non specifica in quale directory verrà aperto il file, ma la
-\acr{glibc} prima tenta con \const{P\_tmpdir} e poi con \file{/tmp}. Questa
-funzione è \index{funzioni!rientranti} rientrante e non soffre di problemi di
-\itindex{race~condition} \textit{race condition}.
+La funzione restituisce direttamente uno \textit{stream} già aperto (in
+modalità \code{w+b}, si veda sez.~\ref{sec:file_fopen}) e pronto per l'uso,
+che viene automaticamente cancellato alla sua chiusura o all'uscita dal
+programma. Lo standard non specifica in quale directory verrà aperto il file,
+ma la \acr{glibc} prima tenta con \const{P\_tmpdir} e poi con
+\file{/tmp}. Questa funzione è \index{funzioni!rientranti} rientrante e non
+soffre di problemi di \itindex{race~condition} \textit{race condition}.
 
 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 \code{X} che verranno sostituiti da un codice
+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 è:
-\begin{prototype}{stlib.h}{char *mktemp(char *template)}
-  Genera un nome univoco per un file temporaneo.
-  
-  \bodydesc{La funzione ritorna il puntatore \param{template} in caso di
-    successo e \val{NULL} in caso di errore, nel qual caso \var{errno}
-    assumerà i valori:
-    \begin{errlist}
+
+\begin{funcproto}{
+\fhead{stlib.h}
+\fdecl{char *mktemp(char *template)}
+\fdesc{Genera un nome univoco per un file temporaneo.} 
+}
+{La funzione ritorna  il puntatore a \param{template} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno dei valori: 
+  \begin{errlist}
     \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
-    \end{errlist}}
-\end{prototype}
+  \end{errlist}}
+\end{funcproto}
 
-La funzionane genera un nome univoco sostituendo le \code{XXXXXX} finali di
+La funzione genera un nome univoco sostituendo le \code{XXXXXX} finali di
 \param{template}; dato che \param{template} deve poter essere modificata dalla
 funzione non si può usare una stringa costante.  Tutte le avvertenze riguardo
 alle possibili \itindex{race~condition} \textit{race condition} date per
@@ -2847,17 +2989,23 @@ usata.
 La seconda funzione, \funcd{mkstemp} è sostanzialmente equivalente a
 \func{tmpfile}, ma restituisce un file descriptor invece di un nome; il suo
 prototipo è:
-\begin{prototype}{stlib.h}{int mkstemp(char *template)}
-  Genera un file temporaneo.
-  
-  \bodydesc{La funzione ritorna il file descriptor in caso di successo e
-    -1 in caso di errore, nel qual caso \var{errno} assumerà i valori:
-    \begin{errlist}
+
+\begin{funcproto}{
+\fhead{stlib.h}
+\fdecl{int mkstemp(char *template)}
+\fdesc{Apre un file temporaneo.} 
+}
+
+{La funzione ritorna il file descriptor in caso di successo e $-1$ per un
+  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.
-    \end{errlist}}
-\end{prototype}
+  \end{errlist}}
+\end{funcproto}
+
 
 Come per \func{mktemp} anche in questo caso \param{template} non può essere
 una stringa costante. La funzione apre un file in lettura/scrittura con la
@@ -2873,12 +3021,16 @@ questa funzione esiste una variante \funcd{mkostemp}, introdotta
 specificamente dalla \acr{glibc},\footnote{la funzione è stata introdotta
   nella versione 2.7 delle librerie e richiede che sia definita la macro
   \macro{\_GNU\_SOURCE}.} il cui prototipo è:
-\begin{prototype}{stlib.h}{int mkostemp(char *template, int flags)}
-  Genera un file temporaneo.
-  
-  \bodydesc{La funzione ritorna il file descriptor in caso di successo e
-    -1 in caso di errore, con gli stessi errori di \func{mkstemp}.}
-\end{prototype}
+
+\begin{funcproto}{
+\fhead{stlib.h}
+\fdecl{int mkostemp(char *template, int flags)}
+\fdesc{Apre un file temporaneo.} 
+}
+{La funzione ritorna un file descriptor in caso di successo e $-1$ per un
+  errore, nel qual caso \var{errno} assumerà  gli stessi valori di
+  \func{mkstemp}.} 
+\end{funcproto}
 \noindent la cui sola differenza è la presenza dell'ulteriore argomento
 \var{flags} che consente di specificare i flag da passare ad \func{open}
 nell'apertura del file.
@@ -2888,17 +3040,20 @@ In OpenBSD è stata introdotta un'altra funzione simile alle precedenti,
 \funcd{mkdtemp}, che crea invece una directory temporanea;\footnote{la
   funzione è stata introdotta nella \acr{glibc} a partire dalla versione
   2.1.91 ed inserita nello standard POSIX.1-2008.}  il suo prototipo è:
-\begin{prototype}{stlib.h}{char *mkdtemp(char *template)}
-  Genera una directory temporanea.
-  
-  \bodydesc{La funzione ritorna il puntatore al nome della directory in caso
-    successo e \val{NULL} in caso di errore, nel qual caso \var{errno}
-    assumerà i valori:
-    \begin{errlist}
+
+\begin{funcproto}{
+\fhead{stlib.h}
+\fdecl{char *mkdtemp(char *template)}
+\fdesc{Crea una directory temporanea.} 
+}
+{La funzione ritorna il puntatore al nome della directory in caso di successo
+  e \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno dei
+  valori:
+  \begin{errlist}
     \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
-    \end{errlist}
-    più gli altri eventuali codici di errore di \func{mkdir}.}
-\end{prototype}
+  \end{errlist}
+  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
@@ -2907,20 +3062,21 @@ creazione della directory è sempre esclusiva i precedenti problemi di
 \itindex{race~condition} \textit{race condition} non si pongono.
 
 
+
+
+
 \section{La manipolazione delle caratteristiche dei file}
 \label{sec:file_infos}
 
 Come spiegato in sez.~\ref{sec:file_filesystem} tutte le informazioni generali
 relative alle caratteristiche di ciascun file, a partire dalle informazioni
 relative al controllo di accesso, sono mantenute \itindex{inode}
-nell'\textit{inode}.
-
-Vedremo in questa sezione come sia possibile leggere tutte queste informazioni
-usando la funzione \func{stat}, che permette l'accesso a tutti i dati
-memorizzati \itindex{inode} nell'\textit{inode}; esamineremo poi le varie
-funzioni usate per manipolare tutte queste informazioni (eccetto quelle che
-riguardano la gestione del controllo di accesso, trattate in in
-sez.~\ref{sec:file_access_control}).
+nell'\textit{inode}. Vedremo in questa sezione come sia possibile leggere
+tutte queste informazioni usando la funzione \func{stat}, che permette
+l'accesso a tutti i dati memorizzati \itindex{inode} nell'\textit{inode};
+esamineremo poi le varie funzioni usate per manipolare tutte queste
+informazioni, eccetto quelle che riguardano la gestione del controllo di
+accesso, trattate in in sez.~\ref{sec:file_access_control}.
 
 
 \subsection{La lettura delle caratteristiche dei file}
@@ -2929,38 +3085,47 @@ sez.~\ref{sec:file_access_control}).
 La lettura delle informazioni relative ai file è fatta attraverso la famiglia
 delle funzioni \func{stat} che sono quelle che usa il comando \cmd{ls} per
 poter ottenere e mostrare tutti i dati relativi ad un file; ne fanno parte le
-funzioni \funcd{stat}, \funcd{fstat} e \funcd{lstat}, i cui prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/stat.h} 
-  \headdecl{unistd.h}
-
-  \funcdecl{int stat(const char *file\_name, struct stat *buf)} 
-  \funcdecl{int lstat(const char *file\_name, struct stat *buf)} 
-  \funcdecl{int fstat(int filedes, struct stat *buf)} 
-  Legge le informazioni di un file.
-
-  \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 per un
-    errore, nel qual caso \var{errno} assumerà uno dei valori: \errval{EBADF},
-    \errval{ENOENT}, \errval{ENOTDIR}, \errval{ELOOP}, \errval{EFAULT},
-    \errval{EACCES}, \errval{ENOMEM}, \errval{ENAMETOOLONG}.}
-\end{functions}
+funzioni di sistema \funcd{stat}, \funcd{fstat} e \funcd{lstat}, i cui
+prototipi sono:
 
-La funzione \func{stat} legge le informazioni del file il cui
-\textit{pathname} è specificato dalla stringa puntata da \param{file\_name} e
-le inserisce nel buffer puntato dall'argomento \param{buf}; la funzione
-\func{lstat} è identica a \func{stat} eccetto che se \param{file\_name} è un
-link simbolico vengono lette le informazioni relative ad esso e non al file a
-cui fa riferimento. Infine \func{fstat} esegue la stessa operazione su un file
-già aperto, specificato tramite il suo file descriptor \param{filedes}.
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/stat.h}
+\fhead{unistd.h}
+\fdecl{int stat(const char *file\_name, struct stat *buf)}
+\fdecl{int lstat(const char *file\_name, struct stat *buf)}
+\fdecl{int fstat(int filedes, struct stat *buf)}
+\fdesc{Leggono le informazioni 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{EOVERFLOW}] il file ha una dimensione che non può essere
+      rappresentata nel tipo \type{off\_t} (può avvenire solo in caso di
+      programmi compilati su piattaforme a 32 bit senza le estensioni
+      (\texttt{-D \_FILE\_OFFSET\_BITS=64}) per file a 64 bit).
+  \end{errlist}
+  ed inoltre \errval{EFAULT} ed \errval{ENOMEM}, per \func{stat} e
+  \func{lstat} anche \errval{EACCES}, \errval{ELOOP}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOTDIR}, per \func{fstat} anche \errval{EBADF}, 
+  nel loro significato generico.}
+\end{funcproto}
+
+La funzione \func{stat} legge le informazioni del file indicato
+da \param{file\_name} e le inserisce nel buffer puntato
+dall'argomento \param{buf}; la funzione \func{lstat} è identica a \func{stat}
+eccetto che se \param{file\_name} è un collegamento simbolico vengono lette le
+informazioni relative ad esso e non al file a cui fa riferimento. Infine
+\func{fstat} esegue la stessa operazione su un file già aperto, specificato
+tramite il suo file descriptor \param{filedes}.
 
 La struttura \struct{stat} usata da queste funzioni è definita nell'header
 \headfile{sys/stat.h} e in generale dipende dall'implementazione; la versione
 usata da Linux è mostrata in fig.~\ref{fig:file_stat_struct}, così come
-riportata dalla pagina di manuale di \func{stat}; in realtà la definizione
+riportata dalla pagina di manuale di \func{stat}. In realtà la definizione
 effettivamente usata nel kernel dipende dall'architettura e ha altri campi
 riservati per estensioni come tempi dei file più precisi (vedi
-sez.~\ref{sec:file_file_times}), o per il padding dei campi.
+sez.~\ref{sec:file_file_times}).
 
 \begin{figure}[!htb]
   \footnotesize
@@ -2975,24 +3140,65 @@ sez.~\ref{sec:file_file_times}), o per il padding dei campi.
 \end{figure}
 
 Si noti come i vari membri della struttura siano specificati come tipi
-primitivi del sistema (di quelli definiti in
-tab.~\ref{tab:intro_primitive_types}, e dichiarati in \headfile{sys/types.h}).
+primitivi del sistema, di quelli definiti in
+tab.~\ref{tab:intro_primitive_types}, e dichiarati in \headfile{sys/types.h},
+con l'eccezione di \type{blksize\_t} e \type{blkcnt\_t} che sono nuovi tipi
+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
+questa sezione:
+\begin{itemize*}
+
+\item Il campo \var{st\_nlink} contiene il numero di \textit{hard link} che
+  fanno riferimento al file (il cosiddetto \textit{link count}) di cui abbiamo
+  già parlato in numerose occasioni.
+
+\item Il campo \var{st\_ino} contiene il numero di \itindex{inode}
+  \textit{inode} del file, quello viene usato all'interno del filesystem per
+  identificarlo e che può essere usato da un programma per determinare se due
+  \textit{pathname} fanno riferimento allo stesso file.
+
+\item Il campo \var{st\_dev} contiene il numero del dispositivo su cui risiede
+  il file (o meglio il suo filesystem). Si tratta dello stesso numero che si
+  usa con \func{mknod} e che può essere decomposto in \itindex{major~number}
+  \textit{major number} e \itindex{minor~number} \textit{minor number} con le
+  macro \macro{major} e \macro{minor} viste in sez.~\ref{sec:file_mknod}.
+
+\item Il campo \var{st\_rdev} contiene il numero di dispositivo associato al
+  file stesso ed ovviamente ha un valore significativo soltanto quando il file
+  è un dispositivo a caratteri o a blocchi.
+
+\item Il campo \var{st\_blksize} contiene la dimensione dei blocchi di dati
+  usati nell'I/O su disco, che è anche la dimensione usata per la
+  bufferizzazione dei dati dalle librerie del C per l'interfaccia degli
+  \textit{stream}.  Leggere o scrivere blocchi di dati in dimensioni inferiori
+  a questo valore è inefficiente in quanto le operazioni su disco usano
+  comunque trasferimenti di questa dimensione.
+
+\end{itemize*}
+
+
 
 \subsection{I tipi di file}
 \label{sec:file_types}
 
-Come riportato in tab.~\ref{tab:file_file_types} in Linux oltre ai file e alle
-directory esistono altri oggetti che possono stare su un filesystem.  Il tipo
-di file è ritornato dalla funzione \func{stat} come maschera binaria nel campo
-\var{st\_mode} (che contiene anche le informazioni relative ai permessi) di
-una struttura \struct{stat}.
-
-Dato che il valore numerico può variare a seconda delle implementazioni, lo
-standard POSIX definisce un insieme di macro per verificare il tipo di file,
-queste vengono usate anche da Linux che supporta pure le estensioni allo
-standard per i link simbolici e i socket definite da BSD; l'elenco completo
-delle macro con cui è possibile estrarre l'informazione da \var{st\_mode} è
-riportato in tab.~\ref{tab:file_type_macro}.
+Abbiamo sottolineato fin dall'introduzione che Linux, come ogni sistema
+unix-like, supporta oltre ai file ordinari e alle directory una serie di altri
+``\textsl{tipi}'' di file che possono stare su un filesystem (elencati in
+tab.~\ref{tab:file_file_types}).  Il tipo di file viene ritornato dalle
+funzioni della famiglia \func{stat} all'interno del campo \var{st\_mode} di
+una struttura \struct{stat}. 
+
+Il campo \var{st\_mode} è una maschera binaria in cui l'informazione viene
+suddivisa nei vari bit che compongono, ed oltre a quelle sul tipo di file,
+contiene anche le informazioni relative ai permessi su cui torneremo in
+sez.~\ref{sec:file_perm_overview}. Dato che i valori numerici usati per
+definire il tipo di file possono variare a seconda delle implementazioni, lo
+standard POSIX definisce un insieme di macro che consentono di verificare il
+tipo di file in maniera standardizzata.
+
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -3006,7 +3212,7 @@ riportato in tab.~\ref{tab:file_type_macro}.
     \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)}  & link simbolico.\\
+    \macro{S\_ISLNK}\texttt{(m)}  & collegamento simbolico.\\
     \macro{S\_ISSOCK}\texttt{(m)} & socket.\\
     \hline    
   \end{tabular}
@@ -3014,17 +3220,14 @@ riportato in tab.~\ref{tab:file_type_macro}.
   \label{tab:file_type_macro}
 \end{table}
 
-Oltre alle macro di tab.~\ref{tab:file_type_macro} è possibile usare
-direttamente il valore di \var{st\_mode} per ricavare il tipo di file
-controllando direttamente i vari bit in esso memorizzati. Per questo sempre in
-\headfile{sys/stat.h} sono definite le costanti numeriche riportate in
-tab.~\ref{tab:file_mode_flags}.
-
-Il primo valore dell'elenco di tab.~\ref{tab:file_mode_flags} è la maschera
-binaria che permette di estrarre i bit nei quali viene memorizzato il tipo di
-file, i valori successivi sono le costanti corrispondenti ai singoli bit, e
-possono essere usati per effettuare la selezione sul tipo di file voluto, con
-un'opportuna combinazione.
+Queste macro vengono usate anche da Linux che supporta pure le estensioni allo
+standard per i collegamenti simbolici e i socket definite da BSD.\footnote{le
+  ultime due macro di tab.~\ref{tab:file_type_macro}, che non sono presenti
+  nello standard POSIX fino alla revisione POSIX.1-1996.}  L'elenco completo
+delle macro con cui è possibile estrarre da \var{st\_mode} l'informazione
+relativa al tipo di file è riportato in tab.~\ref{tab:file_type_macro}, tutte
+le macro restituiscono un valore intero da usare come valore logico e prendono
+come argomento il valore di \var{st\_mode}.
 
 \begin{table}[htb]
   \centering
@@ -3036,28 +3239,28 @@ un'opportuna combinazione.
     \hline
     \const{S\_IFMT}   &  0170000 & Maschera per i bit del tipo di file.\\
     \const{S\_IFSOCK} &  0140000 & Socket.\\
-    \const{S\_IFLNK}  &  0120000 & Link simbolico.\\
+    \const{S\_IFLNK}  &  0120000 & Collegamento simbolico.\\
     \const{S\_IFREG}  &  0100000 & File regolare.\\ 
     \const{S\_IFBLK}  &  0060000 & Dispositivo a blocchi.\\
     \const{S\_IFDIR}  &  0040000 & Directory.\\
     \const{S\_IFCHR}  &  0020000 & Dispositivo a caratteri.\\
     \const{S\_IFIFO}  &  0010000 & Fifo.\\
     \hline
-    \const{S\_ISUID}  &  0004000 & Set UID bit \itindex{suid~bit}.\\
-    \const{S\_ISGID}  &  0002000 & Set GID bit \itindex{sgid~bit}.\\
-    \const{S\_ISVTX}  &  0001000 & Sticky bit \itindex{sticky~bit}.\\
+    \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.\\
     \hline
-%    \const{S\_IRWXU}  &  00700   & Bitmask per i permessi del proprietario.\\
+    \const{S\_IRWXU}  &  00700   & Maschera per i permessi del proprietario.\\
     \const{S\_IRUSR}  &  00400   & Il proprietario ha permesso di lettura.\\
     \const{S\_IWUSR}  &  00200   & Il proprietario ha permesso di scrittura.\\
     \const{S\_IXUSR}  &  00100   & Il proprietario ha permesso di esecuzione.\\
     \hline
-%    \const{S\_IRWXG}  &  00070   & Bitmask per i permessi del gruppo.\\
+    \const{S\_IRWXG}  &  00070   & Maschera per i permessi del gruppo.\\
     \const{S\_IRGRP}  &  00040   & Il gruppo ha permesso di lettura.\\
     \const{S\_IWGRP}  &  00020   & Il gruppo ha permesso di scrittura.\\
     \const{S\_IXGRP}  &  00010   & Il gruppo ha permesso di esecuzione.\\
     \hline
-%    \const{S\_IRWXO}  &  00007   & Bitmask per i permessi di tutti gli altri\\
+    \const{S\_IRWXO}  &  00007   & Maschera per i permessi di tutti gli altri\\
     \const{S\_IROTH}  &  00004   & Gli altri hanno permesso di lettura.\\
     \const{S\_IWOTH}  &  00002   & Gli altri hanno permesso di esecuzione.\\
     \const{S\_IXOTH}  &  00001   & Gli altri hanno permesso di esecuzione.\\
@@ -3068,106 +3271,141 @@ un'opportuna combinazione.
   \label{tab:file_mode_flags}
 \end{table}
 
-Ad esempio se si volesse impostare una condizione che permetta di controllare
-se un file è una directory o un file ordinario si potrebbe definire la macro
-di preprocessore:
-\includecodesnip{listati/is_file_dir.h}
-in cui prima si estraggono da \var{st\_mode} i bit relativi al tipo di file e
-poi si effettua il confronto con la combinazione di tipi scelta.
+Oltre alle macro di tab.~\ref{tab:file_type_macro}, che semplificano
+l'operazione, è possibile usare direttamente il valore di \var{st\_mode} per
+ricavare il tipo di file controllando direttamente i vari bit in esso
+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
+valori.
+
+Le costanti che servono per la identificazione del tipo di file sono riportate
+nella prima sezione di tab.~\ref{tab:file_mode_flags}, mentre le sezioni
+successive attengono alle costanti usate per i permessi.  Il primo valore
+dell'elenco è la maschera binaria \const{S\_IFMT} che permette di estrarre da
+\var{st\_mode} (con un AND aritmetico) il blocco di bit nei quali viene
+memorizzato il tipo di file. I valori successivi sono le costanti
+corrispondenti ai vari tipi di file, e possono essere usate per verificare la
+presenza del tipo di file voluto ed anche, con opportune combinazioni,
+alternative fra più tipi di file. 
+
+Si tenga presente però che a differenza dei permessi, l'informazione relativa
+al tipo di file non è una maschera binaria, per questo motivo se si volesse
+impostare una condizione che permetta di controllare se un file è una
+directory o un file ordinario non si possono controllare dei singoli bit, ma
+si dovrebbe usare una macro di preprocessore come:
+\includecodesnip{listati/is_regdir.h}
+in cui si estraggono ogni volta da \var{st\_mode} i bit relativi al tipo di
+file e poi si effettua il confronto con i due possibili tipi di file.
 
 
 \subsection{Le dimensioni dei file}
 \label{sec:file_file_size}
 
-Il campo \var{st\_size} di una struttura \struct{stat} contiene la dimensione
-del file in byte, se si tratta di un file regolare. Nel caso di un link
-simbolico la dimensione è quella del \textit{pathname} che il link stesso
-contiene; per le fifo questo campo è sempre nullo.
-
-Il campo \var{st\_blocks} definisce la lunghezza del file in blocchi di 512
-byte. Il campo \var{st\_blksize} infine definisce la dimensione preferita per
-i trasferimenti sui file (che è la dimensione usata anche dalle librerie del C
-per l'interfaccia degli stream); scrivere sul file a blocchi di dati di
-dimensione inferiore sarebbe inefficiente.
-
-Si tenga conto che la lunghezza del file riportata in \var{st\_size} non è
-detto che corrisponda all'occupazione dello spazio su disco per via della
-possibile esistenza dei cosiddetti \index{file!\textit{hole}} \textit{holes}
-(letteralmente \textsl{buchi}) che si formano tutte le volte che si va a
-scrivere su un \itindex{sparse~file} file dopo aver eseguito uno spostamento
-oltre la sua fine (tratteremo in dettaglio l'argomento in
-sez.~\ref{sec:file_lseek}).
+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
+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
+riferimento alla quantità di spazio disco allocata per il file, e non alla
+dimensione dello stesso che si otterrebbe leggendolo sequenzialmente.
+
+Si deve tener presente infatti che la lunghezza del file riportata in
+\var{st\_size} non è detto che corrisponda all'occupazione dello spazio su
+disco, e non solo perché la parte finale del file potrebbe riempire
+parzialmente un blocco. In un sistema unix-like infatti è possibile
+l'esistenza dei cosiddetti \itindex{sparse~file} \textit{sparse file}, cioè
+file in cui sono presenti dei ``\textsl{buchi}'' \index{file!\textit{hole}}
+(\textit{holes} nella nomenclatura inglese) che si formano tutte le volte che
+si va a scrivere su un file dopo aver eseguito uno spostamento oltre la sua
+fine (tratteremo in dettaglio l'argomento in sez.~\ref{sec:file_lseek}).
 
 In questo caso si avranno risultati differenti a seconda del modo in cui si
 calcola la lunghezza del file, ad esempio il comando \cmd{du}, (che riporta il
 numero di blocchi occupati) potrà dare una dimensione inferiore, mentre se si
 legge dal file (ad esempio usando il comando \cmd{wc -c}), dato che in tal
-caso per le parti non scritte vengono restituiti degli zeri, si avrà lo stesso
-risultato di \cmd{ls}.
+caso per i ``\textsl{buchi}'' \index{file!\textit{hole}} vengono restituiti
+degli zeri, si avrà lo stesso risultato di \cmd{ls}.
 
-Se è sempre possibile allargare un file, scrivendoci sopra od usando la
-funzione \func{lseek} per spostarsi oltre la sua fine, esistono anche casi in
-cui si può avere bisogno di effettuare un troncamento, scartando i dati
-presenti al di là della dimensione scelta come nuova fine del file.
+Se è sempre possibile allargare un file, scrivendoci sopra o usando la
+funzione \func{lseek} (vedi sez.~\ref{sec:file_lseek}) per spostarsi oltre la
+sua fine, esistono anche casi in cui si può avere bisogno di effettuare un
+troncamento, scartando i dati presenti al di là della dimensione scelta come
+nuova fine del file.
 
 Un file può sempre essere troncato a zero aprendolo con il flag
 \const{O\_TRUNC}, ma questo è un caso particolare; per qualunque altra
-dimensione si possono usare le due funzioni \funcd{truncate} e
+dimensione si possono usare le due funzioni di sistema \funcd{truncate} e
 \funcd{ftruncate}, i cui prototipi sono:
-\begin{functions}
-  \headdecl{unistd.h} 
 
-  \funcdecl{int truncate(const char *file\_name, off\_t length)} 
-
-  \funcdecl{int ftruncate(int fd, off\_t length))} 
-
-  Troncano un file alla lunghezza \param{length}.
-
-  \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per un
-    errore, nel qual caso \var{errno} viene impostata opportunamente; per
-    \func{ftruncate} si hanno i valori:
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int ftruncate(int fd, off\_t length))}
+\fdecl{int truncate(const char *file\_name, off\_t length)}
+\fdesc{Troncano 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{EINTR}] si è stati interrotti da un segnale.
+  \item[\errcode{EINVAL}] \param{length} è negativa o maggiore delle
+    dimensioni massime di un file.
+  \item[\errcode{EPERM}] il filesystem non supporta il troncamento di un file.
+  \item[\errcode{ETXTBSY}] il file è un programma in esecuzione.
+  \end{errlist} 
+  per entrambe, mentre per \func{ftruncate} si avranno anche: 
   \begin{errlist}
-  \item[\errcode{EBADF}] \param{fd}  non è un file descriptor.
-  \item[\errcode{EINVAL}] \param{fd} è un riferimento ad un socket, non a un
-    file o non è aperto in scrittura.
+  \item[\errcode{EBADF}] \param{fd} non è un file descriptor.
+  \item[\errcode{EINVAL}] \param{fd} non è un riferimento a un file o non è
+    aperto in scrittura. 
   \end{errlist}
-  per \func{truncate} si hanno:
+  e per \func{truncate} si avranno anche: 
   \begin{errlist}
-  \item[\errcode{EACCES}] il file non ha permesso di scrittura o non si ha il
-    permesso di esecuzione una delle directory del \textit{pathname}.
-  \item[\errcode{ETXTBSY}] il file è un programma in esecuzione.
+  \item[\errcode{EACCES}] non si ha il permesso di scrittura sul file o il
+    permesso di attraversamento di una delle componenti del \textit{pathname}.
+  \item[\errcode{EISDIR}] \param{file\_name} fa riferimento ad una directory.
   \end{errlist}
-  ed anche \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT},
-  \errval{EROFS}, \errval{EIO}, \errval{EFAULT}, \errval{ELOOP}.}
-\end{functions}
+  ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
+  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR} e \errval{EROFS}
+  nel loro significato generico.}
+\end{funcproto}
 
 Entrambe le funzioni fan sì che la dimensione del file sia troncata ad un
 valore massimo specificato da \param{length}, e si distinguono solo per il
-fatto che il file viene indicato con il \textit{pathname} \param{file\_name}
-per \func{truncate} e con il file descriptor \param{fd} per \funcd{ftruncate};
-se il file è più lungo della lunghezza specificata i dati in eccesso saranno
+fatto che il file viene indicato con un \textit{pathname} per \func{truncate}
+e con un file descriptor per \funcd{ftruncate}. Si tenga presente che se il
+file è più lungo della lunghezza specificata i dati in eccesso saranno
 perduti.
 
-Il comportamento in caso di lunghezza inferiore non è specificato e dipende
-dall'implementazione: il file può essere lasciato invariato o esteso fino alla
-lunghezza scelta; nel caso di Linux viene esteso con la creazione di un
-\index{file!\textit{hole}} \textsl{buco} nel \itindex{sparse~file} file e ad
-una lettura si otterranno degli zeri; si tenga presente però che questo
-comportamento è supportato solo per filesystem nativi, ad esempio su un
-filesystem non nativo come il VFAT di Windows questo non è possibile.
+Il comportamento in caso di lunghezza del file inferiore a \param{length} non
+è specificato e dipende dall'implementazione: il file può essere lasciato
+invariato o esteso fino alla lunghezza scelta. Nel caso di Linux viene esteso
+con la creazione di un \index{file!\textit{hole}} \textsl{buco} nel
+\itindex{sparse~file} file e ad una lettura si otterranno degli zeri, si tenga
+presente però che questo comportamento è supportato solo per filesystem
+nativi, ad esempio su un filesystem non nativo come il VFAT di Windows questo
+non è possibile.
+
 
 \subsection{I tempi dei file}
 \label{sec:file_file_times}
 
-Il sistema mantiene per ciascun file tre tempi, questi sono registrati
-\itindex{inode} nell'\textit{inode} insieme agli altri attributi del file e
-possono essere letti tramite la funzione \func{stat}, che li restituisce
-attraverso tre specifici campi della struttura \struct{stat} di
-fig.~\ref{fig:file_stat_struct}. Il significato di detti tempi e dei relativi
-campi è riportato nello schema in tab.~\ref{tab:file_file_times}, dove è anche
-riportato un esempio delle funzioni che effettuano cambiamenti su di essi. Il
-valore è espresso nel cosiddetto \itindex{calendar~time} \textit{calendar
-  time}, su cui torneremo in dettaglio in sez.~\ref{sec:sys_time}.
+Il sistema mantiene per ciascun file tre tempi, che sono registrati
+\itindex{inode} nell'\textit{inode} insieme agli altri attributi del
+file. Questi possono essere letti tramite la funzione \func{stat}, che li
+restituisce attraverso tre campi della struttura \struct{stat} di
+fig.~\ref{fig:file_stat_struct}. Il significato di questi tempi e dei relativi
+campi della struttura \struct{stat} è illustrato nello schema di
+tab.~\ref{tab:file_file_times}, dove è anche riportato un esempio delle
+funzioni che effettuano cambiamenti su di essi. Il valore del tempo è espresso
+nel cosiddetto \itindex{calendar~time} \textit{calendar time}, su cui
+torneremo in dettaglio in sez.~\ref{sec:sys_time}.
 
 \begin{table}[htb]
   \centering
@@ -3191,28 +3429,32 @@ valore è espresso nel cosiddetto \itindex{calendar~time} \textit{calendar
 \end{table}
 
 Il primo punto da tenere presente è la differenza fra il cosiddetto tempo di
-ultima modifica (il \textit{modification time}, \var{st\_mtime}) e il tempo di
-ultimo cambiamento di stato (il \textit{change time}, \var{st\_ctime}). Il
-primo infatti fa riferimento ad una modifica del contenuto di un file, mentre
-il secondo ad una modifica \itindex{inode} dell'\textit{inode}. Dato che
-esistono molte operazioni, come la funzione \func{link} e altre che vedremo in
-seguito, che modificano solo le informazioni contenute \itindex{inode}
-nell'\textit{inode} senza toccare il contenuto del file, diventa necessario
-l'utilizzo di questo secondo tempo.
+ultima modifica (il \textit{modification time}) riportato in \var{st\_mtime},
+ed il tempo di ultimo cambiamento di stato (il \textit{change status time})
+riportato in \var{st\_ctime}. Il primo infatti fa riferimento ad una modifica
+del contenuto di un file, mentre il secondo ad una modifica dei metadati
+\itindex{inode} dell'\textit{inode}. Dato che esistono molte operazioni, come
+la funzione \func{link} e altre che vedremo in seguito, che modificano solo le
+informazioni contenute \itindex{inode} nell'\textit{inode} senza toccare il
+contenuto del file, diventa necessario l'utilizzo di questo secondo tempo.
 
 Il tempo di ultima modifica viene usato ad esempio da programmi come
-\cmd{make} per decidere quali file necessitano di essere ricompilati o
-(talvolta insieme anche al tempo di cambiamento di stato) per decidere quali
-file devono essere archiviati per il backup. Il tempo di ultimo accesso viene
-di solito usato per identificare i file che non vengono più utilizzati per un
-certo lasso di tempo. Ad esempio un programma come \texttt{leafnode} lo usa
-per cancellare gli articoli letti più vecchi, mentre \texttt{mutt} lo usa per
-marcare i messaggi di posta che risultano letti.  Il sistema non tiene conto
-dell'ultimo accesso \itindex{inode} all'\textit{inode}, pertanto funzioni come
-\func{access} o \func{stat} non hanno alcuna influenza sui tre tempi. Il
-comando \cmd{ls} (quando usato con le opzioni \cmd{-l} o \cmd{-t}) mostra i
-tempi dei file secondo lo schema riportato nell'ultima colonna di
-tab.~\ref{tab:file_file_times}.
+\cmd{make} per decidere quali file necessitano di essere ricompilati perché
+più recenti dei loro sorgenti oppure dai programmi di backup, talvolta insieme
+anche al tempo di cambiamento di stato, per decidere quali file devono essere
+aggiornati nell'archiviazione.  Il tempo di ultimo accesso viene di solito
+usato per identificare i file che non vengono più utilizzati per un certo
+lasso di tempo. Ad esempio un programma come \texttt{leafnode} lo usa per
+cancellare gli articoli letti più vecchi, mentre \texttt{mutt} lo usa per
+marcare i messaggi di posta che risultano letti.  
+
+Il sistema non tiene mai conto dell'ultimo accesso \itindex{inode}
+all'\textit{inode}, pertanto funzioni come \func{access} o \func{stat} non
+hanno alcuna influenza sui tre tempi. Il comando \cmd{ls} (quando usato con le
+opzioni \cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema
+riportato nell'ultima colonna di tab.~\ref{tab:file_file_times}. Si noti anche
+come non esista, a differenza di altri sistemi operativi, un \textsl{tempo di
+  creazione} di un file.
 
 L'aggiornamento del tempo di ultimo accesso è stato a lungo considerato un
 difetto progettuale di Unix, questo infatti comporta la necessità di
@@ -3220,45 +3462,48 @@ effettuare un accesso in scrittura sul disco anche in tutti i casi in cui
 questa informazione non interessa e sarebbe possibile avere un semplice
 accesso in lettura sui dati bufferizzati. Questo comporta un ovvio costo sia
 in termini di prestazioni, che di consumo di risorse come la batteria per i
-portatili, o cicli di riscrittura per i dischi su memorie riscrivibili.
-
-% TODO aggiustare per il contenuto duplicato con le analoghe MS_*
-
-Per questo motivo, onde evitare di mantenere una informazione che nella
-maggior parte dei casi non interessa, è sempre stato possibile disabilitare
-l'aggiornamento del tempo di ultimo accesso con l'opzione di montaggio
-\texttt{noatime}. Dato però che questo può creare problemi a qualche
-programma, in Linux è stata introdotta la opzione \texttt{relatime} che esegue
-l'aggiornamento soltanto se il tempo di ultimo accesso è precedente al tempo di
-ultima modifica o cambiamento, così da rendere evidente che vi è stato un
-accesso dopo la scrittura, ed evitando al contempo ulteriori operazioni su
-disco negli accessi successivi. In questo modo l'informazione relativa al
-fatto che un file sia stato letto resta disponibile, e ad esempio i programmi
-citati in precedenza continuano a funzionare. Questa opzione, a partire dal
-kernel 2.6.30, è diventata il comportamento di default e non deve più essere
-specificata esplicitamente.\footnote{si può comunque riottenere il vecchio
-  comportamento usando la opzione di montaggio \texttt{strictatime}.}
+portatili, o i cicli di riscrittura per i dischi su memorie riscrivibili.
+
+
+Per questo motivo abbiamo visto in sez.~\ref{sec:filesystem_mounting} come
+nello sviluppo del kernel siano stati introdotti degli opportuni \textit{mount
+  flag} che consentissero di evitare di aggiornare continuamente una
+informazione che nella maggior parte dei casi non interessa. Per questo i
+valori che si possono trovare per l'\textit{access time} dipendono dalle
+opzioni di montaggio, ed anche, essendo stato cambiato il comportamento di
+default a partire dalla versione 2.6.30, dal kernel che si sta usando. 
+
+In generale quello che si ha con i kernel più recenti è che il tempo di ultimo
+accesso viene aggiornato solo se è precedente al tempo di ultima modifica o
+cambiamento, o se è passato più di un giorno dall'ultimo accesso. Così si può
+rendere evidente che vi è stato un accesso dopo una modifica e che il file
+viene comunque osservato regolarmente, conservando tutte le informazioni
+veramente utili senza dover consumare risorse in scritture continue per
+mantenere costantemente aggiornata una informazione che questo punto non ha
+più nessuna rilevanza pratica.\footnote{qualora ce ne fosse la necessità è
+  comunque possibile, tramite l'opzione di montaggio \texttt{strictatime},
+  richiedere in ogni caso il comportamento tradizionale.}
 
 \begin{table}[htb]
   \centering
   \footnotesize
   \begin{tabular}[c]{|l|c|c|c|c|c|c|l|}
     \hline
-    \multicolumn{1}{|p{3cm}|}{\centering{\vspace{6pt}\textbf{Funzione}}} &
-    \multicolumn{3}{|p{3.6cm}|}{\centering{
+    \multicolumn{1}{|p{2.8cm}|}{\centering{\vspace{6pt}\textbf{Funzione}}} &
+    \multicolumn{3}{|p{3.2cm}|}{\centering{
         \textbf{File o directory del riferimento}}}&
-    \multicolumn{3}{|p{3.6cm}|}{\centering{
+    \multicolumn{3}{|p{3.2cm}|}{\centering{
         \textbf{Directory contenente il riferimento}}} 
-    &\multicolumn{1}{|p{3.6cm}|}{\centering{\vspace{6pt}\textbf{Note}}} \\
+    &\multicolumn{1}{|p{3.4cm}|}{\centering{\vspace{6pt}\textbf{Note}}} \\
     \cline{2-7}
     \cline{2-7}
-    \multicolumn{1}{|p{3cm}|}{} 
-    &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(a)}}}
-    &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(m)}}}
-    &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(c)}}}
-    &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(a)}}}
-    &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(m)}}}
-    &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(c)}}}
+    \multicolumn{1}{|p{2.8cm}|}{} 
+    &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(a)}}}
+    &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(m)}}}
+    &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(c)}}}
+    &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(a)}}}
+    &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(m)}}}
+    &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(c)}}}
     &\multicolumn{1}{|p{3cm}|}{} \\
     \hline
     \hline
@@ -3280,6 +3525,8 @@ specificata esplicitamente.\footnote{si può comunque riottenere il vecchio
              & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$&\\
     \func{mkdir}
              &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$&\\
+    \func{mknod}
+             &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$&\\
     \func{mkfifo}
              &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$&\\
     \func{open}
@@ -3309,13 +3556,15 @@ specificata esplicitamente.\footnote{si può comunque riottenere il vecchio
               & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$&\\ 
     \func{utime}
               &$\bullet$&$\bullet$&$\bullet$& --      & --      & --      &\\ 
+    \func{utimes}
+              &$\bullet$&$\bullet$&$\bullet$& --      & --      & --      &\\ 
     \func{write}
               & --      &$\bullet$&$\bullet$& --      & --      & --      &\\ 
     \hline
   \end{tabular}
   \caption{Prospetto dei cambiamenti effettuati sui tempi di ultimo 
-    accesso \textsl{(a)}, ultima modifica \textsl{(m)} e ultimo cambiamento
-    \textsl{(c)} dalle varie funzioni operanti su file e directory.}
+    accesso \textsl{(a)}, ultima modifica \textsl{(m)} e ultimo cambiamento di
+    stato \textsl{(c)} dalle varie funzioni operanti su file e directory.}
   \label{tab:file_times_effects}  
 \end{table}
 
@@ -3324,44 +3573,55 @@ L'effetto delle varie funzioni di manipolazione dei file sui relativi tempi è
 illustrato in tab.~\ref{tab:file_times_effects}, facendo riferimento al
 comportamento classico per quanto riguarda \var{st\_atime}. Si sono riportati
 gli effetti sia per il file a cui si fa riferimento, sia per la directory che
-lo contiene; questi ultimi possono essere capiti se si tiene conto di quanto
-già detto, e cioè che anche le directory sono anch'esse file che contengono
-una lista di nomi, che il sistema tratta in maniera del tutto analoga a tutti
-gli altri.
+lo contiene. Questi ultimi possono essere capiti immediatamente se si tiene
+conto di quanto già detto e ripetuto a partire da
+sez.~\ref{sec:file_filesystem}, e cioè che anche le directory sono anch'esse
+file che contengono una lista di nomi, che il sistema tratta in maniera del
+tutto analoga a tutti gli altri.
 
 Per questo motivo tutte le volte che compiremo un'operazione su un file che
 comporta una modifica del nome contenuto nella directory, andremo anche a
-scrivere sulla directory che lo contiene cambiandone il tempo di modifica. Un
-esempio di questo tipo di operazione può essere la cancellazione di un file,
-invece leggere o scrivere o cambiare i permessi di un file ha effetti solo sui
-tempi di quest'ultimo.
-
-Si noti infine come \var{st\_ctime} non abbia nulla a che fare con il tempo di
-creazione del file, usato in molti altri sistemi operativi, ma che in Unix non
-esiste. Per questo motivo quando si copia un file, a meno di preservare
+scrivere sulla directory che lo contiene cambiandone il tempo di ultima
+modifica. Un esempio di questo tipo di operazione può essere la cancellazione
+di un file, invece leggere o scrivere o cambiare i permessi di un file ha
+effetti solo sui tempi di quest'ultimo.
+
+Si ricordi infine come \var{st\_ctime} non è il tempo di creazione del file,
+che in Unix non esiste, anche se può corrispondervi per file che non sono mai
+stati modificati. Per questo motivo, a differenza di quanto avviene con altri
+sistemi operativi, quando si copia un file, a meno di preservare
 esplicitamente i tempi (ad esempio con l'opzione \cmd{-p} di \cmd{cp}) esso
-avrà sempre il tempo corrente come data di ultima modifica.
+avrà sempre il tempo corrente in cui si è effettuata la copia come data di
+ultima modifica.
 
-I tempi di ultimo accesso e modifica possono essere modificati esplicitamente
-usando la funzione \funcd{utime}, il cui prototipo è:
-\begin{prototype}{utime.h}
-  {int utime(const char *filename, struct utimbuf *times)} 
-  Modifica i tempi di ultimo accesso e modifica di un file.
+I tempi di ultimo accesso ed ultima modifica possono essere modificati
+esplicitamente usando la funzione di sistema \funcd{utime}, il cui prototipo
+è:
 
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
-    \begin{errlist}
-    \item[\errcode{EACCES}] non si ha il permesso di scrittura sul file.
-    \item[\errcode{EPERM}] non si è proprietari del file.
-    \end{errlist}
-    ed inoltre \errval{EROFS} e \errval{ENOENT}.}
-\end{prototype}
+\begin{funcproto}{
+\fhead{utime.h}
+\fdecl{int utime(const char *filename, struct utimbuf *times)}
+\fdesc{Modifica i tempi di ultimo accesso ed ultima modifica di un file.} 
+}
+
+{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}] non c'è il permesso di attraversamento per uno dei
+    componenti di \param{filename} o \param{times} è \val{NULL} e non si ha il
+    permesso di scrittura sul file, o non si è proprietari del file o non si
+    hanno i privilegi di amministratore.
+  \item[\errcode{EPERM}] \param{times} non è \val{NULL}, e non si è
+    proprietari del file o non si hanno i privilegi di amministratore.
+  \end{errlist}
+  ed inoltre \errval{ENOENT} e \errval{EROFS} nel loro significato generico.}
+\end{funcproto}
 
-La funzione cambia i tempi di ultimo accesso e modifica del file specificato
-dall'argomento \param{filename}, e richiede come secondo argomento il
-puntatore ad una struttura \struct{utimbuf}, la cui definizione è riportata in
-fig.~\ref{fig:struct_utimebuf}, con i nuovi valori di detti tempi
-(rispettivamente  nei campi \var{actime} e \var{modtime}). Se si passa un
+La funzione cambia i tempi di ultimo accesso e di ultima modifica del file
+specificato dall'argomento \param{filename}, e richiede come secondo argomento
+il puntatore ad una struttura \struct{utimbuf}, la cui definizione è riportata
+in fig.~\ref{fig:struct_utimebuf}, con i nuovi valori di detti tempi
+(rispettivamente nei campi \var{actime} e \var{modtime}). Se si passa un
 puntatore nullo verrà impostato il tempo corrente.
 
 \begin{figure}[!htb]
@@ -3375,21 +3635,28 @@ puntatore nullo verrà impostato il tempo corrente.
   \label{fig:struct_utimebuf}
 \end{figure}
 
-L'effetto della funzione e i privilegi necessari per eseguirla dipendono da
-cosa è l'argomento \param{times}; se è \val{NULL} la funzione imposta il
-tempo corrente ed è sufficiente avere accesso in scrittura al file; se invece
-si è specificato un valore la funzione avrà successo solo se si è proprietari
-del file o si hanno i privilegi di amministratore.
-
-Si tenga presente che non è comunque possibile specificare il tempo di
+L'effetto della funzione ed i privilegi necessari per eseguirla dipendono dal
+valore dell'argomento \param{times}. Se è \val{NULL} la funzione imposta il
+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.
+
+Si tenga presente che non è possibile modificare manualmente il tempo di
 cambiamento di stato del file, che viene aggiornato direttamente dal kernel
-tutte le volte che si modifica \itindex{inode} l'\textit{inode} (quindi anche
-alla chiamata di \func{utime}).  Questo serve anche come misura di sicurezza
-per evitare che si possa modificare un file nascondendo completamente le
-proprie tracce. In realtà la cosa resta possibile se si è in grado di accedere
-al \index{file!di~dispositivo} file di dispositivo, scrivendo direttamente sul
-disco senza passare attraverso il filesystem, ma ovviamente in questo modo la
-cosa è più complicata da realizzare.
+tutte le volte che si modifica \itindex{inode} l'\textit{inode}, e quindi
+anche alla chiamata di \func{utime}.  Questo serve anche come misura di
+sicurezza per evitare che si possa modificare un file nascondendo
+completamente le proprie tracce. In realtà la cosa resta possibile se si è in
+grado di accedere al \index{file!di~dispositivo} file di dispositivo,
+scrivendo direttamente sul disco senza passare attraverso il filesystem, ma
+ovviamente in questo modo la cosa è più complicata da
+realizzare.\footnote{esistono comunque molti programmi che consentono di farlo
+  con relativa semplicità per cui non si dia per scontato che il valore sia
+  credibile in caso di macchina compromessa.}
 
 A partire dal kernel 2.6 la risoluzione dei tempi dei file, che nei campi di
 tab.~\ref{tab:file_file_times} è espressa in secondi, è stata portata ai
@@ -3403,22 +3670,18 @@ supporto per questa maggior precisione sia assente questi campi aggiuntivi
 saranno nulli.
 
 Per la gestione di questi nuovi valori è stata definita una seconda funzione
-di modifica, \funcd{utimes}, che consente di specificare tempi con maggior
+di sistema, \funcd{utimes}, che consente di specificare tempi con maggior
 precisione; il suo prototipo è:
-\begin{prototype}
-  {sys/time.h}
-  {int utimes(const char *filename, struct timeval times[2])} 
-  Modifica i tempi di ultimo accesso e modifica di un file.
-
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
-    \begin{errlist}
-    \item[\errcode{EACCES}] non si ha il permesso di scrittura sul file.
-    \item[\errcode{EPERM}] non si è proprietari del file.
-    \end{errlist} 
-    ed inoltre \errval{EROFS} e \errval{ENOENT}.}
-\end{prototype}
 
+\begin{funcproto}{
+\fhead{sys/time.h}
+\fdecl{int utimes(const char *filename, struct timeval times[2])}
+\fdesc{Modifica i tempi di ultimo accesso e ultima modifica di un file.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà gli stessi valori di \func{utime}.}  
+\end{funcproto}
 La funzione è del tutto analoga alla precedente \func{utime} ma usa come
 secondo argomento un vettore di due strutture \struct{timeval}, la cui
 definizione è riportata in fig.~\ref{fig:sys_timeval_struct}, che consentono
@@ -3441,58 +3704,55 @@ puntatore nullo di nuovo verrà utilizzato il tempo corrente.
 Oltre ad \func{utimes} su Linux sono presenti altre due funzioni,\footnote{le
   due funzioni non sono definite in nessuno standard, ma sono presenti, oltre
   che su Linux, anche su BSD.} \funcd{futimes} e \funcd{lutimes}, che
-consentono rispettivamente di effettuare la modifica utilizzando un file
-già aperto o di eseguirla direttamente su un link simbolico. I relativi
+consentono rispettivamente di effettuare la modifica utilizzando un file già
+aperto o di eseguirla direttamente su un collegamento simbolico. I relativi
 prototipi sono:
-\begin{functions}
-  \headdecl{sys/time.h} 
-  
-  \funcdecl{int futimes(int fd, const struct timeval tv[2])} Cambia i tempi
-  di un file già aperto specificato tramite il file descriptor \param{fd}.
 
-  \funcdecl{int lutimes(const char *filename, const struct timeval tv[2])}
-  Cambia i tempi di \param{filename} anche se questo è un link simbolico.
-  
-  
-  \bodydesc{Le funzioni restituiscono zero in caso di successo e $-1$ per un
-    errore, nel qual caso \var{errno} assumerà gli stessi valori di
-    \func{utimes}, con in più per \func{futimes}:
+\begin{funcproto}{
+\fhead{sys/time.h}
+\fdecl{int futimes(int fd, const struct timeval tv[2])}
+\fdesc{Cambia i tempi di un file già aperto.} 
+\fdecl{int lutimes(const char *filename, const struct timeval tv[2])}
+\fdesc{Cambia i tempi di un collegamento simbolico.} 
+}
+
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno gli stessi valori di \func{utimes}, con in più
+  per \func{futimes}:
   \begin{errlist}
-  \item[\errcode{EBADF}] \param{fd}  non è un file descriptor.
+  \item[\errcode{EBADF}] \param{fd} non è un file descriptor.
   \item[\errcode{ENOSYS}] il filesystem \texttt{/proc} non è accessibile.
-  \end{errlist}}
-\end{functions}
+  \end{errlist}}  
+\end{funcproto}
 
 Le due funzioni anno 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 facendo riferimento al relativo file
-descriptor mentre con \func{lutimes} nel caso in cui \param{filename} sia un
-link simbolico saranno modificati i suoi tempi invece di quelli del file a cui
-esso punta.
+si può indicare il file su cui operare se questo è già aperto facendo
+riferimento al suo file descriptor mentre con \func{lutimes} nel caso in
+cui \param{filename} sia un collegamento simbolico saranno modificati i suoi
+tempi invece di quelli del file a cui esso punta.
 
 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:
-\begin{functions}
-  \headdecl{sys/time.h} 
-  
-  \funcdecl{futimens(int fd, const struct timespec times[2])} Cambia i tempi
-  di un file già aperto, specificato dal file descriptor \param{fd}.
 
-  \funcdecl{int utimensat(int dirfd, const char *pathname, const struct
-    timespec times[2], int flags)} Cambia i tempi del file \param{pathname}.
-  
-  
-  \bodydesc{Le funzioni restituiscono zero in caso di successo e $-1$ per un
-    errore, nel qual caso \var{errno} assumerà gli stessi valori di
-    \func{utimes}, con in più per \func{futimes}:
+\begin{funcproto}{
+\fhead{sys/time.h}
+\fdecl{futimens(int fd, const struct timespec times[2])}
+\fdesc{Cambia i tempi di un file già aperto.} 
+\fdecl{int utimensat(int dirfd, const char *pathname, const struct
+    timespec times[2], int flags)}
+\fdesc{Cambia i tempi di un file.} 
+}
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EBADF}] \param{fd}  non è un file descriptor.
-  \item[\errcode{ENOSYS}] il filesystem \texttt{/proc} non è accessibile.
-  \end{errlist}}
-\end{functions}
+  \item[\errcode{EBADF}] da fare
+  \end{errlist}
+  ed inoltre 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
@@ -3521,24 +3781,24 @@ aggiornare in maniera specifica soltanto uno fra il tempo di ultimo accesso e
 quello di ultima modifica. Quando si usa uno di questi valori speciali per
 \var{tv\_nsec} il corrispondente valore di \var{tv\_sec} viene ignorato.
 
-Queste due funzioni sono una estensione definita in una recente revisione
-dello standard POSIX (la POSIX.1-2008); 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 \param{flags} per indicare alla funzione di dereferenziare o meno i link
-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}.
+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}.
 
 
 \section{Il controllo di accesso ai file}
@@ -3569,13 +3829,14 @@ mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura
 
 Il controllo di accesso ai file segue un modello abbastanza semplice che
 prevede tre permessi fondamentali strutturati su tre livelli di accesso.
-Esistono varie estensioni a questo modello,\footnote{come le \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:
+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:
 \begin{itemize*}
 \item il permesso di lettura (indicato con la lettera \texttt{r}, dall'inglese
   \textit{read}).
@@ -3618,14 +3879,15 @@ contenuti in alcuni bit 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
-\cmd{u} (per \textit{user}), \cmd{g} (per \textit{group}) e \cmd{o} (per
-\textit{other}), inoltre se si vuole indicare tutti i raggruppamenti insieme
-si usa la lettera \cmd{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}.
+\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}.
 
 \begin{table}[htb]
   \centering
@@ -3654,9 +3916,9 @@ che permettono di accedere al valore numerico di questi bit nel campo
 \end{table}
 
 I permessi vengono usati in maniera diversa dalle varie funzioni, e a seconda
-che si riferiscano a dei file, dei link simbolici o delle directory; qui ci
-limiteremo ad un riassunto delle regole generali, entrando nei dettagli più
-avanti.
+che si riferiscano a dei file, dei collegamenti simbolici o delle directory;
+qui ci limiteremo ad un riassunto delle regole generali, entrando nei dettagli
+più avanti.
 
 La prima regola è che per poter accedere ad un file attraverso il suo
 \textit{pathname} occorre il permesso di esecuzione in ciascuna delle
@@ -3694,13 +3956,13 @@ 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.
 
-I permessi per un link simbolico sono ignorati, contano quelli del file a cui
-fa riferimento; per questo in genere il comando \cmd{ls} riporta per un link
-simbolico tutti i permessi come concessi; utente e gruppo a cui esso
-appartiene vengono pure ignorati quando il link viene risolto, vengono
-controllati solo quando viene richiesta la rimozione del link e quest'ultimo è
-in una directory con lo \itindex{sticky~bit} \textit{sticky bit} impostato (si
-veda sez.~\ref{sec:file_special_perm}).
+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
+a cui esso appartiene vengono pure ignorati quando il collegamento viene
+risolto, vengono controllati solo quando viene richiesta la rimozione del
+collegamento e quest'ultimo è in una directory con lo \itindex{sticky~bit}
+\textit{sticky bit} impostato (si veda sez.~\ref{sec:file_special_perm}).
 
 La procedura con cui il kernel stabilisce se un processo possiede un certo
 permesso (di lettura, scrittura o esecuzione) si basa sul confronto fra
@@ -3722,7 +3984,7 @@ cui l'utente appartiene.
 
 I passi attraverso i quali viene stabilito se il processo possiede il diritto
 di accesso sono i seguenti:
-\begin{enumerate}
+\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
@@ -3746,7 +4008,7 @@ di accesso sono i seguenti:
   \end{itemize*}
 \item Se il bit dei permessi d'accesso per tutti gli altri è impostato,
   l'accesso è consentito, altrimenti l'accesso è negato.
-\end{enumerate}
+\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,
@@ -3886,14 +4148,15 @@ 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 è:
-\begin{prototype}{unistd.h}
-{int access(const char *pathname, int mode)}
 
-Verifica i permessi di accesso.
-  
-\bodydesc{La funzione ritorna 0 se l'accesso è consentito, -1 se l'accesso non
-  è consentito ed in caso di errore; nel qual caso la variabile \var{errno}
-  assumerà i valori:
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int access(const char *pathname, int mode)}
+\fdesc{Verifica i permessi di accesso.} 
+}
+
+{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.
   \item[\errcode{EACCES}] l'accesso al file non è consentito, o non si ha il
@@ -3902,8 +4165,9 @@ Verifica i permessi di accesso.
     un filesystem montato in sola lettura.
   \end{errlist}
   ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
-  \errval{ENOTDIR}, \errval{ELOOP}, \errval{EIO}.}
-\end{prototype}
+  \errval{ENOTDIR}, \errval{ELOOP}, \errval{EIO}
+ nel loro significato generico.}
+\end{funcproto}
 
 La funzione verifica i permessi di accesso, indicati da \param{mode}, per il
 file indicato da \param{pathname}. I valori possibili per l'argomento
@@ -3912,8 +4176,8 @@ riportate in tab.~\ref{tab:file_access_mode_val} (attraverso un OR binario
 delle stesse). I primi tre valori implicano anche la verifica dell'esistenza
 del file, se si vuole verificare solo quest'ultima si può usare \const{F\_OK},
 o anche direttamente \func{stat}. Nel caso in cui \param{pathname} si
-riferisca ad un link simbolico, questo viene seguito ed il controllo è fatto
-sul file a cui esso fa riferimento.
+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
@@ -3958,27 +4222,32 @@ codici di errore.
 Per cambiare i permessi di un file il sistema mette ad disposizione due
 funzioni \funcd{chmod} e \funcd{fchmod}, che operano rispettivamente su un
 filename e su un file descriptor, i loro prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/stat.h} 
-  
-  \funcdecl{int chmod(const char *path, mode\_t mode)} Cambia i permessi del
-  file indicato da \param{path} al valore indicato da \param{mode}.
-  
-  \funcdecl{int fchmod(int fd, mode\_t mode)} Analoga alla precedente, ma usa
-  il file descriptor \param{fd} per indicare il file.
-  
-  \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per
-    un errore, in caso di errore \var{errno} può assumere i valori:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/stat.h}
+\fdecl{int chmod(const char *path, mode\_t mode)}
+\fdesc{Cambia i permessi del file indicato da \param{path} al valore indicato
+  da \param{mode}.} 
+\fdecl{int fchmod(int fd, mode\_t mode)}
+\fdesc{Analoga alla precedente, ma usa il file descriptor \param{fd} per
+  indicare il file.}  
+
+}
+
+{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 non corrisponde a quello del
     proprietario del file o non è zero.
-    \item[\errcode{EROFS}] il file è su un filesystem in sola lettura.
+  \item[\errcode{EROFS}] il file è su un filesystem in sola lettura.
   \end{errlist}
-  ed inoltre \errval{EIO}; \func{chmod} restituisce anche \errval{EFAULT},
+  ed inoltre per entrambe \errval{EIO}, per  \func{chmod} \errval{EFAULT},
   \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR},
-  \errval{EACCES}, \errval{ELOOP}; \func{fchmod} anche \errval{EBADF}.}
-\end{functions}
+  \errval{EACCES}, \errval{ELOOP}, per \func{fchmod} \errval{EBADF}
+ nel loro significato generico.}
+\end{funcproto}
+
 
 Entrambe le funzioni utilizzano come secondo argomento \param{mode}, una
 variabile dell'apposito tipo primitivo \type{mode\_t} (vedi
@@ -4098,22 +4367,25 @@ nuovo file viene creato.\footnote{l'operazione viene fatta sempre: anche
 
 La funzione che permette di impostare il valore di questa maschera di
 controllo è \funcd{umask}, ed il suo prototipo è:
-\begin{prototype}{stat.h}
-{mode\_t umask(mode\_t mask)}
 
-Imposta la maschera dei permessi dei bit al valore specificato da \param{mask}
-(di cui vengono presi solo i 9 bit meno significativi).
-  
-  \bodydesc{La funzione ritorna il precedente valore della maschera. È una
-    delle poche funzioni che non restituisce codici di errore.}
-\end{prototype}
+\begin{funcproto}{
+\fhead{stat.h}
+\fdecl{mode\_t umask(mode\_t mask)}
+\fdesc{Imposta la maschera dei permessi.} 
+}
 
-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.
+{La funzione ritorna ritorna il precedente valore della maschera, non sono
+  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
+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.
 
 \itindend{umask} 
 
@@ -4169,30 +4441,31 @@ sufficienti; in tal caso si deve aver cura di usare un valore di
 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:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/stat.h} 
-  
-  \funcdecl{int chown(const char *path, uid\_t owner, gid\_t group)}
-  \funcdecl{int fchown(int fd, uid\_t owner, gid\_t group)}
-  \funcdecl{int lchown(const char *path, uid\_t owner, gid\_t group)}
 
-  Le funzioni cambiano utente e gruppo di appartenenza di un file ai valori
-  specificati dalle variabili \param{owner} e \param{group}. 
-  
-  \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 per un
-    errore, nel qual caso caso \var{errno} assumerà i valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/stat.h}
+\fdecl{int chown(const char *path, uid\_t owner, gid\_t group)}
+\fdecl{int fchown(int fd, uid\_t owner, gid\_t group)}
+\fdecl{int lchown(const char *path, uid\_t owner, gid\_t group)}
+\fdesc{Cambiano proprietario e gruppo proprietario di un file.} 
+}
+
+{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 non corrisponde a quello del
     proprietario del file o non è zero, o utente e gruppo non sono validi
   \end{errlist}
-  Oltre a questi entrambe restituiscono gli errori \errval{EROFS} e
-  \errval{EIO}; \func{chown} restituisce anche \errval{EFAULT},
-  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR},
-  \errval{EACCES}, \errval{ELOOP}; \func{fchown} anche \errval{EBADF}.}
-\end{functions}
+  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{EBADF} nel loro significato generico.}
+\end{funcproto}
 
-Con Linux solo l'amministratore\footnote{o in generale un processo con la
+Le funzioni cambiano utente e gruppo di appartenenza di un file ai valori
+specificati dalle variabili \param{owner} e \param{group}. Con Linux solo
+l'amministratore\footnote{o in generale un processo con la
   \itindex{capabilities} capacità \const{CAP\_CHOWN}, vedi
   sez.~\ref{sec:proc_capabilities}.} può cambiare il proprietario di un file;
 in questo viene seguita la semantica usata da BSD che non consente agli utenti
@@ -4201,15 +4474,16 @@ quote.  L'amministratore può cambiare sempre il gruppo di un file, il
 proprietario può cambiare il gruppo solo dei file che gli appartengono e solo
 se il nuovo gruppo è il suo gruppo primario o uno dei gruppi di cui fa parte.
 
-La funzione \func{chown} segue i link simbolici, per operare direttamente su
-un link simbolico si deve usare la funzione \func{lchown}.\footnote{fino alla
-  versione 2.1.81 in Linux \func{chown} non seguiva i link simbolici, da
-  allora questo comportamento è stato assegnato alla funzione \func{lchown},
-  introdotta per l'occasione, ed è stata creata una nuova system call per
-  \func{chown} che seguisse i link simbolici.} La funzione \func{fchown} opera
-su un file aperto, essa è mutuata da BSD, ma non è nello standard POSIX.
-Un'altra estensione rispetto allo standard POSIX è che specificando -1 come
-valore per \param{owner} e \param{group} i valori restano immutati.
+La funzione \func{chown} segue i collegamenti simbolici, per operare
+direttamente su un collegamento simbolico si deve usare la funzione
+\func{lchown}.\footnote{fino alla versione 2.1.81 in Linux \func{chown} non
+  seguiva i collegamenti simbolici, da allora questo comportamento è stato
+  assegnato alla funzione \func{lchown}, introdotta per l'occasione, ed è
+  stata creata una nuova \textit{system call} per \func{chown} che seguisse i
+  collegamenti simbolici.} La funzione \func{fchown} opera su un file aperto,
+essa è mutuata da BSD, ma non è nello standard POSIX.  Un'altra estensione
+rispetto allo standard POSIX è che specificando -1 come valore
+per \param{owner} e \param{group} i valori restano immutati.
 
 Quando queste funzioni sono chiamate con successo da un processo senza i
 privilegi di root entrambi i bit \itindex{suid~bit} \acr{suid} e
@@ -4240,20 +4514,23 @@ fornire un quadro d'insieme.
     \multicolumn{3}{|c|}{other}&
     \multirow{2}{*}{\textbf{Significato per i file}} \\
     \cline{1-12}
-    \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\
+    \texttt{s}&\texttt{s}&\texttt{t}&
+    \texttt{r}&\texttt{w}&\texttt{x}&
+    \texttt{r}&\texttt{w}&\texttt{x}&
+    \texttt{r}&\texttt{w}&\texttt{x}& \\
     \hline
     \hline
-   1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario.\\
-   -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario.\\
+   1&-&-&-&-&1&-&-&-&-&-&-&Eseguito conferisce l'\ids{UID} effettivo dell'utente.\\
+   -&1&-&-&-&1&-&-&-&-&-&-&Eseguito conferisce il \ids{GID} effettivo del gruppo.\\
    -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking} 
                            \textit{mandatory locking} è abilitato.\\
    -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato.\\
-   -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario.\\
-   -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario.\\
-   -&-&-&-&-&1&-&-&-&-&-&-&Permesso di esecuzione per il proprietario.\\
-   -&-&-&-&-&-&1&-&-&-&-&-&Permesso di lettura per il gruppo proprietario.\\
-   -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario.\\
-   -&-&-&-&-&-&-&-&1&-&-&-&Permesso di esecuzione per il gruppo proprietario.\\
+   -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per l'utente.\\
+   -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per l'utente.\\
+   -&-&-&-&-&1&-&-&-&-&-&-&Permesso di esecuzione per l'utente.\\
+   -&-&-&-&-&-&1&-&-&-&-&-&Permesso di lettura per il gruppo.\\
+   -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo.\\
+   -&-&-&-&-&-&-&-&1&-&-&-&Permesso di esecuzione per il gruppo.\\
    -&-&-&-&-&-&-&-&-&1&-&-&Permesso di lettura per tutti gli altri.\\
    -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri.\\
    -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri.\\
@@ -4265,23 +4542,21 @@ fornire un quadro d'insieme.
     \multicolumn{3}{|c|}{other}&
     \multirow{2}{*}{\textbf{Significato per le directory}} \\
     \cline{1-12}
-    \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\
+    \texttt{s}&\texttt{s}&\texttt{t}&
+    \texttt{r}&\texttt{w}&\texttt{x}&
+    \texttt{r}&\texttt{w}&\texttt{x}&
+    \texttt{r}&\texttt{w}&\texttt{x}& \\
     \hline
     \hline
     1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato.\\
-    -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file 
-                            creati.\\
-    -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella 
-                            directory.\\
-    -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario.\\
-    -&-&-&-&1&-&-&-&-&-&-&-&Permesso di aggiornamento per il proprietario.\\
-    -&-&-&-&-&1&-&-&-&-&-&-&Permesso di attraversamento per il proprietario.\\
-    -&-&-&-&-&-&1&-&-&-&-&-&Permesso di visualizzazione per il gruppo 
-                            proprietario.\\
-    -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo 
-                            proprietario.\\
-    -&-&-&-&-&-&-&-&1&-&-&-&Permesso di attraversamento per il gruppo 
-                            proprietario.\\
+    -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo ai nuovi file creati.\\
+    -&-&1&-&-&-&-&-&-&-&-&-&Solo il proprietario di un file può rimuoverlo.\\
+    -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per l'utente.\\
+    -&-&-&-&1&-&-&-&-&-&-&-&Permesso di aggiornamento per l'utente.\\
+    -&-&-&-&-&1&-&-&-&-&-&-&Permesso di attraversamento per l'utente.\\
+    -&-&-&-&-&-&1&-&-&-&-&-&Permesso di visualizzazione per il gruppo.\\
+    -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo.\\
+    -&-&-&-&-&-&-&-&1&-&-&-&Permesso di attraversamento per il gruppo.\\
     -&-&-&-&-&-&-&-&-&1&-&-&Permesso di visualizzazione per tutti gli altri.\\
     -&-&-&-&-&-&-&-&-&-&1&-&Permesso di aggiornamento per tutti gli altri.\\
     -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri.\\
@@ -4305,10 +4580,11 @@ caso si è riapplicato ai bit di \itindex{suid~bit} \textit{suid},
 \itindex{sgid~bit} \textit{sgid} e \textit{sticky} \itindex{sticky~bit} la
 notazione illustrata in fig.~\ref{fig:file_perm_bit}.
 
-Si ricordi infine che i permessi non hanno alcun significato per i link
-simbolici, mentre per i \index{file!di~dispositivo} file di dispositivo hanno
-senso soltanto i permessi di lettura e scrittura, che si riflettono sulla
-possibilità di compiere dette operazioni sul dispositivo stesso.
+Si ricordi infine che i permessi non hanno alcun significato per i
+collegamenti simbolici, mentre per i \index{file!di~dispositivo} file di
+dispositivo hanno senso soltanto i permessi di lettura e scrittura, che si
+riflettono sulla possibilità di compiere dette operazioni sul dispositivo
+stesso.
 
 Nella tabella si è indicato con il carattere ``-'' il fatto che il valore del
 bit in questione non è influente rispetto a quanto indicato nella riga della
@@ -4483,24 +4759,24 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
   directory ordinarie, se valesse in generale infatti si avrebbe un serio
   problema di sicurezza dato che esistono diversi oggetti sul filesystem per i
   quali è normale avere avere il permesso di scrittura consentito a tutti gli
-  utenti, come i link simbolici, o alcuni \index{file!di~dispositivo} file di
-  dispositivo come \texttt{/dev/null}. Se fosse possibile usare su di essi gli
-  \textit{extended user attributes} un utente qualunque potrebbe inserirvi
-  dati a piacere.\footnote{la cosa è stata notata su XFS, dove questo
-    comportamento permetteva, non essendovi limiti sullo spazio occupabile
-    dagli \textit{Extended Attributes}, di bloccare il sistema riempiendo il
-    disco.}
+  utenti, come i collegamenti simbolici, o alcuni \index{file!di~dispositivo}
+  file di dispositivo come \texttt{/dev/null}. Se fosse possibile usare su di
+  essi gli \textit{extended user attributes} un utente qualunque potrebbe
+  inserirvi dati a piacere.\footnote{la cosa è stata notata su XFS, dove
+    questo comportamento permetteva, non essendovi limiti sullo spazio
+    occupabile dagli \textit{Extended Attributes}, di bloccare il sistema
+    riempiendo il disco.}
 
   La semantica del controllo di accesso indicata inoltre non avrebbe alcun
   senso al di fuori di file e directory: i permessi di lettura e scrittura per
   un \index{file!di~dispositivo} file di dispositivo attengono alle capacità
   di accesso al dispositivo sottostante,\footnote{motivo per cui si può
     formattare un disco anche se \texttt{/dev} è su un filesystem in sola
-    lettura.} mentre per i link simbolici questi vengono semplicemente
+    lettura.} mentre per i collegamenti simbolici questi vengono semplicemente
   ignorati: in nessuno dei due casi hanno a che fare con il contenuto del
   file, e nella discussione relativa all'uso degli \textit{extended user
     attributes} nessuno è mai stato capace di indicare una qualche forma
-  sensata di utilizzo degli stessi per link simbolici o
+  sensata di utilizzo degli stessi per collegamenti simbolici o
   \index{file!di~dispositivo} file di dispositivo, e neanche per le fifo o i
   socket.  Per questo motivo essi sono stati completamente disabilitati per
   tutto ciò che non sia un file regolare o una directory.\footnote{si può
@@ -4525,26 +4801,24 @@ 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 link
-simbolico e ad un file descriptor; i rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{attr/xattr.h} 
-  
-  \funcdecl{ssize\_t getxattr(const char *path, const char *name, void
-    *value, size\_t size)} 
+rispettivamente di richiedere gli attributi relativi a un file, a un
+collegamento simbolico e ad un file descriptor; i rispettivi prototipi sono:
 
-  \funcdecl{ssize\_t lgetxattr(const char *path, const char *name, void
-    *value, size\_t size)} 
-
-  \funcdecl{ssize\_t fgetxattr(int filedes, const char *name, void *value,
-    size\_t size)}
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{attr/xattr.h}
+\fdecl{ssize\_t getxattr(const char *path, const char *name, void *value,
+  size\_t size)}
+\fdecl{ssize\_t lgetxattr(const char *path, const char *name, void *value,
+  size\_t size)}
+\fdecl{ssize\_t fgetxattr(int filedes, const char *name, void *value,
+  size\_t size)}
+\fdesc{Leggono il valore di un attributo esteso.} 
+}
 
-  Le funzioni leggono il valore di un attributo esteso.
-  
-  \bodydesc{Le funzioni restituiscono un intero positivo che indica la
-    dimensione dell'attributo richiesto in caso di successo, e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà i valori:
+{Le funzioni ritornano un intero positivo che indica la dimensione
+  dell'attributo richiesto in caso di successo e $-1$ per un errore, nel qual
+  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}
@@ -4552,17 +4826,18 @@ simbolico e ad un file descriptor; i rispettivi prototipi sono:
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
   \end{errlist}
-  e tutti gli errori di \func{stat}, come \errcode{EPERM} se non si hanno i
-  permessi di accesso all'attributo. }
-\end{functions}
+  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
+  permessi di accesso all'attributo.}
+\end{funcproto}
 
 Le funzioni \func{getxattr} e \func{lgetxattr} prendono come primo argomento
 un \textit{pathname} che indica il file di cui si vuole richiedere un
 attributo, la sola differenza è che la seconda, se il \textit{pathname} indica
-un link simbolico, restituisce gli attributi di quest'ultimo e non quelli del
-file a cui esso fa riferimento. La funzione \func{fgetxattr} prende invece
-come primo argomento un numero di file descriptor, e richiede gli attributi
-del file ad esso associato.
+un collegamento simbolico, restituisce gli attributi di quest'ultimo e non
+quelli del file a cui esso fa riferimento. La funzione \func{fgetxattr} prende
+invece come primo argomento un numero di file descriptor, e richiede gli
+attributi del file ad esso associato.
 
 Tutte e tre le funzioni richiedono di specificare nell'argomento \param{name}
 il nome dell'attributo di cui si vuole ottenere il valore. Il nome deve essere
@@ -4587,24 +4862,22 @@ sufficienti.\footnote{si parla di stima perché anche se le funzioni
 Un secondo gruppo di funzioni è quello che consente di impostare il valore di
 un attributo esteso, queste sono \funcd{setxattr}, \funcd{lsetxattr} e
 \funcd{fsetxattr}, e consentono di operare rispettivamente su un file, su un
-link simbolico o specificando un file descriptor; i loro prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{attr/xattr.h} 
-  
-  \funcdecl{int setxattr(const char *path, const char *name, const void
-    *value, size\_t size, int flags)}
-
-  \funcdecl{int lsetxattr(const char *path, const char *name, const void
-    *value, size\_t size, int flags)}
+collegamento simbolico o specificando un file descriptor; i loro prototipi sono:
 
-  \funcdecl{int fsetxattr(int filedes, const char *name, const void *value,
-    size\_t size, int flags)}
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{attr/xattr.h}
+\fdecl{int setxattr(const char *path, const char *name, const void *value,
+  size\_t size, int flags)} 
+\fdecl{int lsetxattr(const char *path, const char *name, const void *value,
+  size\_t size, int flags)} 
+\fdecl{int fsetxattr(int filedes, const char *name, const void *value, size\_t
+  size, int flags)} 
+\fdesc{Impostano il valore di un attributo esteso.} 
+}
 
-  Impostano il valore di un attributo esteso.
-  
-  \bodydesc{Le funzioni restituiscono 0 in caso di successo, e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà i valori:
+{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.
@@ -4613,11 +4886,10 @@ link simbolico o specificando un file descriptor; i loro prototipi sono:
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
   \end{errlist}
-  Oltre a questi potranno essere restituiti tutti gli errori di \func{stat},
-  ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso
-  all'attributo.  
-}
-\end{functions}
+  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
+  permessi di accesso all'attributo.}
+\end{funcproto}
 
 Le tre funzioni prendono come primo argomento un valore adeguato al loro
 scopo, usato in maniera del tutto identica a quanto visto in precedenza per le
@@ -4641,35 +4913,32 @@ 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},
 \funcd{llistxattr} e \funcd{flistxattr} i cui prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{attr/xattr.h} 
-  
-  \funcdecl{ssize\_t listxattr(const char *path, char *list, size\_t size)}
 
-  \funcdecl{ssize\_t llistxattr(const char *path, char *list, size\_t size)}
-
-  \funcdecl{ssize\_t flistxattr(int filedes, char *list, size\_t size)}
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{attr/xattr.h}
+\fdecl{ssize\_t listxattr(const char *path, char *list, size\_t size)} 
+\fdecl{ssize\_t llistxattr(const char *path, char *list, size\_t size)} 
+\fdecl{ssize\_t flistxattr(int filedes, char *list, size\_t size)} 
+\fdesc{Leggono la lista degli attributi estesi di un file.} 
+}
 
-  Leggono la lista degli attributi estesi di un file.
-  
-  \bodydesc{Le funzioni restituiscono un intero positivo che indica la
-    dimensione della lista in caso di successo, e $-1$ in caso di errore, nel
-    qual caso \var{errno} assumerà i valori:
+{Le funzioni ritornano un intero positivo che indica la dimensione della lista
+  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.
   \end{errlist}
-  Oltre a questi potranno essere restituiti tutti gli errori di \func{stat},
-  ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso
-  all'attributo.  
-}
-\end{functions}
+  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
+  permessi di accesso all'attributo.}
+\end{funcproto}
 
 Come per le precedenti le tre funzioni leggono gli attributi rispettivamente
-di un file, un link simbolico o specificando un file descriptor, da
+di un file, un collegamento simbolico o specificando un file descriptor, da
 specificare con il loro primo argomento. Gli altri due argomenti, identici per
 tutte e tre, indicano rispettivamente il puntatore \param{list} al buffer dove
 deve essere letta la lista e la dimensione \param{size} di quest'ultimo.
@@ -4688,35 +4957,34 @@ 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:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{attr/xattr.h} 
-  
-  \funcdecl{int removexattr(const char *path, const char *name)}
-
-  \funcdecl{int lremovexattr(const char *path, const char *name)}
-
-  \funcdecl{int fremovexattr(int filedes, const char *name)}
 
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{attr/xattr.h}
+\fdecl{int removexattr(const char *path, const char *name)} 
+\fdecl{int lremovexattr(const char *path, const char *name)} 
+\fdecl{int fremovexattr(int filedes, const char *name)} 
+\fdesc{Rimuovono un attributo esteso di un file.} 
+}
 
-  Rimuovono un attributo esteso di un file.
-  
-  \bodydesc{Le funzioni restituiscono 0 in caso di successo, e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà i valori:
+{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{ENOATTR}] l'attributo richiesto non esiste.
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
   \end{errlist}
-  ed inoltre tutti gli errori di \func{stat}.  
-}
-\end{functions}
+  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
+  permessi di accesso all'attributo.}
+\end{funcproto}
 
 Le tre funzioni rimuovono l'attributo esteso indicato dall'argomento
-\param{name} rispettivamente di un file, un link 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.
+\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.
 
 \itindend{Extended~Attributes}
 
@@ -4851,17 +5119,18 @@ ordinari vengono mappati le tre voci di tipo \const{ACL\_USER\_OBJ},
 \const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER} che devono essere presenti in
 qualunque ACL; un cambiamento ad una di queste voci viene automaticamente
 riflesso sui permessi ordinari dei file\footnote{per permessi ordinari si
-  intende quelli mantenuti 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}.}
+  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}.}
 
 Un secondo aspetto dell'incidenza delle ACL sul comportamento del sistema è
 quello relativo alla creazione di nuovi file,\footnote{o oggetti sul
@@ -5507,15 +5776,15 @@ ad un altra con \funcd{acl\_copy\_entry} o eliminare una voce da una ACL con
 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
-\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
+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.
 
 Il meccanismo prevede che per ciascun filesystem che supporta le quote disco
 (i vari \textit{extN}, \textit{btrfs}, \textit{XFS}, \textit{JFS},
@@ -5549,8 +5818,8 @@ 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 \textit{inode}) e devono
-pertanto essere specificati per entrambe le risorse. 
+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 è:
@@ -5737,8 +6006,8 @@ correnti dei limiti e dell'occupazione delle risorse, che con
 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 \textit{inode} o il tempo che resta nel caso si sia superato un
-\textit{soft limit}.
+di spazio e \itindex{inode} \textit{inode} o il tempo che resta nel caso si
+sia superato un \textit{soft limit}.
 
 \begin{table}[htb]
   \centering
@@ -5753,7 +6022,7 @@ di spazio e \textit{inode} o il tempo che resta nel caso si sia superato un
                           \val{dqb\_bsoftlimit}).\\
     \const{QIF\_SPACE}  & Uso corrente
                           dello spazio disco (\val{dqb\_curspace}).\\
-    \const{QIF\_ILIMITS}& Limiti sugli \textit{inode}
+    \const{QIF\_ILIMITS}& Limiti sugli \itindex{inode}  \textit{inode}
                           (\val{dqb\_ihardlimit} e \val{dqb\_isoftlimit}).\\
     \const{QIF\_INODES} & Uso corrente
                           degli \textit{inode} (\val{dqb\_curinodes}).\\
@@ -5762,7 +6031,7 @@ di spazio e \textit{inode} o il tempo che resta nel caso si sia superato un
                           blocchi (\val{dqb\_btime}).\\
     \const{QIF\_ITIME}  & Tempo di
                           sforamento del \textit{soft limit} sul numero di
-                          \textit{inode} (\val{dqb\_itime}).\\ 
+                          \itindex{inode} \textit{inode} (\val{dqb\_itime}).\\ 
     \const{QIF\_LIMITS} & L'insieme di \const{QIF\_BLIMITS} e
                           \const{QIF\_ILIMITS}.\\
     \const{QIF\_USAGE}  & L'insieme di \const{QIF\_SPACE} e
@@ -5778,14 +6047,14 @@ di spazio e \textit{inode} o il tempo che resta nel caso si sia superato un
 
 
 Inoltre in caso di modifica di un limite si può voler operare solo su una
-delle risorse (blocchi o \textit{inode});\footnote{non è possibile modificare
-  soltanto uno dei limiti (\textit{hard} o \textit{soft}) occorre sempre
-  rispecificarli entrambi.} per questo la struttura prevede un campo apposito,
-\val{dqb\_valid}, il cui scopo è quello di indicare quali sono gli altri campi
-che devono essere considerati validi. Questo campo è una maschera binaria che
-deve essere espressa nei termini di OR aritmetico delle apposite costanti di
-tab.~\ref{tab:quotactl_qif_const}, dove si è riportato il significato di
-ciascuna di esse ed i campi a cui fanno riferimento.
+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.
 
 In lettura con \const{Q\_SETQUOTA} eventuali valori presenti in \struct{dqblk}
 vengono comunque ignorati, al momento la funzione sovrascrive tutti i campi e
@@ -5837,7 +6106,7 @@ significato di ciascuna di esse ed i campi a cui fanno riferimento.
     \const{IIF\_BGRACE}& Il \textit{grace period} per i blocchi
                          (\val{dqi\_bgrace}).\\
     \const{IIF\_IGRACE}& Il \textit{grace period} per gli \textit{inode} 
-                         (\val{dqi\_igrace}).\\ 
+                         \itindex{inode} (\val{dqi\_igrace}).\\ 
     \const{IIF\_FLAGS} & I flag delle quote (\val{dqi\_flags}) (inusato ?).\\
     \const{IIF\_ALL}   & Tutti i precedenti.\\
     \hline
@@ -5892,7 +6161,7 @@ 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})
 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
+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
 funzione dell'interfaccia per passare il valore di \var{errno} come eccezione.
 
@@ -7240,7 +7509,6 @@ 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
 
@@ -7263,7 +7531,7 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  name TYPE OFF RECLEN UNKNOWN REG SOCK CHR BLK type IFTODT DTTOIF
 % LocalWords:  DTYPE off reclen seekdir telldir void rewinddir closedir select
 % LocalWords:  namelist compar malloc qsort alphasort versionsort strcoll myls
-% LocalWords:  strcmp DirScan direntry while current working home shell pwd get
+% LocalWords:  strcmp direntry while current working home shell pwd get stddef
 % LocalWords:  getcwd ERANGE getwd change fd race condition tmpnam getfacl mark
 % LocalWords:  string tmpdir TMP tempnam pfx TMPNAME suid tmp EXCL tmpfile pid
 % LocalWords:  EINTR mktemp mkstemp stlib template filename XXXXXX OpenBSD buf
@@ -7317,7 +7585,8 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  bind DIRSYNC lsattr Hierarchy FHS SHARED UNBINDABLE shared REC
 % 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
+% LocalWords:  setmntent getmntent addmntent endmntent hasmntopt such offsetof
+% LocalWords:  member scan attack EOVERFLOW BITS blkcnt rdev
 
 %%% Local Variables: 
 %%% mode: latex