Risistemati un sacco di riferiementi, e la riorganizzazione della parte
[gapil.git] / filedir.tex
index f68576f0cb859b5d5ea18e4c03aaffe3411b0e2c..d811bfccee48f6f716d831bd1cb07487bb5be0b9 100644 (file)
 \chapter{Files e directories}
 \label{cha:files_and_dirs}
 
-In questo capitolo tratteremo in dettaglio le varie caratteristiche di files e
-directories, ed in particolare approfondiremo i dettagli su come è organizzata
-la struttura dei files in un sistema unix; esamineremo poi come è strutturato
-il sistema base di protezioni e controllo di accesso ai files, e tutta
+In questo capitolo tratteremo in dettaglio le modalità con cui si gestiscono
+files e directories, ed in particolare esamineremo come è strutturato il
+sistema base di protezioni e controllo di accesso ai files, e tutta
 l'interfaccia che permette la manipolazione dei vari attributi di files e
-directories. Tutto quello che riguarda invece la manipolazione dei contenuti e
+directories. Tutto quello che riguarda invece la manipolazione dei contenuti è
 lasciato ai capitoli successivi.
 
-Le funzioni che esamineremo in questo capitolo pertanto sono quelle che
-permettono di creare e cancellare o leggere le directories, rinominare o
-cancellare i files ed esaminare o cambiare i loro attributi.
-
-
-\section{L'organizzazione di files e directories}
-\label{sec:filedir_org}
-
-L'organizzazione dei nomi dei file deriva direttamente dall'organizzazione dei
-medesimi nell'albero descritto brevemente in \ref{sec:fileintr_overview}; una
-directory comunque, come già specificato in \ref{sec:fileintr_vfs}, è solo un
-particolare tipo di file che contiene le informazioni che associano un nome al
-contenuto. Per questo, anche se è usuale parlare di ``file in una directory''
-in realtà una directory contiene solo dei riferimenti ai file, non i file
-stessi.
-
-I nomi contenuti nelle directory sono chiamati componenti (\textit{file name
-  components}), un file può essere indicato rispetto alla directory corrente
-semplicemente specificando il nome da essa contenuto. Una directory contiene
-semplicemente un elenco di questi componenti, che possono corrispondere a un
-qualunque oggetto del filesystem, compresa un'altra directory; l'albero viene
-appunto creato inserendo directory in altre directory.
-
-Il nome di file generico è composto da una serie di \textsl{componenti}
-separati da una \texttt{/} (in linux più \texttt{/} consecutive sono
-considerate equivalenti ad una sola). Il nome completo di un file viene
-usualmente chiamato \textit{pathname}, e anche se il manuale della glibc
-depreca questo nome (poichè genererebbe confusione, dato che con \textit{path}
-si indica anche un insieme di directory su cui effettuare una ricerca, come
-quello in cui si cercano i comandi) l'uso è ormai così comune che è senz'altro
-più chiaro dell'alternativa proposta.
-
-Il processo con cui si associa ad un pathname uno specifico file (cioè si
-identifica l'inode a cui fare riferimento) è chiamato risoluzione del nome
-(\textit{file name resolution} o \textit{pathname resolution}).
-La risoluzione viene fatta esaminando il pathname da destra a sinistra e
-localizzando ogni componente nella directory indicata dal componente
-precedente: ovviamente perché il procedimento funzioni occorre che i
-componenti indicati come directory esistano e siano effettivamente directory,
-inoltre i permessi devono consentire l'accesso.
-
-Se il pathname comincia per \texttt{/} la ricerca parte dalla directory radice
-del processo; questa, a meno di un \textit{chroot} (su cui torneremo in
-seguito, vedi \ref{sec:proc_chroot}) è la stessa per tutti i processi ed
-equivale alla directory radice dell'albero (come descritto in
-\ref{sec:fileintr_overview}): in questo caso si parla di un pathname
-\textsl{assoluto}. Altrimenti la ricerca parte dalla directory corrente (su
-cui torneremo più avanti in \ref{sec:filedir_work_dir}) ed il pathname è detto
-\textsl{relativo}.
-
-I componenti \texttt{.} e \texttt{..} hanno un significato speciale e vengono
-inseriti in ogni directory, il primo fa riferimento alla directory corrente e
-il secondo alla directory \textsl{genitore} (\textit{parent directory}) cioè
-la directory che contiene il riferimento alla directory corrente; nel caso
-questa sia la directory radice allora il riferimento è a se stessa.
-
-
-\section{La manipolazione di files e directories}
-\label{sec:filedir_handling}
-
-Per capire fino in fondo le proprietà di files e directories in un sistema
-unix ed il funzionamento delle relative funzioni di manipolazione occorre una
-breve introduzione agli oggetti su cui è basato un filesystem unix; in
-particolare si riprenderanno, approfondendoli, i concetti di \textit{inode} e
-\textit{dentry} brevemente introdotti in \ref{sec:fileintr_vfs}.
-
-
-\subsection{Il funzionamento di un filesystem}
-\label{sec:filedir_filesystem}
-
-Come già accennato in \ref{sec:fileintr_overview} linux (ed ogni unix in
-generale) organizza i dati che tiene su disco attraverso l'uso di un
-filesystem. Una delle caratteristiche di linux rispetto agli altri unix è
-quella di poter supportare grazie al VFS una enorme quantità di filesystem
-diversi, ognuno dei quali ha una sua particolare struttura e funzionalità
-proprie; per questo non entreremo nei dettagli di un filesystem specifico, ma
-daremo una descrizione a grandi linee che si adatta alle caratteristiche
-comuni di un qualunque filesystem standard unix.
-
-Dato un disco lo spazio fisico viene usualmente diviso in partizioni; ogni
-partizione può contenere un filesystem; quest'ultimo è in genere strutturato
-secondo \nfig, con una lista di inodes all'inizio e il resto dello spazio aa
-disposizione per i dati e le directory.
-
-\begin{figure}[htb]
-  \centering
-  
-  \caption{Organizzazione dello spazio su un disco in partizioni e filesystem}
-  \label{fig:filedir_disk_filesys}
-\end{figure}
 
-Se si va ad esaminare come è strutturata l'informazione all'interno del
-filesystem (tralasciando le parti che non riguardano direttamente la gestione
-di file e directory come il super-block) avremo una situazione del tipo di
-quella esposta in \nfig.
+\section{La manipolazione delle caratteristiche dei files}
+\label{sec:filedir_infos}
 
-\begin{figure}[htb]
-  \centering
-  
-  \caption{Organizzazione di un filesystem}
-  \label{fig:filedir_filesys_detail}
-\end{figure}
+Come spiegato in \secref{sec:fileintr_filesystem} tutte le informazioni
+generali relative alle caratteristiche di ciascun file sono mantenute
+nell'inode. Vedremo in questa sezione come sia possibile accedervi usando la
+funzione \texttt{stat} ed esamineremo alcune funzioni utilizzabili per
+manipolare una parte di questa informazione. Tutto quello che invece riguarda
+il meccanismo di controllo di accesso ad i file e le relative funzioni di
+manipolazione sarà invece esaminanto in \secref{sec:filedir_access_control}.
 
 
-Quanto mostrato in \curfig\ mette in evidenza alcune caratteristiche di un 
-filesystem unix su cui è bene porre attenzione in quanto sono fondamentali per
-capire il funzionamento delle funzioni che manipolano i file e le directory su
-cui torneremo fra poco; in particolare è opportuno ricordare sempre che:
+\subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}}
+\label{sec:filedir_stat}
 
-\begin{itemize}
-  
-\item L'\textit{inode} contiene tutte le informazioni riguardanti il file: il
-  tipo di file, i permessi di accesso, le dimensioni, i puntatori ai blocchi
-  fisici che contengono i dati e così via; le informazioni che la funzione
-  \texttt{stat} fornisce provengono dall'inode; dentro una directory si
-  troverà solo il nome del file e il numero dell'inode ad esso associato, cioè
-  una \textit{dentry}.
-  
-\item Come mostrato in \curfig si possono avere più dentries che puntano allo
-  stesso inode. Ogni inode ha un contatore che contiene il numero di
-  riferimenti (\textit{link count}) che sono stati fatti ad esso, solo quando
-  questo contatore si annulla il file può essere cancellato. Per questo in
-  generale non esiste una funzione che cancelli un file, ma solo la funzione
-  \texttt{unlink} che si chiama così proprio perché che toglie un riferimento
-  da una directory (cancellando la dentry), il che non comporta
-  automaticamente pure la eliminazione dei blocchi sul disco.
-  
-\item Siccome il numero di inode nella dentry si riferisce ad un inode nello
-  stesso filesystem non ci può essere una directory che contiene riferimenti
-  ad inodes relativi ad altri filesystem, questo limita l'uso del comando
-  \texttt{ln} (che crea una nuova dentry per un file esistente, con la
-  funzione \texttt{link}) al filesystem corrente.
-
-\item Quando si cambia nome ad un file senza cambiare filesystem il contenuto
-  del file non deve essere spostato, ma basta creare una nuova dentry per
-  l'inode in questione rimuovendo la vecchia (che è la modalità in cui opera
-  normalmente il comando \texttt{mv} attraveso la funzione \texttt{rename}).
-
-\end{itemize}
-
-Infine è bene avere presente che esiste un numero di riferimenti anche per le
-directories, se a partire dalla situazione mostrata in \curfig\ creiamo una
-nuova directory \texttt{textdir} avremo una situazione come quella in \nfig,
-dove per chiarezza abbiamo aggiunto dei numeri di inode.
-
-La nuova directory avrà allora un numero di riferimenti pari a due, in quanto
-è referenziata dalla directory da cui si era partiti (in cui è inserita la
-nuova dentry che fa riferiemto a \texttt{textdir}) e dalla dentry \texttt{.}
-che è sempre inserita in ogni directory; questo vale sempre per ogni directory
-che non contenga a sua volta altre directories. Al contempo la directory da
-cui si era partiti avrà un numero di riferiementi di almeno tre, in quanto
-adesso sarà referenziata anche dalla dentry \texttt{..} di \texttt{textdir}.
-
-
-\subsection{Le funzioni \texttt{link} e \texttt{unlink}}
-\label{sec:filedir_link}
-
-Una delle caratteristiche usate quando si opera con i file è quella di poter
-creare dei nomi fittizi (alias o collegamenti) per potersi riferire allo
-stesso file accedendovi da directory diverse. Questo è possibile anche in
-ambiente unix, dove tali collegamenti sono usualmente chiamati \textit{link},
-ma data la struttura del sistema ci sono due metodi sostanzialmente diversi
-per fare questa operazione.
-
-Come si è appena visto l'accesso al contenuto di un file su disco avviene
-attraverso il suo \textit{inode}, e il nome che si trova in una directory è
-solo una etichetta associata ad un puntatore a detto inode.  Questo significa
-che la realizzazione di un link è immediata in quanto uno stesso file può
-avere tanti nomi diversi allo stesso tempo, dati da altrettante diverse
-associazioni allo stesso inode; si noti poi che nessuno di questi nomi viene
-ad assumere una particolare preferenza rispetto agli altri.
-
-Per aggiungere un nome ad un inode si utilizza la funzione \texttt{link}; si
-suole chiamare questo tipo di associazione un collegamento diretto (o
-\textit{hard link}).  La creazione di un nuovo link diretto non copia il
-contenuto del file, ma si limita ad aumentare di uno il numero di referenze al
-file aggiungendo il nuovo nome ai precedenti. Si noti che uno stesso file può
-essere così richiamato in diverse directory.
-
-\begin{itemize}
-\item \texttt{int link(const char * oldname, const char * newname)}
-  
-  Crea un nuovo link diretto al file indicato da \texttt{oldname} dandogli
-  nome \texttt{newname}.
+La lettura delle informazioni relative ai file è fatta attraverso la famiglia
+delle funzioni \texttt{stat}, questa è la funzione che il comando \texttt{ls}
+usa per poter stampare tutti i dati dei files; il prototipo della funzione è
+il seguente;
+\begin{prototype}{unistd.h}
+{int stat(const char *file\_name, struct stat *buf)}
   
   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
-  di errore. La variabile \texttt{errno} viene settata secondo i codici di
-  errore standard di accesso ai files (trattati in dettaglio in
-  \ref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
+  di errore \texttt{errno} viene settato ai valori:
+  \begin{errlist}
+  \item \texttt{EACCESS} Non c'è il permesso di accedere al file.
+  \item \texttt{ENOTDIR} Una componente del pathname non è una directory.
+  \item \texttt{EMLOOP} Ci sono troppi link simbolici nel pathname.
+  \item \texttt{EFAULT} I puntatori usati sono fuori dallo spazio di indirizzi
+    del processo.
+  \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
+    completare l'operazione. 
+  \item \texttt{ENAMETOOLONG} Il filename è troppo lungo.
+  \end{errlist}
+\end{prototype}
+
+La struttura \texttt{stat} è definita nell'header \texttt{sys/stat.h} e in
+generale dipende dall'implementazione, la versione usata da Linux è mostrata
+in \nfig, così come riportata dalla man page (in realtà la definizione
+effettivamente usata nel kernel dipende dall'archietettura e ha altri campi
+riservati per estensioni come tempo più precisi, o per il padding dei campi).
+
+\begin{figure}[!htb]
+  \footnotesize
+  \centering
+  \begin{minipage}[c]{15cm}
+    \begin{lstlisting}[]{}
+struct stat {
+    dev_t         st_dev;      /* device */
+    ino_t         st_ino;      /* inode */
+    mode_t        st_mode;     /* protection */
+    nlink_t       st_nlink;    /* number of hard links */
+    uid_t         st_uid;      /* user ID of owner */
+    gid_t         st_gid;      /* group ID of owner */
+    dev_t         st_rdev;     /* device type (if inode device) */
+    off_t         st_size;     /* total size, in bytes */
+    unsigned long st_blksize;  /* blocksize for filesystem I/O */
+    unsigned long st_blocks;   /* number of blocks allocated */
+    time_t        st_atime;    /* time of last access */
+    time_t        st_mtime;    /* time of last modification */
+    time_t        st_ctime;    /* time of last change */
+};
+    \end{lstlisting}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \texttt{stat} per la lettura delle informazioni dei 
+    file}
+  \label{fig:filedir_stat_struct}
+\end{figure}
 
-  \begin{itemize}
-  \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo
-    stesso filesystem.
-  \item \texttt{EPERM} il filesystem che contiene \texttt{oldname} e
-    \texttt{newname} non supporta i link diretti.
-  \item \texttt{EACCESS} 
-    Non c'è il permesso di scrittura per la directory in cui si vuole creare
-    il nuovo link.
-  \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
-    già.
-  \item \texttt{EMLINK} Ci sono troppi link al file \texttt{oldname} (il
-    numero massimo è specificato dalla variabile \texttt{LINK\_MAX}, vedi
-    \ref{sec:xxx_limits}.
-  \item \texttt{ENOSPC} La directory in cui si vuole creare il link è piena e
-    non può essere ampliata.
-  \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
-    su un filesystem montato readonly.
-  \end{itemize}
-\end{itemize}
-
-
-
-\subsection{Le funzioni \texttt{remove} e \texttt{rename}}
-\label{sec:filedir_cre_canc}
-
-
-\subsection{I link simbolici}
-\label{sec:filedir_sym_link}
-
-Siccome tutto ciò funziona facendo riferimento ad un inode, questa funzione
-può essere applicata soltanto per file che risiedono sullo stesso filesystem,
-(dato che solo in questo caso è garantita l'unicità dell'inode) e solo per
-filesystem di tipo unix. Inoltre in linux non è consentito eseguire un link
-diretto ad una directory.
-
-Per ovviare a queste limitazioni i sistemi unix supportano un'altra forma di
-link (i cosiddetti \textit{soft link} o \textit{symbolic link}), che sono,
-come avviene in altri sistemi operativi, dei file che contengono il
-semplicemente il riferimento ad un altro file (o directory). In questo modo è
-possibile effettuare link anche attraverso filesystem diversi e a directory, e
-pure a file che non esistono ancora.
-
-Il sistema funziona in quanto i link simbolici sono contrassegnati come tali
-al kernel (analogamente a quanto avviene per le directory) per cui la chiamata
-ad una \texttt{open} o una \texttt{stat} su un link simbolico comporta la
-lettura del contenuto del medesimo e l'applicazione della funzione al file
-specificato da quest'ultimo. Invece altre funzioni come quelle per cancellare
-o rinominare i file operano direttamente sul link simbolico. Inoltre esistono
-funzioni apposite, come la \texttt{readlink} e la \texttt{lstat} per accedere
-alle informazioni del link invece che a quelle del file a cui esso fa
-riferimento.
-
-Le funzioni per operare sui link sono le seguenti, esse sono tutte dichiarate
-nell'header file \texttt{unistd.h}.
-
-\begin{itemize}
-\item \texttt{int symlink(const char * oldname, const char * newname)}
-  
-  Crea un nuovo link simbolico al file indicato da \texttt{oldname} dandogli
-  nome \texttt{newname}.
-  
-  La funzione restituisce zero in caso di successo e -1 per un errore, in caso
-  di errore. La variabile \texttt{errno} viene settata secondo i codici di
-  errore standard di accesso ai files (trattati in dettaglio in
-  \ref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
+Si noti come i vari membri della struttura siano specificati come tipi nativi
+del sistema (di quelli definiti in \tabref{tab:xxx_sys_types}, e dichiarati in
+\texttt{sys/types.h}) 
+
+
+
+
+\subsection{I tipi di file}
+\label{sec:filedir_file_types}
+
+Come riportato in \tabref{tab:fileintr_file_types} in linux oltre ai file e
+alle directory esistono vari altri oggetti che possono stare su un filesystem;
+il tipo di file è ritornato dalla \texttt{stat} nel campo \texttt{st\_mode},
+dato che il valore numerico può variare a seconda delle implementazioni
+
+
+\subsection{La dimensione dei file}
+\label{sec:filedir_file_size}
+
+\subsection{I tempi dei file}
+\label{sec:filedir_file_times}
+
+\subsection{La funzione \texttt{utime}}
+\label{sec:filedir_utime}
+
+
+
+
+\section{Il controllo di accesso ai file}
+\label{sec:filedir_access_control}
+
+
+In unix è implementata da qualunque filesystem standard una forma elementare
+(ma adatta alla maggior parte delle esigenze) di controllo di accesso ai
+files. Torneremo sull'argomento in dettaglio più avanti (vedi
+\secref{sec:filedir_access_control}), qui ci limitiamo ad una introduzione dei
+concetti essenziali.
+
+Si tenga conto poi che quanto diremo è vero solo per filesystem di tipo Unix,
+e non è detto che sia applicabile (ed infatti non è vero per il filesystem di
+Windows) a un filesystem qualunque. Esistono inoltre estensioni che permettono
+di implementare le ACL (\textit{Access Control List}) che sono un meccanismo
+di controllo di accesso molto più sofisticato.
+
+Ad ogni file Unix associa sempre l'utente che ne è proprietario (il cosiddetto
+\textit{owner}) e il gruppo di appartenenza, secondo il meccanismo degli uid e
+gid accennato in \secref{sec:intro_multiuser}, e un insieme di permessi che
+sono divisi in tre classi, e cioè attribuiti rispettivamente al proprietario,
+a qualunque utente faccia parte del gruppo cui appartiene il file, e a tutti
+gli altri utenti.
+
+I permessi sono espressi da un insieme di 12 bit: di questi i nove meno
+significativi sono usati a gruppi di tre per indicare i permessi base di
+lettura, scrittura ed esecuzione (indicati rispettivamente con le lettere
+\textit{w}, \textit{r} \textit{x}) applicabili rispettivamente al
+proprietario, al gruppo, a tutti (una descrizione più dettagliata dei vari
+permessi associati ai file è riportata in \secref{sec:filedir_suid_sgid}).  I
+restanti tre bit sono usati per indicare alcune caratteristiche più complesse
+(\textit{suid}, \textit{sgid}, e \textit{sticky}) su cui pure torneremo in
+seguito (vedi \secref{sec:filedir_suid_sgid} e \secref{sec:filedir_sticky}).
+
+Tutte queste informazioni sono tenute per ciascun file nell'inode. Quando un
+processo cerca l'accesso al file esso controlla i propri uid e gid
+confrontandoli con quelli del file e se l'operazione richiesta è compatibile
+con i permessi associati al file essa viene eseguita, altrimenti viene
+bloccata ed è restituito un errore di \texttt{EPERM}. Questo procedimento non
+viene eseguito per l'amministratore di sistema (il cui uid è zero) il quale ha
+pertanto accesso senza restrizione a qualunque file del sistema.
+
+% In realtà il procedimento è più complesso di quanto descritto in maniera
+% elementare qui; inoltre ad un processo sono associati diversi identificatori,
+% torneremo su questo in maggiori dettagli in seguito in \secref{sec:proc_perms}.
+
+
+
+\subsection{I flag \texttt{suid} e \texttt{sgid}}
+\label{sec:filedir_suid_sgid}
+
+\subsection{La titolarità di nuovi files e directory}
+\label{sec:filedir_ownership}
+
+\subsection{La funzione \texttt{access}}
+\label{sec:filedir_access}
+
+\subsection{La funzione \texttt{umask}}
+\label{sec:filedir_umask}
 
-  \begin{itemize}
-  \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
-    già.
-  \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
-    su un filesystem montato readonly.
-  \item \texttt{ENOSPC} La directory o il filesystem in cui si vuole creare il
-    link è piena e non c'è ulteriore spazio disponibile.
-  \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione di
-    \texttt{oldname} o di \texttt{newname}.
-  \end{itemize}
-\end{itemize}
+\subsection{Le funzioni \texttt{chmod} e \texttt{fchmod}}
+\label{sec:filedir_chmod}
+
+\subsection{Il flag \texttt{sticky}}
+\label{sec:filedir_sticky}
+
+\subsection{Le funzioni \texttt{chown}, \texttt{fchown} e \texttt{lchown}}
+\label{sec:filedir_chown}
 
 
+\section{La manipolazione delle directories}
+\label{sec:filedir_dir_handling}
+
 \subsection{Le funzioni \texttt{mkdir} e \texttt{rmdir}} 
 \label{sec:filedir_dir_creat_rem}
 
 Per creare una nuova directory si può usare la seguente funzione, omonima
-dell'analogo comando di shell \texttt{mkdir}; per accedere alla funzioni il
-programma deve includere il file \texttt{sys/stat.h}.
+dell'analogo comando di shell \texttt{mkdir}; per accedere ai tipi usati
+programma deve includere il file \texttt{sys/types.h}.
 
-\begin{itemize}
-\item \texttt{char * mkdir (const char * dirname, mode\_t mode)}
-  
+\begin{prototype}{sys/stat.h}
+{int mkdir (const char * dirname, mode\_t mode)}
   Questa funzione crea una nuova directory vuota con il nome indicato da
   \texttt{dirname}, assegnandole i permessi indicati da \texttt{mode}. Il nome
   può essere indicato con il pathname assoluto o relativo.
@@ -295,14 +195,14 @@ programma deve includere il file \texttt{sys/stat.h}.
   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
   di errore \texttt{errno} viene settata secondo i codici di errore standard
   di accesso ai files (trattati in dettaglio in
-  \ref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
-  \begin{itemize}
+  \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
+  \begin{errlist}
   \item \texttt{EACCESS} 
     Non c'è il permesso di scrittura per la directory in cui si vuole inserire
     la nuova directory.
-  \item \texttt{EEXIST} Un file (o una directory) con quel nome essite di già. 
+  \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di già. 
   \item \texttt{EMLINK} La directory in cui si vuole creare la nuova directory
-    contiene troppi file. Sotto linux questo normalmente non avviene perchè il
+    contiene troppi file. Sotto Linux questo normalmente non avviene perché il
     filesystem standard consente la creazione di un numero di file maggiore di
     quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che
     fare anche con filesystem di altri sistemi questo errore può presentarsi.
@@ -310,14 +210,14 @@ programma deve includere il file \texttt{sys/stat.h}.
     la nuova directory.
   \item \texttt{EROFS} La directory su cui si vuole inserire la nuova
     directory è su un filesystem montato readonly.
-  \end{itemize}
-\end{itemize}
+  \end{errlist}
+\end{prototype}
  
 
 \subsection{Accesso alle directory}
 \label{sec:filedir_dir_read}
 
-Benchè le directory siano oggetti del filesystem come tutti gli altri non ha
+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.
@@ -327,7 +227,7 @@ Per accedere al contenuto delle directory si usano i cosiddetti
 la funzione \texttt{opendir} apre uno di questi stream e la funzione
 \texttt{readdir} legge il contenuto della directory, i cui elementi sono le
 \textit{directory entries} (da distinguersi da quelle della cache di cui
-parlavamo in \ref{sec:fileintr_vfs}) in una opportuna struttura
+parlavamo in \secref{sec:fileintr_vfs}) in una opportuna struttura
 \texttt{struct dirent}.
 
 
@@ -347,40 +247,37 @@ un processo figlio, la directory corrente della shell diventa anche la
 directory corrente di qualunque comando da essa lanciato.
 
 Le funzioni qui descritte servono esaminare e cambiare la directory di lavoro
-corrente. I prototipi di queste funzioni sono dichiarati in \texttt{unistd.h}. 
+corrente. 
 
-\begin{itemize}
-\item \texttt{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 \texttt{buffer}, che deve essere precedentemente
   allocata, per una dimensione massima di \texttt{size}. Si può anche
   specificare un puntatore nullo come \textit{buffer}, nel qual caso la
   stringa sarà allocata automaticamente per una dimensione pari a
   \texttt{size} qualora questa sia diversa da zero, o della lunghezza esatta
-  del pathname altrimenti. In questo caso si deve ricordare di disallocara la
+  del pathname altrimenti. In questo caso si deve ricordare di disallocare la
   stringa una volta cessato il suo utilizzo.
   
   La funzione restituisce il puntatore \texttt{buffer} se riesce,
   \texttt{NULL} se fallisce, in quest'ultimo caso la variabile
   \texttt{errno} è settata con i seguenti codici di errore:
-
-  \begin{itemize}
+  \begin{errlist}
   \item \texttt{EINVAL} L'argomento \texttt{size} è zero e \texttt{buffer} non
     è nullo.
   \item \texttt{ERANGE} L'argomento \texttt{size} è più piccolo della
     lunghezza del pathname. 
-  \item \texttt{EACCES} Manca il permesso di lettura o di ricerca su uno dei
+  \item \texttt{EACCESS} Manca il permesso di lettura o di ricerca su uno dei
     componenti del pathname (cioè su una delle directory superiori alla
     corrente).
-  \end{itemize}
-\end{itemize}
+  \end{errlist}
+\end{prototype}
 
 Di questa funzione esiste una versione \texttt{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 \texttt{PATH\_MAX} (di solito 256 byters, vedi
-\ref{sec:xxx_limits}; il problema è che in linux non esiste una dimensione
+dimensione superiore a \texttt{PATH\_MAX} (di solito 256 bytes, vedi
+\secref{sec:xxx_limits}; il problema è che in Linux non esiste una dimensione
 superiore per un pathname, per cui non è detto che il buffer sia sufficiente a
 contenere il nome del file, e questa è la ragione principale per cui questa
 funzione è deprecata.
@@ -396,87 +293,29 @@ riferirsi ad esse tramite il file descriptor dell'interfaccia a basso livello,
 e non solo tramite il filename; per questo motivo ci sono due diverse funzioni
 per cambiare directory di lavoro.
 
-\begin{itemize}
-\item \texttt{int chdir (const char * pathname)}
-  
+\begin{prototype}{unistd.h}{int chdir (const char * pathname)}
   Come dice il nome (che significa \textit{change directory}) questa funzione
-  serve a cambiare la directory di lavoro a quella speficata dal pathname
+  serve a cambiare la directory di lavoro a quella specificata dal pathname
   contenuto nella stringa \texttt{pathname}.
+\end{prototype}
   
-\item \texttt{int fchdir (int filedes)} analoga alla precedente, ma usa un
-  file descriptor invece del pathname.
-
+\begin{prototype}{unistd.h}{int fchdir (int filedes)} 
+  Analoga alla precedente, ma usa un file descriptor invece del pathname.
   
   Entrambe le funzioni restituiscono zero in caso di successo e -1 per un
   errore, in caso di errore \texttt{errno} viene settata secondo i codici di
   errore standard di accesso ai files (trattati in dettaglio in
-  \ref{sec:filedir_access_control}) ai quali si aggiunge il codice
+  \secref{sec:filedir_access_control}) ai quali si aggiunge il codice
   \texttt{ENOTDIR} nel caso il \texttt{filename} indichi un file che non sia
   una directory.
-\end{itemize}
-
-
-
-
-
-\section{La manipolazione delle caratteristiche dei files}
-\label{sec:filedir_infos}
-
-
-Si ricordi che in unix non esistono i tipi di file e che non c'è nessun
-supporto per le estensioni come parte del filesystem. Ciò non ostante molti
-programmi adottano delle convenzioni per i nomi dei file, ad esempio il codice
-C normalmente si mette in file con l'estensione .c, ma questa è, appunto, solo
-una convenzione.
-
-
-\subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}}
-\label{sec:filedir_stat}
-
-\subsection{I tipi di file}
-\label{sec:filedir_file_types}
-
-\subsection{La dimensione dei file}
-\label{sec:filedir_file_size}
+\end{prototype}
 
-\subsection{I tempi dei file}
-\label{sec:filedir_file_times}
-
-\subsection{La funzione \texttt{utime}}
-\label{sec:filedir_utime}
-
-
-
-\section{Il controllo di accesso ai file}
-\label{sec:filedir_access_control}
-
-
-\subsection{I flag \texttt{suid} e \texttt{sgid}}
-\label{sec:filedir_suid_sgid}
-
-\subsection{La titolarità di nuovi files e directory}
-\label{sec:filedir_ownership}
-
-\subsection{La funzione \texttt{access}}
-\label{sec:filedir_access}
-
-\subsection{La funzione \texttt{umask}}
-\label{sec:filedir_umask}
-
-\subsection{Le funzioni \texttt{chmod} e \texttt{fchmod}}
-\label{sec:filedir_chmod}
-
-\subsection{Il flag \texttt{stiky}}
-\label{sec:filedir_stiky}
-
-\subsection{Le funzioni \texttt{chown}, \texttt{fchown} e \texttt{lchown}}
-\label{sec:filedir_chown}
 
 
 
 %La struttura fondamentale che contiene i dati essenziali relativi ai file è il
 %cosiddetto \textit{inode}; questo conterrà informazioni come il
 %tipo di file (file di dispositivo, directory, file di dati, per un elenco
-%completo vedi \ntab), i permessi (vedi \ref{sec:file_perms}), le date (vedi
-%\ref{sec:file_times}).
+%completo vedi \ntab), i permessi (vedi \secref{sec:file_perms}), le date (vedi
+%\secref{sec:file_times}).