Aggiornamento al 2010 delle note di copyright
[gapil.git] / filedir.tex
index 7c9beee7b8d4bc6fbfed0ddcee71f2a975d418b8..b1f8e7615086434a0acb31c9ba9073c20c879594 100644 (file)
@@ -1,6 +1,6 @@
 %% filedir.tex
 %%
-%% Copyright (C) 2000-2009 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2010 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -613,12 +613,14 @@ file nella directory.
 \subsection{La creazione di file speciali}
 \label{sec:file_mknod}
 
+\index{file!di~dispositivo|(} 
+
 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 \index{file!di~dispositivo} 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}).
+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
@@ -672,15 +674,15 @@ o \const{S\_IFBLK} o \const{S\_IFCHR}), il valore di \param{dev} dovr
 usato per indicare a quale dispositivo si fa riferimento, altrimenti il suo
 valore verrà ignorato.  Solo l'amministratore può creare un file di
 dispositivo usando questa funzione (il processo deve avere la
-\textit{capability} \const{CAP\_MKNOD}), ma in Linux\footnote{questo è un
-  comportamento specifico di Linux, la funzione non è prevista dallo standard
-  POSIX.1 originale, mentre è presente in SVr4 e 4.4BSD, ma esistono
-  differenze nei comportamenti e nei codici di errore, tanto che questa è
-  stata introdotta in POSIX.1-2001 con una nota che la definisce portabile
-  solo quando viene usata per creare delle fifo, ma comunque deprecata essendo
-  utilizzabile a tale scopo la specifica \func{mkfifo}.} l'uso per la
-creazione di un file ordinario, di una fifo o di un socket è consentito anche
-agli utenti normali.
+\itindex{capabilities} \textit{capability} \const{CAP\_MKNOD}), ma in
+Linux\footnote{questo è un comportamento specifico di Linux, la funzione non è
+  prevista dallo standard POSIX.1 originale, mentre è presente in SVr4 e
+  4.4BSD, ma esistono differenze nei comportamenti e nei codici di errore,
+  tanto che questa è stata introdotta in POSIX.1-2001 con una nota che la
+  definisce portabile solo quando viene usata per creare delle fifo, ma
+  comunque deprecata essendo utilizzabile a tale scopo la specifica
+  \func{mkfifo}.} l'uso per la creazione di un file ordinario, di una fifo o
+di un socket è consentito anche agli utenti normali.
 
 I nuovi \itindex{inode} \textit{inode} creati con \func{mknod} apparterranno
 al proprietario e al gruppo del processo che li ha creati, a meno che non si
@@ -747,6 +749,8 @@ relativo identificativo con la macro \macro{makedev}:
   \textit{major number} e \itindex{minor~number} \textit{minor number}.
 \end{functions}
 
+\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 è:
@@ -1676,9 +1680,10 @@ 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 \textit{holes} (letteralmente
-\textsl{buchi}) che si formano tutte le volte che si va a scrivere su un file
-dopo aver eseguito una \func{lseek} (vedi sez.~\ref{sec:file_lseek}) oltre la
+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 una \func{lseek}
+(tratteremo in dettaglio l'argomento in sez.~\ref{sec:file_lseek}) oltre la
 sua fine.
 
 In questo caso si avranno risultati differenti a seconda del modo in cui si
@@ -1728,9 +1733,9 @@ dimensione si possono usare le due funzioni \funcd{truncate} e
 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; in quest'ultimo caso lo spazio viene riempito con
-zeri (e in genere si ha la creazione di un \textit{hole} nel file).
-
+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.
 
 \subsection{I tempi dei file}
 \label{sec:file_file_times}
@@ -1741,7 +1746,9 @@ 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 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.
+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}.
 
 \begin{table}[htb]
   \centering
@@ -1801,14 +1808,14 @@ maggior parte dei casi non interessa, 
 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'aggiornamnto soltanto se il tempo di ultimo accesso è precedente al tempo di
-ultima modifica o cambiamneto, così da rendere evidente che vi è stato un
+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 riottere il vecchio
+specificata esplicitamente.\footnote{si può comunque riottenere il vecchio
   comportamento usando la opzione di montaggio \texttt{strictatime}.}
 
 L'effetto delle varie funzioni di manipolazione dei file sui relativi tempi è
@@ -1915,19 +1922,20 @@ avr
 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)} 
+  {int utime(const char *filename, struct utimbuf *times)} 
 
-Cambia i tempi di ultimo accesso e modifica \itindex{inode}
-dell'\textit{inode} specificato da \param{filename} secondo i campi
-\var{actime} e \var{modtime} di \param{times}. Se questa è \val{NULL} allora
-viene usato il tempo corrente.
+  Cambia i tempi di ultimo accesso e modifica \itindex{inode}
+  dell'\textit{inode} specificato da \param{filename} secondo i valori dei
+  campi \var{actime} e \var{modtime} di \param{times}. Se questa è \val{NULL}
+  allora viene usato il tempo corrente.
 
-\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{ENOENT}] \param{filename} non esiste.
-  \end{errlist}}
+  \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}
 
 La funzione prende come argomento \param{times} una struttura
@@ -1958,9 +1966,9 @@ 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
-file di dispositivo, scrivendo direttamente sul disco senza passare attraverso
-il filesystem, ma ovviamente in questo modo la cosa è molto più complicata da
-realizzare.
+\index{file!di~dispositivo} file di dispositivo, scrivendo direttamente sul
+disco senza passare attraverso il filesystem, ma ovviamente in questo modo la
+cosa è molto più complicata da realizzare.
 
 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
@@ -1976,25 +1984,144 @@ 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
 precisione; il suo prototipo è:
-\begin{prototype}{utime.h}
-{int utimes(const char *filename, struct timeval times[2])} 
+\begin{prototype}
+  {sys/time.h}
+  {int utimes(const char *filename, struct timeval times[2])} 
+
+  Cambia i tempi di ultimo accesso e modifica \itindex{inode}
+  dell'\textit{inode} specificato da \param{filename} secondo i valori
+  specificati da \param{times}. Se questo è \val{NULL} allora viene usato il
+  tempo corrente.
+
+  \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}
 
-Cambia i tempi di ultimo accesso e modifica \itindex{inode}
-dell'\textit{inode} specificato da \param{filename} secondo i valori
-specificati da \param{times}. Se questo è \val{NULL} allora viene usato il
-tempo corrente.
+La funzione è del tutto analoga alla precedente \func{utime} ma usa come
+argomento \param{times}, un vettore di due strutture \struct{timeval}, la cui
+definizione è riportata in fig.~\ref{fig:sys_timeval_struct}, che consentono
+di indicare i tempi con una precisione del microsecondo. Il primo elemento
+di \param{times} indica il valore per il tempo di ultimo accesso, il secondo
+quello per il tempo di ultima modifica.
 
-\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{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/timeval.h}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \structd{timeval} usata per indicare valori di tempo
+    con la precisione del microsecondo.}
+  \label{fig:sys_timeval_struct}
+\end{figure}
+
+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
+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{errlist}
-  \item[\errcode{EACCES}] non si ha il permesso di scrittura sul file.
-  \item[\errcode{ENOENT}] \param{filename} non esiste.
+  \item[\errcode{EBADF}] \param{fd}  non è un file descriptor.
+  \item[\errcode{ENOSYS}] il filesystem \texttt{/proc} non è accessibile.
   \end{errlist}}
-\end{prototype}
+\end{functions}
 
-La funzione usa 
+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 (tratteremo in dettaglio l'argomento in
+sez.~\ref{cha:file_unix_interface}) 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.
+
+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{errlist}
+  \item[\errcode{EBADF}] \param{fd}  non è un file descriptor.
+  \item[\errcode{ENOSYS}] il filesystem \texttt{/proc} non è accessibile.
+  \end{errlist}}
+\end{functions}
+
+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}.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/timespec.h}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \structd{timespec} usata per indicare valori di tempo
+    con la precisione del nanosecondo.}
+  \label{fig:sys_timespec_struct}
+\end{figure}
 
-%TODO documentare utimes
+Come per le precedenti funzioni il primo elemento di \param{times} indica il
+tempo di ultimo accesso ed il secondo quello di ultima modifica, e se si usa
+il valore \const{NULL} verrà impostato il tempo corrente sia per l'ultimo
+accesso che per l'ultima modifica. Nei singoli elementi di \param{times} si
+possono inoltre utilizzare due valori speciali per il campo \var{tv\_nsec}:
+con \const{UTIME\_NOW} si richiede l'uso del tempo corrente, mentre con
+\const{UTIME\_OMIT} si richiede di non impostare il tempo. Si può così
+aggiornare in maniera specifica soltanto uno fra il tempo di ultimo accesso e
+quello di ultima modifica. Quando si usa uno di questi valori speciali per
+\var{tv\_nsec} il corrispondente valore di \var{tv\_sec} viene ignorato.
+
+Queste due funzioni sono una estensione definita in una recente revisione
+dello standard POSIX (la POSIX.1-2008); sono state introdotte a partire dal
+kernel 2.6.22, e supportate dalle \acr{glibc} a partire dalla versione
+2.6.\footnote{in precedenza, a partire dal kernel 2.6.16, era stata introdotta
+  la funzione \func{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},\footnote{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}.}  consente una indicazione sicura dei
+\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.
 
 
 \section{Il controllo di accesso ai file}
@@ -2520,7 +2647,7 @@ Per alcuni filesystem\footnote{i filesystem pi
 a scongiurare l'abuso dei \itindex{suid~bit} bit \acr{suid} e \acr{sgid}; essa
 consiste nel cancellare automaticamente questi bit dai permessi di un file
 qualora un processo che non appartenga all'amministratore\footnote{per la
-  precisione un processo che non dispone della capability
+  precisione un processo che non dispone della \itindex{capabilities} capacità
   \const{CAP\_FSETID}.} effettui una scrittura. In questo modo anche se un
 utente malizioso scopre un file \acr{suid} su cui può scrivere, un'eventuale
 modifica comporterà la perdita di questo privilegio.
@@ -2602,16 +2729,28 @@ automaticamente propagato, restando coerente a quello della directory di
 partenza, in tutte le sotto-directory. 
 
 La semantica SVr4 offre la possibilità di scegliere, ma per ottenere lo stesso
-risultato di coerenza che si ha con BSD necessita che per le nuove directory
-venga anche propagato anche il bit \acr{sgid}. Questo è il comportamento
-predefinito del comando \cmd{mkdir}, ed è in questo modo ad esempio che Debian
-assicura che le sotto-directory create nella home di un utente restino sempre
-con il \acr{gid} del gruppo primario dello stesso.
-
-Come per i permessi, il sistema fornisce anche delle funzioni che permettano
-di cambiare utente e gruppo cui il file appartiene; le funzioni in questione
-sono tre: \funcd{chown}, \funcd{fchown} e \funcd{lchown}, ed i loro prototipi
-sono:
+risultato di coerenza che si ha con BSD necessita che quando si creano nuove
+directory venga anche propagato anche il bit \acr{sgid}. Questo è il
+comportamento predefinito del comando \cmd{mkdir}, ed è in questo modo ad
+esempio che le varie distribuzioni assicurano che le sotto-directory create
+nella home di un utente restino sempre con il \acr{gid} del gruppo primario
+dello stesso.
+
+La presenza del bit \acr{sgid} è inoltre molto comoda quando si hanno
+directory contenenti file condivisi all'intero di un gruppo in cui possono
+scrivere tutti i membri dello stesso, dato che assicura che i file che gli
+utenti vi creano appartengano sempre allo stesso gruppo. Questo non risolve
+però completamente i problemi di accesso da parte di altri utenti dello stesso
+gruppo, in quanto i permessi assegnati al gruppo potrebbero non essere
+sufficienti; in tal caso si deve aver cura di usare un valore di
+\itindex{umask} \textit{umask} che ne lasci di sufficienti.\footnote{in tal
+  caso si può assegnare agli utenti del gruppo una \textit{umask} di $002$,
+  anche se la soluzione migliore in questo caso è usare una ACL di default
+  (vedi sez.~\ref{sec:file_ACL}).}
+
+Come avviene nel caso dei permessi il sistema fornisce anche delle funzioni,
+\funcd{chown}, \funcd{fchown} e \funcd{lchown}, che permettono di cambiare sia
+l'utente che il gruppo a cui un file appartiene; i rispettivi prototipi sono:
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{sys/stat.h} 
@@ -2623,8 +2762,8 @@ sono:
   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 zero in caso di successo e -1 per
-    un errore, in caso di errore \var{errno} può assumere i valori:
+  \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 per un
+    errore, nel qual caso caso \var{errno} assumerà i valori:
   \begin{errlist}
   \item[\errcode{EPERM}] l'user-ID effettivo non corrisponde a quello del
     proprietario del file o non è zero, o utente e gruppo non sono validi
@@ -2635,13 +2774,14 @@ sono:
   \errval{EACCES}, \errval{ELOOP}; \func{fchown} anche \errval{EBADF}.}
 \end{functions}
 
-In Linux soltanto l'amministratore (in sostanza un processo con la
-\itindex{capabilities} capability \const{CAP\_CHOWN}) può cambiare il
-proprietario di un file, seguendo la semantica di BSD che non consente agli
-utenti di assegnare i loro file ad altri (per evitare eventuali aggiramenti
-delle quote).  L'amministratore può cambiare il gruppo di un file, il
-proprietario può cambiare il gruppo dei file che gli appartengono solo se il
-nuovo gruppo è il suo gruppo primario o uno dei gruppi di cui fa parte.
+Con Linux solo l'amministratore\footnote{o in generale un processo con la
+  \itindex{capabilities} capacità \const{CAP\_CHOWN}, vedi
+  sez.~\ref{sec:proc_capabilities}.} può cambiare il proprietario di un file;
+in questo viene seguita la semantica usata da BSD che non consente agli utenti
+di assegnare i loro file ad altri utenti evitando eventuali aggiramenti delle
+quote.  L'amministratore può cambiare sempre il gruppo di un file, il
+proprietario può cambiare il gruppo solo dei file che gli appartengono e solo
+se il nuovo gruppo è il suo gruppo primario o uno dei gruppi di cui fa parte.
 
 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
@@ -2658,24 +2798,18 @@ privilegi di root entrambi i bit \itindex{suid~bit} \acr{suid} e
 \itindex{sgid~bit} \acr{sgid} vengono cancellati. Questo non avviene per il
 bit \acr{sgid} nel caso in cui esso sia usato (in assenza del corrispondente
 permesso di esecuzione) per indicare che per il file è attivo il
-\itindex{mandatory~locking} \textit{mandatory locking}.
+\itindex{mandatory~locking} \textit{mandatory locking} (vedi
+sez.~\ref{sec:file_mand_locking}).
 
 
 \subsection{Un quadro d'insieme sui permessi}
 \label{sec:file_riepilogo}
 
-Avendo affrontato in maniera separata il comportamento delle varie funzioni ed
-il significato dei singoli bit dei permessi sui file, vale la pena fare un
-riepilogo in cui si riassumono le caratteristiche di ciascuno di essi, in modo
-da poter fornire un quadro d'insieme.
-
-In tab.~\ref{tab:file_fileperm_bits} si sono riassunti gli effetti dei vari
-bit dei permessi per un file; per quanto riguarda l'applicazione dei permessi
-per proprietario, gruppo ed altri si ricordi quanto illustrato in
-sez.~\ref{sec:file_perm_overview}.  Per compattezza, nella tabelle si sono
-specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit}
-\textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la notazione
-illustrata anche in fig.~\ref{fig:file_perm_bit}.
+Avendo affrontato in maniera separata il comportamento delle varie funzioni
+che operano sui permessi dei file ed avendo trattato in sezioni diverse il
+significato dei singoli bit dei permessi, vale la pena di fare un riepilogo in
+cui si riassumano le caratteristiche di ciascuno di essi, in modo da poter
+fornire un quadro d'insieme.
 
 \begin{table}[!htb]
   \centering
@@ -2686,7 +2820,7 @@ illustrata anche in fig.~\ref{fig:file_perm_bit}.
     \multicolumn{3}{|c|}{user}&
     \multicolumn{3}{|c|}{group}&
     \multicolumn{3}{|c|}{other}&
-    \multirow{2}{*}{\textbf{Operazioni possibili}} \\
+    \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& \\
     \hline
@@ -2706,28 +2840,12 @@ illustrata anche in fig.~\ref{fig:file_perm_bit}.
    -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri.\\
    -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri.\\
     \hline
-  \end{tabular}
-  \caption{Tabella riassuntiva del significato dei bit dei permessi per un
-    file.} 
-  \label{tab:file_fileperm_bits}
-\end{table}
-
-In tab.~\ref{tab:file_dirperm_bits} si sono invece riassunti gli effetti dei
-vari bit dei permessi per una directory; anche in questo caso si sono
-specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit}
-\textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la notazione compatta
-illustrata in fig.~\ref{fig:file_perm_bit}.
-
-\begin{table}[!htb]
-  \centering
-  \footnotesize
-  \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|}
     \hline
     \multicolumn{3}{|c|}{special}&
     \multicolumn{3}{|c|}{user}&
     \multicolumn{3}{|c|}{group}&
     \multicolumn{3}{|c|}{other}&
-    \multirow{2}{*}{\textbf{Operazioni possibili}} \\
+    \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& \\
     \hline
@@ -2751,20 +2869,37 @@ illustrata in fig.~\ref{fig:file_perm_bit}.
     -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri.\\
     \hline
   \end{tabular}
-  \caption{Tabella riassuntiva del significato dei bit dei permessi per una
-    directory.} 
-  \label{tab:file_dirperm_bits}
+  \caption{Tabella riassuntiva del significato dei bit dei permessi per un
+    file e directory.} 
+  \label{tab:file_fileperm_bits}
 \end{table}
 
-Nelle tabelle si è indicato con il carattere ``-'' il fatto che il valore del
+Nella parte superiore di tab.~\ref{tab:file_fileperm_bits} si è riassunto il
+significato dei vari bit dei permessi per un file ordinario; per quanto
+riguarda l'applicazione dei permessi per proprietario, gruppo ed altri si
+ricordi quanto illustrato in sez.~\ref{sec:file_perm_overview}.  Per
+compattezza, nella tabella si sono specificati i bit di \itindex{suid~bit}
+\textit{suid}, \itindex{sgid~bit} \textit{sgid} e \textit{sticky}
+\itindex{sticky~bit} con la notazione illustrata anche in
+fig.~\ref{fig:file_perm_bit}.  Nella parte inferiore si sono invece riassunti
+i significati dei vari bit dei permessi per una directory; anche in questo
+caso si è riapplicato ai bit di \itindex{suid~bit} \textit{suid},
+\itindex{sgid~bit} \textit{sgid} e \textit{sticky} \itindex{sticky~bit} la
+notazione illustrata in fig.~\ref{fig:file_perm_bit}.
+
+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.
+
+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
-tabella; la descrizione dell'operazione fa riferimento soltanto alla
+tabella; la descrizione del significato fa riferimento soltanto alla
 combinazione di bit per i quali è stato riportato esplicitamente un valore.
 Si rammenti infine che il valore dei bit dei permessi non ha alcun effetto
 qualora il processo possieda i privilegi di amministratore.
 
 
-
 \section{Caratteristiche e funzionalità avanzate}
 \label{sec:file_dir_advances}
 
@@ -2810,29 +2945,107 @@ molto pi
 situazione di \textsl{tutto o nulla}.
 
 Il meccanismo completo delle \textit{capabilities}\footnote{l'implementazione
-  di Linux si rifà ad una bozza per quello che dovrebbe divenire lo standard
-  POSIX.1e, che prevede questa funzionalità.} prevederebbe anche la
-possibilità di associare le stesse \textit{capabilities} anche ai singoli file
-eseguibili,\footnote{una descrizione sommaria di questa funzionalità è
-  riportata nella pagina di manuale che descrive l'implementazione delle
-  \textit{capabilities} con Linux (accessibile con \texttt{man capabilities}),
-  ma non essendo implementata non ne tratteremo qui.} in modo da poter
-stabilire quali capacità possono essere utilizzate quando viene messo in
-esecuzione uno specifico programma; attualmente però questa funzionalità non è
-implementata.\footnote{per attualmente si intende fino al kernel 2.6.23;
-  benché l'infrastruttura per crearla sia presente (vedi anche
-  sez.~\ref{sec:file_xattr}) finora non è disponibile nessuna realizzazione
-  delle specifiche POSIX.1e, esistono però dei patch di sicurezza del kernel,
-  come LIDS (vedi \href{http://www.lids.org}{\textsf{http://www.lids.org/})}
-  che realizzano qualcosa di simile.}
+  si rifà ad una bozza di quello che doveva diventare lo standard POSIX.1e,
+  ormai abbandonato.} prevede inoltre la possibilità di associare le stesse ai
+singoli file eseguibili, in modo da poter stabilire quali capacità possono
+essere utilizzate quando viene messo in esecuzione uno specifico programma; ma
+il supporto per questa funzionalità è stato introdotto soltanto a partire dal
+kernel 2.6.24; fino ad allora doveva essere il programma stesso ad eseguire
+una riduzione esplicita delle sue capacità, cosa che ha reso l'uso di questa
+funzionalità poco diffuso, vista la presenza di meccanismi alternativi come
+\index{SELinux} SELinux.
+
+Per gestire questo meccanismo ciascun processo porta con sé tre distinti
+insiemi di \textit{capabilities}, che vengono denominati rispettivamente
+\textit{effective}, \textit{permitted} ed \textit{inherited}. Questi insiemi
+vengono mantenuti in forma di tre diverse maschere binarie,\footnote{il kernel
+  li mantiene, come i vari identificatori di sez.~\ref{sec:proc_setuid},
+  all'interno della \struct{task\_struct} di ciascun processo (vedi
+  fig.~\ref{fig:proc_task_struct}), nei tre campi \texttt{cap\_effective},
+  \texttt{cap\_inheritable}, \texttt{cap\_permitted} del tipo
+  \texttt{kernel\_cap\_t}; questo è attualmente definito come intero a 32 bit,
+  il che comporta un massimo di 32 \textit{capabilities} distinte.} in cui
+ciascun bit corrisponde ad una capacità diversa.
+
+L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile
+per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui
+sono mantenuti i diversi insiemi di identificatori di
+sez.~\ref{sec:proc_setuid}; il loro significato è il seguente:
+\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}}
+\item[\textit{effective}] l'insieme delle \textit{capabilities}
+  ``\textsl{effettive}'', cioè di quelle che vengono effettivamente usate dal
+  kernel quando deve eseguire il controllo di accesso per le varie operazioni
+  compiute dal processo.
+\item[\textit{permitted}] l'insieme delle \textit{capabilities}
+  ``\textsl{permesse}'', cioè l'insieme di quelle capacità che un processo
+  \textsl{può} impostare come \textsl{effettive}. Se un processo cancella una
+  capacità da questo insieme non potrà più riassumerla (almeno che non esegua
+  un programma che è \acr{suid} di root).
+\item[\textit{inherited}] l'insieme delle \textit{capabilities}
+  ``\textsl{ereditabili}'', cioè quelle che vengono trasmesse ad un nuovo
+  programma eseguito attraverso una chiamata ad \func{exec} (con l'eccezione
+  del caso che questo sia \acr{suid} di root).
+\label{sec:capabilities_set}
+\end{basedescript}
+
+Oltre a questi tre insiemi, che sono relativi al singolo processo, il kernel
+mantiene un insieme generale valido per tutto il sistema, chiamato
+\itindex{capabilities~bounding~set} \textit{capabilities bounding set}. Ogni
+volta che un programma viene posto in esecuzione con \func{exec} il contenuto
+degli insiemi \textit{effective} e \textit{permitted} vengono mascherati con
+un \textsl{AND} binario del contenuto corrente del \textit{capabilities
+  bounding set}, così che il nuovo processo potrà disporre soltanto delle
+capacità in esso elencate.
+
+Il \textit{capabilities bounding set} è un parametro di sistema, accessibile
+attraverso il contenuto del file \procfile{/proc/sys/kernel/cap-bound}, che per
+questa sua caratteristica consente di impostare un limite generale alle
+capacità che possono essere accordate ai vari processi.  Questo valore può
+essere impostato ad un valore arbitrario esclusivamente dal primo processo
+eseguito nel sistema (di norma cioè da \texttt{/sbin/init}), ogni processo
+eseguito successivamente (cioè con \textsl{pid} diverso da 1) anche se
+eseguito con privilegi di amministratore potrà soltanto rimuovere uno dei bit
+già presenti dell'insieme: questo significa che una volta rimossa una
+\textit{capability} dal \textit{capabilities bounding set} essa non sarà più
+disponibile, neanche per l'amministratore, a meno di un riavvio.
+
+Quando un programma viene messo in esecuzione\footnote{cioè quando viene
+  eseguita la \func{execve} con cui lo si lancia; in corrispondenza di una
+  \func{fork} le \textit{capabilities} non vengono modificate.} esso eredita
+(nel senso che assume negli insiemi \textit{effective} e \textit{permitted})
+le \textit{capabilities} mantenute nell'insieme \textit{inherited}, a meno che
+non sia eseguito un programma \acr{suid} di root o la \func{exec} sia stata
+eseguita da un programma con \textsl{uid} reale zero; in tal caso il programma
+ottiene tutte le \textit{capabilities} presenti nel \textit{capabilities
+  bounding set}. In questo modo si può far si che ad un processo eseguito in
+un secondo tempo possano essere trasmesse solo un insieme limitato di
+capacità, impedendogli di recuperare quelle assenti nell'insieme
+\textit{inherited}. Si tenga presente invece che attraverso una \func{fork}
+vengono mantenute le stesse capacità del processo padre.
+
 
 % TODO verificare per process capability bounding set, vedi:
 %  http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
 
-% TODO capire cosa cambia con i patch del 2.6.26, vedi
+% TODO capire cosa cambia con i patch vari, vedi
 % http://lwn.net/Articles/280279/  
-
-\begin{table}[!h!btp]
+% http://lwn.net/Articles/256519/
+% http://lwn.net/Articles/211883/
+
+
+Un elenco delle delle \textit{capabilities} disponibili su Linux, con una
+breve descrizione ed il nome delle costanti che le identificano, è riportato
+in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa
+  tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man
+    capabilities}) e dalle definizioni in \texttt{linux/capabilities.h}, è
+  aggiornato al kernel 2.6.26.} la tabella è divisa in due parti, la prima
+riporta le \textit{capabilities} previste anche nella bozza dello standard
+POSIX1.e, la seconda quelle specifiche di Linux.  Come si può notare dalla
+tabella alcune \textit{capabilities} attengono a singole funzionalità e sono
+molto specializzate, mentre altre hanno un campo di applicazione molto vasto,
+che è opportuno dettagliare maggiormente.
+
+\begin{table}[!h!bt]
   \centering
   \footnotesize
   \begin{tabular}{|l|p{12cm}|}
@@ -2843,42 +3056,27 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.23;
 %
 % POSIX-draft defined capabilities.
 %
+    \const{CAP\_AUDIT\_WRITE}&La capacità di scrivere dati nel giornale di
+                              auditing del kernel (dal kernel 2.6.11).\\ 
+    \const{CAP\_AUDIT\_CONTROL}& La capacità di abilitare e disabilitare il
+                              controllo dell'auditing (dal kernel 2.6.11).\\ 
+    % TODO verificare questa roba dell'auditing
     \const{CAP\_CHOWN}      & La capacità di cambiare proprietario e gruppo
                               proprietario di un file (vedi
                               sez.~\ref{sec:file_ownership_management}).\\
     \const{CAP\_DAC\_OVERRIDE}& La capacità di evitare il controllo dei
                               permessi di lettura, scrittura ed esecuzione dei
-                              file, (vedi sez.~\ref{sec:file_access_control})
-                              caratteristici del modello classico del
-                              controllo di accesso chiamato
-                              \itindex{Discrectionary~Access~Control~(DAC)} 
-                              \textit{Discrectionary Access Control} (da cui
-                              il nome DAC).\\  
+                              file,\footnotemark (vedi
+                              sez.~\ref{sec:file_access_control}).\\
     \const{CAP\_DAC\_READ\_SEARCH}& La capacità di evitare il controllo dei
-                              permessi di lettura, scrittura ed esecuzione per
+                              permessi di lettura ed esecuzione per
                               le directory (vedi
                               sez.~\ref{sec:file_access_control}).\\
-    \const{CAP\_FOWNER}     & La capacità di evitare il controllo che 
-                              l'user-ID effettivo del processo (o meglio il
-                              \textit{filesystem user-ID}, vedi
-                              sez.~\ref{sec:proc_setuid}) coincida con
-                              quello del proprietario di un file per tutte
+    \const{CAP\_FOWNER}     & La capacità di evitare il controllo della
+                              proprietà di un file per tutte
                               le operazioni privilegiate non coperte dalle
                               precedenti \const{CAP\_DAC\_OVERRIDE} e
-                              \const{CAP\_DAC\_READ\_SEARCH}. Queste
-                              comprendono i cambiamenti dei permessi e dei
-                              tempi del file (vedi
-                              sez.~\ref{sec:file_perm_management} e 
-                              sez.~\ref{sec:file_file_times}), le impostazioni 
-                              degli attributi estesi (con il comando 
-                              \cmd{chattr}) e delle ACL, poter ignorare lo
-                              \itindex{sticky~bit} \textit{sticky bit} nella
-                              cancellazione dei file (vedi
-                              sez.~\ref{sec:file_special_perm}), la possibilità
-                              di impostare il flag di \const{O\_NOATIME} con
-                              \func{open} e \func{fcntl} (vedi
-                              sez.~\ref{sec:file_open} e
-                              sez.~\ref{sec:file_fcntl}).\\
+                              \const{CAP\_DAC\_READ\_SEARCH}.\\
     \const{CAP\_FSETID}     & La capacità di evitare la cancellazione
                               automatica dei bit \itindex{suid~bit} \acr{suid}
                               e \itindex{sgid~bit} \acr{sgid} quando un file
@@ -2888,49 +3086,25 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.23;
                               quando questo è relativo ad un gruppo cui non si
                               appartiene (vedi
                               sez.~\ref{sec:file_perm_management}).\\ 
+    \const{CAP\_SETFCAP}    & La capacità di impostare le
+                              \textit{capabilities} di un file (dal kernel
+                              2.6.24).\\  
     \const{CAP\_KILL}       & La capacità di mandare segnali a qualunque
                               processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
     \const{CAP\_SETGID}     & La capacità di manipolare i group ID dei
                               processi, sia il principale che i supplementari,
-                              (vedi sez.~\ref{sec:proc_setgroups} che quelli
+                              (vedi sez.~\ref{sec:proc_setgroups}) che quelli
                               trasmessi tramite i socket \textit{unix domain}
                               (vedi sez.~\ref{sec:unix_socket}).\\
     \const{CAP\_SETUID}     & La capacità di manipolare gli user ID del
-                              processo (con \func{setuid}, \func{setreuid},
-                              \func{setresuid}, \func{setfsuid}) e di
-                              trasmettere un valore arbitrario
-                              dell'\textsl{uid} nel passaggio delle
-                              credenziali coi socket \textit{unix domain} (vedi
-                              sez.~\ref{sec:unix_socket}).\\ 
+                              processo (vedi sez.~\ref{sec:proc_setuid}) e di
+                              trasmettere un user ID arbitrario nel passaggio
+                              delle credenziali coi socket \textit{unix
+                                domain} (vedi sez.~\ref{sec:unix_socket}).\\ 
 %
 % Linux specific capabilities
 %
 \hline
-    \const{CAP\_SETPCAP}    & La capacità di impostare o rimuovere una capacità
-                              (limitatamente a quelle che il processo
-                              chiamante ha nel suo insieme di capacità
-                              permesse) da qualunque processo.\\
-% TODO cambiata nel 2.4.24 rc1 ? 
-    \const{CAP\_LINUX\_IMMUTABLE}& La capacità di impostare gli attributi
-                              \textit{immutable} e \itindex{append~mode}
-                              \textit{append only} per i file su un
-                              filesystem che supporta questi 
-                              attributi estesi.\\ 
-    \const{CAP\_NET\_BIND\_SERVICE}& La capacità di porre in ascolto server
-                              su porte riservate (vedi 
-                              sez.~\ref{sec:TCP_func_bind}).\\ 
-    \const{CAP\_NET\_BROADCAST}& La capacità di consentire l'uso di socket in
-                              \itindex{broadcast} \textit{broadcast} e
-                              \itindex{multicast} \textit{multicast}.\\ 
-    \const{CAP\_NET\_ADMIN} & La capacità di eseguire alcune operazioni
-                              privilegiate sulla rete (impostare le opzioni
-                              privilegiate dei socket, abilitare il
-                              \itindex{multicast} \textit{multicasting},
-                              impostare interfacce di rete e 
-                              tabella di instradamento).\\
-    \const{CAP\_NET\_RAW}   & La capacità di usare socket \texttt{RAW} e
-                              \texttt{PACKET} (quelli che permettono di creare
-                              pacchetti nei protocolli di basso livello).\\
     \const{CAP\_IPC\_LOCK}  & La capacità di effettuare il \textit{memory
                               locking} \itindex{memory~locking} con le
                               funzioni \func{mlock}, \func{mlockall},
@@ -2941,53 +3115,64 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.23;
                               per le operazioni sugli oggetti di
                               intercomunicazione fra processi (vedi
                               sez.~\ref{sec:ipc_sysv}).\\  
-    \const{CAP\_SYS\_MODULE}& La capacità di caricare e rimuovere moduli del
-                              kernel. \\ 
-    \const{CAP\_SYS\_RAWIO} & La capacità di eseguire operazioni sulle porte
-                              di I/O con \func{ioperm} e \func{iopl} (vedi
-                              sez.~\ref{sec:file_io_port}).\\
+    \const{CAP\_LEASE}      & La capacità di creare dei \textit{file lease}
+                              \index{file!lease} (vedi
+                              sez.~\ref{sec:file_asyncronous_lease})
+                              pur non essendo proprietari del file (dal kernel
+                              2.4).\\ 
+    \const{CAP\_LINUX\_IMMUTABLE}& La capacità di impostare sui file gli
+                              attributi \textit{immutable} e
+                              \itindex{append~mode} \textit{append only} (se
+                              supportati).\\
+    \const{CAP\_MKNOD}      & La capacità di creare
+                              \index{file!di~dispositivo} file di dispositivo
+                              con \func{mknod} (vedi
+                              sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\ 
+    \const{CAP\_NET\_ADMIN} & La capacità di eseguire alcune operazioni
+                              privilegiate sulla rete.\\
+    \const{CAP\_NET\_BIND\_SERVICE}& La capacità di porsi in ascolto
+                              su porte riservate (vedi
+                              sez.~\ref{sec:TCP_func_bind}).\\ 
+    \const{CAP\_NET\_BROADCAST}& La capacità di consentire l'uso di socket in
+                              \itindex{broadcast} \textit{broadcast} e
+                              \itindex{multicast} \textit{multicast}.\\ 
+    \const{CAP\_NET\_RAW}   & La capacità di usare socket \texttt{RAW} e
+                              \texttt{PACKET} (vedi sez.~\ref{sec:sock_type}).\\
+    \const{CAP\_SETPCAP}    & La capacità di impostare o rimuovere una
+                              capacità.\\ 
+    % TODO cambiata nel 2.4.24 rc1 ? 
+    \const{CAP\_SYS\_ADMIN} & La capacità di eseguire una serie di compiti
+                              amministrativi. \\
+    \const{CAP\_SYS\_BOOT}  & La capacità di fare eseguire un riavvio del
+                              sistema.\\
+% TODO trattare reboot e kexec 
     \const{CAP\_SYS\_CHROOT}& La capacità di eseguire la funzione
                               \func{chroot} (vedi
                               sez.~\ref{sec:file_chroot}).\\
-    \const{CAP\_SYS\_PTRACE}& Consente di tracciare qualunque processo con
-                              \func{ptrace} (vedi 
-                              sez.~\ref{sec:xxx_ptrace}).\\
+    \const{CAP\_MAC\_ADMIN} & La capacità amministrare il MAC di Smack (dal
+                              kernel 2.6.25).\\  
+    \const{CAP\_MAC\_OVERRIDE}& La capacità evitare il MAC di Smack (dal
+                              kernel 2.6.25).\\  
+    \const{CAP\_SYS\_MODULE}& La capacità di caricare e rimuovere moduli del
+                              kernel. \\ 
+    \const{CAP\_SYS\_NICE}  & La capacità di modificare le priorità dei
+                              processi. \\ 
     \const{CAP\_SYS\_PACCT} & La capacità di usare le funzioni di
                               \textit{accounting} dei processi (vedi
                               sez.~\ref{sec:sys_bsd_accounting}).\\ 
-    \const{CAP\_SYS\_ADMIN} & La capacità di eseguire una serie di compiti
-                              amministrativi (come impostare le quote,
-                              attivare e disattivare la swap, montare,
-                              rimontare e smontare filesystem, ecc.). \\
-    \const{CAP\_SYS\_BOOT}  & La capacità di fare eseguire un riavvio del
-                              sistema.\\
-% TODO trattare reboot e kexec 
-    \const{CAP\_SYS\_NICE}  & La capacità di modificare le priorità dei
-                              processi (vedi sez.~\ref{sec:proc_priority}). \\ 
+    \const{CAP\_SYS\_PTRACE}& La capacità  di tracciare qualunque processo con
+                              \func{ptrace} (vedi 
+                              sez.~\ref{sec:xxx_ptrace}).\\
+    \const{CAP\_SYS\_RAWIO} & La capacità di eseguire operazioni sulle porte
+                              di I/O con \func{ioperm} e \func{iopl} (vedi
+                              sez.~\ref{sec:file_io_port}).\\
     \const{CAP\_SYS\_RESOURCE}& La capacità di superare le limitazioni sulle
-                              risorse, aumentare le quote disco, usare lo
-                              spazio disco riservato all'amministratore.\\ 
+                              risorse.\\ 
     \const{CAP\_SYS\_TIME}  & La capacità di modificare il tempo di sistema
                               (vedi sez.~\ref{sec:sys_time}).\\ 
     \const{CAP\_SYS\_TTY\_CONFIG}& La capacità di simulare un \textit{hangup}
                               della console, con la funzione
                               \func{vhangup}.\\
-    \const{CAP\_MKNOD}      & La capacità di creare file di dispositivo con la
-                              funzione \func{mknod} (vedi
-                              sez.~\ref{sec:file_mknod}).\footnotemark\\ 
-    \const{CAP\_LEASE}      & La capacità di creare dei \textit{file lease}
-                              \index{file!lease} su di un file (vedi
-                              sez.~\ref{sec:file_asyncronous_lease})
-                              indipendentemente dalla proprietà dello
-                              stesso.\footnotemark\\
-    \const{CAP\_SETFCAP}    & La capacità di impostare le
-                              \textit{capabilities} di un file (non
-                              supportata).\\ 
-    \const{CAP\_AUDIT\_WRITE}&consente la scrittura di dati nel giornale di
-                              auditing del kernel.\\ 
-    \const{CAP\_AUDIT\_CONTROL}& consente di abilitare e disabilitare il
-                              controllo dell'auditing.\footnotemark\\ 
-% TODO verificare questa roba dell'auditing
     \hline
   \end{tabular}
   \caption{Le costanti che identificano le \textit{capabilities} presenti nel
@@ -2995,90 +3180,67 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.23;
 \label{tab:proc_capabilities}
 \end{table}
 
-\footnotetext[21]{questa capacità è presente soltanto a partire dai kernel
-  della serie 2.4.x.}
-
-\footnotetext[22]{questa capacità è presente soltanto a partire dai kernel della
-  serie 2.4.x.}
-
-\footnotetext{queste ultime due capacità sono presenti  soltanto a partire dai
-  kernel della serie 2.6.11.}
-
-Per gestire questo nuovo meccanismo ciascun processo porta con sé tre distinti
-insiemi di \textit{capabilities}, che vengono denominati rispettivamente
-\textit{effective}, \textit{permitted} ed \textit{inherited}. Questi insiemi
-vengono mantenuti in forma di tre diverse maschere binarie,\footnote{il kernel
-  li mantiene, come i vari identificatori di sez.~\ref{sec:proc_setuid},
-  all'interno della \struct{task\_struct} di ciascun processo (vedi
-  fig.~\ref{fig:proc_task_struct}), nei tre campi \texttt{cap\_effective},
-  \texttt{cap\_inheritable}, \texttt{cap\_permitted} del tipo
-  \texttt{kernel\_cap\_t}; questo è attualmente definito come intero a 32 bit,
-  il che comporta un massimo di 32 \textit{capabilities} distinte.} in cui
-ciascun bit corrisponde ad una capacità diversa; se ne è riportato
-l'elenco,\footnote{si tenga presente che l'elenco delle \textit{capabilities}
-  presentato questa tabella, ripreso dalla relativa pagina di manuale
-  (accessibile con \texttt{man capabilities}) e dalle definizioni in
-  \texttt{sys/capabilities.h}, è quello aggiornato al kernel 2.6.6.} con una
-breve descrizione, ed il nome delle costanti che identificano i singoli bit,
-in tab.~\ref{tab:proc_capabilities}; la tabella è divisa in due parti, la
-prima riporta le \textit{capabilities} previste nella bozza dello standard
-POSIX1.e, la seconda quelle specifiche di Linux.
-
-L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile
-per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui
-sono mantenuti i diversi insiemi di identificatori di
-sez.~\ref{sec:proc_setuid}; il loro significato è il seguente:
-\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}}
-\item[\textit{effective}] l'insieme delle \textit{capabilities}
-  ``\textsl{effettive}'', cioè di quelle che vengono effettivamente usate dal
-  kernel quando deve eseguire il controllo di accesso per le varie operazioni
-  compiute dal processo.
-\item[\textit{permitted}] l'insieme delle \textit{capabilities}
-  ``\textsl{permesse}'', cioè l'insieme di quelle capacità che un processo
-  \textsl{può} impostare come \textsl{effettive}. Se un processo cancella una
-  capacità da questo insieme non potrà più riassumerla (almeno che non esegua
-  un programma che è \acr{suid} di root).
-\item[\textit{inherited}] l'insieme delle \textit{capabilities}
-  ``\textsl{ereditabili}'', cioè quelle che vengono trasmesse ad un nuovo
-  programma eseguito attraverso una chiamata ad \func{exec} (con l'eccezione
-  del caso che questo sia \acr{suid} di root).
-\label{sec:capabilities_set}
-\end{basedescript}
+\footnotetext{vale a dire i permessi caratteristici del modello classico del
+  controllo di accesso chiamato \itindex{Discrectionary~Access~Control~(DAC)}
+  \textit{Discrectionary Access Control} (da cui il nome DAC).}
+
+La prima di queste capacità ``\textsl{ampie}'' è \const{CAP\_FOWNER}, che
+rimuove le restrizioni poste ad un processo che non ha la proprietà di un file
+in un vasto campo di operazioni;\footnote{vale a dire la richiesta che
+  l'user-ID effettivo del processo (o meglio il \textit{filesystem user-ID},
+  vedi sez.~\ref{sec:proc_setuid}) coincida con quello del proprietario.}
+queste comprendono i cambiamenti dei permessi e dei tempi del file (vedi
+sez.~\ref{sec:file_perm_management} e sez.~\ref{sec:file_file_times}), le
+impostazioni degli attributi estesi e delle ACL (vedi
+sez.~\ref{sec:file_xattr} e \ref{sec:file_ACL}), poter ignorare lo
+\itindex{sticky~bit} \textit{sticky bit} nella cancellazione dei file (vedi
+sez.~\ref{sec:file_special_perm}), la possibilità di impostare il flag di
+\const{O\_NOATIME} con \func{open} e \func{fcntl} (vedi
+sez.~\ref{sec:file_open} e sez.~\ref{sec:file_fcntl}) senza restrizioni.
+
+Una seconda capacità che copre diverse operazioni, in questo caso riguardanti
+la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni
+privilegiate dei socket (vedi sez.~\ref{sec:sock_generic_options}), abilitare
+il \itindex{multicast} \textit{multicasting}, eseguire la configurazione delle
+interfacce di rete (vedi sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la
+tabella di instradamento.
+
+Una terza \textit{capability} con vasto campo di applicazione è
+\const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
+come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e
+disattivare la swap, montare, rimontare e smontare filesystem (vedi
+sez.~\ref{sec:sys_file_config}), effettuare operazioni di controllo sugli
+oggetti dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare sugli
+attributi estesi di classe \texttt{security} o \texttt{trusted} (vedi
+sez.~\ref{sec:file_xattr}), specificare un user-ID arbitrario nella
+trasmissione delle credenziali dei socket (vedi sez.~\ref{sec:socket_xxx}),
+assegnare classi privilegiate per lo scheduling dell'I/O (vedi
+sez.~\ref{sec:io_priority}), superare il limite di sistema sul numero massimo
+di file aperti,\footnote{quello indicato da \procfile{/proc/sys/fs/file-max}.}
+effettuare operazioni privilegiate sulle chiavi mantenute dal kernel (vedi
+sez.~\ref{sec:io_priority}), usare la funzione \func{lookup\_dcookie} (vedi
+sez.~\ref{sec:xxx_profiling}), usare \const{CLONE\_NEWNS} con \func{unshare},
+(vedi sez.~\ref{sec:process_clone}).
+
+Originariamente \const{CAP\_SYS\_NICE} riguardava soltanto la capacità di
+aumentare le priorità di esecuzione dei processi, come la diminuzione del
+valore di \textit{nice} (vedi sez.~\ref{sec:proc_sched_stand}), l'uso delle
+priorità \textit{real-time} (vedi sez.~\ref{sec:proc_real_time}), o
+l'impostazione delle affinità di processore (vedi
+sez.~\ref{sec:proc_sched_multiprocess}); ma con l'introduzione di priorità
+anche riguardo le operazioni di accesso al disco, e, nel caso di sistemi NUMA,
+alla memoria, essa viene a coprire anche la possibilità di assegnare priorità
+arbitrarie nell'accesso a disco (vedi sez.~\ref{sec:io_priority}) e nelle
+politiche di allocazione delle pagine di memoria ai nodi di un sistema NUMA.
+
+Infine la \textit{capability} \const{CAP\_SYS\_RESOURCE} attiene alla
+possibilità di superare i limiti imposti sulle risorse di sistema, come usare
+lo spazio disco riservato all'amministratore sui filesystem che lo supportano,
+usare la funzione \func{ioctl} per controllare il \textit{journaling} sul
+filesystem \acr{ext3}, non subire le quote disco, aumentare i limiti sulle
+risorse (vedi sez.~\ref{sec:sys_resource_limit}) e sulle dimensioni dei
+messaggi delle code del SysV IPC (vedi sez.~\ref{sec:ipc_sysv_mq}).
 
-Oltre a questi tre insiemi, che sono relativi al singolo processo, il kernel
-mantiene un insieme generale valido per tutto il sistema, chiamato
-\itindex{capabilities~bounding~set} \textit{capabilities bounding set}. Ogni
-volta che un programma viene posto in esecuzione con \func{exec} il contenuto
-degli insiemi \textit{effective} e \textit{permitted} vengono mascherati con
-un \textsl{AND} binario del contenuto corrente del \textit{capabilities
-  bounding set}, così che il nuovo processo potrà disporre soltanto delle
-capacità in esso elencate.
-
-Il \textit{capabilities bounding set} è un parametro di sistema, accessibile
-attraverso il contenuto del file \procfile{/proc/sys/kernel/cap-bound}, che per
-questa sua caratteristica consente di impostare un limite generale alle
-capacità che possono essere accordate ai vari processi.  Questo valore può
-essere impostato ad un valore arbitrario esclusivamente dal primo processo
-eseguito nel sistema (di norma cioè da \texttt{/sbin/init}), ogni processo
-eseguito successivamente (cioè con \textsl{pid} diverso da 1) anche se
-eseguito con privilegi di amministratore potrà soltanto rimuovere uno dei bit
-già presenti dell'insieme: questo significa che una volta rimossa una
-\textit{capability} dal \textit{capabilities bounding set} essa non sarà più
-disponibile, neanche per l'amministratore, a meno di un riavvio.
-
-Quando un programma viene messo in esecuzione\footnote{cioè quando viene
-  eseguita la \func{execve} con cui lo si lancia; in corrispondenza di una
-  \func{fork} le \textit{capabilities} non vengono modificate.} esso eredita
-(nel senso che assume negli insiemi \textit{effective} e \textit{permitted})
-le \textit{capabilities} mantenute nell'insieme \textit{inherited}, a meno che
-non sia eseguito un programma \acr{suid} di root o la \func{exec} sia stata
-eseguita da un programma con \textsl{uid} reale zero; in tal caso il programma
-ottiene tutte le \textit{capabilities} presenti nel \textit{capabilities
-  bounding set}. In questo modo si può far si che ad un processo eseguito in
-un secondo tempo possano essere trasmesse solo un insieme limitato di
-capacità, impedendogli di recuperare quelle assenti nell'insieme
-\textit{inherited}. Si tenga presente invece che attraverso una \func{fork}
-vengono mantenute le stesse capacità del processo padre.
 
 Per la gestione delle \textit{capabilities} il kernel mette a disposizione due
 funzioni che permettono rispettivamente di leggere ed impostare i valori dei
@@ -3588,7 +3750,8 @@ classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}.
                       \itindex{Linux~Security~Modules} \textit{Linux 
                         Security Modules}), per le realizzazione di meccanismi
                       evoluti di controllo di accesso come \index{SELinux}
-                      SELinux.\\ 
+                      SELinux o le \textit{capabilities} dei file di
+                      sez.~\ref{sec:proc_capabilities}.\\ 
     \const{system}  & Gli \textit{extended security attributes}: sono usati
                       dal kernel per memorizzare dati di sistema associati ai
                       file come le \itindex{Access~Control~List} ACL (vedi
@@ -3659,30 +3822,32 @@ 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 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 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.}
 
   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 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 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 file di dispositivo, e neanche per le fifo o i socket.  Per
-  questo motivo essi sono stati completamente disabilitati per tutto ciò che
-  non sia un file regolare o una directory.\footnote{si può verificare la
-    semantica adottata consultando il file \texttt{fs/xattr.c} dei sorgenti
-    del kernel.} Inoltre per le directory è stata introdotta una ulteriore
-  restrizione, dovuta di nuovo alla presenza ordinaria di permessi di
-  scrittura completi su directory come \texttt{/tmp}. Per questo motivo, per
-  evitare eventuali abusi, se una directory ha lo \itindex{sticky~bit}
+  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
+  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
+  \index{file!di~dispositivo} file di dispositivo, e neanche per le fifo o i
+  socket.  Per questo motivo essi sono stati completamente disabilitati per
+  tutto ciò che non sia un file regolare o una directory.\footnote{si può
+    verificare la semantica adottata consultando il file \texttt{fs/xattr.c}
+    dei sorgenti del kernel.} Inoltre per le directory è stata introdotta una
+  ulteriore restrizione, dovuta di nuovo alla presenza ordinaria di permessi
+  di scrittura completi su directory come \texttt{/tmp}. Per questo motivo,
+  per evitare eventuali abusi, se una directory ha lo \itindex{sticky~bit}
   \textit{sticky bit} attivo sarà consentito scrivere i suoi \textit{extended
     user attributes} soltanto se si è proprietari della stessa, o si hanno i
   privilegi amministrativi della capability \index{capabilities}
@@ -3892,12 +4057,14 @@ 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}
 
+
 \subsection{Le \textit{Access  Control List}}
 \label{sec:file_ACL}
 
+% la documentazione di sistema è nei pacchetti libacl1-dev e acl 
+% vedi anche http://www.suse.de/~agruen/acl/linux-acls/online/
 
 \itindbeg{Access~Control~List}
 
@@ -4670,9 +4837,6 @@ ad un altra con \funcd{acl\_copy\_entry} o eliminare una voce da una ACL con
 
 \itindend{Access~Control~List}
 
-% la documentazione di sistema è nei pacchetti libacl1-dev e acl 
-% vedi anche http://www.suse.de/~agruen/acl/linux-acls/online/
-
 
 
 \subsection{La funzione \func{chroot}}
@@ -4731,7 +4895,7 @@ chiamate nel processo sar
 accedere alla parte di albero sovrastante.  Si ha così quella che viene
 chiamata una \textit{chroot jail}, in quanto il processo non può più accedere
 a file al di fuori della sezione di albero in cui è stato
-\textsl{imprigionato}.
+\textsl{imprigionato}. 
 
 Solo un processo con i privilegi di amministratore può usare questa funzione,
 e la nuova radice, per quanto detto in sez.~\ref{sec:proc_fork}, sarà ereditata
@@ -4765,7 +4929,7 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 
 
 % LocalWords:  sez like filesystem unlink MacOS Windows VMS inode kernel unistd
-% LocalWords:  un'etichetta int const char oldpath newpath errno EXDEV EPERM st
+% LocalWords:  int const char oldpath newpath errno EXDEV EPERM st Smack SysV
 % LocalWords:  EEXIST EMLINK EACCES ENAMETOOLONG ENOTDIR EFAULT ENOMEM EROFS ls
 % LocalWords:  ELOOP ENOSPC EIO pathname nlink stat vfat fsck EISDIR ENOENT cap
 % LocalWords:  POSIX socket fifo sticky root system call count crash nell' init
@@ -4798,10 +4962,23 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  attributes mime ADMIN FOWNER libattr lattr getxattr lgetxattr of
 % LocalWords:  fgetxattr attr ssize ENOATTR ENOTSUP NUL setxattr lsetxattr list
 % LocalWords:  fsetxattr flags XATTR REPLACE listxattr llistxattr flistxattr by
-% LocalWords:  removexattr lremovexattr fremovexattr attributename  lacl acl
+% LocalWords:  removexattr lremovexattr fremovexattr attributename lacl acl tv
 % LocalWords:  OBJ setfacl len any prefix separator options NUMERIC IDS SMART
 % LocalWords:  INDENT major number IDE Documentation makedev fopendir proc copy
-% LocalWords:  euidaccess eaccess delete def tag qualifier permset
+% LocalWords:  euidaccess eaccess delete def tag qualifier permset calendar NOW
+% LocalWords:  mutt noatime relatime strictatime atim nsec mtim ctim atimensec
+% LocalWords:  mtimensec utimes timeval futimes lutimes ENOSYS futimens OMIT
+% LocalWords:  utimensat timespec sec futimesat LIDS DAC OVERRIDE SEARCH chattr
+% LocalWords:  Discrectionary KILL SETGID domain SETUID setuid setreuid SETPCAP
+% LocalWords:  setresuid setfsuid IMMUTABLE immutable append only BIND SERVICE
+% LocalWords:  BROADCAST broadcast multicast multicasting RAW PACKET IPC LOCK
+% LocalWords:  memory mlock mlockall shmctl mmap MODULE RAWIO ioperm iopl PACCT
+% LocalWords:  PTRACE ptrace accounting NICE RESOURCE TTY CONFIG hangup vhangup
+% LocalWords:  LEASE lease SETFCAP AUDIT permitted inherited inheritable AND
+% LocalWords:  bounding execve fork capget capset header hdrp datap ESRCH undef
+% LocalWords:  version libcap lcap clear ncap caps pag capgetp CapInh CapPrm
+% LocalWords:  fffffeff CapEff getcap dell'IPC scheduling dell'I lookup dcookie
+% LocalWords:  NEWNS unshare nice NUMA ioctl journaling
 
 %%% Local Variables: 
 %%% mode: latex