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
\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
\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.
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} 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}
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}{sys/stat.h}
+\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
\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}