%% filedir.tex
%%
-%% Copyright (C) 2000-2015 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2016 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
entry}. Le \textit{dentry} sono gli oggetti che il kernel usa per eseguire
la \textit{pathname resolution}, ciascuna di esse corrisponde ad un
\textit{pathname} e contiene il riferimento ad un \textit{inode}, che come
-vedremo a breve è l'oggetto usato dal kernel per identificare un un
+vedremo a breve è l'oggetto usato dal kernel per identificare un
file.\footnote{in questo caso si parla di file come di un qualunque oggetto
generico che sta sul filesystem e non dell'oggetto file del VFS cui
accennavamo prima.} La \textit{dentry} ottenuta dalla chiamata alla funzione
\hline
\end{tabular}
\caption{Le principali operazioni sugli \textit{inode} definite tramite
- \kstruct{inode\_operation}.}
+ \kstructd{inode\_operation}.}
\label{tab:file_inode_operations}
\end{table}
dei file descriptor. Ogni processo infatti mantiene il riferimento ad una
struttura \kstruct{file} per ogni file che ha aperto, ed è tramite essa che
esegue le operazioni di I/O. Inoltre il kernel mantiene un elenco di tutti i
-file aperti nella \itindex{file~table} \textit{file table}.
+file aperti nella \textit{file table} (torneremo su questo in
+sez.~\ref{sec:file_fd}).
Inoltre se le operazioni relative agli \textit{inode} fanno riferimento ad
oggetti posti all'interno di un filesystem e vi si applicano quindi le
sez.~\ref{sec:file_asyncronous_io}) sul file.\\
\hline
\end{tabular}
- \caption{Operazioni sui file definite tramite \kstruct{file\_operation}.}
+ \caption{Operazioni sui file definite tramite \kstructd{file\_operation}.}
\label{tab:file_file_operations}
\end{table}
daremo una descrizione a grandi linee che si adatta alle caratteristiche
comuni di qualunque filesystem di un sistema unix-like.
+\itindbeg{superblock}
+
Una possibile strutturazione dell'informazione su un disco è riportata in
fig.~\ref{fig:file_disk_filesys}, dove si hanno tre filesystem su tre
partizioni. In essa per semplicità si è fatto riferimento alla struttura del
filesystem \acr{ext2}, che prevede una suddivisione dei dati in \textit{block
group}. All'interno di ciascun \textit{block group} viene anzitutto
-replicato il cosiddetto \itindex{superblock} \textit{superblock}, (la
-struttura che contiene l'indice iniziale del filesystem e che consente di
-accedere a tutti i dati sottostanti) e creata una opportuna suddivisione dei
-dati e delle informazioni per accedere agli stessi. Sulle caratteristiche di
-\acr{ext2} e derivati torneremo in sez.~\ref{sec:file_ext2}.
+replicato il cosiddetto \textit{superblock}, (la struttura che contiene
+l'indice iniziale del filesystem e che consente di accedere a tutti i dati
+sottostanti) e creata una opportuna suddivisione dei dati e delle informazioni
+per accedere agli stessi. Sulle caratteristiche di \acr{ext2} e derivati
+torneremo in sez.~\ref{sec:file_ext2}.
+\itindend{superblock}
\itindbeg{inode}
È comunque caratteristica comune di tutti i filesystem per Unix,
\begin{figure}[!htb]
\centering
- \includegraphics[width=12cm]{img/disk_struct}
+ \includegraphics[width=11cm]{img/disk_struct}
\caption{Organizzazione dello spazio su un disco in partizioni e
filesystem.}
\label{fig:file_disk_filesys}
Se si va ad esaminare con maggiore dettaglio la strutturazione
dell'informazione all'interno del filesystem \textsl{ext2}, tralasciando i
dettagli relativi al funzionamento del filesystem stesso come la
-strutturazione in gruppi dei blocchi, il \itindex{superblock}
-\textit{superblock} e tutti i dati di gestione possiamo esemplificare la
-situazione con uno schema come quello esposto in
-fig.~\ref{fig:file_filesys_detail}.
+strutturazione in gruppi dei blocchi, il \textit{superblock} e tutti i dati di
+gestione possiamo esemplificare la situazione con uno schema come quello
+esposto in fig.~\ref{fig:file_filesys_detail}.
\begin{figure}[!htb]
\centering
- \includegraphics[width=12cm]{img/filesys_struct}
+ \includegraphics[width=11cm]{img/filesys_struct}
\caption{Strutturazione dei dati all'interno di un filesystem.}
\label{fig:file_filesys_detail}
\end{figure}
\subsection{Alcuni dettagli sul filesystem \textsl{ext2} e successori}
\label{sec:file_ext2}
-
Benché non esista ``il'' filesystem di Linux, dato che esiste un supporto
nativo di diversi filesystem che sono in uso da anni, quello che gli avvicina
di più è la famiglia di filesystem evolutasi a partire dal \textit{second
in fase di creazione, a seconda delle sue esigenze: blocchi più grandi
permettono un accesso più veloce, ma sprecano più spazio disco.
\item il filesystem implementa collegamenti simbolici veloci, in cui il nome
- del file non è salvato su un blocco, ma tenuto all'interno \itindex{inode}
+ del file non è salvato su un blocco, ma tenuto all'interno
dell'\textit{inode} (evitando letture multiple e spreco di spazio), non
tutti i nomi però possono essere gestiti così per limiti di spazio (il
limite è 60 caratteri).
-\item vengono supportati \itindex{file~attributes} i cosiddetti \textit{file
- attributes} che attivano comportamenti specifici per i file su cui vengono
- attivati come marcarli come immutabili (che possono cioè essere soltanto
- letti) per la protezione di file di configurazione sensibili, o come
- \textit{append-only} (che possono essere aperti in scrittura solo per
- aggiungere dati) per la protezione dei file di log.
+\item vengono supportati i cosiddetti \textit{file attributes} (vedi
+ sez.~\ref{sec:file_perm_overview}) che attivano comportamenti specifici per
+ i file su cui vengono attivati come marcarli come immutabili (che possono
+ cioè essere soltanto letti) per la protezione di file di configurazione
+ sensibili, o come \textit{append-only} (che possono essere aperti in
+ scrittura solo per aggiungere dati) per la protezione dei file di log.
\end{itemize}
La struttura di \acr{ext2} è stata ispirata a quella del filesystem di BSD: un
in gruppi di blocchi.
Ciascun gruppo di blocchi contiene una copia delle informazioni essenziali del
-filesystem (i \itindex{superblock} \textit{superblock} sono quindi ridondati)
-per una maggiore affidabilità e possibilità di recupero in caso di corruzione
-del \itindex{superblock} \textit{superblock} principale. L'utilizzo di
-raggruppamenti di blocchi ha inoltre degli effetti positivi nelle prestazioni
-dato che viene ridotta la distanza fra i dati e la tabella degli
-\itindex{inode} \textit{inode}.
+filesystem (i \textit{superblock} sono quindi ridondati) per una maggiore
+affidabilità e possibilità di recupero in caso di corruzione del
+\textit{superblock} principale. L'utilizzo di raggruppamenti di blocchi ha
+inoltre degli effetti positivi nelle prestazioni dato che viene ridotta la
+distanza fra i dati e la tabella degli \textit{inode}.
\begin{figure}[!htb]
\centering
\label{fig:file_ext2_dirs}
\end{figure}
-Le directory sono implementate come una \itindex{linked~list} \textit{linked
- list} con voci di dimensione variabile. Ciascuna voce della lista contiene
-il numero di \itindex{inode} \textit{inode}, la sua lunghezza, il nome del
-file e la sua lunghezza, secondo lo schema in fig.~\ref{fig:file_ext2_dirs};
-in questo modo è possibile implementare nomi per i file anche molto lunghi
-(fino a 1024 caratteri) senza sprecare spazio disco.
+
+Le directory sono implementate come una \textit{linked list} con voci di
+dimensione variabile. Ciascuna voce della lista contiene il numero di
+\textit{inode}, la sua lunghezza, il nome del file e la sua lunghezza, secondo
+lo schema in fig.~\ref{fig:file_ext2_dirs}; in questo modo è possibile
+implementare nomi per i file anche molto lunghi (fino a 1024 caratteri) senza
+sprecare spazio disco.
Con l'introduzione del filesystem \textit{ext3} sono state introdotte diverse
modifiche strutturali, la principale di queste è quella che \textit{ext3} è un
Oltre a questo \textit{ext3} introduce ulteriori modifiche volte a migliorare
sia le prestazioni che la semplicità di gestione del filesystem, in
particolare per le directory si è passato all'uso di alberi binari con
-indicizzazione tramite hash al posto delle \textit{linked list} che abbiamo
-illustrato, ottenendo un forte guadagno di prestazioni in caso di directory
-contenenti un gran numero di file.
+indicizzazione tramite \textit{hash} al posto delle \textit{linked list} che
+abbiamo illustrato, ottenendo un forte guadagno di prestazioni in caso di
+directory contenenti un gran numero di file.
% TODO (bassa priorità) portare a ext3, ext4 e btrfs ed illustrare le
% problematiche che si possono incontrare (in particolare quelle relative alla
o non può essere montato su \param{target} perché la directory è ancora in
uso.
\item[\errcode{EINVAL}] il dispositivo \param{source} presenta un
- \itindex{superblock} \textit{superblock} non valido, o si è cercato di
- rimontare un filesystem non ancora montato, o di montarlo senza
- che \param{target} sia un \textit{mount point} o di spostarlo
- quando \param{target} non è un \textit{mount point} o è la radice.
+ \textit{superblock} non valido, o si è cercato di rimontare un filesystem
+ non ancora montato, o di montarlo senza che \param{target} sia un
+ \textit{mount point} o di spostarlo quando \param{target} non è un
+ \textit{mount point} o è la radice.
\item[\errcode{ELOOP}] si è cercato di spostare un \textit{mount point} su
una sottodirectory di \param{source} o si sono incontrati troppi
collegamenti simbolici nella risoluzione di un nome.
configurato nel kernel.
\item[\errcode{ENOTBLK}] non si è usato un \textit{block device} per
\param{source} quando era richiesto.
- \item[\errcode{ENXIO}] il \itindex{major~number} \textit{major number} del
+ \item[\errcode{ENXIO}] il \textit{major number} del
dispositivo \param{source} è sbagliato.
\item[\errcode{EPERM}] il processo non ha i privilegi di amministratore.
\end{errlist}
Il tipo di filesystem che si vuole montare è specificato
dall'argomento \param{filesystemtype}, che deve essere una delle stringhe
-riportate nel file \procfile{/proc/filesystems} che, come accennato in
+riportate nel file \procfilem{/proc/filesystems} che, come accennato in
sez.~\ref{sec:file_vfs_work}, contiene l'elenco dei filesystem supportati dal
kernel. Nel caso si sia indicato un filesystem virtuale, che non è associato a
nessun file di dispositivo, il contenuto di \param{source} viene ignorato.
della serie 2.2.x i 16 più significativi avevano un valore riservato che
doveva essere specificato obbligatoriamente,\footnote{il valore era il
\textit{magic number} \code{0xC0ED}, si può usare la costante
- \const{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags} riservata
+ \constd{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags} riservata
al \textit{magic number}, mentre per specificarlo si può dare un OR
- aritmetico con la costante \const{MS\_MGC\_VAL}.} e si potevano usare solo i
+ aritmetico con la costante \constd{MS\_MGC\_VAL}.} e si potevano usare solo i
16 meno significativi. Oggi invece, con un numero di opzioni superiore, sono
utilizzati tutti e 32 i bit, ma qualora nei 16 più significativi sia presente
detto valore, che non esprime una combinazione valida, esso viene ignorato. Il
\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
\itindbeg{bind~mount}
-\item[\const{MS\_BIND}] Effettua un cosiddetto \textit{bind mount}, in cui è
+\item[\constd{MS\_BIND}] Effettua un cosiddetto \textit{bind mount}, in cui è
possibile montare una directory di un filesystem in un'altra directory,
l'opzione è disponibile a partire dai kernel della serie 2.4. In questo caso
verranno presi in considerazione solo gli argomenti \param{source}, che
In sostanza quello che avviene è che in corrispondenza del \textit{pathname}
indicato da \param{target} viene montato l'\textit{inode} di \param{source},
- così che la porzione di albero dei file presente sotto
- \param{source} diventi visibile allo stesso modo sotto
- \param{target}. Trattandosi esattamente dei dati dello stesso filesystem,
- ogni modifica fatta in uno qualunque dei due rami di albero sarà visibile
- nell'altro, visto che entrambi faranno riferimento agli stessi
- \textit{inode}.
+ così che la porzione di albero dei file presente sotto \param{source}
+ diventi visibile allo stesso modo sotto \param{target}. Trattandosi
+ esattamente dei dati dello stesso filesystem, ogni modifica fatta in uno
+ qualunque dei due rami di albero sarà visibile nell'altro, visto che
+ entrambi faranno riferimento agli stessi \textit{inode}.
Dal punto di vista del VFS l'operazione è analoga al montaggio di un
filesystem proprio nel fatto che anche in questo caso si inserisce in
all'uso dei collegamenti simbolici (di cui parleremo in
sez.~\ref{sec:link_symlink_rename}) che funziona correttamente anche
all'intero di un \textit{chroot} (argomento su cui torneremo in
- sez.~\ref{sec:file_chroot}). \itindend{bind~mount}
+ sez.~\ref{sec:file_chroot}).
-\item[\const{MS\_DIRSYNC}] Richiede che ogni modifica al contenuto di una
+\itindend{bind~mount}
+
+\item[\constd{MS\_DIRSYNC}] Richiede che ogni modifica al contenuto di una
directory venga immediatamente registrata su disco in maniera sincrona
(introdotta a partire dai kernel della serie 2.6). L'opzione si applica a
tutte le directory del filesystem, ma su alcuni filesystem è possibile
operazioni sulle directory non saranno più bufferizzate e si bloccheranno
fino all'arrivo dei dati sul disco prima che un programma possa proseguire.
-\item[\const{MS\_MANDLOCK}] Consente l'uso del \textit{mandatory locking}
- \itindex{mandatory~locking} (vedi sez.~\ref{sec:file_mand_locking}) sui file
- del filesystem. Per poterlo utilizzare effettivamente però esso dovrà essere
- comunque attivato esplicitamente per i singoli file impostando i permessi
- come illustrato in sez.~\ref{sec:file_mand_locking}.
+\item[\constd{MS\_MANDLOCK}] Consente l'uso del \textit{mandatory locking}
+ (vedi sez.~\ref{sec:file_mand_locking}) sui file del filesystem. Per poterlo
+ utilizzare effettivamente però esso dovrà essere comunque attivato
+ esplicitamente per i singoli file impostando i permessi come illustrato in
+ sez.~\ref{sec:file_mand_locking}.
-\item[\const{MS\_MOVE}] Effettua uno del spostamento del \textit{mount point}
+\item[\constd{MS\_MOVE}] Effettua uno del spostamento del \textit{mount point}
di un filesystem. La directory del \textit{mount point} originale deve
essere indicata nell'argomento \param{source}, e la sua nuova posizione
nell'argomento \param{target}. Tutti gli altri argomenti della funzione
sotto \param{source} sarà immediatamente visibile sotto \param{target}. Non
esiste cioè nessun momento in cui il filesystem non risulti montato in una o
nell'altra directory e pertanto è garantito che la risoluzione di
- \itindsub{pathname}{relativo} \textit{pathname} relativi all'interno del
- filesystem non possa fallire.
+ \textit{pathname} relativi all'interno del filesystem non possa fallire.
-\item[\const{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento
+\item[\constd{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento
degli \textit{access time} (vedi sez.~\ref{sec:file_file_times}) per
qualunque tipo di file. Dato che l'aggiornamento degli \textit{access time}
è una funzionalità la cui utilità è spesso irrilevante ma comporta un costo
sviluppo del kernel sono state introdotte altre opzioni che forniscono
soluzioni più appropriate e meno radicali.
-\item[\const{MS\_NODEV}] Viene disabilitato sul filesystem l'accesso ai file
+\item[\constd{MS\_NODEV}] Viene disabilitato sul filesystem l'accesso ai file
di dispositivo eventualmente presenti su di esso. L'opzione viene usata come
misura di precauzione per rendere inutile la presenza di eventuali file di
dispositivo su filesystem che non dovrebbero contenerne.\footnote{si ricordi
dispositivo con permessi ``opportunamente'' ampliati che gli consentirebbero
di accedere anche a risorse cui non dovrebbe.
-\item[\const{MS\_NODIRATIME}] Viene disabilitato sul filesystem
+\item[\constd{MS\_NODIRATIME}] Viene disabilitato sul filesystem
l'aggiornamento degli \textit{access time} (vedi
sez.~\ref{sec:file_file_times}), ma soltanto per le directory. Costituisce
una alternativa per \const{MS\_NOATIME}, che elimina l'informazione per le
directory, che in pratica che non viene mai utilizzata, mantenendola per i
file in cui invece ha un impiego, sia pur limitato.
-\item[\const{MS\_NOEXEC}] Viene disabilitata sul filesystem l'esecuzione di un
+\item[\constd{MS\_NOEXEC}] Viene disabilitata sul filesystem l'esecuzione di un
qualunque file eseguibile eventualmente presente su di esso. L'opzione viene
usata come misura di precauzione per rendere impossibile l'uso di programmi
posti su filesystem che non dovrebbero contenerne.
vuole che gli utenti eseguano solo i programmi forniti
dall'amministratore.}
-\item[\const{MS\_NOSUID}] Viene disabilitato sul filesystem l'effetto dei bit
+\item[\constd{MS\_NOSUID}] Viene disabilitato sul filesystem l'effetto dei bit
dei permessi \acr{suid} e \acr{sgid} (vedi sez.~\ref{sec:file_special_perm})
eventualmente presenti sui file in esso contenuti. L'opzione viene usata
come misura di precauzione per rendere inefficace l'effetto di questi bit
di un altro utente, che gli consentirebbe di eseguirlo per conto di
quest'ultimo.
-\item[\const{MS\_PRIVATE}] Marca un \textit{mount point} come privato. Si
+\item[\constd{MS\_PRIVATE}] Marca un \textit{mount point} come privato. Si
tratta di una delle nuove opzioni (insieme a \const{MS\_SHARED},
\const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti parte
- dell'infrastruttura degli \itindex{shared~subtree} \textit{shared subtree}
- introdotta a partire dal kernel 2.6.15, che estendono le funzionalità dei
- \itindex{bind~mount} \textit{bind mount}. In questo caso
- \param{target} dovrà fare riferimento al \textit{mount point} che si intende
- marcare, e tutti gli altri argomenti verranno ignorati.
+ dell'infrastruttura degli \textit{shared subtree} introdotta a partire dal
+ kernel 2.6.15, che estendono le funzionalità dei \textit{bind mount}. In
+ questo caso \param{target} dovrà fare riferimento al \textit{mount point}
+ che si intende marcare, e tutti gli altri argomenti verranno ignorati.
Di default, finché non lo si marca altrimenti con una delle altre opzioni
- dell'interfaccia \itindex{shared~subtree} \textit{shared subtree}, ogni
- \textit{mount point} è privato. Ogni \textit{bind mount} ottenuto da un
- \textit{mount point} di tipo \textit{private} si comporta come descritto
- nella trattazione di \const{MS\_BIND}. Si usa questo flag principalmente per
- revocare gli effetti delle altre opzioni e riportare il comportamento a
- quello ordinario.
-
-\item[\const{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura,
+ dell'interfaccia come \textit{shared subtree}, ogni \textit{mount point} è
+ privato. Ogni \textit{bind mount} ottenuto da un \textit{mount point} di
+ tipo \textit{private} si comporta come descritto nella trattazione di
+ \const{MS\_BIND}. Si usa questo flag principalmente per revocare gli effetti
+ delle altre opzioni e riportare il comportamento a quello ordinario.
+
+\item[\constd{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura,
non sarà possibile nessuna modifica ai suoi contenuti. Viene usato tutte le
volte che si deve accedere ai contenuti di un filesystem con la certezza che
questo non venga modificato (ad esempio per ispezionare un filesystem
corrotto). All'avvio di default il kernel monta la radice in questa
modalità.
-\item[\const{MS\_REC}] Applica ricorsivamente a tutti i \textit{mount point}
+\item[\constd{MS\_REC}] Applica ricorsivamente a tutti i \textit{mount point}
presenti al di sotto del \textit{mount point} indicato gli effetti della
- opzione degli \itindex{shared~subtree} \textit{shared subtree}
- associata. Anche questo caso l'argomento \param{target} deve fare
- riferimento ad un \textit{mount point} e tutti gli altri argomenti sono
- ignorati, ed il flag deve essere indicato assieme ad una fra
- \const{MS\_PRIVATE}, \const{MS\_SHARED}, \const{MS\_SLAVE} e
- \const{MS\_UNBINDABLE}.
+ opzione degli \textit{shared subtree} associata. Anche questo caso
+ l'argomento \param{target} deve fare riferimento ad un \textit{mount point}
+ e tutti gli altri argomenti sono ignorati, ed il flag deve essere indicato
+ assieme ad una fra \const{MS\_PRIVATE}, \const{MS\_SHARED},
+ \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}.
% TODO trattare l'opzione \texttt{lazytime} introdotta con il kernel 4.0,
% vedi http://lwn.net/Articles/621046/
-\item[\const{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli
+\item[\constd{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli
\textit{access time} sul filesystem soltanto quando questo risulti
antecedente il valore corrente del \textit{modification time} o del
\textit{change time} (per i tempi dei file si veda
l'introduzione di questo comportamento l'uso delle alternative
\const{MS\_NOATIME} e \const{MS\_NODIRATIME} è sostanzialmente inutile.
-\item[\const{MS\_REMOUNT}] Consente di rimontare un filesystem già montato
+\item[\constd{MS\_REMOUNT}] Consente di rimontare un filesystem già montato
cambiandone le opzioni di montaggio in maniera atomica. In questo modo si
possono modificare le opzioni del filesystem anche se questo è in uso. Gli
argomenti \param{source} e \param{target} devono essere gli stessi usati per
\const{MS\_NOATIME} e \const{MS\_NODIRATIME}, ed infine prima del kernel
2.4.10 anche \const{MS\_NODEV}, \const{MS\_NOEXEC} e \const{MS\_NOSUID}.
-\item[\const{MS\_SHARED}] Marca un \textit{mount point} come \textit{shared
- mount}. Si tratta di una delle nuove opzioni (insieme a
+\itindbeg{shared~subtree}
+
+\item[\constd{MS\_SHARED}] Marca un \textit{mount point} come \textit{shared
+ mount}. Si tratta di una delle nuove opzioni (insieme a
\const{MS\_PRIVATE}, \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti
- parte dell'infrastruttura degli \itindex{shared~subtree} \textit{shared
- subtree} introdotta a partire dal kernel 2.6.15, che estendono le
- funzionalità dei \itindex{bind~mount} \textit{bind mount}. In questo caso
- \param{target} dovrà fare riferimento al \textit{mount point} che si intende
- marcare, e tutti gli altri argomenti verranno ignorati.
-
- Lo scopo dell'opzione è ottenere che tutti i successivi \itindex{bind~mount}
- \textit{bind mount} effettuati da un \textit{mount point} marcato da essa
- siano di tipo \textit{shared}, cioè ``\textsl{condividano}'' con l'originale
- e fra di loro ogni ulteriore operazione di montaggio o smontaggio che
- avviene su una directory al di sotto di uno qualunque di essi. Le operazioni
- di montaggio e smontaggio effettuate al di sotto di un qualunque
- \textit{mount point} così marcato verranno ``\textsl{propagate}'' a tutti i
- \textit{mount point} della stessa condivisione, e la sezione di albero di
- file vista al di sotto di ciascuno di essi sarà sempre identica.
-
-\item[\const{MS\_SILENT}] Richiede la soppressione di alcuni messaggi di
+ parte dell'infrastruttura dei cosiddetti \textit{shared subtree} introdotta
+ a partire dal kernel 2.6.15, che estendono le funzionalità dei \textit{bind
+ mount}. In questo caso \param{target} dovrà fare riferimento al
+ \textit{mount point} che si intende marcare, e tutti gli altri argomenti
+ verranno ignorati.
+
+ Lo scopo dell'opzione è ottenere che tutti i successivi \textit{bind mount}
+ effettuati da un \textit{mount point} marcato da essa siano di tipo
+ \textit{shared}, cioè ``\textsl{condividano}'' con l'originale e fra di loro
+ ogni ulteriore operazione di montaggio o smontaggio che avviene su una
+ directory al di sotto di uno qualunque di essi. Le operazioni di montaggio e
+ smontaggio effettuate al di sotto di un qualunque \textit{mount point} così
+ marcato verranno ``\textsl{propagate}'' a tutti i \textit{mount point} della
+ stessa condivisione, e la sezione di albero di file vista al di sotto di
+ ciascuno di essi sarà sempre identica.
+
+\itindend{shared~subtree}
+
+\item[\constd{MS\_SILENT}] Richiede la soppressione di alcuni messaggi di
avvertimento nei log del kernel (vedi sez.~\ref{sec:sess_daemon}). L'opzione
è presente a partire dal kernel 2.6.17 e sostituisce, utilizzando un nome
non fuorviante, la precedente \const{MS\_VERBOSE}, introdotta nel kernel
2.6.12, che aveva lo stesso effetto.
-\item[\const{MS\_SLAVE}] Marca un \textit{mount point} come \textit{slave
+\item[\constd{MS\_SLAVE}] Marca un \textit{mount point} come \textit{slave
mount}. Si tratta di una delle nuove opzioni (insieme a
\const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_UNBINDABLE}) facenti
- parte dell'infrastruttura degli \itindex{shared~subtree} \textit{shared
- subtree} introdotta a partire dal kernel 2.6.15, che estendono le
- funzionalità dei \itindex{bind~mount} \textit{bind mount}. In questo caso
- \param{target} dovrà fare riferimento al \textit{mount point} che si intende
- marcare, e tutti gli altri argomenti verranno ignorati.
+ parte dell'infrastruttura degli \textit{shared subtree} introdotta a partire
+ dal kernel 2.6.15, che estendono le funzionalità dei \textit{bind mount}.
+ In questo caso \param{target} dovrà fare riferimento al \textit{mount point}
+ che si intende marcare, e tutti gli altri argomenti verranno ignorati.
Lo scopo dell'opzione è ottenere che tutti i successivi \textit{bind mount}
effettuati da un \textit{mount point} marcato da essa siano di tipo
essi potranno eseguire al loro interno ulteriori montaggi che non saranno
propagati né negli altri né nel \textit{mount point} originale.
-\item[\const{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per
+\item[\constd{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per
cui l'\textit{access time} viene aggiornato ad ogni accesso al
file. L'opzione è disponibile solo a partire dal kernel 2.6.30 quando il
comportamento di default del kernel è diventato quello fornito da
\const{MS\_RELATIME}.
-\item[\const{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona richiedendo che
+\item[\constd{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona richiedendo che
ogni modifica al contenuto del filesystem venga immediatamente registrata su
disco. Lo stesso comportamento può essere ottenuto con il flag
\const{O\_SYNC} di \func{open} (vedi sez.~\ref{sec:file_open_close}).
compromesso in cui questo comportamento avviene solo per le directory, ed ha
quindi una incidenza nettamente minore, si può usare \const{MS\_DIRSYNC}.
-\item[\const{MS\_UNBINDABLE}] Marca un \textit{mount point} come
+\item[\constd{MS\_UNBINDABLE}] Marca un \textit{mount point} come
\textit{unbindable mount}. Si tratta di una delle nuove opzioni (insieme a
\const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_SLAVE}) facenti parte
- dell'infrastruttura degli \itindex{shared~subtree} \textit{shared subtree}
- introdotta a partire dal kernel 2.6.15, che estendono le funzionalità dei
- \itindex{bind~mount} \textit{bind mount}. In questo caso
- \param{target} dovrà fare riferimento al \textit{mount point} che si intende
- marcare, e tutti gli altri argomenti verranno ignorati.
+ dell'infrastruttura degli \textit{shared subtree} introdotta a partire dal
+ kernel 2.6.15, che estendono le funzionalità dei \textit{bind mount}. In
+ questo caso \param{target} dovrà fare riferimento al \textit{mount point}
+ che si intende marcare, e tutti gli altri argomenti verranno ignorati.
Un \textit{mount point} marcato in questo modo disabilita la capacità di
- eseguire dei \itindex{bind~mount} \textit{bind mount} del suo contenuto. Si
- comporta cioè come allo stesso modo di un \textit{mount point} ordinario di
- tipo \textit{private} con in più la restrizione che nessuna sua
- sottodirectory (anche se relativa ad un ulteriore montaggio) possa essere
- utilizzata per un come sorgente di un \itindex{bind~mount} \textit{bind
- mount}.
+ eseguire dei \textit{bind mount} del suo contenuto. Si comporta cioè come
+ allo stesso modo di un \textit{mount point} ordinario di tipo
+ \textit{private} con in più la restrizione che nessuna sua sottodirectory
+ (anche se relativa ad un ulteriore montaggio) possa essere utilizzata per un
+ come sorgente di un \textit{bind mount}.
\end{basedescript}
Il valore di \param{flags} è una maschera binaria dei flag che controllano le
modalità di smontaggio, che deve essere specificato con un OR aritmetico delle
costanti illustrate in tab.~\ref{tab:umount2_flags}. Specificando
-\const{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è
+\constd{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è
occupato per via di una delle condizioni descritte in precedenza. A seconda
del tipo di filesystem alcune (o tutte) possono essere superate, evitando
l'errore di \errcode{EBUSY}. In tutti i casi prima dello smontaggio viene
\hline
\hline
\const{MNT\_FORCE} & Forza lo smontaggio del filesystem anche se questo è
- occupato (presente dai kernel della serie 2.2).\\
+ occupato (presente dai kernel della serie 2.2).\\
\const{MNT\_DETACH} & Esegue uno smontaggio ``\textsl{pigro}'', in cui si
- blocca l'accesso ma si aspetta che il filesystem si
- liberi (presente dal kernel 2.4.11 e dalla
- \acr{glibc} 2.11).\\
+ blocca l'accesso ma si aspetta che il filesystem si
+ liberi (presente dal kernel 2.4.11 e dalla
+ \acr{glibc} 2.11).\\
\const{MNT\_EXPIRE} & Se non occupato marca un \textit{mount point} come
- ``\textsl{in scadenza}'' in modo che ad una
- successiva chiamata senza utilizzo del filesystem
- questo venga smontato (presente dal
- kernel 2.6.8 e dalla \acr{glibc} 2.11).\\
+ ``\textsl{in scadenza}'' in modo che ad una
+ successiva chiamata senza utilizzo del filesystem
+ questo venga smontato (presente dal
+ kernel 2.6.8 e dalla \acr{glibc} 2.11).\\
\const{UMOUNT\_NOFOLLOW}& Non dereferenzia \param{target} se questo è un
- collegamento simbolico (vedi
- sez.~\ref{sec:link_symlink_rename}) evitando
- problemi di sicurezza (presente dal kernel 2.6.34).\\
+ collegamento simbolico (vedi
+ sez.~\ref{sec:link_symlink_rename}) evitando
+ problemi di sicurezza (presente dal kernel
+ 2.6.34).\\
\hline
\end{tabular}
\caption{Costanti che identificano i bit dell'argomento \param{flags}
\label{tab:umount2_flags}
\end{table}
-Con l'opzione \const{MNT\_DETACH} si richiede invece uno smontaggio
+Con l'opzione \constd{MNT\_DETACH} si richiede invece uno smontaggio
``\textsl{pigro}'' (o \textit{lazy umount}) in cui il filesystem diventa
inaccessibile per i nuovi processi subito dopo la chiamata della funzione, ma
resta accessibile per quelli che lo hanno ancora in uso e non viene smontato
fintanto che resta occupato.
-Con \const{MNT\_EXPIRE}, che non può essere specificato insieme agli altri
+Con \constd{MNT\_EXPIRE}, che non può essere specificato insieme agli altri
due, si marca il \textit{mount point} di un filesystem non occupato come
``\textsl{in scadenza}'', in tal caso \func{umount2} ritorna con un errore di
\errcode{EAGAIN}, mentre in caso di filesystem occupato si sarebbe ricevuto
automaticamente i filesystem che restano inutilizzati per un certo periodo di
tempo.
-Infine il flag \const{UMOUNT\_NOFOLLOW} non dereferenzia \param{target} se
+Infine il flag \constd{UMOUNT\_NOFOLLOW} non dereferenzia \param{target} se
questo è un collegamento simbolico (vedi
sez.~\ref{sec:link_symlink_rename}). Questa è una misura di sicurezza
introdotta per evitare, per quei filesystem per il quale è prevista una
\label{fig:sys_statfs}
\end{figure}
+\conffilebeg{/etc/mtab}
+
La \acr{glibc} provvede infine una serie di funzioni per la gestione dei due
-file \conffile{/etc/fstab}\footnote{più precisamente \funcm{setfsent},
+file \conffiled{/etc/fstab}\footnote{più precisamente \funcm{setfsent},
\funcm{getfsent}, \funcm{getfsfile}, \funcm{getfsspec}, \funcm{endfsent}.}
ed \conffile{/etc/mtab}\footnote{più precisamente \funcm{setmntent},
\funcm{getmntent},\funcm{getmntent\_r}, \funcm{addmntent},\funcm{endmntent},
\funcm{hasmntopt}.} che convenzionalmente sono usati in quasi tutti i
sistemi unix-like per mantenere rispettivamente le informazioni riguardo ai
filesystem da montare e a quelli correntemente montati. Le funzioni servono a
-leggere il contenuto di questi file in opportune strutture \struct{fstab} e
-\struct{mntent}, e, nel caso di \conffile{/etc/mtab}, per inserire e rimuovere
-le voci presenti nel file.
+leggere il contenuto di questi file in opportune strutture \structd{fstab} e
+\structd{mntent}, e, nel caso di \conffile{/etc/mtab}, per inserire e
+rimuovere le voci presenti nel file.
In generale si dovrebbero usare queste funzioni, in particolare quelle
relative a \conffile{/etc/mtab}, quando si debba scrivere un programma che
trattazione, di queste funzioni, rimandando al manuale della \acr{glibc}
\cite{GlibcMan} per la documentazione completa.
+\conffileend{/etc/mtab}
+
% TODO (bassa priorità) scrivere delle funzioni (getfsent e getmntent &C)
% TODO (bassa priorità) documentare ? swapon e swapoff (man 2 ...)
chiamare un file con nomi diversi sia connaturata con l'architettura di un
filesystem per un sistema Unix, in quanto il nome del file che si trova in una
directory è solo un'etichetta associata ad un puntatore che permette di
-ottenere il riferimento ad un \itindex{inode} \textit{inode}, e che è
-quest'ultimo che viene usato dal kernel per identificare univocamente gli
-oggetti sul filesystem.
+ottenere il riferimento ad un \textit{inode}, e che è quest'ultimo che viene
+usato dal kernel per identificare univocamente gli oggetti sul filesystem.
Questo significa che fintanto che si resta sullo stesso filesystem la
realizzazione di un \textit{link} è immediata: uno stesso file può avere tanti
nomi diversi, dati da altrettante associazioni diverse allo stesso
-\itindex{inode} \textit{inode} effettuate tramite ``etichette'' diverse in
-directory diverse. Si noti anche come nessuno di questi nomi possa assumere
-una particolare preferenza o originalità rispetto agli altri, in quanto tutti
-fanno comunque riferimento allo stesso \itindex{inode} \textit{inode} e quindi
-tutti otterranno lo stesso file.
+\textit{inode} effettuate tramite ``etichette'' diverse in directory
+diverse. Si noti anche come nessuno di questi nomi possa assumere una
+particolare preferenza o originalità rispetto agli altri, in quanto tutti
+fanno comunque riferimento allo stesso \textit{inode} e quindi tutti
+otterranno lo stesso file.
Quando si vuole aggiungere ad una directory una voce che faccia riferimento ad
un file già esistente nella modalità appena descritta, per ottenere quello che
successiva dello standard.
\itindbeg{symbolic~link}
-
\index{collegamento!simbolico|(}
La ragione di questa differenza rispetto al vecchio standard, presente anche
questa differenza rispetto allo standard POSIX.}
Dato che \func{link} crea semplicemente dei nomi che fanno riferimenti agli
-\itindex{inode} \textit{inode}, essa può funzionare soltanto per file che
-risiedono sullo stesso filesystem e solo per un filesystem di tipo Unix.
-Inoltre abbiamo visto che in Linux non è consentito eseguire un collegamento
-diretto ad una directory.
+\textit{inode}, essa può funzionare soltanto per file che risiedono sullo
+stesso filesystem e solo per un filesystem di tipo Unix. Inoltre abbiamo
+visto che in Linux non è consentito eseguire un collegamento diretto ad una
+directory.
Per ovviare a queste limitazioni, come accennato all'inizio, i sistemi
unix-like supportano un'altra forma di collegamento, detta
Il meccanismo funziona in quanto i \textit{symbolic link} sono riconosciuti
come tali dal kernel\footnote{è uno dei diversi tipi di file visti in
- tab.~\ref{tab:file_file_types}, contrassegnato come tale \itindex{inode}
- nell'\textit{inode} e riconoscibile dal valore del campo \var{st\_mode}
- della struttura \struct{stat} (vedi sez.~\ref{sec:file_stat}).} e tutta una
-serie di funzioni di sistema (come \func{open} o \func{stat}) quando ricevono
-come argomento il \textit{pathname} di un collegamento simbolico vanno
+ tab.~\ref{tab:file_file_types}, contrassegnato come tale nell'\textit{inode}
+ e riconoscibile dal valore del campo \var{st\_mode} della struttura
+ \struct{stat} (vedi sez.~\ref{sec:file_stat}).} e tutta una serie di
+funzioni di sistema (come \func{open} o \func{stat}) quando ricevono come
+argomento il \textit{pathname} di un collegamento simbolico vanno
automaticamente ad operare sul file da esso specificato. La funzione di
sistema che permette di creare un nuovo collegamento simbolico è
\funcd{symlink}, ed il suo prototipo è:
Per questo motivo il kernel e le librerie prevedono che nella risoluzione di
un \textit{pathname} possano essere seguiti fino ad un certo numero massimo di
collegamenti simbolici, il cui valore limite è specificato dalla costante
-\const{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un
+\constd{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un
errore ed \var{errno} viene impostata al valore \errcode{ELOOP}, che nella
quasi totalità dei casi indica appunto che si è creato un collegamento
simbolico che fa riferimento ad una directory del suo stesso
\itindend{symbolic~link}
\index{collegamento!simbolico|)}
-
Un'altra funzione relativa alla gestione dei nomi dei file, anche se a prima
vista parrebbe riguardare un argomento completamente diverso, è quella che per
la cancellazione di un file. In realtà una \textit{system call} che serva
proprio a cancellare un file non esiste neanche perché, come accennato in
sez.~\ref{sec:file_filesystem}, quando in un sistema unix-like si richiede la
rimozione di un file quella che si va a cancellare è soltanto la voce che
-referenzia il suo \itindex{inode} \textit{inode} all'interno di una directory.
+referenzia il suo \textit{inode} all'interno di una directory.
La funzione di sistema che consente di effettuare questa operazione, il cui
nome come si può notare ha poco a che fare con il concetto di rimozione, è
\item[\errcode{EISDIR}] \param{pathname} si riferisce ad una
directory.
\item[\errcode{EPERM}] il filesystem non consente l'operazione, o la
- directory che contiene \param{pathname} ha lo \itindex{sticky~bit}
- \textit{sticky bit} e non si è il proprietario o non si hanno privilegi
- amministrativi.
+ directory che contiene \param{pathname} ha lo \textit{sticky bit} e non si
+ è il proprietario o non si hanno privilegi amministrativi.
\end{errlist} ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
\errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errval{EROFS} nel loro
significato generico.}
La funzione elimina il nome specificato dall'argomento \param{pathname} nella
directory che lo contiene e decrementa il numero di riferimenti nel relativo
-\itindex{inode} \textit{inode}.\footnote{come per \func{link} queste due
- operazioni sono effettuate all'interno della \textit{system call} in maniera
- atomica.} Nel caso di socket, fifo o file di dispositivo rimuove il nome, ma
-come per i file normali i processi che hanno aperto uno di questi oggetti
-possono continuare ad utilizzarli. Nel caso di cancellazione di un
-collegamento simbolico, che consiste solo nel rimando ad un altro file, questo
-viene immediatamente eliminato.
+\textit{inode}.\footnote{come per \func{link} queste due operazioni sono
+ effettuate all'interno della \textit{system call} in maniera atomica.} Nel
+caso di socket, fifo o file di dispositivo rimuove il nome, ma come per i file
+normali i processi che hanno aperto uno di questi oggetti possono continuare
+ad utilizzarli. Nel caso di cancellazione di un collegamento simbolico, che
+consiste solo nel rimando ad un altro file, questo viene immediatamente
+eliminato.
Per cancellare una voce in una directory è necessario avere il permesso di
scrittura su di essa, dato che si va a rimuovere una voce dal suo contenuto, e
il diritto di esecuzione/attraversamento sulla directory che la contiene
(affronteremo in dettaglio l'argomento dei permessi di file e directory in
-sez.~\ref{sec:file_access_control}). Se inoltre lo \itindex{sticky~bit}
-\textit{sticky bit} (vedi sez.~\ref{sec:file_special_perm}) è impostato
-occorrerà anche essere proprietari del file o proprietari della directory o
-avere i privilegi di amministratore.
+sez.~\ref{sec:file_access_control}). Se inoltre lo \textit{sticky bit} (vedi
+sez.~\ref{sec:file_special_perm}) è impostato occorrerà anche essere
+proprietari del file o proprietari della directory o avere i privilegi di
+amministratore.
Si ricordi inoltre che anche se se ne è rimosso il nome da una directory, un
file non viene eliminato dal disco fintanto che tutti i riferimenti ad esso
sono stati cancellati: solo quando il numero di collegamenti mantenuto
-\itindex{inode} nell'\textit{inode} diventa nullo, questo viene disallocato e
-lo spazio occupato su disco viene liberato. Si tenga presente comunque che a
-questo si aggiunge sempre un'ulteriore condizione e cioè che non ci siano
-processi che abbiano il suddetto file aperto.\footnote{come vedremo in
+nell'\textit{inode} diventa nullo, questo viene disallocato e lo spazio
+occupato su disco viene liberato. Si tenga presente comunque che a questo si
+aggiunge sempre un'ulteriore condizione e cioè che non ci siano processi che
+abbiano il suddetto file aperto.\footnote{come vedremo in
sez.~\ref{sec:file_unix_interface} il kernel mantiene anche una tabella dei
file aperti nei vari processi, che a sua volta contiene i riferimenti agli
- \itindex{inode} \textit{inode} ad essi relativi; prima di procedere alla
- cancellazione dello spazio occupato su disco dal contenuto di un file il
- kernel controlla anche questa tabella, per verificare che anche in essa non
- ci sia più nessun riferimento all'\textit{inode} in questione.}
+ \textit{inode} ad essi relativi; prima di procedere alla cancellazione dello
+ spazio occupato su disco dal contenuto di un file il kernel controlla anche
+ questa tabella, per verificare che anche in essa non ci sia più nessun
+ riferimento all'\textit{inode} in questione.}
Questa caratteristica del sistema può essere usata per essere sicuri di non
lasciare file temporanei su disco in caso di crash di un programma. La tecnica
directory o \param{oldpath} è una directory e
\param{newpath} esiste e non è una directory.
\item[\errval{EPERM}] la directory contenente \param{oldpath} o quella
- contenente un \param{newpath} esistente hanno lo
- \itindex{sticky~bit} \textit{sticky bit} e non si è i proprietari dei
- rispettivi file (o non si hanno privilegi amministrativi) oppure il
- filesystem non supporta l'operazione.
+ contenente un \param{newpath} esistente hanno lo \textit{sticky bit} e non
+ si è i proprietari dei rispettivi file (o non si hanno privilegi
+ amministrativi) oppure il filesystem non supporta l'operazione.
\item[\errcode{EXDEV}] \param{oldpath} e \param{newpath} non sono sullo
stesso filesystem e sotto lo stesso \textit{mount point}.
\end{errlist} ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{EMLINK},
La funzione rinomina in \param{newpath} il file o la directory indicati
dall'argomento \param{oldpath}. Il nome viene eliminato nella directory
originale e ricreato nella directory di destinazione mantenendo il riferimento
-allo stesso \itindex{inode} \textit{inode}. Non viene spostato nessun dato e
-\itindex{inode} l'\textit{inode} del file non subisce nessuna modifica in
-quanto le modifiche sono eseguite sulle directory che
-contengono \param{newpath} ed \param{oldpath}.
+allo stesso \textit{inode}. Non viene spostato nessun dato e l'\textit{inode}
+del file non subisce nessuna modifica in quanto le modifiche sono eseguite
+sulle directory che contengono \param{newpath} ed \param{oldpath}.
Il vantaggio nell'uso di questa funzione al posto della chiamata successiva di
\func{link} e \func{unlink} è che l'operazione è eseguita atomicamente, non
contenenti \param{oldpath} e \param{newpath}, e nel caso \param{newpath} sia
una directory vuota già esistente anche su di essa (perché dovrà essere
aggiornata la voce ``\texttt{..}''). Se poi le directory
-contenenti \param{oldpath} o \param{newpath} hanno lo \itindex{sticky~bit}
-\textit{sticky bit} attivo (vedi sez.~\ref{sec:file_special_perm}) si dovrà
-essere i proprietari dei file (o delle directory) che si vogliono rinominare,
-o avere i permessi di amministratore.
+contenenti \param{oldpath} o \param{newpath} hanno lo \textit{sticky bit}
+attivo (vedi sez.~\ref{sec:file_special_perm}) si dovrà essere i proprietari
+dei file (o delle directory) che si vogliono rinominare, o avere i permessi di
+amministratore.
\subsection{La creazione e la cancellazione delle directory}
\label{sec:file_dir_creat_rem}
Benché in sostanza le directory non siano altro che dei file contenenti
-elenchi di nomi con riferimenti ai rispettivi \itindex{inode} \textit{inode},
-non è possibile trattarle come file ordinari e devono essere create
-direttamente dal kernel attraverso una opportuna \textit{system
- call}.\footnote{questo è quello che permette anche, attraverso l'uso del
- VFS, l'utilizzo di diversi formati per la gestione dei suddetti elenchi,
- dalle semplici liste a strutture complesse come alberi binari, hash,
- ecc. che consentono una ricerca veloce quando il numero di file è molto
- grande.} La funzione di sistema usata per creare una directory è
-\funcd{mkdir}, ed il suo prototipo è:
+elenchi di nomi con riferimenti ai rispettivi \textit{inode}, non è possibile
+trattarle come file ordinari e devono essere create direttamente dal kernel
+attraverso una opportuna \textit{system call}.\footnote{questo è quello che
+ permette anche, attraverso l'uso del VFS, l'utilizzo di diversi formati per
+ la gestione dei suddetti elenchi, dalle semplici liste a strutture complesse
+ come alberi binari, hash, ecc. che consentono una ricerca veloce quando il
+ numero di file è molto grande.} La funzione di sistema usata per creare una
+directory è \funcd{mkdir}, ed il suo prototipo è:
\begin{funcproto}{
\fhead{sys/stat.h}
di \param{dirname}.
\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 non si è i
- proprietari della directory o non si hanno privilegi amministrativi.
+ \textit{sticky bit} impostato e non si è i proprietari della directory o
+ non si hanno privilegi amministrativi.
\end{errlist}
ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG},
\errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errcode{ENOTEMPTY} e
\label{sec:file_dir_read}
Benché le directory alla fine non siano altro che dei file che contengono
-delle liste di nomi associati ai relativi \itindex{inode} \textit{inode}, per
-il ruolo che rivestono nella struttura del sistema non possono essere trattate
-come dei normali file di dati. Ad esempio, onde evitare inconsistenze
-all'interno del filesystem, solo il kernel può scrivere il contenuto di una
-directory, e non può essere un processo a inserirvi direttamente delle voci
-con le usuali funzioni di scrittura.
+delle liste di nomi associati ai relativi \textit{inode}, per il ruolo che
+rivestono nella struttura del sistema non possono essere trattate come dei
+normali file di dati. Ad esempio, onde evitare inconsistenze all'interno del
+filesystem, solo il kernel può scrivere il contenuto di una directory, e non
+può essere un processo a inserirvi direttamente delle voci con le usuali
+funzioni di scrittura.
Ma se la scrittura e l'aggiornamento dei dati delle directory è compito del
kernel, sono molte le situazioni in cui i processi necessitano di poterne
\end{funcproto}
La funzione apre un \textit{directory stream} per la directory
-\param{dirname}, ritornando il puntatore ad un oggetto di tipo \type{DIR} (che
+\param{dirname}, ritornando il puntatore ad un oggetto di tipo \typed{DIR} (che
è il tipo opaco usato dalle librerie per gestire i \textit{directory stream})
da usare per tutte le operazioni successive, la funzione inoltre posiziona lo
\textit{stream} sulla prima voce contenuta nella directory.
delle macro \texttt{\macro{\_POSIX\_C\_SOURCE} >= 1},
\macro{\_XOPEN\_SOURCE}, \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE},
\macro{\_POSIX\_SOURCE}.} che non usa una struttura allocata staticamente, e
-può essere utilizzata anche con i \itindex{thread} \textit{thread}, il suo
-prototipo è:
+può essere utilizzata anche con i \textit{thread}, il suo prototipo è:
\begin{funcproto}{
\fhead{sys/types.h}
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, ed il campo \var{d\_ino}, che contiene il numero di
-\itindex{inode} \textit{inode} cui il file è associato e corrisponde al campo
-\var{st\_ino} di \struct{stat}. La presenza di ulteriori campi opzionali
-oltre i due citati è segnalata dalla definizione di altrettante macro nella
-forma \code{\_DIRENT\_HAVE\_D\_XXX} dove \code{XXX} è il nome del relativo
+\textit{inode} cui il file è associato e corrisponde al campo \var{st\_ino} di
+\struct{stat}. La presenza di ulteriori campi opzionali oltre i due citati è
+segnalata dalla definizione di altrettante macro nella forma
+\code{\_DIRENT\_HAVE\_D\_XXX} dove \code{XXX} è il nome del relativo
campo. Come si può evincere da fig.~\ref{fig:file_dirent_struct} nel caso di
-Linux sono pertanto definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
-\macro{\_DIRENT\_HAVE\_D\_OFF} e \macro{\_DIRENT\_HAVE\_D\_RECLEN}, mentre non
-è definita la macro \macro{\_DIRENT\_HAVE\_D\_NAMLEN}.
+Linux sono pertanto definite le macro \macrod{\_DIRENT\_HAVE\_D\_TYPE},
+\macrod{\_DIRENT\_HAVE\_D\_OFF} e \macrod{\_DIRENT\_HAVE\_D\_RECLEN}, mentre non
+è definita la macro \macrod{\_DIRENT\_HAVE\_D\_NAMLEN}.
Dato che possono essere presenti campi opzionali e che lo standard
POSIX.1-2001 non specifica una dimensione definita per il nome dei file (che
\vspace{3pt}
\begin{funcbox}{
\fhead{stddef.h}
-\fdecl{size\_t \macro{offsetof}(type, member)}
+\fdecl{size\_t \macrod{offsetof}(type, member)}
\fdesc{Restituisce la posizione del campo \param{member} nella
struttura \param{type}.}
}
\textbf{Valore} & \textbf{Tipo di file} \\
\hline
\hline
- \const{DT\_UNKNOWN} & Tipo sconosciuto.\\
- \const{DT\_REG} & File normale.\\
- \const{DT\_DIR} & Directory.\\
- \const{DT\_LNK} & Collegamento simbolico.\\
- \const{DT\_FIFO} & Fifo.\\
- \const{DT\_SOCK} & Socket.\\
- \const{DT\_CHR} & Dispositivo a caratteri.\\
- \const{DT\_BLK} & Dispositivo a blocchi.\\
+ \constd{DT\_UNKNOWN} & Tipo sconosciuto.\\
+ \constd{DT\_REG} & File normale.\\
+ \constd{DT\_DIR} & Directory.\\
+ \constd{DT\_LNK} & Collegamento simbolico.\\
+ \constd{DT\_FIFO} & Fifo.\\
+ \constd{DT\_SOCK} & Socket.\\
+ \constd{DT\_CHR} & Dispositivo a caratteri.\\
+ \constd{DT\_BLK} & Dispositivo a blocchi.\\
\hline
\end{tabular}
\caption{Costanti che indicano i vari tipi di file nel campo \var{d\_type}
\vspace{3pt}
\begin{funcbox}{
\fhead{dirent.h}
-\fdecl{int \macro{IFTODT}(mode\_t MODE)}
+\fdecl{int \macrod{IFTODT}(mode\_t MODE)}
\fdesc{Converte il tipo di file dal formato di \var{st\_mode} a quello di
\var{d\_type}.}
-\fdecl{mode\_t \macro{DTTOIF}(int DTYPE)}
+\fdecl{mode\_t \macrod{DTTOIF}(int DTYPE)}
\fdesc{Converte il tipo di file dal formato di \var{d\_type} a quello di
\var{st\_mode}.}
}
precisamente nel campo \texttt{pwd} della sotto-struttura
\kstruct{fs\_struct}.} che è chiamata \textsl{directory corrente} o
\textsl{directory di lavoro} (in inglese \textit{current working directory}).
-La directory di lavoro è quella da cui si parte quando un
-\itindsub{pathname}{relativo} \textit{pathname} è espresso in forma relativa,
-dove il ``\textsl{relativa}'' fa riferimento appunto a questa directory.
+La directory di lavoro è quella da cui si parte quando un \textit{pathname} è
+espresso in forma relativa, dove il ``\textsl{relativa}'' fa riferimento
+appunto a questa directory.
Quando un utente effettua il login, questa directory viene impostata alla
\textit{home directory} del suo account. Il comando \cmd{cd} della shell
sez.~\ref{sec:proc_fork}), la directory di lavoro della shell diventa anche la
directory di lavoro di qualunque comando da essa lanciato.
-Dato che è il kernel che tiene traccia per ciascun processo \itindex{inode}
+Dato che è il kernel che tiene traccia per ciascun processo
dell'\textit{inode} della directory di lavoro, per ottenerne il
\textit{pathname} occorre usare una apposita funzione,
\funcd{getcwd},\footnote{con Linux \func{getcwd} è una \textit{system call}
\item[\errcode{EINVAL}] il valore di \param{mode} non indica un file, una
fifo, un socket o un dispositivo.
\item[\errcode{EPERM}] non si hanno privilegi sufficienti a creare
- \itindex{inode} l'\texttt{inode}, o il filesystem su cui si è cercato di
+ l'\texttt{inode}, o il filesystem su cui si è cercato di
creare \param{pathname} non supporta l'operazione.
\end{errlist}
ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{ELOOP},
\errval{ENOTDIR} e \errval{EROFS} nel loro significato generico.}
\end{funcproto}
-La funzione permette di creare un \itindex{inode} \textit{inode} di tipo
-generico sul filesystem, e viene in genere utilizzata per creare i file di
-dispositivo, ma si può usare anche per creare qualunque tipo di file speciale
-ed anche file regolari. L'argomento \param{mode} specifica sia il tipo di file
-che si vuole creare che i relativi permessi, secondo i valori riportati in
+La funzione permette di creare un \textit{inode} di tipo generico sul
+filesystem, e viene in genere utilizzata per creare i file di dispositivo, ma
+si può usare anche per creare qualunque tipo di file speciale ed anche file
+regolari. L'argomento \param{mode} specifica sia il tipo di file che si vuole
+creare che i relativi permessi, secondo i valori riportati in
tab.~\ref{tab:file_mode_flags}, che vanno combinati con un OR aritmetico. I
permessi sono comunque modificati nella maniera usuale dal valore di
-\itindex{umask} \textit{umask} (si veda sez.~\ref{sec:file_perm_management}).
+\textit{umask} (si veda sez.~\ref{sec:file_perm_management}).
Per il tipo di file può essere specificato solo uno fra i seguenti valori:
\const{S\_IFREG} per un file regolare (che sarà creato vuoto),
specifica \func{mkfifo}.} l'uso per la creazione di un file ordinario, di
una fifo o di un socket è consentito anche agli utenti normali.
-I nuovi \itindex{inode} \textit{inode} creati con \func{mknod} apparterranno
-al proprietario e al gruppo del processo (usando \ids{UID} e \ids{GID} del
-gruppo effettivo) che li ha creati a meno non sia presente il bit \acr{sgid}
-per la directory o sia stata attivata la semantica BSD per il filesystem (si
-veda sez.~\ref{sec:file_ownership_management}) in cui si va a creare
-\itindex{inode} l'\textit{inode}, nel qual caso per il gruppo verrà usato il
-\ids{GID} del proprietario della directory.
+I nuovi \textit{inode} creati con \func{mknod} apparterranno al proprietario e
+al gruppo del processo (usando \ids{UID} e \ids{GID} del gruppo effettivo) che
+li ha creati a meno non sia presente il bit \acr{sgid} per la directory o sia
+stata attivata la semantica BSD per il filesystem (si veda
+sez.~\ref{sec:file_ownership_management}) in cui si va a creare
+l'\textit{inode}, nel qual caso per il gruppo verrà usato il \ids{GID} del
+proprietario della directory.
+
+\itindbeg{major~number}
+\itindbeg{minor~number}
Nella creazione di un file di dispositivo occorre poi specificare
correttamente il valore di \param{dev}; questo infatti è di tipo
tab.~\ref{tab:intro_primitive_types}) riservato per indicare un
\textsl{numero} di dispositivo. Il kernel infatti identifica ciascun
dispositivo con un valore numerico, originariamente questo era un intero a 16
-bit diviso in due parti di 8 bit chiamate rispettivamente
-\itindex{major~number} \textit{major number} e \itindex{minor~number}
-\textit{minor number}, che sono poi i due numeri mostrati dal comando
-\texttt{ls -l} al posto della dimensione quando lo si esegue su un file di
-dispositivo.
-
-Il \itindex{major~number} \textit{major number} identifica una classe di
-dispositivi (ad esempio la seriale, o i dischi IDE) e serve in sostanza per
-indicare al kernel quale è il modulo che gestisce quella classe di
-dispositivi. Per identificare uno specifico dispositivo di quella classe (ad
-esempio una singola porta seriale, o uno dei dischi presenti) si usa invece il
-\itindex{minor~number} \textit{minor number}. L'elenco aggiornato di questi
-numeri con le relative corrispondenze ai vari dispositivi può essere trovato
-nel file \texttt{Documentation/devices.txt} allegato alla documentazione dei
-sorgenti del kernel.
+bit diviso in due parti di 8 bit chiamate rispettivamente \textit{major
+ number} e \textit{minor number}, che sono poi i due numeri mostrati dal
+comando \texttt{ls -l} al posto della dimensione quando lo si esegue su un
+file di dispositivo.
+
+Il \textit{major number} identifica una classe di dispositivi (ad esempio la
+seriale, o i dischi IDE) e serve in sostanza per indicare al kernel quale è il
+modulo che gestisce quella classe di dispositivi. Per identificare uno
+specifico dispositivo di quella classe (ad esempio una singola porta seriale,
+o uno dei dischi presenti) si usa invece il \textit{minor number}. L'elenco
+aggiornato di questi numeri con le relative corrispondenze ai vari dispositivi
+può essere trovato nel file \texttt{Documentation/devices.txt} allegato alla
+documentazione dei sorgenti del kernel.
Data la crescita nel numero di dispositivi supportati, ben presto il limite
massimo di 256 si è rivelato troppo basso, e nel passaggio dai kernel della
serie 2.4 alla serie 2.6 è stata aumentata a 32 bit la dimensione del tipo
-\type{dev\_t}, con delle dimensioni passate a 12 bit per il
-\itindex{major~number} \textit{major number} e 20 bit per il
-\itindex{minor~number} \textit{minor number}. La transizione però ha
+\type{dev\_t}, con delle dimensioni passate a 12 bit per il \textit{major
+ number} e 20 bit per il \textit{minor number}. La transizione però ha
comportato il fatto che \type{dev\_t} è diventato un tipo opaco, e la
necessità di specificare il numero tramite delle opportune macro, così da non
avere problemi di compatibilità con eventuali ulteriori estensioni.
-Le macro sono definite nel file \headfile{sys/sysmacros.h},\footnote{se si usa
- la \acr{glibc} dalla versione 2.3.3 queste macro sono degli alias alle
- versioni specifiche di questa libreria, \macro{gnu\_dev\_major},
- \macro{gnu\_dev\_minor} e \macro{gnu\_dev\_makedev} che si possono usare
- direttamente, al costo di una minore portabilità.} che viene
-automaticamente incluso quando si include \headfile{sys/types.h}. Si possono
-pertanto ottenere i valori del \itindex{major~number} \textit{major number} e
-\itindex{minor~number} \textit{minor number} di un dispositivo rispettivamente
-con le macro \macro{major} e \macro{minor}:
+Le macro sono definite nel file \headfiled{sys/sysmacros.h},\footnote{se si
+ usa la \acr{glibc} dalla versione 2.3.3 queste macro sono degli alias alle
+ versioni specifiche di questa libreria, \macrod{gnu\_dev\_major},
+ \macrod{gnu\_dev\_minor} e \macrod{gnu\_dev\_makedev} che si possono usare
+ direttamente, al costo di una minore portabilità.} che viene automaticamente
+incluso quando si include \headfile{sys/types.h}. Si possono pertanto ottenere
+i valori del \textit{major number} e \textit{minor number} di un dispositivo
+rispettivamente con le macro \macro{major} e \macro{minor}:
{\centering
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/types.h}
-\fdecl{int \macro{major}(dev\_t dev)}
-\fdesc{Restituisce il \itindex{major~number} \textit{major number} del
- dispositivo \param{dev}.}
-\fdecl{int \macro{minor}(dev\_t dev)}
-\fdesc{Restituisce il \itindex{minor~number} \textit{minor number} del
- dispositivo \param{dev}.}
+\fdecl{int \macrod{major}(dev\_t dev)}
+\fdesc{Restituisce il \textit{major number} del dispositivo \param{dev}.}
+\fdecl{int \macrod{minor}(dev\_t dev)}
+\fdesc{Restituisce il \textit{minor number} del dispositivo \param{dev}.}
}
\end{funcbox}
}
-\noindent mentre una volta che siano noti \itindex{major~number} \textit{major
- number} e \itindex{minor~number} \textit{minor number} si potrà costruire il
-relativo identificativo con la macro \macro{makedev}:
+\noindent mentre una volta che siano noti \textit{major number} e
+\textit{minor number} si potrà costruire il relativo identificativo con la
+macro \macro{makedev}:
{\centering
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/types.h}
-\fdecl{dev\_t \macro{makedev}(int major, int minor)}
-\fdesc{Dati \itindex{major~number} \textit{major number} e
- \itindex{minor~number} \textit{minor number} restituisce l'identificativo di
- un dispositivo.}
+\fdecl{dev\_t \macrod{makedev}(int major, int minor)}
+\fdesc{Dati \textit{major number} e \textit{minor number} restituisce
+ l'identificativo di un dispositivo.}
}
\end{funcbox}
}
+
+\itindend{major~number}
+\itindend{minor~number}
\index{file!di~dispositivo|)}
Dato che la funzione di sistema \func{mknod} presenta diverse varianti nei
La funzione crea la fifo \param{pathname} con i permessi \param{mode}. Come
per \func{mknod} il file \param{pathname} non deve esistere (neanche come
collegamento simbolico); al solito i permessi specificati da \param{mode}
-vengono modificati dal valore di \itindex{umask} \textit{umask}.
+vengono modificati dal valore di \textit{umask} (vedi
+sez.~\ref{sec:file_perm_management}).
\index{file!speciali|)}
La funzione restituisce il puntatore ad una stringa contente un nome di file
valido e non esistente al momento dell'invocazione. Se si è passato come
argomento \param{string} un puntatore non nullo ad un buffer di caratteri
-questo deve essere di dimensione \const{L\_tmpnam} ed il nome generato vi
+questo deve essere di dimensione \constd{L\_tmpnam} ed il nome generato vi
verrà copiato automaticamente, altrimenti il nome sarà generato in un buffer
statico interno che verrà sovrascritto ad una chiamata successiva. Successive
invocazioni della funzione continueranno a restituire nomi unici fino ad un
-massimo di \const{TMP\_MAX} volte, limite oltre il quale il comportamento è
+massimo di \constd{TMP\_MAX} volte, limite oltre il quale il comportamento è
indefinito. Al nome viene automaticamente aggiunto come prefisso la directory
-specificata dalla costante \const{P\_tmpdir}.\footnote{le costanti
+specificata dalla costante \constd{P\_tmpdir}.\footnote{le costanti
\const{L\_tmpnam}, \const{P\_tmpdir} e \const{TMP\_MAX} sono definite in
\headfile{stdio.h}.}
-Di questa funzione esiste una versione \ rientrante,
-\funcm{tmpnam\_r}, che non fa nulla quando si passa \val{NULL} come argomento.
-Una funzione simile, \funcd{tempnam}, permette di specificare un prefisso per
-il file esplicitamente, il suo prototipo è:
+Di questa funzione esiste una versione rientrante, \funcm{tmpnam\_r}, che non
+fa nulla quando si passa \val{NULL} come argomento. Una funzione simile,
+\funcd{tempnam}, permette di specificare un prefisso per il file
+esplicitamente, il suo prototipo è:
\begin{funcproto}{
\fhead{stdio.h}
\end{funcproto}
La funzione alloca con \code{malloc} la stringa in cui restituisce il nome,
-per cui è sempre \ rientrante, occorre però
-ricordarsi di disallocare con \code{free} il puntatore che restituisce.
-L'argomento \param{pfx} specifica un prefisso di massimo 5 caratteri per il
-nome provvisorio. La funzione assegna come directory per il file temporaneo,
-verificando che esista e sia accessibile, la prima valida fra le seguenti:
+per cui è sempre rientrante, occorre però ricordarsi di disallocare con
+\code{free} il puntatore che restituisce. L'argomento \param{pfx} specifica
+un prefisso di massimo 5 caratteri per il nome provvisorio. La funzione
+assegna come directory per il file temporaneo, verificando che esista e sia
+accessibile, la prima valida fra le seguenti:
\begin{itemize*}
\item la variabile di ambiente \envvar{TMPDIR} (non ha effetto se non è
definita o se il programma chiamante è \acr{suid} o \acr{sgid}, vedi
Come spiegato in sez.~\ref{sec:file_filesystem} tutte le informazioni generali
relative alle caratteristiche di ciascun file, a partire dalle informazioni
-relative al controllo di accesso, sono mantenute \itindex{inode}
-nell'\textit{inode}. Vedremo in questa sezione come sia possibile leggere
-tutte queste informazioni usando la funzione \func{stat}, che permette
-l'accesso a tutti i dati memorizzati \itindex{inode} nell'\textit{inode};
-esamineremo poi le varie funzioni usate per manipolare tutte queste
-informazioni, eccetto quelle che riguardano la gestione del controllo di
-accesso, trattate in in sez.~\ref{sec:file_access_control}.
+relative al controllo di accesso, sono mantenute nell'\textit{inode}. Vedremo
+in questa sezione come sia possibile leggere tutte queste informazioni usando
+la funzione \func{stat}, che permette l'accesso a tutti i dati memorizzati
+nell'\textit{inode}; esamineremo poi le varie funzioni usate per manipolare
+tutte queste informazioni, eccetto quelle che riguardano la gestione del
+controllo di accesso, trattate in in sez.~\ref{sec:file_access_control}.
\subsection{La lettura delle caratteristiche dei file}
tramite il suo file descriptor \param{filedes}.
La struttura \struct{stat} usata da queste funzioni è definita nell'header
-\headfile{sys/stat.h} e in generale dipende dall'implementazione; la versione
+\headfiled{sys/stat.h} e in generale dipende dall'implementazione; la versione
usata da Linux è mostrata in fig.~\ref{fig:file_stat_struct}, così come
riportata dalla pagina di manuale di \func{stat}. In realtà la definizione
effettivamente usata nel kernel dipende dall'architettura e ha altri campi
Si noti come i vari membri della struttura siano specificati come tipi
primitivi del sistema, di quelli definiti in
tab.~\ref{tab:intro_primitive_types}, e dichiarati in \headfile{sys/types.h},
-con l'eccezione di \type{blksize\_t} e \type{blkcnt\_t} che sono nuovi tipi
+con l'eccezione di \typed{blksize\_t} e \typed{blkcnt\_t} che sono nuovi tipi
introdotti per rendersi indipendenti dalla piattaforma.
Benché la descrizione dei commenti di fig.~\ref{fig:file_stat_struct} sia
fanno riferimento al file (il cosiddetto \textit{link count}) di cui abbiamo
già parlato in numerose occasioni.
-\item Il campo \var{st\_ino} contiene il numero di \itindex{inode}
- \textit{inode} del file, quello viene usato all'interno del filesystem per
- identificarlo e che può essere usato da un programma per determinare se due
- \textit{pathname} fanno riferimento allo stesso file.
+\item Il campo \var{st\_ino} contiene il numero di \textit{inode} del file,
+ quello viene usato all'interno del filesystem per identificarlo e che può
+ essere usato da un programma per determinare se due \textit{pathname} fanno
+ riferimento allo stesso file.
\item Il campo \var{st\_dev} contiene il numero del dispositivo su cui risiede
il file (o meglio il suo filesystem). Si tratta dello stesso numero che si
- usa con \func{mknod} e che può essere decomposto in \itindex{major~number}
- \textit{major number} e \itindex{minor~number} \textit{minor number} con le
- macro \macro{major} e \macro{minor} viste in sez.~\ref{sec:file_mknod}.
+ usa con \func{mknod} e che può essere decomposto in \textit{major number} e
+ \textit{minor number} con le macro \macro{major} e \macro{minor} viste in
+ sez.~\ref{sec:file_mknod}.
\item Il campo \var{st\_rdev} contiene il numero di dispositivo associato al
file stesso ed ovviamente ha un valore significativo soltanto quando il file
\textbf{Macro} & \textbf{Tipo del file} \\
\hline
\hline
- \macro{S\_ISREG}\texttt{(m)} & File normale.\\
- \macro{S\_ISDIR}\texttt{(m)} & Directory.\\
- \macro{S\_ISCHR}\texttt{(m)} & Dispositivo a caratteri.\\
- \macro{S\_ISBLK}\texttt{(m)} & Dispositivo a blocchi.\\
- \macro{S\_ISFIFO}\texttt{(m)} & Fifo.\\
- \macro{S\_ISLNK}\texttt{(m)} & Collegamento simbolico.\\
- \macro{S\_ISSOCK}\texttt{(m)} & Socket.\\
+ \macrod{S\_ISREG}\texttt{(m)} & File normale.\\
+ \macrod{S\_ISDIR}\texttt{(m)} & Directory.\\
+ \macrod{S\_ISCHR}\texttt{(m)} & Dispositivo a caratteri.\\
+ \macrod{S\_ISBLK}\texttt{(m)} & Dispositivo a blocchi.\\
+ \macrod{S\_ISFIFO}\texttt{(m)} & Fifo.\\
+ \macrod{S\_ISLNK}\texttt{(m)} & Collegamento simbolico.\\
+ \macrod{S\_ISSOCK}\texttt{(m)} & Socket.\\
\hline
\end{tabular}
\caption{Macro per i tipi di file (definite in \headfile{sys/stat.h}).}
\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 & Collegamento 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.\\
+ \constd{S\_IFMT} & 0170000 & Maschera per i bit del tipo di file.\\
+ \constd{S\_IFSOCK} & 0140000 & Socket.\\
+ \constd{S\_IFLNK} & 0120000 & Collegamento simbolico.\\
+ \constd{S\_IFREG} & 0100000 & File regolare.\\
+ \constd{S\_IFBLK} & 0060000 & Dispositivo a blocchi.\\
+ \constd{S\_IFDIR} & 0040000 & Directory.\\
+ \constd{S\_IFCHR} & 0020000 & Dispositivo a caratteri.\\
+ \constd{S\_IFIFO} & 0010000 & Fifo.\\
\hline
- \const{S\_ISUID} & 0004000 & Set user ID (\acr{suid}) bit, vedi
+ \constd{S\_ISUID} & 0004000 & Set user ID (\acr{suid}) bit, vedi
sez.~\ref{sec:file_special_perm}).\\
- \const{S\_ISGID} & 0002000 & Set group ID (\acr{sgid}) bit, vedi
+ \constd{S\_ISGID} & 0002000 & Set group ID (\acr{sgid}) bit, vedi
sez.~\ref{sec:file_special_perm}).\\
- \const{S\_ISVTX} & 0001000 & \acr{Sticky} bit, vedi
+ \constd{S\_ISVTX} & 0001000 & \acr{Sticky} bit, vedi
sez.~\ref{sec:file_special_perm}).\\
\hline
- \const{S\_IRWXU} & 00700 & Maschera 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.\\
+ \constd{S\_IRWXU} & 00700 & Maschera per i permessi del proprietario.\\
+ \constd{S\_IRUSR} & 00400 & Il proprietario ha permesso di lettura.\\
+ \constd{S\_IWUSR} & 00200 & Il proprietario ha permesso di scrittura.\\
+ \constd{S\_IXUSR} & 00100 & Il proprietario ha permesso di esecuzione.\\
\hline
- \const{S\_IRWXG} & 00070 & Maschera 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.\\
+ \constd{S\_IRWXG} & 00070 & Maschera per i permessi del gruppo.\\
+ \constd{S\_IRGRP} & 00040 & Il gruppo ha permesso di lettura.\\
+ \constd{S\_IWGRP} & 00020 & Il gruppo ha permesso di scrittura.\\
+ \constd{S\_IXGRP} & 00010 & Il gruppo ha permesso di esecuzione.\\
\hline
- \const{S\_IRWXO} & 00007 & Maschera 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.\\
+ \constd{S\_IRWXO} & 00007 & Maschera per i permessi di tutti gli altri\\
+ \constd{S\_IROTH} & 00004 & Gli altri hanno permesso di lettura.\\
+ \constd{S\_IWOTH} & 00002 & Gli altri hanno permesso di esecuzione.\\
+ \constd{S\_IXOTH} & 00001 & Gli altri hanno permesso di esecuzione.\\
\hline
\end{tabular}
\caption{Costanti per l'identificazione dei vari bit che compongono il campo
\label{sec:file_file_times}
Il sistema mantiene per ciascun file tre tempi, che sono registrati
-\itindex{inode} nell'\textit{inode} insieme agli altri attributi del
-file. Questi possono essere letti tramite la funzione \func{stat}, che li
-restituisce attraverso tre campi della struttura \struct{stat} di
-fig.~\ref{fig:file_stat_struct}. Il significato di questi tempi e dei relativi
-campi della struttura \struct{stat} è illustrato nello schema di
-tab.~\ref{tab:file_file_times}, dove è anche riportato un esempio delle
-funzioni che effettuano cambiamenti su di essi. Il valore del tempo è espresso
-nel cosiddetto \textit{calendar time}, su cui torneremo in dettaglio in
-sez.~\ref{sec:sys_time}.
+nell'\textit{inode} insieme agli altri attributi del file. Questi possono
+essere letti tramite la funzione \func{stat}, che li restituisce attraverso
+tre campi della struttura \struct{stat} di fig.~\ref{fig:file_stat_struct}. Il
+significato di questi tempi e dei relativi campi della struttura \struct{stat}
+è illustrato nello schema di tab.~\ref{tab:file_file_times}, dove è anche
+riportato un esempio delle funzioni che effettuano cambiamenti su di essi. Il
+valore del tempo è espresso nel cosiddetto \textit{calendar time}, su cui
+torneremo in dettaglio in sez.~\ref{sec:sys_time}.
\begin{table}[htb]
\centering
ed il tempo di ultimo cambiamento di stato (il \textit{change status time})
riportato in \var{st\_ctime}. Il primo infatti fa riferimento ad una modifica
del contenuto di un file, mentre il secondo ad una modifica dei metadati
-\itindex{inode} dell'\textit{inode}. Dato che esistono molte operazioni, come
-la funzione \func{link} e altre che vedremo in seguito, che modificano solo le
-informazioni contenute \itindex{inode} nell'\textit{inode} senza toccare il
-contenuto del file, diventa necessario l'utilizzo di questo secondo tempo.
+dell'\textit{inode}. Dato che esistono molte operazioni, come la funzione
+\func{link} e altre che vedremo in seguito, che modificano solo le
+informazioni contenute nell'\textit{inode} senza toccare il contenuto del
+file, diventa necessario l'utilizzo di questo secondo tempo.
Il tempo di ultima modifica viene usato ad esempio da programmi come
\cmd{make} per decidere quali file necessitano di essere ricompilati perché
cancellare gli articoli letti più vecchi, mentre \texttt{mutt} lo usa per
marcare i messaggi di posta che risultano letti.
-Il sistema non tiene mai conto dell'ultimo accesso \itindex{inode}
-all'\textit{inode}, pertanto funzioni come \func{access} o \func{stat} non
-hanno alcuna influenza sui tre tempi. 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}. Si noti anche
-come non esista, a differenza di altri sistemi operativi, un \textsl{tempo di
- creazione} di un file.
+Il sistema non tiene mai conto dell'ultimo accesso all'\textit{inode},
+pertanto funzioni come \func{access} o \func{stat} non hanno alcuna influenza
+sui tre tempi. 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}. Si noti anche come non esista, a
+differenza di altri sistemi operativi, un \textsl{tempo di creazione} di un
+file.
L'aggiornamento del tempo di ultimo accesso è stato a lungo considerato un
difetto progettuale di Unix, questo infatti comporta la necessità di
Si tenga presente che non è possibile modificare manualmente il tempo di
cambiamento di stato del file, che viene aggiornato direttamente dal kernel
-tutte le volte che si modifica \itindex{inode} l'\textit{inode}, e quindi
-anche alla chiamata di \func{utime}. Questo serve anche come misura di
-sicurezza per evitare che si possa modificare un file nascondendo
-completamente le proprie tracce. In realtà la cosa resta possibile se si è in
-grado di accedere al file di dispositivo, scrivendo direttamente sul disco
-senza passare attraverso il filesystem, ma ovviamente in questo modo la cosa è
-più complicata da realizzare.\footnote{esistono comunque molti programmi che
- consentono di farlo con relativa semplicità per cui non si dia per scontato
- che il valore sia credibile in caso di macchina compromessa.}
+tutte le volte che si modifica l'\textit{inode}, e quindi anche alla chiamata
+di \func{utime}. Questo serve anche come misura di sicurezza per evitare che
+si possa modificare un file nascondendo completamente le proprie tracce. In
+realtà la cosa resta possibile se si è in grado di accedere al file di
+dispositivo, scrivendo direttamente sul disco senza passare attraverso il
+filesystem, ma ovviamente in questo modo la cosa è più complicata da
+realizzare.\footnote{esistono comunque molti programmi che consentono di farlo
+ con relativa semplicità per cui non si dia per scontato che il valore sia
+ credibile in caso di macchina compromessa.}
A partire dal kernel 2.6 la risoluzione dei tempi dei file, che nei campi di
tab.~\ref{tab:file_file_times} è espressa in secondi, è stata portata ai
(solo \func{utimensat}).
\item[\errcode{EPERM}] si è richiesto un cambiamento nei tempi non al tempo
corrente, ma non si è proprietari del file o non si hanno i privilegi di
- amministratore; oppure il file è \itindex{file~attributes} immutabile o
- \textit{append-only} (vedi sez.~\ref{sec:file_perm_overview}).
+ amministratore; oppure il file è immutabile o \textit{append-only} (vedi
+ sez.~\ref{sec:file_perm_overview}).
\item[\errcode{ESRCH}] non c'è il permesso di attraversamento per una delle
componenti di \param{pathname} (solo \func{utimensat})
\end{errlist}
il valore \val{NULL} verrà impostato il tempo corrente sia per l'ultimo
accesso che per l'ultima modifica. Nei singoli elementi di \param{times} si
possono inoltre utilizzare due valori speciali per il campo \var{tv\_nsec}:
-con \const{UTIME\_NOW} si richiede l'uso del tempo corrente, mentre con
-\const{UTIME\_OMIT} si richiede di non impostare il tempo. Si può così
+con \constd{UTIME\_NOW} si richiede l'uso del tempo corrente, mentre con
+\constd{UTIME\_OMIT} si richiede di non impostare il tempo. Si può così
aggiornare in maniera specifica soltanto uno fra il tempo di ultimo accesso e
quello di ultima modifica. Quando si usa uno di questi valori speciali per
\var{tv\_nsec} il corrispondente valore di \var{tv\_sec} viene ignorato.
seconda supporta invece, rispetto ad \func{utimes}, una sintassi più complessa
che consente una indicazione sicura del file su cui operare specificando la
directory su cui si trova tramite il file descriptor \param{dirfd} ed il suo
-nome come \itindsub{pathname}{relativo} \textit{pathname relativo}
-in \param{pathname}.\footnote{su Linux solo \func{utimensat} è una
- \textit{system call} e \func{futimens} è una funzione di libreria, infatti
- se \param{pathname} è \var{NULL} \param{dirfd} viene considerato un file
- descriptor ordinario e il cambiamento del tempo applicato al file
- sottostante, qualunque esso sia, per cui \code{futimens(fd, times}) è del
- tutto equivalente a \code{utimensat(fd, NULL, times, 0)}.}
+nome come \textit{pathname relativo} in \param{pathname}.\footnote{su Linux
+ solo \func{utimensat} è una \textit{system call} e \func{futimens} è una
+ funzione di libreria, infatti se \param{pathname} è \var{NULL} \param{dirfd}
+ viene considerato un file descriptor ordinario e il cambiamento del tempo
+ applicato al file sottostante, qualunque esso sia, per cui
+ \code{futimens(fd, times}) è del tutto equivalente a \code{utimensat(fd,
+ NULL, times, 0)}.}
Torneremo su questa sintassi e sulla sua motivazione in
sez.~\ref{sec:file_openat}, quando tratteremo tutte le altre funzioni (le
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 queste
proprietà vengono assegnate in maniera fissa con opportune opzioni di
- montaggio.} Anche questi sono mantenuti \itindex{inode} sull'\textit{inode}
-insieme alle altre proprietà e sono accessibili da programma tramite la
-funzione \func{stat} (trattata in sez.~\ref{sec:file_stat}), che restituisce
-l'utente proprietario nel campo \var{st\_uid} ed il gruppo proprietario nel
-campo \var{st\_gid} della omonima struttura \struct{stat}.
+ montaggio.} Anche questi sono mantenuti sull'\textit{inode} insieme alle
+altre proprietà e sono accessibili da programma tramite la funzione
+\func{stat} (trattata in sez.~\ref{sec:file_stat}), che restituisce l'utente
+proprietario nel campo \var{st\_uid} ed il gruppo proprietario nel campo
+\var{st\_gid} della omonima struttura \struct{stat}.
Il controllo di accesso ai file segue un modello abbastanza semplice che
prevede tre permessi fondamentali strutturati su tre livelli di accesso.
complesse del meccanismo del controllo di accesso su cui torneremo in seguito
(in sez.~\ref{sec:file_special_perm}), lo schema di allocazione dei bit è
riportato in fig.~\ref{fig:file_perm_bit}. Come tutte le altre proprietà di
-un file anche i permessi sono memorizzati \itindex{inode} nell'\textit{inode},
-e come accennato in sez.~\ref{sec:file_types} essi sono vengono restituiti in
-una parte del campo \var{st\_mode} della struttura \struct{stat} (si veda di
-nuovo fig.~\ref{fig:file_stat_struct}).
+un file anche i permessi sono memorizzati nell'\textit{inode}, e come
+accennato in sez.~\ref{sec:file_types} essi sono vengono restituiti in una
+parte del campo \var{st\_mode} della struttura \struct{stat} (si veda di nuovo
+fig.~\ref{fig:file_stat_struct}).
In genere ci si riferisce ai tre livelli dei privilegi usando le lettere
\texttt{u} (per \textit{user}), \texttt{g} (per \textit{group}) e \texttt{o}
per un collegamento simbolico tutti i permessi come concessi. Utente e gruppo
a cui esso appartiene vengono pure ignorati quando il collegamento viene
risolto, vengono controllati solo quando viene richiesta la rimozione del
-collegamento e quest'ultimo è in una directory con lo \itindex{sticky~bit}
-\textit{sticky bit} impostato (si veda sez.~\ref{sec:file_special_perm}).
+collegamento e quest'ultimo è in una directory con lo \textit{sticky bit}
+impostato (si veda sez.~\ref{sec:file_special_perm}).
La procedura con cui il kernel stabilisce se un processo possiede un certo
permesso (di lettura, scrittura o esecuzione) si basa sul confronto fra
veda sez.~\ref{sec:file_ownership_management} per una spiegazione dettagliata
al proposito).
-Infine Linux utilizza il bit \acr{sgid} per un'ulteriore estensione mutuata
-da SVr4. Il caso in cui un file ha il bit \acr{sgid} impostato senza che lo
-sia anche il corrispondente bit di esecuzione viene utilizzato per attivare
-per quel file il \itindex{mandatory~locking} \textit{mandatory locking}
-(affronteremo questo argomento in dettaglio più avanti, in
-sez.~\ref{sec:file_mand_locking}).
+Infine Linux utilizza il bit \acr{sgid} per un'ulteriore estensione mutuata da
+SVr4. Il caso in cui un file ha il bit \acr{sgid} impostato senza che lo sia
+anche il corrispondente bit di esecuzione viene utilizzato per attivare per
+quel file il \textit{mandatory locking} (affronteremo questo argomento in
+dettaglio più avanti, in sez.~\ref{sec:file_mand_locking}).
\itindend{suid~bit}
\itindend{sgid~bit}
\textbf{\param{mode}} & \textbf{Significato} \\
\hline
\hline
- \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. \\
+ \constd{R\_OK} & Verifica il permesso di lettura. \\
+ \constd{W\_OK} & Verifica il permesso di scrittura. \\
+ \constd{X\_OK} & Verifica il permesso di esecuzione. \\
+ \constd{F\_OK} & Verifica l'esistenza del file. \\
\hline
\end{tabular}
\caption{Valori possibili per l'argomento \param{mode} della funzione
l'uso del \textit{suid bit}) che vuole controllare se l'utente originale ha i
permessi per accedere ad un certo file, ma eseguire questo controllo prima di
aprire il file espone al rischio di una \textit{race condition} che apre ad un
-possibile \itindex{symlink~attack} \textit{symlink attack} fra il controllo e
-l'apertura del file. In questo caso è sempre opportuno usare invece la
-funzione \func{faccessat} che tratteremo insieme alle altre
-\textit{at-functions} in sez.~\ref{sec:file_openat}.
+possibile \textit{symlink attack} fra il controllo e l'apertura del file. In
+questo caso è sempre opportuno usare invece la funzione \func{faccessat} che
+tratteremo insieme alle altre \textit{at-functions} in
+sez.~\ref{sec:file_openat}.
Del tutto analoghe a \func{access} sono le due funzioni \funcm{euidaccess} e
\funcm{eaccess} che ripetono lo stesso controllo usando però gli
Entrambe le funzioni utilizzano come secondo argomento \param{mode}, una
variabile dell'apposito tipo primitivo \type{mode\_t} (vedi
-tab.~\ref{tab:intro_primitive_types}) utilizzato per specificare i permessi sui
-file.
+tab.~\ref{tab:intro_primitive_types}) utilizzato per specificare i permessi
+sui file.
\begin{table}[!htb]
\centering
non tutti i valori possibili di \param{mode} sono permessi o hanno effetto;
in particolare accade che:
\begin{enumerate*}
-\item siccome solo l'amministratore può impostare lo \itindex{sticky~bit}
- \textit{sticky bit}, se l'\ids{UID} effettivo del processo non è zero esso
- viene automaticamente cancellato, senza notifica di errore, qualora sia
- stato indicato in \param{mode}.
+\item siccome solo l'amministratore può impostare lo \textit{sticky bit}, se
+ l'\ids{UID} effettivo del processo non è zero esso viene automaticamente
+ cancellato, senza notifica di errore, qualora sia stato indicato
+ in \param{mode}.
\item per quanto detto in sez.~\ref{sec:file_ownership_management} riguardo la
creazione dei nuovi file, si può avere il caso in cui il file creato da un
processo è assegnato ad un gruppo per il quale il processo non ha privilegi.
- Per evitare che si possa assegnare il bit \itindex{sgid~bit} \acr{sgid} ad
- un file appartenente ad un gruppo per cui non si hanno diritti, questo viene
- automaticamente cancellato da \param{mode}, senza notifica di errore,
- qualora il gruppo del file non corrisponda a quelli associati al processo;
- la cosa non avviene quando l'\ids{UID} effettivo del processo è zero.
+ Per evitare che si possa assegnare il bit \acr{sgid} ad un file appartenente
+ ad un gruppo per cui non si hanno diritti, questo viene automaticamente
+ cancellato da \param{mode}, senza notifica di errore, qualora il gruppo del
+ file non corrisponda a quelli associati al processo; la cosa non avviene
+ quando l'\ids{UID} effettivo del processo è zero.
\end{enumerate*}
Per alcuni filesystem\footnote{i filesystem più comuni (\textsl{ext2},
completamente i problemi di accesso da parte di altri utenti dello stesso
gruppo, in quanto di default i permessi assegnati al gruppo non sono
sufficienti per un accesso in scrittura; in questo caso si deve aver cura di
-usare prima della creazione dei file un valore per \itindex{umask}
-\textit{umask} lasci il permesso di scrittura.\footnote{in tal caso si può
- assegnare agli utenti del gruppo una \textit{umask} di $002$, anche se la
- soluzione migliore in questo caso è usare una ACL di default (vedi
- sez.~\ref{sec:file_ACL}).}
+usare prima della creazione dei file un valore per \textit{umask} lasci il
+permesso di scrittura.\footnote{in tal caso si può assegnare agli utenti del
+ gruppo una \textit{umask} di $002$, anche se la soluzione migliore in questo
+ caso è usare una ACL di default (vedi sez.~\ref{sec:file_ACL}).}
Come avviene nel caso dei permessi esistono anche delle appropriate funzioni
di sistema, \funcd{chown} \funcd{fchown} e \funcd{lchown}, che permettono di
per \param{owner} e \param{group} i valori restano immutati.
Quando queste funzioni sono chiamate con successo da un processo senza i
-privilegi di amministratore entrambi i bit \acr{suid} e \itindex{sgid~bit}
-\acr{sgid} vengono cancellati. Questo non avviene per il bit \acr{sgid} nel
-caso in cui esso sia usato (in assenza del corrispondente permesso di
-esecuzione) per indicare che per il file è attivo il \textit{mandatory
- locking} (vedi sez.~\ref{sec:file_mand_locking}).
+privilegi di amministratore entrambi i bit \acr{suid} e \acr{sgid} vengono
+cancellati. Questo non avviene per il bit \acr{sgid} nel caso in cui esso sia
+usato (in assenza del corrispondente permesso di esecuzione) per indicare che
+per il file è attivo il \textit{mandatory locking} (vedi
+sez.~\ref{sec:file_mand_locking}).
\subsection{Un quadro d'insieme sui permessi}
\hline
1&-&-&-&-&1&-&-&-&-&-&-&Eseguito conferisce l'\ids{UID} effettivo dell'utente.\\
-&1&-&-&-&1&-&-&-&-&-&-&Eseguito conferisce il \ids{GID} effettivo del gruppo.\\
- -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking}
- \textit{mandatory locking} è abilitato.\\
+ -&1&-&-&-&0&-&-&-&-&-&-&Il \textit{mandatory locking} è abilitato.\\
-&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato.\\
-&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per l'utente.\\
-&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per l'utente.\\
\itindbeg{Extended~Attributes}
Nelle sezioni precedenti abbiamo trattato in dettaglio le varie informazioni
-che il sistema mantiene negli \itindex{inode} \textit{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 abbiamo chiamato genericamente \textsl{metadati}) che però non
-potevano trovare spazio nei dati classici mantenuti negli \itindex{inode}
-\textit{inode}.
+che il sistema mantiene negli \textit{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
+abbiamo chiamato genericamente \textsl{metadati}) che però non potevano
+trovare spazio nei dati classici mantenuti negli \textit{inode}.
Per risolvere questo problema alcuni sistemi unix-like (e fra questi anche
Linux) hanno introdotto un meccanismo generico, detto \textit{Extended
richiedono una gran numero di accessi, come le ACL.} e di garantire
l'atomicità di tutte le operazioni.
-In Linux gli attributi estesi sono sempre associati al singolo \itindex{inode}
-\textit{inode} e l'accesso viene sempre eseguito in forma atomica, in lettura
-il valore corrente viene scritto su un buffer in memoria, mentre la scrittura
-prevede che ogni valore precedente sia sovrascritto.
+In Linux gli attributi estesi sono sempre associati al singolo \textit{inode}
+e l'accesso viene sempre eseguito in forma atomica, in lettura il valore
+corrente viene scritto su un buffer in memoria, mentre la scrittura prevede
+che ogni valore precedente sia sovrascritto.
Si tenga presente che non tutti i filesystem supportano gli \textit{Extended
Attributes}; al momento della scrittura di queste dispense essi sono
dei sorgenti del kernel.} Inoltre per le directory è stata introdotta una
ulteriore restrizione, dovuta di nuovo alla presenza ordinaria di permessi
di scrittura completi su directory come \texttt{/tmp}. Per questo motivo,
- per evitare eventuali abusi, se una directory ha lo \itindex{sticky~bit}
- \textit{sticky bit} attivo sarà consentito scrivere i suoi \textit{extended
- user attributes} soltanto se si è proprietari della stessa, o si hanno i
- privilegi amministrativi della capacità \const{CAP\_FOWNER}.
+ per evitare eventuali abusi, se una directory ha lo \textit{sticky bit}
+ attivo sarà consentito scrivere i suoi \textit{extended user attributes}
+ soltanto se si è proprietari della stessa, o si hanno i privilegi
+ amministrativi della capacità \const{CAP\_FOWNER}.
\end{basedescript}
Le funzioni per la gestione degli attributi estesi, come altre funzioni di
puntato da \param{value}, e la sua dimensione totale (in byte) sarà indicata
dall'argomento \param{size}. Infine l'argomento \param{flag} consente di
controllare le modalità di sovrascrittura dell'attributo esteso, esso può
-prendere due valori: con \const{XATTR\_REPLACE} si richiede che l'attributo
+prendere due valori: con \constd{XATTR\_REPLACE} si richiede che l'attributo
esista, nel qual caso verrà sovrascritto, altrimenti si avrà errore, mentre
-con \const{XATTR\_CREATE} si richiede che l'attributo non esista, nel qual
+con \constd{XATTR\_CREATE} si richiede che l'attributo non esista, nel qual
caso verrà creato, altrimenti si avrà errore ed il valore attuale non sarà
modificato. Utilizzando per \param{flag} un valore nullo l'attributo verrà
modificato se è già presente, o creato se non c'è.
definiscono le cosiddette \textit{Posix ACL}.
A differenza di altri sistemi, come ad esempio FreeBSD, nel caso di Linux si è
-scelto di realizzare le ACL attraverso l'uso degli
-\itindex{Extended~Attributes} \textit{Extended Attributes} (appena trattati in
-sez.~\ref{sec:file_xattr}), e fornire tutte le relative funzioni di gestione
-tramite una libreria, \texttt{libacl} che nasconde i dettagli implementativi
-delle ACL e presenta ai programmi una interfaccia che fa riferimento allo
-standard POSIX 1003.1e.
+scelto di realizzare le ACL attraverso l'uso degli \textit{Extended
+ Attributes} (appena trattati in sez.~\ref{sec:file_xattr}), e fornire tutte
+le relative funzioni di gestione tramite una libreria, \texttt{libacl} che
+nasconde i dettagli implementativi delle ACL e presenta ai programmi una
+interfaccia che fa riferimento allo standard POSIX 1003.1e.
Anche in questo caso le funzioni di questa libreria non fanno parte della
\acr{glibc} e devono essere installate a parte;\footnote{la versione corrente
\textbf{Tipo} & \textbf{Descrizione} \\
\hline
\hline
- \const{ACL\_USER\_OBJ} & Voce che contiene i diritti di accesso del
+ \constd{ACL\_USER\_OBJ}& Voce che contiene i diritti di accesso del
proprietario del file.\\
- \const{ACL\_USER} & Voce che contiene i diritti di accesso per
+ \constd{ACL\_USER} & Voce che contiene i diritti di accesso per
l'utente indicato dal rispettivo
qualificatore.\\
- \const{ACL\_GROUP\_OBJ}& Voce che contiene i diritti di accesso del
+ \constd{ACL\_GROUP\_OBJ}&Voce che contiene i diritti di accesso del
gruppo proprietario del file.\\
- \const{ACL\_GROUP} & Voce che contiene i diritti di accesso per
+ \constd{ACL\_GROUP} & Voce che contiene i diritti di accesso per
il gruppo indicato dal rispettivo
qualificatore.\\
- \const{ACL\_MASK} & Voce che contiene la maschera dei massimi
+ \constd{ACL\_MASK} & Voce che contiene la maschera dei massimi
permessi di accesso che possono essere garantiti
da voci del tipo \const{ACL\_USER},
\const{ACL\_GROUP} e \const{ACL\_GROUP\_OBJ}.\\
- \const{ACL\_OTHER} & Voce che contiene i diritti di accesso di chi
+ \constd{ACL\_OTHER} & Voce che contiene i diritti di accesso di chi
non corrisponde a nessuna altra voce dell'ACL.\\
\hline
\end{tabular}
verrebbe ignorato. L'uso di una ACL di tipo \const{ACL\_MASK} è di particolare
utilità quando essa associata ad una \textit{Default ACL} su una directory, in
quanto i permessi così specificati verranno ereditati da tutti i file creati
-nella stessa directory. Si ottiene così una sorta di \itindex{umask}
-\textit{umask} associata ad un oggetto sul filesystem piuttosto che a un
-processo.
+nella stessa directory. Si ottiene così una sorta di \textit{umask} associata
+ad un oggetto sul filesystem piuttosto che a un processo.
Dato che le ACL vengono a costituire una estensione dei permessi ordinari, uno
dei problemi che si erano posti nella loro standardizzazione era appunto
\const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER} che devono essere presenti in
qualunque ACL; un cambiamento ad una di queste voci viene automaticamente
riflesso sui permessi ordinari dei file e viceversa.\footnote{per permessi
- ordinari si intende quelli mantenuti \itindex{inode} nell'\textit{inode},
- che devono restare dato che un filesystem può essere montato senza abilitare
- le ACL.}
+ ordinari si intende quelli mantenuti nell'\textit{inode}, che devono restare
+ dato che un filesystem può essere montato senza abilitare le ACL.}
In realtà la mappatura è diretta solo per le voci \const{ACL\_USER\_OBJ} e
\const{ACL\_OTHER}, nel caso di \const{ACL\_GROUP\_OBJ} questo vale soltanto
presenza di una \textit{Default ACL} sulla directory che andrà a contenerli.
Se questa non c'è valgono le regole usuali illustrate in
sez.~\ref{sec:file_perm_management}, per cui essi sono determinati dalla
-\itindex{umask} \textit{umask} del processo, e la sola differenza è che i
-permessi ordinari da esse risultanti vengono automaticamente rimappati anche
-su una ACL di accesso assegnata automaticamente al nuovo file, che contiene
-soltanto le tre corrispondenti voci di tipo \const{ACL\_USER\_OBJ},
-\const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER}.
+\textit{umask} del processo, e la sola differenza è che i permessi ordinari da
+esse risultanti vengono automaticamente rimappati anche su una ACL di accesso
+assegnata automaticamente al nuovo file, che contiene soltanto le tre
+corrispondenti voci di tipo \const{ACL\_USER\_OBJ}, \const{ACL\_GROUP\_OBJ} e
+\const{ACL\_OTHER}.
Se invece è presente una ACL di default sulla directory che contiene il nuovo
file, essa diventerà automaticamente anche la ACL di accesso di quest'ultimo,
La funzione alloca ed inizializza un'area di memoria che verrà usata per
mantenere i dati di una ACL contenente fino ad un massimo di \param{count}
-voci. La funzione ritorna un valore di tipo \type{acl\_t} da usare in tutte le
+voci. La funzione ritorna un valore di tipo \typed{acl\_t} da usare in tutte le
altre funzioni che operano sulla ACL. La funzione si limita alla allocazione
iniziale e non inserisce nessun valore nella ACL che resta vuota.
-Si tenga presente che pur essendo \type{acl\_t} un tipo opaco che identifica
+Si tenga presente che pur essendo \typed{acl\_t} un tipo opaco che identifica
``\textsl{l'oggetto}'' ACL, il valore restituito dalla funzione non è altro
che un puntatore all'area di memoria allocata per i dati richiesti. Pertanto
in caso di fallimento verrà restituito un puntatore nullo di tipo
funzione, che può richiedere anche la ACL relativa ad una directory, il
secondo argomento \param{type} consente di specificare se si vuole ottenere la
ACL di default o quella di accesso. Questo argomento deve essere di tipo
-\type{acl\_type\_t} e può assumere solo i due valori riportati in
+\typed{acl\_type\_t} e può assumere solo i due valori riportati in
tab.~\ref{tab:acl_type}.
\begin{table}[htb]
\textbf{Tipo} & \textbf{Descrizione} \\
\hline
\hline
- \const{ACL\_TYPE\_ACCESS} & Indica una ACL di accesso.\\
- \const{ACL\_TYPE\_DEFAULT}& Indica una ACL di default.\\
+ \constd{ACL\_TYPE\_ACCESS} & Indica una ACL di accesso.\\
+ \constd{ACL\_TYPE\_DEFAULT}& Indica una ACL di default.\\
\hline
\end{tabular}
\caption{Le costanti che identificano il tipo di ACL.}
\textbf{Tipo} & \textbf{Descrizione} \\
\hline
\hline
- \const{TEXT\_ABBREVIATE} & Stampa le voci in forma abbreviata.\\
- \const{TEXT\_NUMERIC\_IDS} & non effettua la risoluzione numerica di
+ \constd{TEXT\_ABBREVIATE} & Stampa le voci in forma abbreviata.\\
+ \constd{TEXT\_NUMERIC\_IDS} & non effettua la risoluzione numerica di
\ids{UID} e \ids{GID}.\\
- \const{TEXT\_SOME\_EFFECTIVE}& Per ciascuna voce che contiene permessi che
+ \constd{TEXT\_SOME\_EFFECTIVE}&Per ciascuna voce che contiene permessi che
vengono eliminati dalla \const{ACL\_MASK}
viene generato un commento con i permessi
effettivamente risultanti; il commento è
separato con un tabulatore.\\
- \const{TEXT\_ALL\_EFFECTIVE} & Viene generato un commento con i permessi
+ \constd{TEXT\_ALL\_EFFECTIVE}& Viene generato un commento con i permessi
effettivi per ciascuna voce che contiene
permessi citati nella \const{ACL\_MASK},
anche quando questi non vengono modificati
da essa; il commento è separato con un
tabulatore.\\
- \const{TEXT\_SMART\_INDENT} & Da usare in combinazione con le precedenti
+ \constd{TEXT\_SMART\_INDENT} & Da usare in combinazione con le precedenti
opzioni \const{TEXT\_SOME\_EFFECTIVE} e
\const{TEXT\_ALL\_EFFECTIVE}, aumenta
automaticamente il numero di spaziatori
}
\end{funcproto}
-La funzione è del tutto è analoga a \funcd{acl\_set\_file} ma opera
+La funzione è del tutto è analoga a \func{acl\_set\_file} ma opera
esclusivamente sui file identificati tramite un file descriptor. Non dovendo
avere a che fare con directory (e con la conseguente possibilità di avere una
ACL di default) la funzione non necessita che si specifichi il tipo di ACL,
Se si vuole operare direttamente sui contenuti di un oggetto di tipo
\type{acl\_t} infatti occorre fare riferimento alle singole voci tramite gli
-opportuni puntatori di tipo \type{acl\_entry\_t}, che possono essere ottenuti
+opportuni puntatori di tipo \typed{acl\_entry\_t}, che possono essere ottenuti
dalla funzione \funcm{acl\_get\_entry} (per una voce esistente) o dalla
funzione \funcm{acl\_create\_entry} per una voce da aggiungere. Nel caso della
prima funzione si potrà poi ripetere la lettura per ottenere i puntatori alle
Quella delle quote disco è una funzionalità introdotta inizialmente da BSD e
presente in Linux fino dai kernel dalla serie 2.0, che consente di porre dei
tetti massimi al consumo delle risorse di un filesystem (spazio disco e
-\itindex{inode} \textit{inode}) da parte di utenti e gruppi.
+\textit{inode}) da parte di utenti e gruppi.
Dato che la funzionalità ha senso solo per i filesystem su cui si mantengono i
dati degli utenti\footnote{in genere la si attiva sul filesystem che contiene
\textit{hard limit}) possono essere disposti separatamente su entrambe le
risorse di un filesystem, essi cioè possono essere presenti in maniera
indipendente sia sullo spazio disco, con un massimo per il numero di blocchi,
-che sui file, con un massimo per il numero di \itindex{inode} \textit{inode}.
+che sui file, con un massimo per il numero di \textit{inode}.
La funzione di sistema che consente di controllare tutti i vari aspetti della
gestione delle quote è \funcd{quotactl}, ed il suo prototipo è:
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/quota.h}
-\fdecl{int \macro{QCMD}(subcmd,type)}
+\fdecl{int \macrod{QCMD}(subcmd,type)}
\fdesc{Imposta il comando \param{subcmd} per il tipo di quote (utente o
gruppo) \param{type}.}
}
\textbf{Comando} & \textbf{Descrizione} \\
\hline
\hline
- \const{Q\_QUOTAON} & Attiva l'applicazione delle quote disco per il
+ \constd{Q\_QUOTAON} & Attiva l'applicazione delle quote disco per il
filesystem indicato da \param{dev}, si deve passare
in \param{addr} il \textit{pathname} al file che
mantiene le quote, che deve esistere, e \param{id}
valori di tab.~\ref{tab:quotactl_id_format};
l'operazione richiede i privilegi di
amministratore.\\
- \const{Q\_QUOTAOFF} & Disattiva l'applicazione delle quote disco per il
+ \constd{Q\_QUOTAOFF}& Disattiva l'applicazione delle quote disco per il
filesystem indicato da \param{dev}, \param{id}
e \param{addr} vengono ignorati; l'operazione
richiede i privilegi di amministratore.\\
- \const{Q\_GETQUOTA} & Legge i limiti ed i valori correnti delle quote nel
+ \constd{Q\_GETQUOTA}& Legge i limiti ed i valori correnti delle quote nel
filesystem indicato da \param{dev} per l'utente o
il gruppo specificato da \param{id}; si devono avere
i privilegi di amministratore per leggere i dati
parte, il risultato viene restituito in una struttura
\struct{dqblk} all'indirizzo indicato
da \param{addr}.\\
- \const{Q\_SETQUOTA} & Imposta i limiti per le quote nel filesystem
+ \constd{Q\_SETQUOTA}& Imposta i limiti per le quote nel filesystem
indicato da \param{dev} per l'utente o il gruppo
specificato da \param{id} secondo i valori ottenuti
dalla struttura \struct{dqblk} puntata
da \param{addr}; l'operazione richiede i privilegi
di amministratore.\\
- \const{Q\_GETINFO} & Legge le informazioni (in sostanza i \textit{grace
+ \constd{Q\_GETINFO} & Legge le informazioni (in sostanza i \textit{grace
time}) delle quote del filesystem indicato
da \param{dev} sulla struttura \struct{dqinfo}
puntata da \param{addr}, \param{id} viene ignorato.\\
- \const{Q\_SETINFO} & Imposta le informazioni delle quote del filesystem
+ \constd{Q\_SETINFO} & Imposta le informazioni delle quote del filesystem
indicato da \param{dev} come ottenuti dalla
struttura \struct{dqinfo} puntata
da \param{addr}, \param{id} viene ignorato;
l'operazione richiede i privilegi di amministratore.\\
- \const{Q\_GETFMT} & Richiede il valore identificativo (quello di
+ \constd{Q\_GETFMT} & Richiede il valore identificativo (quello di
tab.~\ref{tab:quotactl_id_format}) per il formato
delle quote attualmente in uso sul filesystem
indicato da \param{dev}, che sarà memorizzato
sul buffer di 4 byte puntato da \param{addr}.\\
- \const{Q\_SYNC} & Aggiorna la copia su disco dei dati delle quote del
+ \constd{Q\_SYNC} & Aggiorna la copia su disco dei dati delle quote del
filesystem indicato da \param{dev}; in questo
caso \param{dev} può anche essere \val{NULL} nel
qual caso verranno aggiornati i dati per tutti i
filesystem con quote attive, \param{id}
e \param{addr} vengono comunque ignorati.\\
- \const{Q\_GETSTATS} & Ottiene statistiche ed altre informazioni generali
+ \constd{Q\_GETSTATS}& Ottiene statistiche ed altre informazioni generali
relative al sistema delle quote per il filesystem
indicato da \param{dev}, richiede che si
passi come argomento \param{addr} l'indirizzo di una
ci sono alcuni campi (in sostanza \val{dqb\_curspace}, \val{dqb\_curinodes},
\val{dqb\_btime}, \val{dqb\_itime}) che hanno senso solo in lettura, in quanto
riportano uno stato non modificabile da \func{quotactl} come l'uso corrente di
-spazio disco ed \itindex{inode} \textit{inode}, o il tempo che resta nel caso
-si sia superato un \textit{soft limit}.
+spazio disco ed \textit{inode}, o il tempo che resta nel caso si sia superato
+un \textit{soft limit}.
Inoltre in caso di modifica di un limite si può voler operare solo su una
-delle risorse (blocchi o \itindex{inode} \textit{inode}),\footnote{non è
- possibile modificare soltanto uno dei limiti (\textit{hard} o \textit{soft})
- occorre sempre rispecificarli entrambi.} per questo la struttura prevede un
-campo apposito, \val{dqb\_valid}, il cui scopo è quello di indicare quali sono
-gli altri campi che devono essere considerati validi. Questo campo è una
-maschera binaria che deve essere espressa nei termini di OR aritmetico delle
-apposite costanti di tab.~\ref{tab:quotactl_qif_const}, dove si è riportato il
-significato di ciascuna di esse ed i campi a cui fanno riferimento.
+delle risorse (blocchi o \textit{inode}),\footnote{non è possibile modificare
+ soltanto uno dei limiti (\textit{hard} o \textit{soft}) occorre sempre
+ rispecificarli entrambi.} per questo la struttura prevede un campo apposito,
+\val{dqb\_valid}, il cui scopo è quello di indicare quali sono gli altri campi
+che devono essere considerati validi. Questo campo è una maschera binaria che
+deve essere espressa nei termini di OR aritmetico delle apposite costanti di
+tab.~\ref{tab:quotactl_qif_const}, dove si è riportato il significato di
+ciascuna di esse ed i campi a cui fanno riferimento.
\begin{table}[!htb]
\centering
\textbf{Costante} & \textbf{Descrizione} \\
\hline
\hline
- \const{QIF\_BLIMITS}& Limiti sui blocchi di
- spazio disco (\val{dqb\_bhardlimit} e
- \val{dqb\_bsoftlimit}).\\
- \const{QIF\_SPACE} & Uso corrente
- dello spazio disco (\val{dqb\_curspace}).\\
- \const{QIF\_ILIMITS}& Limiti sugli \itindex{inode} \textit{inode}
- (\val{dqb\_ihardlimit} e \val{dqb\_isoftlimit}).\\
- \const{QIF\_INODES} & Uso corrente
- degli \textit{inode} (\val{dqb\_curinodes}).\\
- \const{QIF\_BTIME} & Tempo di
- sforamento del \textit{soft limit} sul numero di
- blocchi (\val{dqb\_btime}).\\
- \const{QIF\_ITIME} & Tempo di
- sforamento del \textit{soft limit} sul numero di
- \itindex{inode} \textit{inode} (\val{dqb\_itime}).\\
- \const{QIF\_LIMITS} & L'insieme di \const{QIF\_BLIMITS} e
- \const{QIF\_ILIMITS}.\\
- \const{QIF\_USAGE} & L'insieme di \const{QIF\_SPACE} e
- \const{QIF\_INODES}.\\
- \const{QIF\_TIMES} & L'insieme di \const{QIF\_BTIME} e
- \const{QIF\_ITIME}.\\
- \const{QIF\_ALL} & Tutti i precedenti.\\
+ \constd{QIF\_BLIMITS}& Limiti sui blocchi di spazio disco
+ (\val{dqb\_bhardlimit} e \val{dqb\_bsoftlimit}).\\
+ \constd{QIF\_SPACE} & Uso corrente dello spazio disco
+ (\val{dqb\_curspace}).\\
+ \constd{QIF\_ILIMITS}& Limiti sugli \textit{inode}
+ (\val{dqb\_ihardlimit} e \val{dqb\_isoftlimit}).\\
+ \constd{QIF\_INODES} & Uso corrente degli \textit{inode}
+ (\val{dqb\_curinodes}).\\
+ \constd{QIF\_BTIME} & Tempo di sforamento del \textit{soft limit} sul
+ numero di blocchi (\val{dqb\_btime}).\\
+ \constd{QIF\_ITIME} & Tempo di sforamento del \textit{soft limit} sul
+ numero di \textit{inode} (\val{dqb\_itime}).\\
+ \constd{QIF\_LIMITS} & L'insieme di \const{QIF\_BLIMITS} e
+ \const{QIF\_ILIMITS}.\\
+ \constd{QIF\_USAGE} & L'insieme di \const{QIF\_SPACE} e
+ \const{QIF\_INODES}.\\
+ \constd{QIF\_TIMES} & L'insieme di \const{QIF\_BTIME} e
+ \const{QIF\_ITIME}.\\
+ \constd{QIF\_ALL} & Tutti i precedenti.\\
\hline
\end{tabular}
\caption{Costanti per il campo \val{dqb\_valid} di \struct{dqblk}.}
\textbf{Identificatore} & \textbf{Descrizione} \\
\hline
\hline
- \const{QFMT\_VFS\_OLD}& Il vecchio (ed obsoleto) formato delle quote.\\
- \const{QFMT\_VFS\_V0} & La versione 0 usata dal VFS di Linux, supporta
- \ids{UID} e \ids{GID} a 32 bit e limiti fino a
- $2^{42}$ byte e $2^{32}$ file.\\
- \const{QFMT\_VFS\_V1} & La versione 1 usata dal VFS di Linux, supporta
- \ids{UID} e \ids{GID} a 32 bit e limiti fino a
- $2^{64}$ byte e $2^{64}$ file.\\
+ \constd{QFMT\_VFS\_OLD}& Il vecchio (ed obsoleto) formato delle quote.\\
+ \constd{QFMT\_VFS\_V0} & La versione 0 usata dal VFS di Linux, supporta
+ \ids{UID} e \ids{GID} a 32 bit e limiti fino a
+ $2^{42}$ byte e $2^{32}$ file.\\
+ \constd{QFMT\_VFS\_V1} & La versione 1 usata dal VFS di Linux, supporta
+ \ids{UID} e \ids{GID} a 32 bit e limiti fino a
+ $2^{64}$ byte e $2^{64}$ file.\\
\hline
\end{tabular}
\caption{Valori di identificazione del formato delle quote.}
\label{tab:quotactl_id_format}
\end{table}
-
-
Altre due operazioni che necessitano di ulteriori spiegazioni sono
\const{Q\_GETINFO} e \const{Q\_SETINFO}, che consentono di ottenere i dati
relativi alle impostazioni delle altre proprietà delle quote, che al momento
\textbf{Costante} & \textbf{Descrizione} \\
\hline
\hline
- \const{IIF\_BGRACE}& Il \textit{grace period} per i blocchi
+ \constd{IIF\_BGRACE}& Il \textit{grace period} per i blocchi
(\val{dqi\_bgrace}).\\
- \const{IIF\_IGRACE}& Il \textit{grace period} per gli \textit{inode}
- \itindex{inode} (\val{dqi\_igrace}).\\
- \const{IIF\_FLAGS} & I flag delle quote (\val{dqi\_flags}) (inusato ?).\\
- \const{IIF\_ALL} & Tutti i precedenti.\\
+ \constd{IIF\_IGRACE}& Il \textit{grace period} per gli \textit{inode}
+ (\val{dqi\_igrace}).\\
+ \constd{IIF\_FLAGS} & I flag delle quote (\val{dqi\_flags}) (inusato ?).\\
+ \constd{IIF\_ALL} & Tutti i precedenti.\\
\hline
\end{tabular}
\caption{Costanti per il campo \val{dqi\_valid} di \struct{dqinfo}.}
5-16}) che in caso di successo provvede a costruire (\texttt{\small 6-12})
opportunamente una risposta restituendo tramite la opportuna funzione di
interfaccia un oggetto Python contenente i dati della struttura \struct{dqblk}
-relativi a uso corrente e limiti sia per i blocchi che per gli \itindex{inode}
+relativi a uso corrente e limiti sia per i blocchi che per gli
\textit{inode}. In caso di errore (\texttt{\small 13-15}) si usa un'altra
funzione dell'interfaccia per passare il valore di \var{errno} come eccezione.
\textit{inheritable} ed \textit{effective}. Questi insiemi vengono mantenuti
in forma di tre diverse maschere binarie,\footnote{il kernel li mantiene, come
i vari identificatori di sez.~\ref{sec:proc_setuid}, all'interno della
- \struct{task\_struct} di ciascun processo (vedi
+ \texttt{task\_struct} di ciascun processo (vedi
fig.~\ref{fig:proc_task_struct}), nei tre campi \texttt{cap\_effective},
\texttt{cap\_inheritable}, \texttt{cap\_permitted} del tipo
\texttt{kernel\_cap\_t}; questo era, fino al kernel 2.6.25 definito come
Per i kernel fino al 2.6.25, o se non si attiva il supporto per le
\textit{file capabilities}, il \textit{capabilities bounding set} è un
parametro generale di sistema, il cui valore viene riportato nel file
-\sysctlfile{kernel/cap-bound}. Il suo valore iniziale è definito in sede di
+\sysctlfiled{kernel/cap-bound}. Il suo valore iniziale è definito in sede di
compilazione del kernel, e da sempre ha previsto come default la presenza di
tutte le \textit{capabilities} eccetto \const{CAP\_SETPCAP}. In questa
situazione solo il primo processo eseguito nel sistema (quello con
\textbf{Flag} & \textbf{Descrizione} \\
\hline
\hline
- \const{SECURE\_KEEP\_CAPS}& Il processo non subisce la cancellazione delle
+ \constd{SECURE\_KEEP\_CAPS}&Il processo non subisce la cancellazione delle
sue \textit{capabilities} quando tutti i suoi
\ids{UID} passano ad un valore non
nullo (regola di compatibilità per il cambio
elenco), sostituisce il precedente uso
dell'operazione \const{PR\_SET\_KEEPCAPS} di
\func{prctl}.\\
- \const{SECURE\_NO\_SETUID\_FIXUP}&Il processo non subisce le modifiche
+ \constd{SECURE\_NO\_SETUID\_FIXUP}&Il processo non subisce le modifiche
delle sue \textit{capabilities} nel passaggio
da nullo a non nullo degli \ids{UID}
dei gruppi \textit{effective} e
\textit{file system} (regole di compatibilità
per il cambio di \ids{UID} nn.~1 e 2 del
precedente elenco).\\
- \const{SECURE\_NOROOT} & Il processo non assume nessuna capacità
+ \constd{SECURE\_NOROOT} & Il processo non assume nessuna capacità
aggiuntiva quando esegue un programma, anche
se ha \ids{UID} nullo o il programma ha
il \acr{suid} bit attivo ed appartiene
corrispondente flag di blocco, identificato da una costante omonima con
l'estensione \texttt{\_LOCKED}, la cui attivazione è irreversibile ed ha
l'effetto di rendere permanente l'impostazione corrente del corrispondente
-flag ordinario; in sostanza con \const{SECURE\_KEEP\_CAPS\_LOCKED} si rende
+flag ordinario; in sostanza con \constd{SECURE\_KEEP\_CAPS\_LOCKED} si rende
non più modificabile \const{SECURE\_KEEP\_CAPS}, ed analogamente avviene con
-\const{SECURE\_NO\_SETUID\_FIXUP\_LOCKED} per
-\const{SECURE\_NO\_SETUID\_FIXUP} e con \const{SECURE\_NOROOT\_LOCKED} per
+\constd{SECURE\_NO\_SETUID\_FIXUP\_LOCKED} per
+\const{SECURE\_NO\_SETUID\_FIXUP} e con \constd{SECURE\_NOROOT\_LOCKED} per
\const{SECURE\_NOROOT}.
Per l'impostazione di questi flag sono state predisposte due specifiche
%
% POSIX-draft defined capabilities.
%
- \const{CAP\_AUDIT\_CONTROL}& Abilitare e disabilitare il
+ \constd{CAP\_AUDIT\_CONTROL}& Abilitare e disabilitare il
controllo dell'auditing (dal kernel 2.6.11).\\
- \const{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
+ \constd{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
auditing del kernel (dal kernel 2.6.11).\\
% TODO verificare questa roba dell'auditing
- \const{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare
+ \constd{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare
la sospensione del sistema (dal kernel 3.5).\\
- \const{CAP\_CHOWN} & Cambiare proprietario e gruppo
+ \constd{CAP\_CHOWN} & Cambiare proprietario e gruppo
proprietario di un file (vedi
sez.~\ref{sec:file_ownership_management}).\\
- \const{CAP\_DAC\_OVERRIDE}& Evitare il controllo dei
- permessi di lettura, scrittura ed esecuzione dei
- file, (vedi sez.~\ref{sec:file_access_control}).\\
- \const{CAP\_DAC\_READ\_SEARCH}& Evitare il controllo dei
+ \constd{CAP\_DAC\_OVERRIDE}& Evitare il controllo dei
+ permessi di lettura, scrittura ed esecuzione dei
+ file, (vedi sez.~\ref{sec:file_access_control}).\\
+ \constd{CAP\_DAC\_READ\_SEARCH}& Evitare il controllo dei
permessi di lettura ed esecuzione per
le directory (vedi
sez.~\ref{sec:file_access_control}).\\
per tutte le operazioni privilegiate non coperte
dalle precedenti \const{CAP\_DAC\_OVERRIDE} e
\const{CAP\_DAC\_READ\_SEARCH}.\\
- \const{CAP\_FSETID} & Evitare la cancellazione automatica dei bit
+ \constd{CAP\_FSETID} & Evitare la cancellazione automatica dei bit
\acr{suid} e \acr{sgid} quando un file
per i quali sono impostati viene modificato da
un processo senza questa capacità e la capacità
quando questo è relativo ad un gruppo cui non si
appartiene (vedi
sez.~\ref{sec:file_perm_management}).\\
- \const{CAP\_KILL} & Mandare segnali a qualunque
+ \constd{CAP\_KILL} & Mandare segnali a qualunque
processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
- \const{CAP\_SETFCAP} & Impostare le \textit{capabilities} di un file
+ \constd{CAP\_SETFCAP} & Impostare le \textit{capabilities} di un file
(dal kernel 2.6.24).\\
- \const{CAP\_SETGID} & Manipolare i group ID dei
+ \constd{CAP\_SETGID} & Manipolare i group ID dei
processi, sia il principale che i supplementari,
(vedi sez.~\ref{sec:proc_setgroups}) che quelli
trasmessi tramite i socket \textit{unix domain}
(vedi sez.~\ref{sec:unix_socket}).\\
- \const{CAP\_SETUID} & Manipolare gli user ID del
+ \constd{CAP\_SETUID} & Manipolare gli user ID del
processo (vedi sez.~\ref{sec:proc_setuid}) e di
trasmettere un user ID arbitrario nel passaggio
delle credenziali coi socket \textit{unix
% Linux specific capabilities
%
\hline
- \const{CAP\_IPC\_LOCK} & Effettuare il \textit{memory locking} con le
+ \constd{CAP\_IPC\_LOCK} & Effettuare il \textit{memory locking} con le
funzioni \func{mlock}, \func{mlockall},
\func{shmctl}, \func{mmap} (vedi
sez.~\ref{sec:proc_mem_lock} e
sez.~\ref{sec:file_memory_map}). \\
% TODO verificare l'interazione con SHM_HUGETLB
- \const{CAP\_IPC\_OWNER} & Evitare il controllo dei permessi
+ \constd{CAP\_IPC\_OWNER}& Evitare il controllo dei permessi
per le operazioni sugli oggetti di
intercomunicazione fra processi (vedi
sez.~\ref{sec:ipc_sysv}).\\
- \const{CAP\_LEASE} & Creare dei \textit{file lease} (vedi
+ \constd{CAP\_LEASE} & Creare dei \textit{file lease} (vedi
sez.~\ref{sec:file_asyncronous_lease})
pur non essendo proprietari del file (dal kernel
2.4).\\
- \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi
- \textit{immutable} e \textit{append-only} (vedi
- sez.~\ref{sec:file_perm_overview}) se
- supportati.\\
- \const{CAP\_MKNOD} & Creare file di dispositivo con \func{mknod} (vedi
+ \constd{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi
+ \textit{immutable} e \textit{append-only} (vedi
+ sez.~\ref{sec:file_perm_overview}) se
+ supportati.\\
+ \constd{CAP\_MAC\_ADMIN}& Amministrare il \textit{Mandatory
+ Access Control} di \textit{Smack} (dal kernel
+ 2.6.25).\\
+ \constd{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory
+ Access Control} di \textit{Smack} (dal kernel
+ 2.6.25).\\
+ \constd{CAP\_MKNOD} & Creare file di dispositivo con \func{mknod} (vedi
sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\
\const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni
privilegiate sulla rete.\\
- \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi
+ \constd{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi
sez.~\ref{sec:TCP_func_bind}).\\
- \const{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
- \itindex{broadcast} \textit{broadcast} e
- \itindex{multicast} \textit{multicast}.\\
- \const{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e \texttt{PACKET}
+ \constd{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
+ \textit{broadcast} e \textit{multicast}.\\
+ \constd{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e \texttt{PACKET}
(vedi sez.~\ref{sec:sock_type}).\\
\const{CAP\_SETPCAP} & Effettuare modifiche privilegiate alle
\textit{capabilities}.\\
\const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\
- \const{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi
+ \constd{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi
sez.~\ref{sec:sys_reboot}).\\
- \const{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi
+ \constd{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi
sez.~\ref{sec:file_chroot}).\\
- \const{CAP\_MAC\_ADMIN} & Amministrare il \textit{Mandatory
- Access Control} di \textit{Smack} (dal kernel
- 2.6.25).\\
- \const{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory
- Access Control} di \textit{Smack} (dal kernel
- 2.6.25).\\
- \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\
+ \constd{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\
\const{CAP\_SYS\_NICE} & Modificare le varie priorità dei processi (vedi
sez.~\ref{sec:proc_priority}).\\
- \const{CAP\_SYS\_PACCT} & Usare le funzioni di \textit{accounting} dei
+ \constd{CAP\_SYS\_PACCT}& Usare le funzioni di \textit{accounting} dei
processi (vedi
sez.~\ref{sec:sys_bsd_accounting}).\\
- \const{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
+ \constd{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
\func{ptrace} (vedi
sez.~\ref{sec:process_ptrace}).\\
- \const{CAP\_SYS\_RAWIO} & Operare sulle porte di I/O con \func{ioperm} e
+ \constd{CAP\_SYS\_RAWIO}& Operare sulle porte di I/O con \func{ioperm} e
\func{iopl} (vedi
sez.~\ref{sec:process_io_port}).\\
\const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\
- \const{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi
+ \constd{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi
sez.~\ref{sec:sys_time}).\\
- \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
+ \constd{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
con la funzione \func{vhangup}.\\
- \const{CAP\_SYSLOG} & Gestire il buffer dei messaggi
+ \constd{CAP\_SYSLOG} & Gestire il buffer dei messaggi
del kernel, (vedi sez.~\ref{sec:sess_daemon}),
introdotta dal kernel 2.6.38 come capacità
separata da \const{CAP\_SYS\_ADMIN}.\\
- \const{CAP\_WAKE\_ALARM}& Usare i timer di tipo
+ \constd{CAP\_WAKE\_ALARM}&Usare i timer di tipo
\const{CLOCK\_BOOTTIME\_ALARM} e
\const{CLOCK\_REALTIME\_ALARM}, vedi
sez.~\ref{sec:sig_timer_adv} (dal kernel 3.0).\\
\label{tab:proc_capabilities}
\end{table}
+\constbeg{CAP\_SETPCAP}
Prima di dettagliare il significato della capacità più generiche, conviene
però dedicare un discorso a parte a \const{CAP\_SETPCAP}, il cui significato è
conseguente impossibilità successiva di eseguire programmi con quella
capacità), o di impostare i \textit{securebits} delle \textit{capabilities}.
+\constend{CAP\_SETPCAP}
+\constbeg{CAP\_FOWNER}
+
La prima fra le capacità ``\textsl{ampie}'' che occorre dettagliare
maggiormente è \const{CAP\_FOWNER}, che rimuove le restrizioni poste ad un
processo che non ha la proprietà di un file in un vasto campo di
sez.~\ref{sec:file_perm_management} e sez.~\ref{sec:file_file_times}), le
impostazioni degli attributi dei file e delle ACL (vedi
sez.~\ref{sec:file_xattr} e \ref{sec:file_ACL}), poter ignorare lo
-\itindex{sticky~bit} \textit{sticky bit} nella cancellazione dei file (vedi
+\textit{sticky bit} nella cancellazione dei file (vedi
sez.~\ref{sec:file_special_perm}), la possibilità di impostare il flag di
\const{O\_NOATIME} con \func{open} e \func{fcntl} (vedi
sez.~\ref{sec:file_open_close} e sez.~\ref{sec:file_fcntl_ioctl}) senza
restrizioni.
+\constend{CAP\_FOWNER}
+\constbeg{CAP\_NET\_ADMIN}
+
Una seconda capacità che copre diverse operazioni, in questo caso riguardanti
la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni
privilegiate dei socket (vedi sez.~\ref{sec:sock_generic_options}), abilitare
-il \itindex{multicast} \textit{multicasting}, eseguire la configurazione delle
-interfacce di rete (vedi sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la
-tabella di instradamento.
+il \textit{multicasting} (vedi sez.\ref{sec:sock_ipv4_options}), eseguire la
+configurazione delle interfacce di rete (vedi
+sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la tabella di instradamento.
+
+\constend{CAP\_NET\_ADMIN}
+\constbeg{CAP\_SYS\_ADMIN}
Una terza \textit{capability} con vasto campo di applicazione è
\const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
(\const{IOPRIO\_CLASS\_RT} e prima del kernel 2.6.25 anche
\const{IOPRIO\_CLASS\_IDLE}) per lo scheduling dell'I/O (vedi
sez.~\ref{sec:io_priority}), superare il limite di sistema sul numero massimo
-di file aperti,\footnote{quello indicato da \sysctlfile{fs/file-max}.}
+di file aperti,\footnote{quello indicato da \sysctlfiled{fs/file-max}.}
effettuare operazioni privilegiate sulle chiavi mantenute dal kernel (vedi
sez.~\ref{sec:keyctl_management}), usare la funzione \func{lookup\_dcookie},
usare \const{CLONE\_NEWNS} con \func{unshare} e \func{clone}, (vedi
sez.~\ref{sec:process_clone}).
+\constend{CAP\_SYS\_ADMIN}
+\constbeg{CAP\_SYS\_NICE}
+
Originariamente \const{CAP\_SYS\_NICE} riguardava soltanto la capacità di
aumentare le priorità di esecuzione dei processi, come la diminuzione del
valore di \textit{nice} (vedi sez.~\ref{sec:proc_sched_stand}), l'uso delle
arbitrarie nell'accesso a disco (vedi sez.~\ref{sec:io_priority}) e nelle
politiche di allocazione delle pagine di memoria ai nodi di un sistema NUMA.
+\constend{CAP\_SYS\_NICE}
+\constbeg{CAP\_SYS\_RESOURCE}
+
Infine la \textit{capability} \const{CAP\_SYS\_RESOURCE} attiene alla
possibilità di superare i limiti imposti sulle risorse di sistema, come usare
lo spazio disco riservato all'amministratore sui filesystem che lo supportano,
numero di processi, ed i limiti sulle dimensioni dei messaggi delle code del
SysV IPC (vedi sez.~\ref{sec:ipc_sysv_mq}).
+\constend{CAP\_SYS\_RESOURCE}
+
Per la gestione delle \textit{capabilities} il kernel mette a disposizione due
funzioni che permettono rispettivamente di leggere ed impostare i valori dei
tre insiemi illustrati in precedenza. Queste due funzioni di sistema sono
indicato che per poterle utilizzare fosse necessario che la macro
\macro{\_POSIX\_SOURCE} risultasse non definita (ed era richiesto di inserire
una istruzione \texttt{\#undef \_POSIX\_SOURCE} prima di includere
-\headfile{sys/capability.h}) requisito che non risulta più
+\headfiled{sys/capability.h}) requisito che non risulta più
presente.\footnote{e non è chiaro neanche quanto sia mai stato davvero
necessario.}
\centering
\begin{minipage}[c]{0.8\textwidth}
\includestruct{listati/cap_user_header_t.h}
- \end{minipage}
+ \end{minipage}
\normalsize
\caption{Definizione delle strutture a cui fanno riferimento i puntatori
\structd{cap\_user\_header\_t} e \structd{cap\_user\_data\_t} usati per
Le funzioni dell'interfaccia alle \textit{capabilities} definite nelle bozze
dello standard POSIX.1e prevedono l'uso di un tipo di dato opaco,
-\type{cap\_t}, come puntatore ai dati mantenuti nel cosiddetto
+\typed{cap\_t}, come puntatore ai dati mantenuti nel cosiddetto
\textit{capability state},\footnote{si tratta in sostanza di un puntatore ad
una struttura interna utilizzata dalle librerie, i cui campi non devono mai
essere acceduti direttamente.} in sono memorizzati tutti i dati delle
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{CAP\_EFFECTIVE} & Capacità dell'insieme \textsl{effettivo}.\\
- \const{CAP\_PERMITTED} & Capacità dell'insieme \textsl{permesso}.\\
- \const{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\
+ \constd{CAP\_EFFECTIVE} & Capacità dell'insieme \textsl{effettivo}.\\
+ \constd{CAP\_PERMITTED} & Capacità dell'insieme \textsl{permesso}.\\
+ \constd{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\
\hline
\end{tabular}
- \caption{Valori possibili per il tipo di dato \type{cap\_flag\_t} che
+ \caption{Valori possibili per il tipo di dato \typed{cap\_flag\_t} che
identifica gli insiemi delle \textit{capabilities}.}
\label{tab:cap_set_identifier}
\end{table}
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/capability.h}
-\fdecl{int \macro{CAP\_DIFFERS}(value, flag)}
+\fdecl{int \macrod{CAP\_DIFFERS}(value, flag)}
\fdesc{Controlla lo stato di eventuali differenze delle \textit{capabilities}
nell'insieme \texttt{flag}.}
}
indica su quale dei tre insiemi si intende operare, sempre con i valori di
tab.~\ref{tab:cap_set_identifier}. La capacità che si intende controllare o
impostare invece deve essere specificata attraverso una variabile di tipo
-\type{cap\_value\_t}, che può prendere come valore uno qualunque di quelli
+\typed{cap\_value\_t}, che può prendere come valore uno qualunque di quelli
riportati in tab.~\ref{tab:proc_capabilities}, in questo caso però non è
possibile combinare diversi valori in una maschera binaria, una variabile di
tipo \type{cap\_value\_t} può indicare una sola capacità.\footnote{in
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{CAP\_CLEAR}& La capacità non è impostata.\\
- \const{CAP\_SET} & La capacità è impostata.\\
+ \constd{CAP\_CLEAR}& La capacità non è impostata.\\
+ \constd{CAP\_SET} & La capacità è impostata.\\
\hline
\end{tabular}
- \caption{Valori possibili per il tipo di dato \type{cap\_flag\_value\_t} che
+ \caption{Valori possibili per il tipo di dato \typed{cap\_flag\_value\_t} che
indica lo stato di una capacità.}
\label{tab:cap_value_type}
\end{table}
% sicurezza avanzate, con dentro chroot SELinux e AppArmor, Tomoyo, Smack,
% cgroup o altro
-% TODO: trattare la funzione setns e i namespace file descriptors (vedi
-% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0, altre
-% informazioni su setns qui: http://lwn.net/Articles/532748/
-% http://lwn.net/Articles/531498/
-
% TODO: spostare chroot e le funzioni affini relative ai container da qualche
% parte diversa se è il caso.
\kstruct{fs\_struct}; vedi fig.~\ref{fig:proc_task_struct}.} che, pur
essendo di norma corrispondente alla radice dell'albero dei file dell'intero
sistema, ha per il processo il significato specifico di directory rispetto
-alla quale vengono risolti i \itindsub{pathname}{assoluto}\textit{pathname}
-assoluti.\footnote{cioè quando un processo chiede la risoluzione di un
- \textit{pathname}, il kernel usa sempre questa directory come punto di
- partenza.} Il fatto che questo valore sia specificato per ogni processo apre
-allora la possibilità di modificare le modalità di risoluzione dei
-\itindsub{pathname}{assoluto} \textit{pathname} assoluti da parte di un
-processo cambiando questa directory, così come si fa coi
-\itindsub{pathname}{relativo} \textit{pathname} relativi cambiando la
-directory di lavoro.
+alla quale vengono risolti i \textit{pathname} assoluti.\footnote{cioè quando
+ un processo chiede la risoluzione di un \textit{pathname}, il kernel usa
+ sempre questa directory come punto di partenza.} Il fatto che questo valore
+sia specificato per ogni processo apre allora la possibilità di modificare le
+modalità di risoluzione dei \textit{pathname} assoluti da parte di un processo
+cambiando questa directory, così come si fa coi \textit{pathname} relativi
+cambiando la directory di lavoro.
Normalmente la directory radice di un processo coincide con la radice generica
dell'albero dei file, che è la directory che viene montata direttamente dal
\end{funcproto}
La funzione imposta la directory radice del processo a quella specificata da
-\param{path} (che ovviamente deve esistere) ed ogni
-\itindsub{pathname}{assoluto} \textit{pathname} assoluto usato dalle funzioni
-chiamate nel processo sarà risolto a partire da essa, rendendo impossibile
-accedere alla parte di albero sovrastante. Si ha così quella che viene
-chiamata una \textit{chroot jail}, in quanto il processo non può più accedere
-a file al di fuori della sezione di albero in cui è stato
+\param{path} (che ovviamente deve esistere) ed ogni \textit{pathname} assoluto
+usato dalle funzioni chiamate nel processo sarà risolto a partire da essa,
+rendendo impossibile accedere alla parte di albero sovrastante. Si ha così
+quella che viene chiamata una \textit{chroot jail}, in quanto il processo non
+può più accedere a file al di fuori della sezione di albero in cui è stato
\textsl{imprigionato}.
Solo un processo con i privilegi di amministratore può usare questa
ad un ramo di albero solo se dopo averla eseguita si cedono i privilegi di
amministratore. Infatti se per un qualunque motivo il processo resta con la
sua directory di lavoro al di fuori dalla \textit{chroot jail}, potrà accedere
-a tutto il resto del filesystem usando \itindsub{pathname}{relativo} dei
-\textit{pathname} relativi, dato che in tal caso è possibile, grazie all'uso
-di ``\texttt{..}'', risalire all'indietro fino alla radice effettiva
-dell'albero dei file.
+a tutto il resto del filesystem usando dei \textit{pathname} relativi, dato
+che in tal caso è possibile, grazie all'uso di ``\texttt{..}'', risalire
+all'indietro fino alla radice effettiva dell'albero dei file.
Potrebbe sembrare che per risolvere il problema sia sufficiente ricordarsi di
eseguire preventivamente anche una \func{chdir} sulla directory su cui si