X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filedir.tex;h=cf928fc21cc347155c99d76b14f332075def4910;hb=eb318a83679841eada97ff880e361b5a5f62bb02;hp=8f64ac0fa656e4ab8e49d2a4cfc241ec00724d5e;hpb=66765a9be9a61085dd00abd92d99a24b23dc844b;p=gapil.git diff --git a/filedir.tex b/filedir.tex index 8f64ac0..cf928fc 100644 --- a/filedir.tex +++ b/filedir.tex @@ -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