Modificate due righe.
[gapil.git] / filedir.tex
index 8f64ac0fa656e4ab8e49d2a4cfc241ec00724d5e..cf928fc21cc347155c99d76b14f332075def4910 100644 (file)
@@ -3,16 +3,12 @@
 
 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
+la struttura dei files in un sistema unix, 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 è
 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}
@@ -67,7 +63,7 @@ la directory che contiene il riferimento alla directory corrente; nel caso
 questa sia la directory radice allora il riferimento è a se stessa.
 
 
-\section{L'architettura di gestione dei file}
+\section{L'architettura della gestione dei file}
 \label{sec:filedir_file_handling}
 
 Per capire fino in fondo le proprietà di files e directories in un sistema
@@ -202,8 +198,7 @@ principali, come risultano dalla man page, sono le seguenti:
   \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} non sono sullo
     stesso filesystem.
   \item \texttt{EPERM} il filesystem che contiene \texttt{oldpath} e
-    \texttt{newpath} non supporta i link diretti, oppure \texttt{oldpath} è
-    una directory.
+    \texttt{newpath} non supporta i link diretti o è una directory.
   \item \texttt{EFAULT} una delle stringhe passate come parametri è fuori
     dello spazio di indirizzi del processo.
   \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o
@@ -268,10 +263,13 @@ effettua con la funzione \texttt{unlink}; il suo prototipo 
   \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o
     per attraversare le directories), vedi \secref{sec:filedir_access_control}
     per i dettagli.
-  \item \texttt{EPERM} il filesystem che contiene \texttt{pathname} non
-    consente l'operazione.
-  \item \texttt{EFAULT} la stringa passata come parametro è fuori dello spazio
-    di indirizzi del processo.
+  \item \texttt{EISDIR} \texttt{pathname} si riferisce ad una directory
+    (valore specifico ritornato da linux che non consente l'uso di
+    \texttt{unlink} con le directory, e non conforme allo standard POSIX, che
+    prescrive invece l'uso di \texttt{EPERM} in caso l'operazione non sia
+    consnetita o il processo non abbia privilegi sufficienti).
+  \item \texttt{EFAULT} la stringa
+    passata come parametro è fuori dello spazio di indirizzi del processo.
   \item \texttt{ENAMETOOLONG} il pathname troppo lungo.
   \item \texttt{ENOENT} uno dei componenti del pathname non esiste o è un link
     simbolico spezzato.
@@ -344,29 +342,43 @@ nuovo nome dopo che il vecchio 
   qual caso il file non viene toccato. La variabile \texttt{errno} viene
   settata secondo i seguenti codici di errore:
   \begin{errlist} 
-  \item \texttt{EFAULT} la stringa \texttt{filename} è fuori dello spazio di
-    indirizzi del processo.
+  \item \texttt{EISDIR} \texttt{newpath} è una directory già esistente mentre
+    \texttt{oldpath} non è una directory. 
+  \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} non sono sullo
+    stesso filesystem. 
+  \item \texttt{ENOTEMPTY} \texttt{newpath} è una directory già esistente e
+    non vuota.
+  \item \texttt{EBUSY} o \texttt{oldpath} o \texttt{newpath} sono in uso da
+    parte di qualche processo (come directory di lavoro o come root) o del
+    sistema (come mount point).
+  \item \texttt{EINVAL} \texttt{newpath} contiene un prefisso di
+    \texttt{oldpath} o più in generale si è cercato di creare una directory
+    come sottodirectory di se stessa.
+  \item \texttt{EMLINK} \texttt{oldpath} ha già il massimo numero di link
+    consentiti o è una directory e la directory che contiene \texttt{newpath}
+    ha già il massimo numero di link. 
+  \item \texttt{ENOTDIR} Uno dei componenti dei pathname non è una directory
+    o\texttt{oldpath} è una directory e \texttt{newpath} esiste e non è una
+    directory.
+  \item \texttt{EFAULT} o \texttt{oldpath} o \texttt{newpath} è fuori dello
+    spazio di indirizzi del processo.
   \item \texttt{EACCESS} Non c'è il permesso di scrittura per la directory in
     cui si vuole creare il nuovo link o una delle directory del pathname non
     consente la ricerca (permesso di esecuzione).
-  \item \texttt{EPERM} il pathname indica una directory o il filesystem che
-    contiene \texttt{filename} non consente l'operazione.
-  \item \texttt{EROFS} I file sono su un filesystem montato in sola lettura.
-  \item \texttt{ENAMETOOLONG} il pathname è troppo lungo.
+  \item \texttt{EPERM} le directory contenenti \texttt{oldpath} o
+    \texttt{newpath} hanno lo sticky bit attivo e i permessi del processo non
+    consentono rispettivamente la cancellazione e la creazione del file, o il
+    filesystem non supporta i link.
+  \item \texttt{ENAMETOOLONG} uno dei pathname è troppo lungo.
   \item \texttt{ENOENT} Uno dei componenti del pathname non esiste o è un link
     simbolico spezzato.
-  \item \texttt{ENOTDIR} Uno dei componenti del pathname non è una directory.
-  \item \texttt{ENOMEM} Memoria insufficiente nel kernel.
+  \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
+    completare l'operazione. 
+  \item \texttt{EROFS} I file sono su un filesystem montato in sola lettura.
   \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione del
     pathname.
-  \item \texttt{EISDIR} 
-  \item \texttt{EXDEV} 
-  \item \texttt{ENOTEMPTY} 
-  \item \texttt{EBUSY} 
-  \item \texttt{EINVAL} 
-  \item \texttt{EMLINK} 
-  \item \texttt{ENOSPC} 
-
+  \item \texttt{ENOSPC} Il device di destinazione non ha più spazio per la
+    nuova voce. 
   \end{errlist}    
 \end{prototype}
 
@@ -430,7 +442,6 @@ questa funzione 
   \texttt{buff} di dimensione \texttt{size}. Non chiude la stringa con un
   carattere nullo e la tronca a \texttt{size} nel caso il buffer sia troppo
   piccolo per contenerla.
-
   
   La funzione restituisce il numero di caratteri letti dentro \texttt{buff} o
   -1 per un errore, in caso di errore. La variabile \texttt{errno} viene
@@ -448,6 +459,99 @@ questa funzione 
 \end{prototype}
 
 
+\section{La manipolazione delle caratteristiche dei files}
+\label{sec:filedir_infos}
+
+Come spiegato in \secref{sec:filedir_file_handling} 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}.
+
+
+\subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}}
+\label{sec:filedir_stat}
+
+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 \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}[!htbp]
+  \footnotesize
+  \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}
+  \caption{La struttura \texttt{stat} per la lettura delle informazioni dei 
+    file}
+  \label{fig:sock_sa_gen_struct}
+\end{figure}
+
+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}
 
@@ -474,7 +578,6 @@ questa funzione 
 \label{sec:filedir_chown}
 
 
-
 \section{La manipolazione delle directories}
 \label{sec:filedir_dir_handling}
 
@@ -610,26 +713,6 @@ per cambiare directory di lavoro.
 \end{prototype}
 
 
-\section{La manipolazione delle caratteristiche dei files}
-\label{sec:filedir_infos}
-
-
-\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}
-
-\subsection{I tempi dei file}
-\label{sec:filedir_file_times}
-
-\subsection{La funzione \texttt{utime}}
-\label{sec:filedir_utime}
-
-
 
 
 %La struttura fondamentale che contiene i dati essenziali relativi ai file è il