Correzioni alle figure e scritto un po' di chroot e tmpnam
[gapil.git] / filedir.tex
index 46c502b85c2639941370b45a31235f19832579d1..355348627fd4cbbdc7384b9c1d309fcce328f6b2 100644 (file)
@@ -53,7 +53,7 @@ suole chiamare questo tipo di associazione un collegamento diretto (o
 \textit{hard link}).  Il prototipo della funzione e le sue caratteristiche
 principali, come risultano dalla man page, sono le seguenti:
 \begin{prototype}{unistd.h}
-{int link(const char * oldpath, const char * newpath)}
+{int link(const char *oldpath, const char *newpath)}
   Crea un nuovo collegamento diretto al file indicato da \var{oldpath}
   dandogli nome \var{newpath}.
   
@@ -108,7 +108,7 @@ funzione restituisce l'errore \macro{EPERM}.
 La rimozione di un file (o più precisamente della voce che lo referenzia
 all'interno di una directory) si effettua con la funzione \func{unlink}; il
 suo prototipo è il seguente:
-\begin{prototype}{unistd.h}{int unlink(const char * pathname)}
+\begin{prototype}{unistd.h}{int unlink(const char *pathname)}
   Cancella il nome specificato dal pathname nella relativa directory e
   decrementa il numero di riferimenti nel relativo inode. Nel caso di link
   simbolico cancella il link simbolico; nel caso di socket, fifo o file di
@@ -275,19 +275,19 @@ link simbolico comporta l'applicazione della funzione al file da esso
 specificato. La funzione che permette di creare un nuovo link simbolico è
 \func{symlink}; il suo prototipo è:
 \begin{prototype}{unistd.h}
-  {int symlink(const char * oldpath, const char * newpath)} 
-  Crea un nuovo link simbolico di nome \func{newpath} il cui contenuto è
-  \func{oldpath}.
+  {int symlink(const char *oldpath, const char *newpath)} 
+  Crea un nuovo link simbolico di nome \param{newpath} il cui contenuto è
+  \param{oldpath}.
   
   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
     errore, nel qual caso la variabile \var{errno} restituisce i valori:
   \begin{errlist}
-  \item[\macro{EPERM}] il filesystem che contiene \var{newpath} non supporta i
+  \item[\macro{EPERM}] il filesystem che contiene \param{newpath} non supporta i
     link simbolici.
-  \item[\macro{ENOENT}] una componente di \var{newpath} non esiste o
-    \func{oldpath} è una stringa vuota.
-  \item[\macro{EEXIST}] esiste già un file \var{newpath}.
-  \item[\macro{EROFS}] \var{newpath} è su un filesystem montato in sola
+  \item[\macro{ENOENT}] una componente di \param{newpath} non esiste o
+    \param{oldpath} è una stringa vuota.
+  \item[\macro{EEXIST}] esiste già un file \param{newpath}.
+  \item[\macro{EROFS}] \param{newpath} è su un filesystem montato in sola
     lettura.
   \end{errlist}
   ed inoltre \macro{EFAULT}, \macro{EACCES}, \macro{ENAMETOOLONG},
@@ -296,10 +296,10 @@ specificato. La funzione che permette di creare un nuovo link simbolico 
 \end{prototype}
 
 Si tenga presente che la funzione non effettua nessun controllo sull'esistenza
-di un file di nome \var{oldpath}, ma si limita ad inserire quella stringa nel
-link simbolico. Pertanto un link simbolico può anche riferirsi ad un file che
-non esiste: quello che viene chiamato un \textit{dangling link}, letteralmente
-\textsl{link ciondolante}.
+di un file di nome \param{oldpath}, ma si limita ad inserire quella stringa
+nel link simbolico. Pertanto un link simbolico può anche riferirsi ad un file
+che non esiste: quello che viene chiamato un \textit{dangling link},
+letteralmente \textsl{link ciondolante}.
 
 
 Come accennato i link simbolici sono risolti automaticamente dal kernel
@@ -354,7 +354,7 @@ alle informazioni del link invece che a quelle del file a cui esso fa
 riferimento. Quando si vuole leggere il contenuto di un link simbolico si usa
 la funzione \func{readlink}, il cui prototipo è:
 \begin{prototype}{unistd.h}
-{int readlink(const char * path, char * buff, size\_t size)} 
+{int readlink(const char *path, char *buff, size\_t size)} 
   Legge il contenuto del link simbolico indicato da \var{path} nel buffer
   \var{buff} di dimensione \var{size}.
   
@@ -401,8 +401,8 @@ interno un link simbolico che punta di nuovo a \file{/boot}\footnote{Questo
 Questo può causare problemi per tutti quei programmi che effettuano la
 scansione di una directory senza tener conto dei link simbolici, ad esempio se
 lanciassimo un comando del tipo \cmd{grep -r linux *}, il loop nella directory
-porterebbe il comando ad esaminare \file{/boot}, \file/{boot/boot},
-\file/{boot/boot/boot} e così via.
+porterebbe il comando ad esaminare \file{/boot}, \file{/boot/boot},
+\file{/boot/boot/boot} e così via.
 
 Per questo motivo il kernel e le librerie prevedono che nella risoluzione di
 un pathname possano essere seguiti un numero limitato di link simbolici, il
@@ -428,15 +428,15 @@ con un errore che pu
 mostrerebbe l'esistenza di \file{temporaneo}.
 
 
-\subsection{Le funzioni \func{mkdir} e \func{rmdir}
+\subsection{La creazione e la cancellazione delle directory
 \label{sec:file_dir_creat_rem}
 
-Queste due funzioni servono per creare e cancellare delle directory e sono
-omonime degli analoghi comandi di shell.  Per poter accedere ai tipi usati
-da queste funzioni si deve includere il file \file{sys/types.h}, il
-prototipo della prima è:
+Per creare e cancellare delle directory si usano le due funzioni (omonime
+degli analoghi comandi di shell) \func{mkdir} e \func{rmdir}.  Per poter
+accedere ai tipi usati da queste funzioni si deve includere il file
+\file{sys/types.h}, il prototipo della prima è:
 \begin{prototype}{sys/stat.h}
-  {int mkdir (const char * dirname, mode\_t mode)} 
+  {int mkdir(const char *dirname, mode\_t mode)} 
   Crea una nuova directory vuota con il nome indicato da \var{dirname},
   assegnandole i permessi indicati da \var{mode}. Il nome può essere indicato
   con il pathname assoluto o relativo.
@@ -472,10 +472,9 @@ titolarit
 La seconda funzione serve ad eliminare una directory già vuota (la directory
 deve cioè contenere soltanto le due voci standard \file{.} e \file{..}); il
 suo prototipo è:
-\begin{prototype}{sys/stat.h}
-  {int rmdir (const char * dirname)} Cancella la directory \var{dirname}, che
-  deve essere vuota.  Il nome può essere indicato con il pathname assoluto o
-  relativo.
+\begin{prototype}{sys/stat.h}{int rmdir(const char *dirname)} 
+  Cancella la directory \var{dirname}, che deve essere vuota.  Il nome può
+  essere indicato con il pathname assoluto o relativo.
   
   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
     errore, nel qual caso \var{errno} assumerà i valori:
@@ -497,12 +496,92 @@ suo prototipo 
 \end{prototype}
 
 La modalità con cui avviene la cancellazione è analoga a quella di
-\func{unlink}, fintanto che il numero di link all'inode della directory non
+\func{unlink}: fintanto che il numero di link all'inode della directory non
 diventa nullo e nessun processo ha la directory aperta lo spazio occupato su
 disco non viene rilasciato. Se un processo ha la directory aperta la funzione
 rimuove il link all'inode e nel caso sia l'ultimo, pure le voci standard
-\file{.} e \file{..}, ed il kernel non consentirà di creare più nuovi file
-nella directory.
+\file{.} e \file{..}, a questo punto il kernel non consentirà di creare più
+nuovi file nella directory.
+
+
+\subsection{La creazione di file speciali}
+\label{sec:file_mknod}
+
+Finora abbiamo parlato esclusivamente di file, directory e link simbolici; in
+\secref{sec:file_file_types} abbiamo visto però che il sistema preveda pure
+degli altri tipi di file, come i file di dispositivo e le fifo (i socket sono
+un caso a parte, che vedremo in \secref{cha:socket_intro}). 
+
+La manipolazione delle caratteristiche di questi filee e la loro cancellazione
+può essere effettuata con le stesse funzioni che operano sui file normali; ma
+quando li si devono creare sono necessarie delle funzioni apposite. La prima
+di queste funzioni è \func{mknod}, il suo prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h}
+  \headdecl{sys/stat.h}
+  \headdecl{fnctl.h}
+  \headdecl{unistd.h}
+  \funcdecl{int mknod(const char *pathname, mode\_t mode, dev\_t dev)} Crea un
+  inode, si usa per creare i file speciali.
+  
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
+    errore, nel qual caso \var{errno} assumerà i valori:
+  \begin{errlist}
+  \item[\macro{EPERM}] Non si hanno privilegi sufficienti a creare l'inode, o
+    il filesystem su cui si è cercato di creare \func{pathname} non supporta
+    l'operazione.
+  \item[\macro{EINVAL}] Il valore di \var{mode} non indica un file, una fifo o
+    un dipositivo.
+  \item[\macro{EEXIST}] \param{pathname} esiste già o è un link simbolico.
+  \end{errlist}
+  ed inoltre anche \macro{EFAULT}, \macro{EACCESS}, \macro{ENAMETOOLONG},
+  \macro{ENOENT}, \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP},
+  \macro{ENOSPC}, \macro{EROFS}.}
+\end{functions}
+
+La funzione permette di creare un file speciale, ma si può usare anche per
+creare file normali e fifo; l'argomento \param{mode} specifica il tipo di file
+che si vuole creare ed i relativi permessi, secondo i valori riportati in
+\tabref{tab:file_mode_flags}, che vanno combinato come OR binario. I permessi
+sono comunque modificati nella maniera usuale dal valore di \var{umask} (si
+veda \secref{sec:file_umask}.
+
+Per il tipo di file può essere specificato solo uno fra: \macro{S\_IFREG} per
+un file normale (che sarà creato vuoto), \macro{S\_IFBLK} per un device a
+blocchi, \macro{S\_IFCHR} per un device a caratteri e \macro{S\_IFIFO} per una
+fifo. Un valore diverso comporterà l'errore \macro{EINVAL}. Qualora si sia
+specificato in \param{mode} un file di dispositivo, il valore di \param{dev}
+viene usato per indicare a quale dispositivo si fa riferimento. 
+
+Solo l'amministratore può creare un file di dispositivo o un file regolare
+usando questa funzione; ma in Linux\footnote{la funzione non è prevista dallo
+  standard POSIX, e deriva da SVr4, con appunto questa differenza e diversi
+  codici di errore.} l'uso per la creazione di una fifo è consentito anche
+agli utenti normali.
+
+I nuovi inode creati con \func{mknod} apparterranno al proprietario e al
+gruppo del processo che li creati, a meno che non si sia attivato il bit
+\acr{sgid} per la directory o sia stata attivata la semantica BSD per il
+filesystem (si veda \secref{sec:file_ownership}) in cui si va a creare
+l'inode.
+
+Per creare una fifo (un file speciale, su cui torneremo in dettaglio in
+\secref{sec:ipc_named_pipe}) lo standard POSIX specifica l'uso della funzione
+\func{mkfifo}, il cui prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} \headdecl{sys/stat.h} 
+  
+  \funcdecl{int mkfifo(const char *pathname, mode\_t mode)} Crea una fifo.
+  
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
+    errore, nel qual caso \var{errno} assumerà i valori \macro{EACCESS},
+    \macro{EEXIST}, \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOSPC},
+    \macro{ENOTDIR} e\macro{EROFS}.}
+\end{functions}
+\noindent come per \func{mknod} il file \param{pathname} non deve esistere
+(neanche come link simbolico); al solito i permessi specificati da
+\param{mode} vengono modificati dal valore di \var{umask}.
+
 
 
 \subsection{Accesso alle directory}
@@ -511,17 +590,17 @@ nella directory.
 Benché le directory siano oggetti del filesystem come tutti gli altri non ha
 ovviamente senso aprirle come fossero dei file di dati. Può però essere utile
 poterne leggere il contenuto ad esempio per fare la lista dei file che esse
-contengono o ricerche sui medesimi. Solo il kernel scrivere direttamente in
-una directory (onde evitare inconsistenze all'interno del filesystem), i
+contengono o ricerche sui medesimi. Solo il kernel può scrivere direttamente
+in una directory (onde evitare inconsistenze all'interno del filesystem), i
 processi devono creare i file usando le apposite funzioni.
 
 Per accedere al contenuto delle directory si usano i cosiddetti
-\textit{directory streams} (chiamati così per l'analogia con i file stream);
-la funzione \func{opendir} apre uno di questi stream e la funzione
-\func{readdir} legge il contenuto della directory, i cui elementi sono le
-\textit{directory entry} (da distinguersi da quelle della cache di cui
-parlavamo in \secref{sec:file_vfs}) in una opportuna struttura \var{struct
-  dirent}.
+\textit{directory streams} (chiamati così per l'analogia con i file stream di
+\capref{cha:files_std_interface}); la funzione \func{opendir} apre uno di
+questi stream e la funzione \func{readdir} legge il contenuto della directory,
+i cui elementi sono le \textit{directory entry} (da distinguersi da quelle
+della cache di cui parlavamo in \secref{sec:file_vfs}) in una opportuna
+struttura \var{struct dirent}.
 
 (NdA Il resto va scritto!!! É noioso e lo farò più avanti).
 
@@ -545,7 +624,7 @@ directory corrente di qualunque comando da essa lanciato.
 In genere il kernel tiene traccia per ciascun processo dell'inode della
 directory di lavoro corrente, per ottenere il pathname occorre usare una
 apposita funzione di libreria,  \func{getcwd}, il cui prototipo è:
-\begin{prototype}{unistd.h}{char * getcwd (char * buffer, size\_t size)}
+\begin{prototype}{unistd.h}{char *getcwd(char *buffer, size\_t size)}
   Restituisce il filename completo della directory di lavoro corrente nella
   stringa puntata da \var{buffer}, che deve essere precedentemente
   allocata, per una dimensione massima di \var{size}.
@@ -574,7 +653,7 @@ qualora questa sia diversa da zero, o della lunghezza esatta del pathname
 altrimenti. In questo caso ci si deve ricordare di disallocare la stringa una
 volta cessato il suo utilizzo.
 
-Di questa funzione esiste una versione \func{char * getwd(char * buffer)}
+Di questa funzione esiste una versione \code{char *getwd(char *buffer)}
 fatta per compatibilità all'indietro con BSD, che non consente di specificare
 la dimensione del buffer; esso deve essere allocato in precedenza ed avere una
 dimensione superiore a \macro{PATH\_MAX} (di solito 256 byte, vedi
@@ -583,40 +662,64 @@ superiore per un pathname, per cui non 
 contenere il nome del file, e questa è la ragione principale per cui questa
 funzione è deprecata.
 
-Una seconda funzione simile è \func{char * get\_current\_dir\_name(void)} che
-è sostanzialmente equivalente ad una \func{getcwd(NULL, 0)}, con la sola
+Una seconda funzione simile è \code{char *get\_current\_dir\_name(void)} che è
+sostanzialmente equivalente ad una \code{getcwd(NULL, 0)}, con la sola
 differenza che essa ritorna il valore della variabile di ambiente \macro{PWD},
-che essendo costruita dalla shell può contenere anche dei riferimenti
-simbolici; nel caso di  \func{getcwd} infatti, essendo il pathname ricavato
-risalendo all'indietro l'albero della directory, si perderebbe traccia di ogni
-passaggio attraverso eventuali pathname.
-
-Altre due funzioni, \func{chdir} e \func{fchdir}, vengono usate, come dice il
-nome (che deriva da \textit{change directory}), per cambiare la directory di
-lavoro corrente. Dato che anche le directory sono file, è possibile riferirsi
-ad esse anche tramite il file descriptor dell'interfaccia a basso livello, e
-non solo tramite il filename, i prototipi di queste funzioni sono:
-\begin{functions}
-  \headdecl{unistd.h} 
-  \funcdecl{int chdir (const char * path)} 
-  Cambia la directory di lavoro corrente a quella specificata dal pathname
-  contenuto nella stringa \var{path}.
+che essendo costruita dalla shell può contenere un pathname comprendente anche
+con dei link simbolici. Usando \func{getcwd} infatti, essendo il
+pathname ricavato risalendo all'indietro l'albero della directory, si
+perderebbe traccia di ogni passaggio attraverso eventuali link simbolici.
+
+Per cambiare la directory di lavoro corrente si può usare la funzione
+\func{chdir} (omonima dell'analogo comando di shell) il cui nome sta appunto
+per \textit{change directory}), il suo prototipo è:
+\begin{prototype}{unistd.h}{int chdir(const char *pathname)} 
+  Cambia la directory di lavoro corrente in \param{pathname}.
   
-  \funcdecl{int fchdir (int fd)} Analoga alla precedente, ma
-  usa un file descriptor invece del pathname.
-  
-  \bodydesc{Entrambe le funzioni restituiscono zero in caso di successo
-    e -1 per un errore, in caso di errore \var{errno} viene settata per
-    \func{chdir} ai valori:
+  \bodydesc{La funzione restituisce 0 in caso di successo e -1 per un errore,
+    nel qual caso \var{errno} viene settata a:
   \begin{errlist}
-  \item[\macro{ENOTDIR}] Uno dei componenti di \var{path} non è una directory. 
+  \item[\macro{ENOTDIR}] Non si è specificata una directory.
   \item[\macro{EACCESS}] Manca il permesso di ricerca su uno dei componenti di
-    \func{path}.
+    \param{path}.
   \end{errlist}
   ed inoltre \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT},
-  \macro{ENOMEM}, \macro{ELOOP} e \macro{EIO}. Per \func{fchdir} invece gli
-  errori sono \macro{EBADF} e \macro{EACCES}.}
-\end{functions}
+  \macro{ENOMEM}, \macro{ELOOP} e \macro{EIO}.}
+\end{prototype}
+\noindent ed ovviamente \param{pathname} deve indicare una directory per la
+quale si hanno i permessi di accesso.
+
+Dato che anche le directory sono file, è possibile riferirsi ad esse anche
+tramite il file descriptor, e non solo tramite il filename, per fare questo si
+usa \func{fchdir}, il cui prototipo è:
+\begin{prototype}{unistd.h}{int fchdir(int fd)} 
+  Identica a \func{chdir}, ma usa il file descriptor \param{fd} invece del
+  pathname.
+  
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
+    errore, in caso di errore \var{errno} viene settata ai valori
+    \macro{EBADF} o \macro{EACCES}.}
+\end{prototype}
+\noindent anche in questo caso \param{fd} deve essere un file descriptor
+valido che fa riferimento ad una directory. Inoltre l'unico errore di accesso
+possibile (tutti gli altri sarebbero occorsi all'apertura di \func{fd}), è
+quello in cui il processo non ha il permesso di accesso alla directory
+specificata da \param{fd}.
+
+
+
+\subsection{I file temporanei}
+\label{sec:file_temp_file}
+
+In molte occasioni è utile poter creare dei file temporanei; benchè la cosa
+sembri semplice in realtà il problema è più sottile di quanto non appaia a
+prima vista. Infatti anche se sembrerebbe banale generare un nome a caso e
+creare il file dopo aver controllato che questo non esista, nel momento fra il
+controllo e la creazione si ha giusto lo spazio per una \textit{race
+  condition} (si ricordi quanto visto in \secref{sec:proc_race_cond}).
+
+Per questo motivo il kernel le \acr{glibc} provvedono una serie di funzioni da
+utilizzare per la gestione dei file temporanei.
 
 
 
@@ -813,7 +916,7 @@ Si tenga conto che lunghezza del file riportata in \var{st\_size} non 
 che corrisponda all'occupazione dello spazio su disco per via della possibile
 esistenza dei cosiddetti \textsl{buchi} (detti normalmente \textit{holes}) che
 si formano tutte le volte che si va a scrivere su un file dopo aver eseguito
-una \func{seek} (vedi \secref{sec:file_lseek}) oltre la sua conclusione
+una \func{lseek} (vedi \secref{sec:file_lseek}) oltre la sua conclusione
 corrente.
 
 In tal caso si avranno differenti risultati a seconda del modi in cui si
@@ -824,7 +927,7 @@ caso per le parti non scritte vengono restituiti degli zeri, si avr
 risultato di \cmd{ls}.
 
 Se è sempre possibile allargare un file, scrivendoci sopra od usando la
-funzione \func{seek} per spostarsi oltre la sua fine, esistono anche casi in
+funzione \func{lseek} per spostarsi oltre la sua fine, esistono anche casi in
 cui si può avere bisogno di effettuare un troncamento, scartando i dati
 presenti al di là della dimensione scelta come nuova fine del file.
 
@@ -1016,17 +1119,17 @@ avr
 I tempi di ultimo accesso e modifica possono essere cambiati usando la
 funzione \func{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 dell'inode specificato da
-\var{filename} secondo i campi \var{actime} e \var{modtime} di \var{times}. Se
-questa è \macro{NULL} allora viene usato il tempo corrente.
+\param{filename} secondo i campi \var{actime} e \var{modtime} di
+\param{times}. Se questa è \macro{NULL} allora viene usato il tempo corrente.
 
 \bodydesc{La funzione restituisce zero in caso di successo e -1 in caso
   di errore, nel qual caso \var{errno} è settata opportunamente.
 \begin{errlist}
 \item[\macro{EACCESS}] non si ha il permesso di scrittura sul file.
-\item[\macro{ENOENT}] \var{filename} non esiste.
+\item[\macro{ENOENT}] \param{filename} non esiste.
 \end{errlist}}
 \end{prototype}
  
@@ -1039,7 +1142,7 @@ struct utimbuf {
 \end{lstlisting}
 
 L'effetto della funzione e i privilegi necessari per eseguirla dipendono da
-cosa è l'argomento \var{times}; se è \macro{NULL} la funzione setta il tempo
+cosa è l'argomento \param{times}; se è \macro{NULL} la funzione setta il tempo
 corrente ed è sufficiente avere accesso in scrittura al file; se invece si è
 specificato un valore la funzione avrà successo solo se si è proprietari del
 file (o si hanno i privilegi di amministratore).
@@ -1204,7 +1307,7 @@ dell'utente che ha lanciato il processo, mentre i \textit{supplementary group
 
 I passi attraverso i quali viene stabilito se il processo possiede il diritto
 di accesso sono i seguenti:
-\begin{itemize}
+\begin{enumerate}
 \item Se l'\textit{effective user id} 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
@@ -1212,24 +1315,24 @@ di accesso sono i seguenti:
 \item Se l'\textit{effective user id} del processo è uguale all'\acr{uid} del
   proprietario del file (nel qual caso si dice che il processo è proprietario
   del file) allora:
-  \begin{itemize}
+  \begin{itemize*}
   \item se il relativo\footnote{per relativo si intende il bit di user-read se
       il processo vuole accedere in scrittura, quello di user-write per
       l'accesso in scrittura, etc.} bit dei permessi d'accesso dell'utente è
     settato, l'accesso è consentito
   \item altrimenti l'accesso è negato
-  \end{itemize}
+  \end{itemize*}
 \item Se l'\textit{effective group id} del processo o uno dei
   \textit{supplementary group id} dei processi corrispondono al \acr{gid} del
   file allora:
-  \begin{itemize}
+  \begin{itemize*}
   \item se il bit dei permessi d'accesso del gruppo è settato, l'accesso è
     consentito, 
   \item altrimenti l'accesso è negato
-  \end{itemize}
+  \end{itemize*}
 \item se il bit dei permessi d'accesso per tutti gli altri è settato,
   l'accesso è consentito, altrimenti l'accesso è negato.
-\end{itemize}
+\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
@@ -1331,11 +1434,11 @@ assunto un uso corrente per le directory\footnote{lo \textsl{sticky bit} per
   la supporta, così come BSD e SVR4}, in questo caso se il bit è settato un
 file potrà essere rimosso dalla directory soltanto se l'utente ha il permesso
 di scrittura ed inoltre è vera una delle seguenti condizioni:
-\begin{itemize}
+\begin{itemize*}
 \item l'utente è proprietario del file
 \item l'utente è proprietario della directory
 \item l'utente è l'amministratore 
-\end{itemize}
+\end{itemize*}
 un classico esempio di directory che ha questo bit settato è \file{/tmp}, i
 permessi infatti di solito sono settati come:
 \begin{verbatim}
@@ -1360,12 +1463,12 @@ descritto in \secref{sec:file_dir_creat_rem}).
 Lo standard POSIX prescrive che l'\acr{uid} del nuovo file corrisponda
 all'\textit{effective user id} del processo che lo crea; per il \acr{gid}
 invece prevede due diverse possibilità:
-\begin{itemize}
+\begin{itemize*}
 \item il \acr{gid} del file corrisponde all'\textit{effective group id} del
   processo.
 \item il \acr{gid} del file corrisponde al \acr{gid} della directory in cui
   esso è creato.
-\end{itemize}
+\end{itemize*}
 in genere BSD usa sempre la seconda possibilità, che viene per questo chiamata
 semantica BSD. Linux invece segue quella che viene chiamata semantica SVr4; di
 norma cioè il nuovo file viene creato, seguendo la prima opzione, con il
@@ -1374,7 +1477,7 @@ bit \acr{sgid} settato allora viene usata la seconda opzione.
 
 Usare la semantica BSD ha il vantaggio che il \acr{gid} viene sempre
 automaticamente propagato, restando coerente a quello della directory di
-partenza, in tutte le sottodirectory. La semantica SVR4 offre una maggiore
+partenza, in tutte le sottodirectory. La semantica SVr4 offre una maggiore
 possibilità di scelta, ma per ottenere lo stesso risultato necessita che per
 le nuove directory venga anche propagato anche il bit \acr{sgid}. Questo è
 comunque il comportamento di default di \func{mkdir}, ed é in questo modo ad
@@ -1396,14 +1499,14 @@ la funzione \func{access}, il cui prototipo 
 \begin{prototype}{unistd.h}
 {int access(const char *pathname, int mode)}
 
-  La funzione verifica i permessi di accesso, indicati da \var{mode}, per il
-  file indicato da \var{pathname}. 
+Verifica i permessi di accesso, indicati da \var{mode}, per il file indicato
+da \var{pathname}.
   
-  La funzione ritorna 0 se l'accesso è consentito, -1 altrimenti; in
-  quest'ultimo caso la variabile \var{errno} viene settata secondo i codici
-  di errore: \macro{EACCES}, \macro{EROFS}, \macro{EFAULT}, \macro{EINVAL},
+\bodydesc{La funzione ritorna 0 se l'accesso è consentito, -1 altrimenti; in
+  quest'ultimo caso la variabile \var{errno} viene settata secondo i codici di
+  errore: \macro{EACCES}, \macro{EROFS}, \macro{EFAULT}, \macro{EINVAL},
   \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOTDIR}, \macro{ELOOP},
-  \macro{EIO}.
+  \macro{EIO}.}
 \end{prototype}
 
 I valori possibili per il parametro \var{mode} sono esprimibili come
@@ -1518,7 +1621,7 @@ Il cambiamento dei permessi di un file attraverso queste funzioni ha comunque
 alcune limitazioni, provviste per motivi di sicurezza. Questo significa che
 anche se si è proprietari del file non tutte le operazioni sono permesse, in
 particolare:
-\begin{itemize}
+\begin{enumerate}
 \item siccome solo l'amministratore può settare lo \textit{sticky bit}; se
   l'\textit{effective user id} del processo non è zero esso viene
   automaticamente cancellato (senza notifica di errore) qualora sia stato
@@ -1531,7 +1634,7 @@ particolare:
   notifica di errore) da \var{mode} qualora il gruppo del file non corrisponda
   a quelli associati al processo (la cosa non avviene quando
   l'\textit{effective user id} del processo è zero).
-\end{itemize}
+\end{enumerate}
 
 Per alcuni filesystem\footnote{il filesystem \acr{ext2} supporta questa
   caratteristica, che è mutuata da BSD.} è inoltre prevista una ulteriore
@@ -1554,8 +1657,8 @@ funzione \func{umask}, il cui prototipo 
   Setta la maschera dei permessi dei bit al valore specificato da \var{mask}
   (di cui vengono presi solo i 9 bit meno significativi).
   
-  La funzione ritorna il precedente valore della maschera. È una delle poche
-  funzioni che non restituisce codici di errore.
+  \bodydesc{La funzione ritorna il precedente valore della maschera. È una
+    delle poche funzioni che non restituisce codici di errore.}
 \end{prototype}
 
 Questa maschera è una caratteristica di ogni processo e viene utilizzata per
@@ -1578,6 +1681,7 @@ login a $022$, e di norma gli utenti non hanno motivi per modificarlo. Se per
 si vuole che un processo possa creare un file che chiunque possa leggere
 allora occorrerà cambiare il valore di \func{umask}.
 
+
 \subsection{Le funzioni \func{chown}, \func{fchown} e \func{lchown}}
 \label{sec:file_chown}
 
@@ -1636,4 +1740,15 @@ che per il file 
 %completo vedi \ntab), i permessi (vedi \secref{sec:file_perms}), le date (vedi
 %\secref{sec:file_times}).
 
+\subsection{La funzione \func{chroot}}
+\label{sec:file_chroot}
+
+Benché non abbia niente a che fare con permessi, utenti e gruppi, questa
+funzione viene usata spesso per limitare le capacità dei programmi, ed è
+pertanto pertinente al controllo di accesso. Come accennato in
+\secref{sec:proc_fork} ogni processo oltre ad una directory di lavoro
+corrente, ha anche una directory radice, cioè una directory che per il
+processo costituisce la radice dell'albero del filesystem.
+
+In generale questa directory coincide con la