Trattazione del significato di immutable e di append-only
[gapil.git] / filedir.tex
index d2cd284994c8f6d4c90ddbed964876d28932268b..fcc0c59c9e0317c2ed01b3660c540657d1746b4c 100644 (file)
@@ -538,10 +538,10 @@ Oltre alle caratteristiche standard, \acr{ext2} fornisce alcune estensioni che
 non sono presenti su un classico filesystem di tipo Unix; le principali sono
 le seguenti:
 \begin{itemize}
-\item i \textit{file attributes} consentono di modificare il comportamento del
-  kernel quando agisce su gruppi di file. Possono essere impostati su file e
-  directory e in quest'ultimo caso i nuovi file creati nella directory
-  ereditano i suoi attributi.
+\item gli attributi estesi (vedi sez.~\ref{sec:file_xattr}) che consentono di
+  estendere le informazioni salvabili come metadati e le ACL (vedi
+  sez.~\ref{sec:file_ACL}) che consentono di estendere il modello tradizionale
+  dei permessi sui file.
 \item sono supportate entrambe le semantiche di BSD e SVr4 come opzioni di
   montaggio. La semantica BSD comporta che i file in una directory sono creati
   con lo stesso identificatore di gruppo della directory che li contiene. La
@@ -558,11 +558,12 @@ le seguenti:
   dell'\textit{inode} (evitando letture multiple e spreco di spazio), non
   tutti i nomi però possono essere gestiti così per limiti di spazio (il
   limite è 60 caratteri).
-\item vengono supportati i file immutabili (che possono solo essere letti) per
-  la protezione di file di configurazione sensibili, o file
-  \textit{append-only} che possono essere aperti in scrittura solo per
-  aggiungere dati (caratteristica utilizzabile per la protezione dei file di
-  log).
+\item vengono supportati \itindex{file~attributes} i cosiddetti \textit{file
+    attributes} che attivano comportamenti specifici per i file su cui vengono
+  attivati come marcarli come immutabili (che possono cioè essere soltanto
+  letti) per la protezione di file di configurazione sensibili, o come
+  \textit{append-only} (che possono essere aperti in scrittura solo per
+  aggiungere dati) per la protezione dei file di log.
 \end{itemize}
 
 La struttura di \acr{ext2} è stata ispirata a quella del filesystem di BSD: un
@@ -629,7 +630,7 @@ 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, \\ 
@@ -1076,7 +1077,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 +1114,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.} 
@@ -1212,7 +1213,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)}
@@ -1336,7 +1337,7 @@ 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}).} 
@@ -1468,7 +1469,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}).} 
@@ -1554,7 +1555,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.} 
@@ -1663,7 +1664,7 @@ 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.} 
@@ -1748,7 +1749,7 @@ 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.} 
@@ -1772,7 +1773,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.} 
@@ -1886,7 +1887,7 @@ direttamente dal kernel attraverso una opportuna \textit{system
   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)}
@@ -1930,7 +1931,7 @@ Come accennato in precedenza per eseguire la cancellazione di una directory è
 necessaria una specifica funzione di sistema, \funcd{rmdir}, il suo prototipo
 è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/stat.h}
 \fdecl{int rmdir(const char *dirname)}
 \fdesc{Cancella una directory.} 
@@ -2003,7 +2004,7 @@ 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{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{DIR *opendir(const char *dirname)}
@@ -2041,7 +2042,7 @@ ad un \textit{directory stream} si può usare la funzione
   \texttt{\macro{\_POSIX\_C\_SOURCE} >= 200809L} o
   \texttt{\macro{\_XOPEN\_SOURCE} >= 700}.}  il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{int dirfd(DIR *dir)}
@@ -2076,7 +2077,7 @@ possibile associarvi un \textit{directory stream} con la funzione
   \texttt{\macro{\_POSIX\_C\_SOURCE} >= 200809L} o \texttt{\_XOPEN\_SOURCE >=
     700} .}  il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{DIR *fdopendir(int fd)}
@@ -2107,7 +2108,7 @@ Una volta che si sia aperto un \textit{directory stream} la lettura del
 contenuto della directory viene effettuata attraverso la funzione
 \funcd{readdir}, il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{struct dirent *readdir(DIR *dir)}
@@ -2145,7 +2146,7 @@ rientrante, \funcd{readdir\_r},\footnote{per usarla è necessario definire una
 può essere utilizzata anche con i \itindex{thread} \textit{thread}, il suo
 prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{int readdir\_r(DIR *dir, struct dirent *entry, struct dirent **result)}
@@ -2289,7 +2290,7 @@ varie voci, spostarsi all'interno dello \textit{stream} usando la funzione
   una delle macro \macro{\_XOPEN\_SOURCE}, \macro{\_BSD\_SOURCE} o
   \macro{\_SVID\_SOURCE}.} il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{dirent.h}
 \fdecl{void seekdir(DIR *dir, off\_t offset)}
 \fdesc{Cambia la posizione all'interno di un \textit{directory stream}.} 
@@ -2306,7 +2307,7 @@ funzione \funcd{telldir}, che legge la posizione corrente; il cui prototipo
   tipo \type{off\_t}, sostituito a partire dalla versione 2.1.2 da \ctyp{long}
   per conformità a POSIX.1-2001.}
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{dirent.h}
 \fdecl{long telldir(DIR *dir)}
 \fdesc{Ritorna la posizione corrente in un \textit{directory stream}.} 
@@ -2334,7 +2335,7 @@ 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{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{int closedir(DIR *dir)}
@@ -2351,7 +2352,7 @@ ordinamento, del contenuto di una directory; la funzione è
   \acr{libc4} e richiede siano definite le macro \macro{\_BSD\_SOURCE} o
   \macro{\_SVID\_SOURCE}.} ed il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{dirent.h}
 \fdecl{int scandir(const char *dir, struct dirent ***namelist, \\
 \phantom{int scandir(}int(*filter)(const struct dirent *), \\
@@ -2396,7 +2397,7 @@ Per l'ordinamento, vale a dire come valori possibili per l'argomento
 \param{compar}, sono disponibili due funzioni predefinite, \funcd{alphasort} e
 \funcd{versionsort}, i cui prototipi sono:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{dirent.h}
 \fdecl{int alphasort(const void *a, const void *b)}
 \fdecl{int versionsort(const void *a, const void *b)}
@@ -2539,7 +2540,7 @@ dell'\textit{inode} della directory di lavoro, per ottenerne il
   il filesystem \texttt{/proc} da \procfile{/proc/self/cwd}.} il cui prototipo
 è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{char *getcwd(char *buffer, size\_t size)}
 \fdesc{Legge il \textit{pathname} della directory di lavoro corrente.} 
@@ -2606,7 +2607,7 @@ 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}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int chdir(const char *pathname)}
 \fdesc{Cambia la directory di lavoro per \textit{pathname}.} 
@@ -2669,7 +2670,7 @@ 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}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{sys/stat.h}
 \fhead{fcntl.h}
@@ -2863,7 +2864,7 @@ 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{funcproto}{ 
+\begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{char *tmpnam(char *string)}
 \fdesc{Genera un nome univoco per un file temporaneo.} 
@@ -2890,7 +2891,7 @@ Di questa funzione esiste una versione \index{funzioni!rientranti} rientrante,
 Una funzione simile, \funcd{tempnam}, permette di specificare un prefisso per
 il file esplicitamente, il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{char *tempnam(const char *dir, const char *pfx)}
 \fdesc{Genera un nome univoco per un file temporaneo.} 
@@ -2930,7 +2931,7 @@ 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{funcproto}{ 
+\begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{FILE *tmpfile(void)}
 \fdesc{Apre un file temporaneo in lettura/scrittura.} 
@@ -2963,7 +2964,7 @@ 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{funcproto}{ 
+\begin{funcproto}{
 \fhead{stlib.h}
 \fdecl{char *mktemp(char *template)}
 \fdesc{Genera un nome univoco per un file temporaneo.} 
@@ -2990,7 +2991,7 @@ La seconda funzione, \funcd{mkstemp} è sostanzialmente equivalente a
 \func{tmpfile}, ma restituisce un file descriptor invece di un nome; il suo
 prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stlib.h}
 \fdecl{int mkstemp(char *template)}
 \fdesc{Apre un file temporaneo.} 
@@ -3022,7 +3023,7 @@ 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{funcproto}{ 
+\begin{funcproto}{
 \fhead{stlib.h}
 \fdecl{int mkostemp(char *template, int flags)}
 \fdesc{Apre un file temporaneo.} 
@@ -3041,7 +3042,7 @@ In OpenBSD è stata introdotta un'altra funzione simile alle precedenti,
   funzione è stata introdotta nella \acr{glibc} a partire dalla versione
   2.1.91 ed inserita nello standard POSIX.1-2008.}  il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stlib.h}
 \fdecl{char *mkdtemp(char *template)}
 \fdesc{Crea una directory temporanea.} 
@@ -3344,7 +3345,7 @@ Un file può sempre essere troncato a zero aprendolo con il flag
 dimensione si possono usare le due funzioni di sistema \funcd{truncate} e
 \funcd{ftruncate}, i cui prototipi sono:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int ftruncate(int fd, off\_t length))}
 \fdecl{int truncate(const char *file\_name, off\_t length)}
@@ -3598,7 +3599,7 @@ I tempi di ultimo accesso ed ultima modifica possono essere modificati
 esplicitamente usando la funzione di sistema \funcd{utime}, il cui prototipo
 è:
 
-\begin{funcproto}{ 
+\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.} 
@@ -3673,7 +3674,7 @@ Per la gestione di questi nuovi valori è stata definita una seconda funzione
 di sistema, \funcd{utimes}, che consente di specificare tempi con maggior
 precisione; il suo prototipo è:
 
-\begin{funcproto}{ 
+\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.} 
@@ -3708,7 +3709,7 @@ consentono rispettivamente di effettuare la modifica utilizzando un file già
 aperto o di eseguirla direttamente su un collegamento simbolico. I relativi
 prototipi sono:
 
-\begin{funcproto}{ 
+\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.} 
@@ -3732,13 +3733,14 @@ riferimento al suo file descriptor mentre con \func{lutimes} nel caso in
 cui \param{filename} sia un collegamento simbolico saranno modificati i suoi
 tempi invece di quelli del file a cui esso punta.
 
-Nonostante il kernel, come accennato, supporti risoluzioni dei tempi dei file
-fino al nanosecondo, le funzioni fin qui esaminate non consentono di impostare
-valori con questa precisione. Per questo sono state introdotte due nuove
-funzioni, \funcd{futimens} e \func{utimensat}, in grado di eseguire questo
-compito; i rispettivi prototipi sono:
+Nonostante il kernel nelle versioni più recenti supporti, come accennato,
+risoluzioni dei tempi dei file fino al nanosecondo, le funzioni fin qui
+esaminate non consentono di impostare valori con questa precisione. Per questo
+sono state introdotte due nuove funzioni di sistema, \funcd{futimens} e
+\funcd{utimensat}, in grado di eseguire questo compito; i rispettivi prototipi
+sono:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/time.h}
 \fdecl{futimens(int fd, const struct timespec times[2])}
 \fdesc{Cambia i tempi di un file già aperto.} 
@@ -3746,18 +3748,41 @@ compito; i rispettivi prototipi sono:
     timespec times[2], int flags)}
 \fdesc{Cambia i tempi di un file.} 
 }
+
 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
   caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EBADF}] da fare
+  \item[\errcode{EACCES}] si è richiesta l'impostazione del tempo corrente ma
+    non si ha il permesso di scrittura sul file, o non si è proprietari del
+    file o non si hanno i privilegi di amministratore; oppure il file è
+    immutabile (vedi sez.~\ref{sec:file_perm_overview}).
+  \item[\errcode{EBADF}] \param{fd} non è un file descriptor valido (solo
+    \func{futimens}), oppure \param{dirfd} non è \const{AT\_FDCWD} o un file
+    descriptor valido (solo \func{utimensat}).
+  \item[\errcode{EFAULT}] \param{times} non è un puntatore valido (per
+    entrambe), oppure \param{dirfd} è \const{AT\_FDCWD} ma \param{pathname} è
+    \var{NULL} o non è un puntatore valido (solo \func{utimensat}).
+  \item[\errcode{EINVAL}] si sono usati dei valori non corretti per i tempi
+    di \param{times} (per entrambe), oppure è si usato un valore non valido
+    per \param{flags}, oppure \param{pathname} è \var{NULL}, \param{dirfd} non
+    è \const{AT\_FDCWD} e \param{flags} contiene \const{AT\_SYMLINK\_NOFOLLOW}
+    (solo \func{utimensat}).
+  \item[\errcode{EPERM}] si è richiesto un cambiamento nei tempi non al tempo
+    corrente, ma non si è proprietari del file o non si hanno i privilegi di
+    amministratore; oppure il file è \itindex{file~attributes} immutabile o
+    \textit{append-only} (vedi sez.~\ref{sec:file_perm_overview}).
+  \item[\errcode{ESRCH}] non c'è il permesso di attraversamento per una delle
+    componenti di \param{pathname} (solo \func{utimensat})
   \end{errlist}
-  ed inoltre nel loro significato generico.}
+  ed inoltre per entrambe \errval{EROFS} e per \func{utimensat}
+  \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR} nel
+  loro significato generico.}
 \end{funcproto}
 
 Entrambe le funzioni utilizzano per indicare i valori dei tempi un
-vettore \param{times} di due strutture \struct{timespec} che permette di
-specificare un valore di tempo con una precisione fino al nanosecondo, la cui
-definizione è riportata in fig.~\ref{fig:sys_timespec_struct}.
+vettore \param{times} di due strutture \struct{timespec}, la cui definizione è
+riportata in fig.~\ref{fig:sys_timespec_struct}, che permette di specificare
+un valore dei tempi con una precisione fino al nanosecondo.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -3782,23 +3807,39 @@ quello di ultima modifica. Quando si usa uno di questi valori speciali per
 \var{tv\_nsec} il corrispondente valore di \var{tv\_sec} viene ignorato.
 
 Queste due funzioni sono una estensione definita nella revisione POSIX.1-2008
-dello standard POSIX; sono state introdotte a partire dal kernel 2.6.22, e
-supportate dalla \acr{glibc} a partire dalla versione 2.6.\footnote{in
-  precedenza, a partire dal kernel 2.6.16, era stata introdotta la funzione
-  \funcm{futimesat} seguendo una bozza della revisione dello standard poi
-  modificata, questa funzione, sostituita da \func{utimensat}, è stata
-  dichiarata obsoleta, non è supportata da nessuno standard e non deve essere
-  più utilizzata: pertanto non la tratteremo.} La prima è sostanzialmente una
-estensione di \func{futimes} che consente di specificare i tempi con
-precisione maggiore, la seconda supporta invece, rispetto ad \func{utimes},
-una sintassi più complessa che, come vedremo in sez.~\ref{sec:file_openat}
-consente una indicazione sicura dei \itindsub{pathname}{relativo}
-\textit{pathname relativi} specificando la directory da usare come riferimento
-in \param{dirfd} e la possibilità di usare per \param{flags} il valore
-\const{AT\_SYMLINK\_NOFOLLOW} per indicare alla funzione di non dereferenziare
-i collegamenti simbolici; si rimanda pertanto la spiegazione del significato
-degli argomenti aggiuntivi alla trattazione generica delle varie funzioni che
-usano la stessa sintassi, effettuata in sez.~\ref{sec:file_openat}.
+dello standard POSIX, in Linux sono state introdotte a partire dal kernel
+2.6.22,\footnote{si tenga presente però che per kernel precedenti il 2.6.26 le
+  due funzioni sono difettose nel rispetto di alcuni requisiti minori dello
+  standard e nel controllo della correttezza dei tempi, per i dettagli dei
+  quali si rimanda alla pagina di manuale.} e supportate dalla \acr{glibc} a
+partire dalla versione 2.6.\footnote{in precedenza, a partire dal kernel
+  2.6.16, era stata introdotta una \textit{system call} \funcm{futimesat}
+  seguendo una bozza della revisione dello standard poi modificata; questa
+  funzione, sostituita da \func{utimensat}, è stata dichiarata obsoleta, non è
+  supportata da nessuno standard e non deve essere più utilizzata: pertanto
+  non ne parleremo.} La prima è sostanzialmente una estensione di
+\func{futimes} che consente di specificare i tempi con precisione maggiore, la
+seconda supporta invece, rispetto ad \func{utimes}, una sintassi più complessa
+che consente una indicazione sicura del file su cui operare specificando la
+directory su cui si trova tramite il file descriptor \param{dirfd} ed il suo
+nome come \itindsub{pathname}{relativo} \textit{pathname relativo}
+in \param{pathname}.\footnote{su Linux solo \func{utimensat} è una
+  \textit{system call} e \func{futimens} è una funzione di libreria, infatti
+  se \param{pathname} è \var{NULL} \param{dirfd} viene considerato un file
+  descriptor ordinario e il cambiamento del tempo applicato al file
+  sottostante, qualunque esso sia, per cui \code{futimens(fd, times}) è del
+  tutto equivalente a \code{utimensat(fd, NULL, times, 0)}.}
+
+Torneremo su questa sintassi e sulla sua motivazione in
+sez.~\ref{sec:file_openat}, quando tratteremo tutte le altre funzioni (le
+cosiddette funzioni \textit{at}) che la utilizzano; essa prevede comunque
+anche la presenza dell'argomento \param{flags} con cui attivare flag di
+controllo che modificano il comportamento della funzione, nel caso specifico
+l'unico valore consentito è \const{AT\_SYMLINK\_NOFOLLOW} che indica alla
+funzione di non dereferenziare i collegamenti simbolici, cosa che le permette
+di riprodurre le funzionalità di \func{lutimes}.
+
+
 
 
 \section{Il controllo di accesso ai file}
@@ -3807,35 +3848,40 @@ usano la stessa sintassi, effettuata in sez.~\ref{sec:file_openat}.
 Una delle caratteristiche fondamentali di tutti i sistemi unix-like è quella
 del controllo di accesso ai file, che viene implementato per qualunque
 filesystem standard.\footnote{per standard si intende che implementa le
-  caratteristiche previste dallo standard POSIX; in Linux sono disponibili
-  anche una serie di altri filesystem, come quelli di Windows e del Mac, che
-  non supportano queste caratteristiche.} In questa sezione ne esamineremo i
-concetti essenziali e le funzioni usate per gestirne i vari aspetti.
+  caratteristiche previste dallo standard POSIX; in Linux sono utilizzabili
+  anche filesystem di altri sistemi operativi, che non supportano queste
+  caratteristiche.} In questa sezione ne esamineremo i concetti essenziali e
+le funzioni usate per gestirne i vari aspetti.
 
 
 \subsection{I permessi per l'accesso ai file}
 \label{sec:file_perm_overview}
 
-Ad ogni file Linux associa sempre l'utente che ne è proprietario (il
-cosiddetto \textit{owner}) ed un gruppo di appartenenza, secondo il meccanismo
-degli identificatori di utente e gruppo (\ids{UID} e \ids{GID}). Questi valori
-sono accessibili da programma tramite la funzione \func{stat}, e sono
-mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura
-\struct{stat} (si veda sez.~\ref{sec:file_stat}).\footnote{questo è vero solo
-  per filesystem di tipo Unix, ad esempio non è vero per il filesystem vfat di
-  Windows, che non fornisce nessun supporto per l'accesso multiutente, e per
-  il quale i permessi vengono assegnati in maniera fissa con un opzione in
-  fase di montaggio.}
+Ad ogni file Linux associa sempre, oltre ad un insieme di permessi, l'utente
+che ne è proprietario (il cosiddetto \textit{owner}) ed un gruppo di
+appartenenza, indicati dagli identificatori di utente e gruppo (\ids{UID} e
+\ids{GID}) di cui abbiamo già parlato in
+sez.~\ref{sec:proc_access_id}.\footnote{questo è vero solo per filesystem di
+  tipo Unix, ad esempio non è vero per il filesystem VFAT di Windows, che non
+  fornisce nessun supporto per l'accesso multiutente, e per il quale queste
+  proprietà vengono assegnate in maniera fissa con opportune opzioni di
+  montaggio.}  Anche questi sono mantenuti \index{itinode} sull'\textit{inode}
+insieme alle altre proprietà e sono accessibili da programma tramite la
+funzione \func{stat} (trattata in sez.~\ref{sec:file_stat}), che restituisce
+l'utente proprietario nel campo \var{st\_uid} ed il gruppo proprietario nel
+campo \var{st\_gid} della omonima struttura \struct{stat}.
 
 Il controllo di accesso ai file segue un modello abbastanza semplice che
 prevede tre permessi fondamentali strutturati su tre livelli di accesso.
-Esistono varie estensioni a questo modello,\footnote{come le \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 \itindex{Mandatory~Access~Control~(MAC)}
+  \textit{mandatory access control} di SE-Linux e delle altre estesioni come
+  \textit{Smack} o.} ma nella maggior parte dei casi il meccanismo standard è
+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}).
@@ -3869,23 +3915,24 @@ I restanti tre bit (noti come \itindex{suid~bit} \textit{suid bit},
 \itindex{sgid~bit} \textit{sgid bit}, e \itindex{sticky~bit} \textit{sticky
   bit}) sono usati per indicare alcune caratteristiche più complesse del
 meccanismo del controllo di accesso su cui torneremo in seguito (in
-sez.~\ref{sec:file_special_perm}); lo schema di allocazione dei bit è
-riportato in fig.~\ref{fig:file_perm_bit}.
-
-Anche i permessi, come tutte le altre informazioni pertinenti al file, sono
-memorizzati \itindex{inode} nell'\textit{inode}; in particolare essi sono
-contenuti in alcuni bit del campo \var{st\_mode} della struttura \struct{stat}
+sez.~\ref{sec:file_special_perm}), lo schema di allocazione dei bit è
+riportato in fig.~\ref{fig:file_perm_bit}.  Come tutte le altre proprietà di
+una file anche i permessi sono memorizzati \itindex{inode}
+nell'\textit{inode}, e come accennato in sez.~\ref{sec:file_types} essi sono
+contenuti in una parte del campo \var{st\_mode} della struttura \struct{stat}
 (si veda di nuovo fig.~\ref{fig:file_stat_struct}).
 
 In genere ci si riferisce ai tre livelli dei privilegi usando le lettere
-\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 a
+suo tempo nel VMS, si parla dei permessi base come di permessi per
+\textit{owner}, \textit{group} ed \textit{all}, le cui iniziali possono dar
+luogo a confusione.  Le costanti che permettono di accedere al valore numerico
+di questi bit nel campo \var{st\_mode}, già viste in
+tab.~\ref{tab:file_mode_flags}, sono riportate per chiarezza in
+tab.~\ref{tab:file_bit_perm}.
 
 \begin{table}[htb]
   \centering
@@ -3922,18 +3969,18 @@ La prima regola è che per poter accedere ad un file attraverso il suo
 \textit{pathname} occorre il permesso di esecuzione in ciascuna delle
 directory che compongono il \textit{pathname}; lo stesso vale per aprire un
 file nella directory corrente (per la quale appunto serve il diritto di
-esecuzione).
-
-Per una directory infatti il permesso di esecuzione significa che essa può
-essere attraversata nella risoluzione del \textit{pathname}, ed è distinto dal
-permesso di lettura che invece implica che si può leggere il contenuto della
-directory.
+esecuzione). Per una directory infatti il permesso di esecuzione significa che
+essa può essere attraversata nella risoluzione del \textit{pathname}, e per
+questo viene anche chiamato permesso di attraversamento. Esso è sempre
+distinto dal permesso di lettura che invece implica che si può leggere il
+contenuto della directory.
 
 Questo significa che se si ha il permesso di esecuzione senza permesso di
-lettura si potrà lo stesso aprire un file in una directory (se si hanno i
-permessi opportuni per il medesimo) ma non si potrà vederlo con \cmd{ls}
-(mentre per crearlo occorrerà anche il permesso di scrittura per la
-directory).
+lettura si potrà lo stesso aprire un file all'interno di una una directory (se
+si hanno i permessi adeguati per il medesimo) ma non si potrà vederlo con
+\cmd{ls} mancando il permesso di leggere il contenuto della directory. Per
+crearlo o rinominarlo o cancellarlo invece occorrerà avere anche il permesso
+di scrittura per la directory.
 
 Avere il permesso di lettura per un file consente di aprirlo con le opzioni
 (si veda quanto riportato in tab.~\ref{tab:file_open_flags}) di sola lettura o
@@ -3945,14 +3992,15 @@ Non si può creare un file fintanto che non si disponga del permesso di
 esecuzione e di quello di scrittura per la directory di destinazione; gli
 stessi permessi occorrono per cancellare un file da una directory (si ricordi
 che questo non implica necessariamente la rimozione del contenuto del file dal
-disco), non è necessario nessun tipo di permesso per il file stesso (infatti
-esso non viene toccato, viene solo modificato il contenuto della directory,
-rimuovendo la voce che ad esso fa riferimento).
+disco). Per la cancellazione non è necessario nessun tipo di permesso per il
+file stesso dato che, come illustrato in sez.~\ref{sec:link_symlink_rename}
+esso non viene toccato, nella cancellazione viene solo modificato il contenuto
+della directory, rimuovendo la voce che ad esso fa riferimento.
 
 Per poter eseguire un file (che sia un programma compilato od uno script di
-shell, od un altro tipo di file eseguibile riconosciuto dal kernel), occorre
-avere il permesso di esecuzione, inoltre solo i file regolari possono essere
-eseguiti.
+shell, od un altro tipo di file eseguibile riconosciuto dal kernel), occorre,
+oltre al permesso di lettura per accedere al contenuto, avere anche il
+permesso di esecuzione. Inoltre solo i file regolari possono essere eseguiti.
 
 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
@@ -3982,7 +4030,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
@@ -3991,22 +4039,22 @@ di accesso sono i seguenti:
   proprietario del file (nel qual caso si dice che il processo è proprietario
   del file) allora:
   \begin{itemize*}
-  \item se il relativo\footnote{per relativo si intende il bit di user-read se
-      il processo vuole accedere in lettura, quello di user-write per
-      l'accesso in scrittura, ecc.} bit dei permessi d'accesso dell'utente è
-    impostato, l'accesso è consentito
-  \item altrimenti l'accesso è negato
+  \item se il relativo\footnote{per relativo si intende il bit di
+      \textit{user-read} se il processo vuole accedere in lettura, quello di
+      \textit{user-write} per l'accesso in scrittura, ecc.} bit dei permessi
+    d'accesso dell'utente è impostato, l'accesso è consentito;
+  \item altrimenti l'accesso è negato.
   \end{itemize*}
 \item Se il \ids{GID} effettivo del processo o uno dei \ids{GID} supplementari
   dei processi corrispondono al \ids{GID} del file allora:
   \begin{itemize*}
   \item se il bit dei permessi d'accesso del gruppo è impostato, l'accesso è
-    consentito
-  \item altrimenti l'accesso è negato
+    consentito;
+  \item altrimenti l'accesso è negato.
   \end{itemize*}
 \item Se il bit dei permessi d'accesso per tutti gli altri è impostato,
   l'accesso è consentito, altrimenti l'accesso è negato.
-\end{enumerate}
+\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,
@@ -4015,6 +4063,38 @@ permessi per il gruppo non vengono neanche controllati. Lo stesso vale se il
 processo appartiene ad un gruppo appropriato, in questo caso i permessi per
 tutti gli altri non vengono controllati.
 
+\itindbeg{file~attributes}
+A questi che sono i permessi ordinari si aggiungono, per i filesystem che
+supportano questa estensione, due permessi speciali mantenuti nei cosiddetti
+\textit{file attributes}, che si possono leggere ed impostare con i comandi
+\cmd{lsattr} e \cmd{chattr}.\footnote{per l'utilizzo di questo comando e le
+  spiegazioni riguardo gli altri \textit{file attributes} si rimanda alla
+  sezione 1.4.4 di \cite{AGL}.} 
+
+Il primo è il cosiddetto attributo di immutabilità (\textit{immutable},
+identificato dalla lettera \texttt{i}) che impedisce ogni modifica al file,
+\textit{inode} compreso. Questo significa non solo che non se ne può cambiare
+il contenuto, ma neanche nessuno dei metadati, ed in particolare non si può
+cancellare, rinominare, modificare nei permessi o nei tempi, o creare
+\textit{hard link} verso di esso.
+
+Il secondo è il cosiddetto attributo di \textit{append-only}, (identificato
+dalla lettera \texttt{a}) che consente soltanto la scrittura del file in coda
+al file. Il file cioè può essere soltanto esteso, ma i suoi metadati, a parte
+i tempi che può però possono essere impostati al valore corrente, non possono
+essere modificati, quindi di nuovo non si potrà cancellare, rinominare, o
+modificare nei permessi.
+
+Entrambi questi attributi attivano queste proprietà a livello di filesytem,
+per cui a differenza dei permessi ordinari esse varranno per qualunque utente
+compreso l'amministratore. L'amministratore è l'unico che può attivare o
+disattivare questi attributi,\footnote{più precisamente un processo con la
+  \itindex{capabilities} capacità \const{CAP\_LINUX\_IMMUTABLE}.} e potendo
+rimuoverli è comunque capace di tornare in grado di eseguire qualunque
+operazione.
+\itindbeg{file~attributes}
+
+
 
 \subsection{I bit dei permessi speciali}
 \label{sec:file_special_perm}
@@ -4146,14 +4226,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
@@ -4162,8 +4243,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
@@ -4218,27 +4300,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
@@ -4358,22 +4445,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.} 
+}
+
+{La funzione ritorna ritorna il precedente valore della maschera, non sono
+  previste condizioni di errore.}
+\end{funcproto}
 
-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 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} 
 
@@ -4429,30 +4519,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
@@ -4790,24 +4881,22 @@ Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni,
 \funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che consentono
 rispettivamente di richiedere gli attributi relativi a un file, a un
 collegamento simbolico e ad un file descriptor; i rispettivi prototipi sono:
-\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)} 
 
-  \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}
@@ -4815,9 +4904,10 @@ collegamento 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
@@ -4851,23 +4941,21 @@ Un secondo gruppo di funzioni è quello che consente di impostare il valore di
 un attributo esteso, queste sono \funcd{setxattr}, \funcd{lsetxattr} e
 \funcd{fsetxattr}, e consentono di operare rispettivamente su un file, su un
 collegamento simbolico o specificando un file descriptor; i loro prototipi sono:
-\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)}
-
-  \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.
@@ -4876,11 +4964,10 @@ collegamento 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
@@ -4904,32 +4991,29 @@ 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 collegamento simbolico o specificando un file descriptor, da
@@ -4951,29 +5035,27 @@ 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 collegamento simbolico o
@@ -6665,8 +6747,9 @@ opportuno dettagliare maggiormente.
                               2.4).\\ 
     \const{CAP\_LINUX\_IMMUTABLE}& La capacità di impostare sui file gli
                               attributi \textit{immutable} e
-                              \itindex{append~mode} \textit{append only} (se
-                              supportati).\\
+                              \itindex{append~mode} \textit{append-only} (vedi
+                              sez.~\ref{sec:file_perm_overview}) se
+                              supportati.\\
     \const{CAP\_MKNOD}      & La capacità di creare
                               \index{file!di~dispositivo} file di dispositivo
                               con \func{mknod} (vedi
@@ -7505,7 +7588,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
 
@@ -7583,9 +7665,9 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  subtree SILENT log unbindable BUSY EAGAIN EXPIRE DETACH NOFOLLOW
 % LocalWords:  lazy encfs sshfs setfsent getfsent getfsfile getfsspec endfsent
 % LocalWords:  setmntent getmntent addmntent endmntent hasmntopt such offsetof
+% LocalWords:  member scan attack EOVERFLOW BITS blkcnt rdev
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
-% LocalWords:  member scan attack EOVERFLOW BITS blkcnt rdev