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=8cm]{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}
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}
\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},
\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'argomemto \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.
\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
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}
\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}
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}&
\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
\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}
\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}&
\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
\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 a breve, 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 soddifacente.}
+
+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 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
+liberia, \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