X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filedir.tex;h=04eef2a533beb608d196dca9a718924bca81b744;hb=a48e8dfeb4b05b57eab2336c7d2e0aaf6b9bd572;hp=239c9950e51c5db9d8bcdc0ef509dbf7e1858d35;hpb=ff76d56c6a2c280cbe4f153173488871d7b12336;p=gapil.git diff --git a/filedir.tex b/filedir.tex index 239c995..04eef2a 100644 --- a/filedir.tex +++ b/filedir.tex @@ -8,6 +8,7 @@ %% license is included in the section entitled "GNU Free Documentation %% License". %% + \chapter{File e directory} \label{cha:files_and_dirs} @@ -78,8 +79,8 @@ suole chiamare questo tipo di associazione un collegamento diretto (o \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di errore nel qual caso \var{errno} viene impostata ai valori: \begin{errlist} - \item[\errcode{EXDEV}] \param{oldpath} e \param{newpath} non sono sullo - stesso filesystem. + \item[\errcode{EXDEV}] i file \param{oldpath} e \param{newpath} non sono + sullo stesso filesystem. \item[\errcode{EPERM}] il filesystem che contiene \param{oldpath} e \param{newpath} non supporta i link diretti o è una directory. \item[\errcode{EEXIST}] un file (o una directory) con quel nome esiste di @@ -255,7 +256,7 @@ nello stesso filesystem) si usa invece la funzione \funcd{rename},\footnote{la \item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di \param{oldpath} o più in generale si è cercato di creare una directory come sotto-directory di se stessa. - \item[\errcode{ENOTDIR}] Uno dei componenti dei \itindex{pathname} + \item[\errcode{ENOTDIR}] uno dei componenti dei \itindex{pathname} \textit{pathname} non è una directory o \param{oldpath} è una directory e \param{newpath} esiste e non è una directory. \end{errlist} @@ -429,10 +430,9 @@ buffer, e lo richiude. Si tenga presente che la funzione non termina la stringa con un carattere nullo e la tronca alla dimensione specificata da \param{size} per evitare di sovrascrivere oltre le dimensioni del buffer. - \begin{figure}[htb] \centering - \includegraphics[width=9cm]{img/link_loop} + \includegraphics[width=8.5cm]{img/link_loop} \caption{Esempio di loop nel filesystem creato con un link simbolico.} \label{fig:file_link_loop} \end{figure} @@ -486,10 +486,10 @@ ci mostrerebbe invece l'esistenza di \file{temporaneo}. Benché in sostanza le directory non siano altro che dei file contenenti elenchi di nomi ed \index{inode} inode, non è possibile trattarle come file ordinari e devono essere create direttamente dal kernel attraverso una -opportuna system call.\footnote{questo permette anche, attraverso l'uso del - VFS, l'utilizzo di diversi formati per la gestione dei suddetti elenchi.} -La funzione usata per creare una directory è \funcd{mkdir}, ed il suo -prototipo è: +opportuna system call.\footnote{questo è quello che permette anche, attraverso + l'uso del VFS, l'utilizzo di diversi formati per la gestione dei suddetti + elenchi.} La funzione usata per creare una directory è \funcd{mkdir}, ed il +suo prototipo è: \begin{functions} \headdecl{sys/stat.h} \headdecl{sys/types.h} @@ -500,18 +500,17 @@ prototipo \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[\errcode{EEXIST}] Un file (o una directory) con quel nome esiste di + \item[\errcode{EEXIST}] un file (o una directory) con quel nome esiste di già. - \item[\errcode{EACCES}] - Non c'è il permesso di scrittura per la directory in cui si vuole inserire - la nuova directory. - \item[\errcode{EMLINK}] La directory in cui si vuole creare la nuova - directory contiene troppi file. Sotto Linux questo normalmente non avviene + \item[\errcode{EACCES}] non c'è il permesso di scrittura per la directory in + cui si vuole inserire la nuova directory. + \item[\errcode{EMLINK}] la directory in cui si vuole creare la nuova + directory 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 nel disco, ma potendo avere a che fare anche con filesystem di altri sistemi questo errore può presentarsi. - \item[\errcode{ENOSPC}] Non c'è abbastanza spazio sul file system per creare + \item[\errcode{ENOSPC}] non c'è abbastanza spazio sul file system per creare la nuova directory o si è esaurita la quota disco dell'utente. \end{errlist} ed inoltre anche \errval{EPERM}, \errval{EFAULT}, \errval{ENAMETOOLONG}, @@ -520,44 +519,46 @@ prototipo \end{functions} La funzione crea una nuova directory vuota, che contiene cioè solo le due voci -standard (\file{.} e \file{..}), con il nome indicato dall'argomento -\param{dirname}. Il nome può essere indicato sia come \itindex{pathname} -\textit{pathname} assoluto che relativo. - -I permessi di accesso alla directory (vedi sez.~\ref{sec:file_access_control}) -sono specificati da \param{mode}, i cui possibili valori sono riportati in -tab.~\ref{tab:file_permission_const}; questi sono modificati dalla maschera di -creazione dei file (si veda sez.~\ref{sec:file_perm_management}). La -titolarità della nuova directory è impostata secondo quanto riportato in +standard presenti in ogni directory (cioè ``\file{.}'' e ``\file{..}''), con +il nome indicato dall'argomento \param{dirname}. Il nome può essere indicato +sia come \itindex{pathname} \textit{pathname} assoluto che come +\itindex{pathname} \textit{pathname} relativo. + +I permessi di accesso (vedi sez.~\ref{sec:file_access_control}) con cui la +directory viene creata sono specificati dall'argomento \param{mode}, i cui +possibili valori sono riportati in tab.~\ref{tab:file_permission_const}; si +tenga presente che questi sono modificati dalla maschera di creazione dei file +(si veda sez.~\ref{sec:file_perm_management}). La titolarità della nuova +directory è impostata secondo quanto riportato in sez.~\ref{sec:file_ownership_management}. -La funzione per la cancellazione di una directory è \funcd{rmdir}, il suo -prototipo è: +La funzione che permette la cancellazione di una directory è invece +\funcd{rmdir}, ed il suo prototipo è: \begin{prototype}{sys/stat.h}{int rmdir(const char *dirname)} Cancella una directory. \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[\errcode{EPERM}] Il filesystem non supporta la cancellazione di + \item[\errcode{EPERM}] il filesystem non supporta la cancellazione di directory, oppure la directory che contiene \param{dirname} ha lo \itindex{sticky~bit} \textit{sticky bit} impostato e l'user-ID effettivo del processo non corrisponde al proprietario della directory. - \item[\errcode{EACCES}] Non c'è il permesso di scrittura per la directory + \item[\errcode{EACCES}] non c'è il permesso di scrittura per la directory che contiene la directory che si vuole cancellare, o non c'è il permesso di attraversare (esecuzione) una delle directory specificate in \param{dirname}. - \item[\errcode{EBUSY}] La directory specificata è la directory di lavoro o la + \item[\errcode{EBUSY}] la directory specificata è la directory di lavoro o la radice di qualche processo. - \item[\errcode{ENOTEMPTY}] La directory non è vuota. + \item[\errcode{ENOTEMPTY}] la directory non è vuota. \end{errlist} ed inoltre anche \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP}, \errval{EROFS}.} \end{prototype} La funzione cancella la directory \param{dirname}, che deve essere vuota (la -directory deve cioè contenere soltanto le due voci standard \file{.} e -\file{..}). Il nome può essere indicato con il \itindex{pathname} +directory deve cioè contenere soltanto le due voci standard ``\file{.}'' e +``\file{..}''). Il nome può essere indicato con il \itindex{pathname} \textit{pathname} assoluto o relativo. La modalità con cui avviene la cancellazione è analoga a quella di @@ -565,8 +566,8 @@ La modalit 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 \index{inode} all'inode e nel caso sia l'ultimo, -pure le voci standard \file{.} e \file{..}, a questo punto il kernel non -consentirà di creare più nuovi file nella directory. +pure le voci standard ``\file{.}'' e ``\file{..}'', a questo punto il kernel +non consentirà di creare più nuovi file nella directory. \subsection{La creazione di file speciali} @@ -594,10 +595,10 @@ di queste funzioni \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[\errcode{EPERM}] Non si hanno privilegi sufficienti a creare l'inode, o + \item[\errcode{EPERM}] non si hanno privilegi sufficienti a creare l'inode, o il filesystem su cui si è cercato di creare \param{pathname} non supporta l'operazione. - \item[\errcode{EINVAL}] Il valore di \param{mode} non indica un file, una + \item[\errcode{EINVAL}] il valore di \param{mode} non indica un file, una fifo o un dispositivo. \item[\errcode{EEXIST}] \param{pathname} esiste già o è un link simbolico. \end{errlist} @@ -774,16 +775,16 @@ struttura precedentemente allocata e specificata dall'argomento \param{entry} (anche se non è assicurato che la funzione usi lo spazio fornito dall'utente). I vari campi di \struct{dirent} contengono le informazioni relative alle voci -presenti nella directory; sia BSD che SVr4\footnote{POSIX prevede invece solo - la presenza del campo \var{d\_fileno}, identico \var{d\_ino}, che in Linux è - definito come alias di quest'ultimo. Il campo \var{d\_name} è considerato - dipendente dall'implementazione.} prevedono che siano sempre presenti il -campo \var{d\_name}, che contiene il nome del file nella forma di una stringa -terminata da uno zero,\footnote{lo standard POSIX non specifica una lunghezza, - ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del campo è - definita come \code{NAME\_MAX+1} che di norma porta al valore di 256 byte - usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero di -\index{inode} inode cui il file è associato (di solito corrisponde al campo +presenti nella directory; sia BSD che SVr4\footnote{lo standard POSIX prevede + invece solo la presenza del campo \var{d\_fileno}, identico \var{d\_ino}, + che in Linux è definito come alias di quest'ultimo. Il campo \var{d\_name} è + considerato dipendente dall'implementazione.} prevedono che siano sempre +presenti il campo \var{d\_name}, che contiene il nome del file nella forma di +una stringa terminata da uno zero,\footnote{lo standard POSIX non specifica + una lunghezza, ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del + campo è definita come \code{NAME\_MAX+1} che di norma porta al valore di 256 + byte usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero +di \index{inode} inode cui il file è associato (di solito corrisponde al campo \var{st\_ino} di \struct{stat}). \begin{figure}[!htb] @@ -808,16 +809,16 @@ il nome del relativo campo; nel nostro caso sono definite le macro \footnotesize \begin{tabular}[c]{|l|l|} \hline - \textbf{Valore} & \textbf{Significato} \\ + \textbf{Valore} & \textbf{Tipo di file} \\ \hline \hline - \const{DT\_UNKNOWN} & tipo sconosciuto. \\ - \const{DT\_REG} & file normale. \\ - \const{DT\_DIR} & directory. \\ - \const{DT\_FIFO} & fifo. \\ - \const{DT\_SOCK} & socket. \\ - \const{DT\_CHR} & dispositivo a caratteri. \\ - \const{DT\_BLK} & dispositivo a blocchi. \\ + \const{DT\_UNKNOWN} & Tipo sconosciuto.\\ + \const{DT\_REG} & File normale.\\ + \const{DT\_DIR} & Directory.\\ + \const{DT\_FIFO} & Fifo.\\ + \const{DT\_SOCK} & Socket.\\ + \const{DT\_CHR} & Dispositivo a caratteri.\\ + \const{DT\_BLK} & Dispositivo a blocchi.\\ \hline \end{tabular} \caption{Costanti che indicano i vari tipi di file nel campo \var{d\_type} @@ -828,11 +829,11 @@ il nome del relativo campo; nel nostro caso sono definite le macro Per quanto riguarda il significato dei campi opzionali, il campo \var{d\_type} indica il tipo di file (fifo, directory, link simbolico, ecc.); i suoi possibili valori\footnote{fino alla versione 2.1 delle \acr{glibc} questo - campo, pur presente nella struttura, non è implementato, e resta sempre al + campo, pur presente nella struttura, non era implementato, e resta sempre al valore \const{DT\_UNKNOWN}.} sono riportati in -tab.~\ref{tab:file_dtype_macro}; per la conversione da e verso l'analogo valore -mantenuto dentro il campo \var{st\_mode} di \struct{stat} sono definite anche -due macro di conversione \macro{IFTODT} e \macro{DTTOIF}: +tab.~\ref{tab:file_dtype_macro}; per la conversione da e verso l'analogo +valore mantenuto dentro il campo \var{st\_mode} di \struct{stat} sono definite +anche due macro di conversione \macro{IFTODT} e \macro{DTTOIF}: \begin{functions} \funcdecl{int IFTODT(mode\_t MODE)} Converte il tipo di file dal formato di \var{st\_mode} a quello di \var{d\_type}. @@ -897,7 +898,7 @@ ed ordinamento) del contenuto di una directory; la funzione \funcd{scandir}\footnote{in Linux questa funzione è stata introdotta fin dalle libc4.} ed il suo prototipo è: \begin{prototype}{dirent.h}{int scandir(const char *dir, - struct dirent ***namelist, int(*select)(const struct dirent *), + struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const struct dirent **, const struct dirent **))} Esegue una scansione di un \textit{directory stream}. @@ -909,27 +910,33 @@ ed ordinamento) del contenuto di una directory; la funzione Al solito, per la presenza fra gli argomenti di due puntatori a funzione, il prototipo non è molto comprensibile; queste funzioni però sono quelle che controllano rispettivamente la selezione di una voce (quella passata con -l'argomento \param{select}) e l'ordinamento di tutte le voci selezionate +l'argomento \param{filter}) e l'ordinamento di tutte le voci selezionate (quella specificata dell'argomento \param{compar}). La funzione legge tutte le voci della directory indicata dall'argomento -\param{dir}, passando ciascuna di esse (una struttura \struct{dirent}) come -argomento della funzione di selezione specificata da \param{select}; se questa -ritorna un valore diverso da zero la voce viene inserita in un vettore che -viene allocato dinamicamente con \func{malloc}. Qualora si specifichi un -valore \val{NULL} per \func{select} vengono selezionate tutte le voci. +\param{dir}, passando un puntatore a ciascuna di esse (una struttura +\struct{dirent}) come argomento della funzione di selezione specificata da +\param{filter}; se questa ritorna un valore diverso da zero il puntatore viene +inserito in un vettore che viene allocato dinamicamente con \func{malloc}. +Qualora si specifichi un valore \val{NULL} per l'argomento \func{filter} non +viene fatta nessuna selezione e si ottengono tutte le voci presenti. Le voci selezionate possono essere riordinate tramite \func{qsort}, le modalità del riordinamento possono essere personalizzate usando la funzione -\param{compar} come criterio di ordinamento di\func{qsort}, la funzione prende -come argomenti le due strutture \struct{dirent} da confrontare restituendo un -valore positivo, nullo o negativo per indicarne l'ordinamento; alla fine -l'indirizzo della lista delle strutture \struct{dirent} così ordinate viene -restituito nell'argomento \param{namelist}. - -Per l'ordinamento (vale a dire come valori possibili per l'argomento -\param{compar}) sono disponibili anche due funzioni predefinite, -\funcd{alphasort} e \funcd{versionsort}, i cui prototipi sono: +\param{compar} come criterio di ordinamento di \func{qsort}, la funzione +prende come argomenti le due strutture \struct{dirent} da confrontare +restituendo un valore positivo, nullo o negativo per indicarne l'ordinamento; +alla fine l'indirizzo della lista ordinata dei puntatori alle strutture +\struct{dirent} viene restituito nell'argomento +\param{namelist}.\footnote{la funzione alloca automaticamente la lista, e + restituisce, come \itindex{value~result~argument} \textit{value result + argument}, l'indirizzo della stessa; questo significa che \param{namelist} + deve essere dichiarato come \code{struct dirent **namelist} ed alla funzione + si deve passare il suo indirizzo.} + +Per l'ordinamento, vale a dire come valori possibili per l'argomento +\param{compar} sono disponibili due funzioni predefinite, \funcd{alphasort} e +\funcd{versionsort}, i cui prototipi sono: \begin{functions} \headdecl{dirent.h} @@ -1076,11 +1083,11 @@ prototipo \val{NULL} se fallisce, in quest'ultimo caso la variabile \var{errno} è impostata con i seguenti codici di errore: \begin{errlist} - \item[\errcode{EINVAL}] L'argomento \param{size} è zero e \param{buffer} non + \item[\errcode{EINVAL}] l'argomento \param{size} è zero e \param{buffer} non è nullo. - \item[\errcode{ERANGE}] L'argomento \param{size} è più piccolo della + \item[\errcode{ERANGE}] l'argomento \param{size} è più piccolo della lunghezza del \textit{pathname}. - \item[\errcode{EACCES}] Manca il permesso di lettura o di ricerca su uno dei + \item[\errcode{EACCES}] manca il permesso di lettura o di ricerca su uno dei componenti del \textit{pathname} (cioè su una delle directory superiori alla corrente). \end{errlist}} @@ -1127,8 +1134,8 @@ Per cambiare la directory di lavoro si pu \bodydesc{La funzione restituisce 0 in caso di successo e -1 per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{ENOTDIR}] Non si è specificata una directory. - \item[\errcode{EACCES}] Manca il permesso di ricerca su uno dei componenti + \item[\errcode{ENOTDIR}] non si è specificata una directory. + \item[\errcode{EACCES}] manca il permesso di ricerca su uno dei componenti di \param{path}. \end{errlist} ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, @@ -1234,8 +1241,8 @@ POSIX definisce la funzione \funcd{tmpfile}, il cui prototipo temporaneo in caso di successo e \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale. - \item[\errcode{EEXIST}] Non è stato possibile generare un nome univoco. + \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale. + \item[\errcode{EEXIST}] non è stato possibile generare un nome univoco. \end{errlist} ed inoltre \errval{EFAULT}, \errval{EMFILE}, \errval{ENFILE}, \errval{ENOSPC}, \errval{EROFS} e \errval{EACCES}.} @@ -1416,13 +1423,13 @@ riportato in tab.~\ref{tab:file_type_macro}. \textbf{Macro} & \textbf{Tipo del file} \\ \hline \hline - \macro{S\_ISREG(m)} & file regolare \\ - \macro{S\_ISDIR(m)} & directory \\ - \macro{S\_ISCHR(m)} & dispositivo a caratteri \\ - \macro{S\_ISBLK(m)} & dispositivo a blocchi\\ - \macro{S\_ISFIFO(m)} & fifo \\ - \macro{S\_ISLNK(m)} & link simbolico \\ - \macro{S\_ISSOCK(m)} & socket \\ + \macro{S\_ISREG(m)} & File normale.\\ + \macro{S\_ISDIR(m)} & Directory.\\ + \macro{S\_ISCHR(m)} & Dispositivo a caratteri.\\ + \macro{S\_ISBLK(m)} & Dispositivo a blocchi.\\ + \macro{S\_ISFIFO(m)} & Fifo.\\ + \macro{S\_ISLNK(m)} & Link simbolico.\\ + \macro{S\_ISSOCK(m)} & Socket.\\ \hline \end{tabular} \caption{Macro per i tipi di file (definite in \texttt{sys/stat.h}).} @@ -1449,33 +1456,33 @@ un'opportuna combinazione. \textbf{Flag} & \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \const{S\_IFMT} & 0170000 & maschera per i bit del tipo di file \\ - \const{S\_IFSOCK} & 0140000 & socket \\ - \const{S\_IFLNK} & 0120000 & link simbolico \\ - \const{S\_IFREG} & 0100000 & file regolare \\ - \const{S\_IFBLK} & 0060000 & dispositivo a blocchi \\ - \const{S\_IFDIR} & 0040000 & directory \\ - \const{S\_IFCHR} & 0020000 & dispositivo a caratteri \\ - \const{S\_IFIFO} & 0010000 & fifo \\ + \const{S\_IFMT} & 0170000 & Maschera per i bit del tipo di file.\\ + \const{S\_IFSOCK} & 0140000 & Socket.\\ + \const{S\_IFLNK} & 0120000 & Link simbolico.\\ + \const{S\_IFREG} & 0100000 & File regolare.\\ + \const{S\_IFBLK} & 0060000 & Dispositivo a blocchi.\\ + \const{S\_IFDIR} & 0040000 & Directory.\\ + \const{S\_IFCHR} & 0020000 & Dispositivo a caratteri.\\ + \const{S\_IFIFO} & 0010000 & Fifo.\\ \hline - \const{S\_ISUID} & 0004000 & set UID bit \itindex{suid~bit} \\ - \const{S\_ISGID} & 0002000 & set GID bit \itindex{sgid~bit} \\ - \const{S\_ISVTX} & 0001000 & sticky bit \itindex{sticky~bit}\\ + \const{S\_ISUID} & 0004000 & Set UID bit \itindex{suid~bit}.\\ + \const{S\_ISGID} & 0002000 & Set GID bit \itindex{sgid~bit}.\\ + \const{S\_ISVTX} & 0001000 & Sticky bit \itindex{sticky~bit}.\\ \hline -% \const{S\_IRWXU} & 00700 & bitmask per i permessi del proprietario \\ - \const{S\_IRUSR} & 00400 & il proprietario ha permesso di lettura \\ - \const{S\_IWUSR} & 00200 & il proprietario ha permesso di scrittura \\ - \const{S\_IXUSR} & 00100 & il proprietario ha permesso di esecuzione\\ +% \const{S\_IRWXU} & 00700 & Bitmask per i permessi del proprietario.\\ + \const{S\_IRUSR} & 00400 & Il proprietario ha permesso di lettura.\\ + \const{S\_IWUSR} & 00200 & Il proprietario ha permesso di scrittura.\\ + \const{S\_IXUSR} & 00100 & Il proprietario ha permesso di esecuzione.\\ \hline -% \const{S\_IRWXG} & 00070 & bitmask per i permessi del gruppo \\ - \const{S\_IRGRP} & 00040 & il gruppo ha permesso di lettura \\ - \const{S\_IWGRP} & 00020 & il gruppo ha permesso di scrittura \\ - \const{S\_IXGRP} & 00010 & il gruppo ha permesso di esecuzione \\ +% \const{S\_IRWXG} & 00070 & Bitmask per i permessi del gruppo.\\ + \const{S\_IRGRP} & 00040 & Il gruppo ha permesso di lettura.\\ + \const{S\_IWGRP} & 00020 & Il gruppo ha permesso di scrittura.\\ + \const{S\_IXGRP} & 00010 & Il gruppo ha permesso di esecuzione.\\ \hline -% \const{S\_IRWXO} & 00007 & bitmask per i permessi di tutti gli altri\\ - \const{S\_IROTH} & 00004 & gli altri hanno permesso di lettura \\ - \const{S\_IWOTH} & 00002 & gli altri hanno permesso di esecuzione \\ - \const{S\_IXOTH} & 00001 & gli altri hanno permesso di esecuzione \\ +% \const{S\_IRWXO} & 00007 & Bitmask per i permessi di tutti gli altri\\ + \const{S\_IROTH} & 00004 & Gli altri hanno permesso di lettura.\\ + \const{S\_IWOTH} & 00002 & Gli altri hanno permesso di esecuzione.\\ + \const{S\_IXOTH} & 00001 & Gli altri hanno permesso di esecuzione.\\ \hline \end{tabular} \caption{Costanti per l'identificazione dei vari bit che compongono il campo @@ -1550,7 +1557,7 @@ dimensione si possono usare le due funzioni \funcd{truncate} e \item[\errcode{EACCES}] il file non ha permesso di scrittura o non si ha il permesso di esecuzione una delle directory del \itindex{pathname} \textit{pathname}. - \item[\errcode{ETXTBSY}] Il file è un programma in esecuzione. + \item[\errcode{ETXTBSY}] il file è un programma in esecuzione. \end{errlist} ed anche \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{EROFS}, \errval{EIO}, \errval{EFAULT}, \errval{ELOOP}.} @@ -1583,12 +1590,12 @@ funzioni che effettuano cambiamenti su di essi. & \textbf{Opzione di \cmd{ls}} \\ \hline \hline - \var{st\_atime}& ultimo accesso ai dati del file &\func{read}, - \func{utime} & \cmd{-u}\\ - \var{st\_mtime}& ultima modifica ai dati del file &\func{write}, - \func{utime} & default\\ - \var{st\_ctime}& ultima modifica ai dati dell'inode&\func{chmod}, - \func{utime} & \cmd{-c} \\ + \var{st\_atime}& ultimo accesso ai dati del file & + \func{read}, \func{utime} & \cmd{-u}\\ + \var{st\_mtime}& ultima modifica ai dati del file & + \func{write}, \func{utime} & default\\ + \var{st\_ctime}& ultima modifica ai dati dell'inode & + \func{chmod}, \func{utime} & \cmd{-c}\\ \hline \end{tabular} \caption{I tre tempi associati a ciascun file.} @@ -1612,13 +1619,6 @@ cancellare i file che non servono pi il programma \cmd{leafnode} cancella i vecchi articoli sulla base di questo tempo). -Il tempo di ultima modifica invece viene usato da \cmd{make} per decidere -quali file necessitano di essere ricompilati o (talvolta insieme anche al -tempo di cambiamento di stato) per decidere quali file devono essere -archiviati per il backup. Il comando \cmd{ls} (quando usato con le opzioni -\cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema riportato -nell'ultima colonna di tab.~\ref{tab:file_file_times}. - \begin{table}[htb] \centering \footnotesize @@ -1643,47 +1643,54 @@ nell'ultima colonna di tab.~\ref{tab:file_file_times}. \hline \hline \func{chmod}, \func{fchmod} - & -- & -- &$\bullet$& -- & -- & -- & \\ + & -- & -- &$\bullet$& -- & -- & -- &\\ \func{chown}, \func{fchown} - & -- & -- &$\bullet$& -- & -- & -- & \\ + & -- & -- &$\bullet$& -- & -- & -- &\\ + \func{creat} + &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& + con \const{O\_CREATE} \\ \func{creat} - &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& con - \const{O\_CREATE} \\ \func{creat} - & -- &$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& - con \const{O\_TRUNC} \\ \func{exec} - &$\bullet$& -- & -- & -- & -- & -- & \\ + & -- &$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& + con \const{O\_TRUNC} \\ + \func{exec} + &$\bullet$& -- & -- & -- & -- & -- &\\ \func{lchown} - & -- & -- &$\bullet$& -- & -- & -- & \\ + & -- & -- &$\bullet$& -- & -- & -- &\\ \func{link} - & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& \\ + & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$&\\ \func{mkdir} - &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& \\ + &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$&\\ \func{mkfifo} - &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& \\ + &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$&\\ \func{open} - &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& con - \const{O\_CREATE} \\ \func{open} - & -- &$\bullet$&$\bullet$& -- & -- & -- & con - \const{O\_TRUNC} \\ \func{pipe} - &$\bullet$&$\bullet$&$\bullet$& -- & -- & -- & \\ + &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& + con \const{O\_CREATE} \\ + \func{open} + & -- &$\bullet$&$\bullet$& -- & -- & -- & + con \const{O\_TRUNC} \\ + \func{pipe} + &$\bullet$&$\bullet$&$\bullet$& -- & -- & -- &\\ \func{read} - &$\bullet$& -- & -- & -- & -- & -- & \\ + &$\bullet$& -- & -- & -- & -- & -- &\\ + \func{remove} + & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& + se esegue \func{unlink}\\ \func{remove} - & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& se esegue - \func{unlink}\\ \func{remove} - & -- & -- & -- & -- &$\bullet$&$\bullet$& se esegue - \func{rmdir}\\ \func{rename} - & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& per entrambi - gli argomenti\\ \func{rmdir} - & -- & -- & -- & -- &$\bullet$&$\bullet$& \\ + & -- & -- & -- & -- &$\bullet$&$\bullet$& + se esegue \func{rmdir}\\ + \func{rename} + & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& + per entrambi gli argomenti\\ + \func{rmdir} + & -- & -- & -- & -- &$\bullet$&$\bullet$&\\ \func{truncate}, \func{ftruncate} - & -- &$\bullet$&$\bullet$& -- & -- & -- & \\ + & -- &$\bullet$&$\bullet$& -- & -- & -- &\\ \func{unlink} - & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& \\ + & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$&\\ \func{utime} - &$\bullet$&$\bullet$&$\bullet$& -- & -- & -- & \\ + &$\bullet$&$\bullet$&$\bullet$& -- & -- & -- &\\ \func{write} - & -- &$\bullet$&$\bullet$& -- & -- & -- & \\ + & -- &$\bullet$&$\bullet$& -- & -- & -- &\\ \hline \end{tabular} \caption{Prospetto dei cambiamenti effettuati sui tempi di ultimo @@ -1692,6 +1699,14 @@ nell'ultima colonna di tab.~\ref{tab:file_file_times}. \label{tab:file_times_effects} \end{table} + +Il tempo di ultima modifica invece viene usato da \cmd{make} per decidere +quali file necessitano di essere ricompilati o (talvolta insieme anche al +tempo di cambiamento di stato) per decidere quali file devono essere +archiviati per il backup. Il comando \cmd{ls} (quando usato con le opzioni +\cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema riportato +nell'ultima colonna di tab.~\ref{tab:file_file_times}. + L'effetto delle varie funzioni di manipolazione dei file sui tempi è illustrato in tab.~\ref{tab:file_times_effects}. Si sono riportati gli effetti sia per il file a cui si fa riferimento, sia per la directory che lo contiene; @@ -1769,7 +1784,7 @@ realizzare. Una delle caratteristiche fondamentali di tutti i sistemi unix-like è quella del controllo di accesso ai file, che viene implementato per qualunque filesystem standard.\footnote{per standard si intende che implementa le - caratteristiche previste dallo standard POSIX. In Linux sono disponibili + caratteristiche previste dallo standard POSIX; in Linux sono disponibili anche una serie di altri filesystem, come quelli di Windows e del Mac, che non supportano queste caratteristiche.} In questa sezione ne esamineremo i concetti essenziali e le funzioni usate per gestirne i vari aspetti. @@ -1783,7 +1798,7 @@ cosiddetto \textit{owner}) ed un gruppo di appartenenza, secondo il meccanismo degli identificatori di utente e gruppo (\acr{uid} e \acr{gid}). Questi valori sono accessibili da programma tramite la funzione \func{stat}, e sono mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura -\struct{stat} (si veda sez.~\ref{sec:file_stat}).\footnote{Questo è vero solo +\struct{stat} (si veda sez.~\ref{sec:file_stat}).\footnote{questo è vero solo per filesystem di tipo Unix, ad esempio non è vero per il filesystem vfat di Windows, che non fornisce nessun supporto per l'accesso multiutente, e per il quale i permessi vengono assegnati in maniera fissa con un opzione in @@ -1792,12 +1807,12 @@ mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura Il controllo di accesso ai file segue un modello abbastanza semplice che prevede tre permessi fondamentali strutturati su tre livelli di accesso. Esistono varie estensioni a questo modello,\footnote{come le \textit{Access - Control List} che possono essere aggiunte al filesystem standard con - opportune patch, la cui introduzione nei kernel ufficiali è iniziata con la - serie 2.5.x. per arrivare a meccanismi di controllo ancora più sofisticati - come il \textit{mandatory access control} di SE-Linux.} ma nella maggior -parte dei casi il meccanismo standard è più che sufficiente a soddisfare tutte -le necessità più comuni. I tre permessi di base associati ad ogni file sono: + Control List} che sono state aggiunte ai filesystem standard con opportune + estensioni (vedi sez.~\ref{sec:file_ACL}) per arrivare a meccanismi di + controllo ancora più sofisticati come il \textit{mandatory access control} + di SE-Linux.} ma nella maggior parte dei casi il meccanismo standard è più +che sufficiente a soddisfare tutte le necessità più comuni. I tre permessi di +base associati ad ogni file sono: \begin{itemize*} \item il permesso di lettura (indicato con la lettera \texttt{r}, dall'inglese \textit{read}). @@ -1857,17 +1872,17 @@ che permettono di accedere al valore numerico di questi bit nel campo \textbf{\var{st\_mode}} bit & \textbf{Significato} \\ \hline \hline - \const{S\_IRUSR} & \textit{user-read}, l'utente può leggere \\ - \const{S\_IWUSR} & \textit{user-write}, l'utente può scrivere \\ - \const{S\_IXUSR} & \textit{user-execute}, l'utente può eseguire \\ - \hline - \const{S\_IRGRP} & \textit{group-read}, il gruppo può leggere \\ - \const{S\_IWGRP} & \textit{group-write}, il gruppo può scrivere \\ - \const{S\_IXGRP} & \textit{group-execute}, il gruppo può eseguire\\ - \hline - \const{S\_IROTH} & \textit{other-read}, tutti possono leggere \\ - \const{S\_IWOTH} & \textit{other-write}, tutti possono scrivere \\ - \const{S\_IXOTH} & \textit{other-execute}, tutti possono eseguire\\ + \const{S\_IRUSR} & \textit{user-read}, l'utente può leggere.\\ + \const{S\_IWUSR} & \textit{user-write}, l'utente può scrivere.\\ + \const{S\_IXUSR} & \textit{user-execute}, l'utente può eseguire.\\ + \hline + \const{S\_IRGRP} & \textit{group-read}, il gruppo può leggere.\\ + \const{S\_IWGRP} & \textit{group-write}, il gruppo può scrivere.\\ + \const{S\_IXGRP} & \textit{group-execute}, il gruppo può eseguire.\\ + \hline + \const{S\_IROTH} & \textit{other-read}, tutti possono leggere.\\ + \const{S\_IWOTH} & \textit{other-write}, tutti possono scrivere.\\ + \const{S\_IXOTH} & \textit{other-execute}, tutti possono eseguire.\\ \hline \end{tabular} \caption{I bit dei permessi di accesso ai file, come definiti in @@ -2151,10 +2166,10 @@ contrario (o di errore) ritorna -1. \textbf{\param{mode}} & \textbf{Significato} \\ \hline \hline - \const{R\_OK} & verifica il permesso di lettura \\ - \const{W\_OK} & verifica il permesso di scritture \\ - \const{X\_OK} & verifica il permesso di esecuzione \\ - \const{F\_OK} & verifica l'esistenza del file \\ + \const{R\_OK} & Verifica il permesso di lettura. \\ + \const{W\_OK} & Verifica il permesso di scrittura. \\ + \const{X\_OK} & Verifica il permesso di esecuzione. \\ + \const{F\_OK} & Verifica l'esistenza del file. \\ \hline \end{tabular} \caption{Valori possibile per l'argomento \param{mode} della funzione @@ -2183,9 +2198,9 @@ filename e su un file descriptor, i loro prototipi sono: \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per un errore, in caso di errore \var{errno} può assumere i valori: \begin{errlist} - \item[\errcode{EPERM}] L'user-ID effettivo non corrisponde a quello del + \item[\errcode{EPERM}] l'user-ID effettivo non corrisponde a quello del proprietario del file o non è zero. - \item[\errcode{EROFS}] Il file è su un filesystem in sola lettura. + \item[\errcode{EROFS}] il file è su un filesystem in sola lettura. \end{errlist} ed inoltre \errval{EIO}; \func{chmod} restituisce anche \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, @@ -2205,24 +2220,24 @@ file. \textbf{\param{mode}} & \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \const{S\_ISUID} & 04000 & set user ID \itindex{suid~bit} \\ - \const{S\_ISGID} & 02000 & set group ID \itindex{sgid~bit}\\ - \const{S\_ISVTX} & 01000 & sticky bit \itindex{sticky~bit}\\ + \const{S\_ISUID} & 04000 & Set user ID \itindex{suid~bit}.\\ + \const{S\_ISGID} & 02000 & Set group ID \itindex{sgid~bit}.\\ + \const{S\_ISVTX} & 01000 & Sticky bit \itindex{sticky~bit}.\\ \hline - \const{S\_IRWXU} & 00700 & l'utente ha tutti i permessi \\ - \const{S\_IRUSR} & 00400 & l'utente ha il permesso di lettura \\ - \const{S\_IWUSR} & 00200 & l'utente ha il permesso di scrittura \\ - \const{S\_IXUSR} & 00100 & l'utente ha il permesso di esecuzione \\ + \const{S\_IRWXU} & 00700 & L'utente ha tutti i permessi.\\ + \const{S\_IRUSR} & 00400 & L'utente ha il permesso di lettura.\\ + \const{S\_IWUSR} & 00200 & L'utente ha il permesso di scrittura.\\ + \const{S\_IXUSR} & 00100 & L'utente ha il permesso di esecuzione.\\ \hline - \const{S\_IRWXG} & 00070 & il gruppo ha tutti i permessi \\ - \const{S\_IRGRP} & 00040 & il gruppo ha il permesso di lettura \\ - \const{S\_IWGRP} & 00020 & il gruppo ha il permesso di scrittura \\ - \const{S\_IXGRP} & 00010 & il gruppo ha il permesso di esecuzione \\ + \const{S\_IRWXG} & 00070 & Il gruppo ha tutti i permessi.\\ + \const{S\_IRGRP} & 00040 & Il gruppo ha il permesso di lettura.\\ + \const{S\_IWGRP} & 00020 & Il gruppo ha il permesso di scrittura.\\ + \const{S\_IXGRP} & 00010 & Il gruppo ha il permesso di esecuzione.\\ \hline - \const{S\_IRWXO} & 00007 & gli altri hanno tutti i permessi \\ - \const{S\_IROTH} & 00004 & gli altri hanno il permesso di lettura \\ - \const{S\_IWOTH} & 00002 & gli altri hanno il permesso di scrittura \\ - \const{S\_IXOTH} & 00001 & gli altri hanno il permesso di esecuzione \\ + \const{S\_IRWXO} & 00007 & Gli altri hanno tutti i permessi.\\ + \const{S\_IROTH} & 00004 & Gli altri hanno il permesso di lettura.\\ + \const{S\_IWOTH} & 00002 & Gli altri hanno il permesso di scrittura.\\ + \const{S\_IXOTH} & 00001 & Gli altri hanno il permesso di esecuzione.\\ \hline \end{tabular} \caption{Valori delle costanti usate per indicare i vari bit di @@ -2376,7 +2391,7 @@ sono: \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per un errore, in caso di errore \var{errno} può assumere i valori: \begin{errlist} - \item[\errcode{EPERM}] L'user-ID effettivo non corrisponde a quello del + \item[\errcode{EPERM}] l'user-ID effettivo non corrisponde a quello del proprietario del file o non è zero, o utente e gruppo non sono validi \end{errlist} Oltre a questi entrambe restituiscono gli errori \errval{EROFS} e @@ -2420,17 +2435,19 @@ riepilogo in cui si riassumono le caratteristiche di ciascuno di essi, in modo da poter fornire un quadro d'insieme. In tab.~\ref{tab:file_fileperm_bits} si sono riassunti gli effetti dei vari -bit per un file; per quanto riguarda l'applicazione dei permessi per -proprietario, gruppo ed altri si ricordi quanto illustrato in -sez.~\ref{sec:file_perm_overview}. Si rammenti che il valore dei permessi non -ha alcun effetto qualora il processo possieda i privilegi di amministratore. +bit dei permessi per un file; per quanto riguarda l'applicazione dei permessi +per proprietario, gruppo ed altri si ricordi quanto illustrato in +sez.~\ref{sec:file_perm_overview}. Per compattezza, nella tabelle si sono +specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit} +\textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la notazione +illustrata anche in fig.~\ref{fig:file_perm_bit}. \begin{table}[!htb] \centering \footnotesize \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|} \hline - \multicolumn{3}{|c|}{}& + \multicolumn{3}{|c|}{special}& \multicolumn{3}{|c|}{user}& \multicolumn{3}{|c|}{group}& \multicolumn{3}{|c|}{other}& @@ -2439,20 +2456,20 @@ ha alcun effetto qualora il processo possieda i privilegi di amministratore. \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\ \hline \hline - 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario\\ - -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario\\ - -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking} - \textit{mandatory locking} è abilitato\\ - -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato\\ - -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario\\ - -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario\\ - -&-&-&-&-&1&-&-&-&-&-&-&Permesso di esecuzione per il proprietario\\ - -&-&-&-&-&-&1&-&-&-&-&-&Permesso di lettura per il gruppo proprietario\\ - -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&1&-&-&-&Permesso di esecuzione per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&-&1&-&-&Permesso di lettura per tutti gli altri\\ - -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri \\ - -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri\\ + 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario.\\ + -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario.\\ + -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking} + \textit{mandatory locking} è abilitato.\\ + -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato.\\ + -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario.\\ + -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario.\\ + -&-&-&-&-&1&-&-&-&-&-&-&Permesso di esecuzione per il proprietario.\\ + -&-&-&-&-&-&1&-&-&-&-&-&Permesso di lettura per il gruppo proprietario.\\ + -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario.\\ + -&-&-&-&-&-&-&-&1&-&-&-&Permesso di esecuzione per il gruppo proprietario.\\ + -&-&-&-&-&-&-&-&-&1&-&-&Permesso di lettura per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri.\\ \hline \end{tabular} \caption{Tabella riassuntiva del significato dei bit dei permessi per un @@ -2460,11 +2477,6 @@ ha alcun effetto qualora il processo possieda i privilegi di amministratore. \label{tab:file_fileperm_bits} \end{table} -Per compattezza, nella tabella si sono specificati i bit di \itindex{suid~bit} -\textit{suid}, \itindex{sgid~bit} \textit{sgid} e \textit{sticky} -\itindex{sticky~bit} con la notazione illustrata anche in -fig.~\ref{fig:file_perm_bit}. - In tab.~\ref{tab:file_dirperm_bits} si sono invece riassunti gli effetti dei vari bit dei permessi per una directory; anche in questo caso si sono specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit} @@ -2476,7 +2488,7 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \footnotesize \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|} \hline - \multicolumn{3}{|c|}{}& + \multicolumn{3}{|c|}{special}& \multicolumn{3}{|c|}{user}& \multicolumn{3}{|c|}{group}& \multicolumn{3}{|c|}{other}& @@ -2485,18 +2497,23 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\ \hline \hline - 1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato\\ - -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file creati\\ - -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella directory\\ - -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario\\ - -&-&-&-&1&-&-&-&-&-&-&-&Permesso di aggiornamento per il proprietario\\ - -&-&-&-&-&1&-&-&-&-&-&-&Permesso di attraversamento per il proprietario\\ - -&-&-&-&-&-&1&-&-&-&-&-&Permesso di visualizzazione per il gruppo proprietario\\ - -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&1&-&-&-&Permesso di attraversamento per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&-&1&-&-&Permesso di visualizzazione per tutti gli altri\\ - -&-&-&-&-&-&-&-&-&-&1&-&Permesso di aggiornamento per tutti gli altri \\ - -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri\\ + 1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato.\\ + -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file + creati.\\ + -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella + directory.\\ + -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario.\\ + -&-&-&-&1&-&-&-&-&-&-&-&Permesso di aggiornamento per il proprietario.\\ + -&-&-&-&-&1&-&-&-&-&-&-&Permesso di attraversamento per il proprietario.\\ + -&-&-&-&-&-&1&-&-&-&-&-&Permesso di visualizzazione per il gruppo + proprietario.\\ + -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo + proprietario.\\ + -&-&-&-&-&-&-&-&1&-&-&-&Permesso di attraversamento per il gruppo + proprietario.\\ + -&-&-&-&-&-&-&-&-&1&-&-&Permesso di visualizzazione per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&1&-&Permesso di aggiornamento per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri.\\ \hline \end{tabular} \caption{Tabella riassuntiva del significato dei bit dei permessi per una @@ -2504,17 +2521,126 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \label{tab:file_dirperm_bits} \end{table} -Nelle tabelle si è indicato con ``-'' il fatto che il valore degli altri bit -non è influente rispetto a quanto indicato in ciascuna riga; l'operazione fa -riferimento soltanto alla combinazione di bit per i quali il valore è -riportato esplicitamente. +Nelle tabelle si è indicato con il carattere ``-'' il fatto che il valore del +bit in questione non è influente rispetto a quanto indicato nella riga della +tabella; la descrizione dell'operazione fa riferimento soltanto alla +combinazione di bit per i quali è stato riportato esplicitamente un valore. +Si rammenti infine che il valore dei bit dei permessi non ha alcun effetto +qualora il processo possieda i privilegi di amministratore. + + + +\section{Caratteristiche e funzionalità avanzate} +\label{sec:file_dir_advances} + +Tratteremo qui alcune caratteristiche e funzionalità avanzate della gestione +di file e directory, affrontando anche una serie di estensioni +dell'interfaccia classica dei sistemi unix-like, principalmente utilizzate a +scopi di sicurezza, che sono state introdotte nelle versioni più recenti di +Linux. + + +\subsection{Gli attributi estesi} +\label{sec:file_xattr} + +\itindbeg{Extended~Attributes} + +Nelle sezioni precedenti abbiamo trattato in dettaglio le varie informazioni +che il sistema mantiene negli inode, e le varie funzioni che permettono di +modificarle. Si sarà notato come in realtà queste informazioni siano +estremamente ridotte. Questo è dovuto al fatto che Unix origina negli anni +'70, quando le risorse di calcolo e di spazio disco erano minime. Con il venir +meno di queste restrizioni è incominciata ad emergere l'esigenza di poter +associare ai file delle ulteriori informazioni astratte (quelli che vengono +chiamati i \textsl{meta-dati}) che però non potevano trovar spazio nei dati +classici mantenuti negli inode. + +Per risolvere questo problema alcuni sistemi unix-like (e fra questi anche +Linux) hanno introdotto un meccanismo generico che consenta di associare delle +informazioni ai singoli file,\footnote{l'uso più comune è quello della ACL, + che tratteremo nella prossima sezione, ma si possono inserire anche altre + informazioni.} detto \textit{Extended Attributes}. Gli \textsl{attributi + estesi} non sono altro che delle coppie nome/valore che sono associate +permanentemente ad un oggetto sul filesystem, analoghi di quello che sono le +variabili di ambiente (vedi sez.~\ref{sec:proc_environ}) per un processo. + +Altri sistemi (come Solaris, MacOS e Windows) hanno adottato un meccanismo +diverso in cui ad un file sono associati diversi flussi di dati, su cui +possono essere mantenute ulteriori informazioni, che possono essere accedute +con le normali operazioni di lettura e scrittura. Questi non vanno confusi con +gli \textit{Extended Attributes} (anche se su Solaris hanno lo stesso nome), +che sono un meccanismo molto più semplice, che pur essendo limitato (potendo +contenere solo una quantità limitata di informazione) hanno il grande +vantaggio di essere molto più semplici da realizzare e più +efficienti,\footnote{cosa molto importante, specie per le applicazioni che + richiedono una gran numero di accessi, come le ACL.} e di garantire +l'atomicità di tutte le operazioni. + + + + +\itindend{Extended~Attributes} + +% TODO trattare gli attributi estesi e le funzioni la documentazione di +% sistema è nei pacchetti libxattr1-dev e attr + + +\subsection{Le ACL} +\label{sec:file_ACL} + + +\itindbeg{Access~Control~List} + +Il modello classico dei permessi di Unix, per quanto funzionale ed efficiente, +è comunque piuttosto limitato e per quanto possa aver coperto per lunghi anni +le esigenze più comuni con un meccanismo semplice e potente, non è in grado di +rispondere in maniera adeguata a situazioni che richiedono una gestione +complessa dei permessi di accesso.\footnote{già un requisito come quello di + dare accesso in scrittura ad alcune persone ed in sola lettura ad altre non + si può soddisfare in maniera soddisfacente.} + +Per questo motivo erano state progressivamente introdotte nelle varie versioni +di Unix dei meccanismi di gestione dei permessi dei file più flessibili, nella +forma delle cosiddette \textit{Access Control List}. Nello sforzo di +standardizzare queste funzionalità era stato creato un gruppo di lavoro il cui +scopo era estendere lo standard POSIX 1003 attraverso due nuovi insiemi di +specifiche, la POSIX 1003.1e per l'interfaccia di programmazione e la POSIX +1003.2c per i comandi di shell. + +Gli obiettivi erano però forse troppo ambizioni, e nel gennaio del 1998 i +finanziamenti vennero ritirati senza che si fosse arrivati alla definizione di +uno standard, dato però che una parte della documentazione prodotta era di +alta qualità venne deciso di rilasciare al pubblico la diciassettesima bozza +del documento, quella che va sotto il nome di \textit{POSIX 1003.1e Draft 17}, +che è divenuta la base sulla quale si definiscono quelle che vanno sotto il +nome di \textit{Posix ACL}. + +A differenza di altri sistemi (ad esempio FreeBSD) nel caso di Linux si è +scelto di realizzare le ACL attraverso l'interfaccia degli \textit{Extended + Attributes}, e fornire tutte le relative funzioni di gestione tramite una +libreria, \texttt{libacl} che nasconde i dettagli implementativi delle stesse e +presenta ai programmi una interfaccia che fa riferimento allo standard POSIX +1003.1e. + + + + + +\itindend{Access~Control~List} + + +% TODO trattare le ACL, la documentazione di sistema è nei pacchetti +% libacl1-dev e acl +% vedi anche http://www.suse.de/~agruen/acl/linux-acls/online/ + -% TODO intrudurre nuova sezione sulle funzionalità di sicurezza avanzate, con -% dentro chroot, gli attributi estesi, ecc. \subsection{La funzione \func{chroot}} \label{sec:file_chroot} +% TODO intrudurre nuova sezione sulle funzionalità di sicurezza avanzate, con +% dentro chroot SELinux e AppArmor ??? + Benché non abbia niente a che fare con permessi, utenti e gruppi, la funzione \func{chroot} viene usata spesso per restringere le capacità di accesso di un programma ad una sezione limitata del filesystem, per cui ne parleremo in @@ -2539,8 +2665,8 @@ cambiando la directory di lavoro. Normalmente la directory radice di un processo coincide anche con la radice del filesystem usata dal kernel, e dato che il suo valore viene ereditato dal padre da ogni processo figlio, in generale i processi risolvono i -\itindsub{pathname}{assoluto}\textit{pathname} assoluti a partire sempre dalla -stessa directory, che corrisponde alla \file{/} del sistema. +\itindsub{pathname}{assoluto} \textit{pathname} assoluti a partire sempre +dalla stessa directory, che corrisponde alla radice del sistema. In certe situazioni però, per motivi di sicurezza, è utile poter impedire che un processo possa accedere a tutto il filesystem; per far questo si può @@ -2553,7 +2679,7 @@ prototipo \bodydesc{La funzione restituisce zero in caso di successo e -1 per un errore, in caso di errore \var{errno} può assumere i valori: \begin{errlist} - \item[\errcode{EPERM}] L'user-ID effettivo del processo non è zero. + \item[\errcode{EPERM}] l'user-ID effettivo del processo non è zero. \end{errlist} ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errval{EACCES}, \errval{ELOOP}; @@ -2596,10 +2722,11 @@ contiene i file. Si tenga presente per replicare all'interno della \textit{chroot jail} tutti i file (in genere programmi e librerie) di cui il server potrebbe avere bisogno. -%%% Local Variables: -%%% mode: latex -%%% TeX-master: "gapil" -%%% End: + + + + + % LocalWords: sez like filesystem unlink MacOS Windows VMS inode kernel unistd % LocalWords: un'etichetta int const char oldpath newpath errno EXDEV EPERM st @@ -2630,4 +2757,9 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % LocalWords: gid Control List patch mandatory control execute group other all % LocalWords: dell' effective passwd IGID locking swap saved text IRWXU IRWXG % LocalWords: IRWXO ext reiser capability FSETID mask capabilities chroot jail -% LocalWords: FTP Di +% LocalWords: FTP Di filter reiserfs Attributes Solaris Posix FreeBSD libacl + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "gapil" +%%% End: