%% filedir.tex
%%
-%% Copyright (C) 2000-2005 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2006 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",
\errval{ENOSPC}, \errval{EIO}.}
\end{prototype}
-La funzione crea sul \index{\textit{pathname}}\textit{pathname}
-\param{newpath} un collegamento diretto al file indicato da \param{oldpath}.
-Per quanto detto la creazione di un nuovo collegamento diretto non copia il
-contenuto del file, ma si limita a creare una voce nella directory specificata
-da \param{newpath} e ad aumentare di uno il numero di riferimenti al file
-(riportato nel campo \var{st\_nlink} della struttura \struct{stat}, vedi
-sez.~\ref{sec:file_stat}) aggiungendo il nuovo nome ai precedenti. Si noti che
-uno stesso file può essere così chiamato con vari nomi in diverse directory.
+La funzione crea sul \itindex{pathname}\textit{pathname} \param{newpath} un
+collegamento diretto al file indicato da \param{oldpath}. Per quanto detto la
+creazione di un nuovo collegamento diretto non copia il contenuto del file, ma
+si limita a creare una voce nella directory specificata da \param{newpath} e
+ad aumentare di uno il numero di riferimenti al file (riportato nel campo
+\var{st\_nlink} della struttura \struct{stat}, vedi sez.~\ref{sec:file_stat})
+aggiungendo il nuovo nome ai precedenti. Si noti che uno stesso file può
+essere così chiamato con vari nomi in diverse directory.
Per quanto dicevamo in sez.~\ref{sec:file_filesystem} la creazione di un
collegamento diretto è possibile solo se entrambi i
-\index{\textit{pathname}}\textit{pathname} sono nello stesso filesystem;
-inoltre il filesystem deve supportare i collegamenti diretti (il meccanismo
-non è disponibile ad esempio con il filesystem \acr{vfat} di Windows).
+\itindex{pathname}\textit{pathname} sono nello stesso filesystem; inoltre il
+filesystem deve supportare i collegamenti diretti (il meccanismo non è
+disponibile ad esempio con il filesystem \acr{vfat} di Windows).
La funzione inoltre opera sia sui file ordinari che sugli altri oggetti del
filesystem, con l'eccezione delle directory. In alcune versioni di Unix solo
scrittura su di essa, dato che si va a rimuovere una voce dal suo contenuto, e
il diritto di esecuzione 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 \textit{sticky} bit (vedi
-sez.~\ref{sec:file_sticky}) è impostato occorrerà anche essere proprietari del
-file o proprietari della directory (o root, per cui nessuna delle restrizioni
-è applicata).
+sez.~\ref{sec:file_access_control}). Se inoltre lo
+\itindex{sticky~bit}\textit{sticky bit} (vedi sez.~\ref{sec:file_sticky}) è
+impostato occorrerà anche essere proprietari del file o proprietari della
+directory (o root, per cui nessuna delle restrizioni è applicata).
Una delle caratteristiche di queste funzioni è che la creazione/rimozione del
nome dalla directory e l'incremento/decremento del numero di riferimenti
un'ulteriore condizione,\footnote{come vedremo in
cap.~\ref{cha:file_unix_interface} il kernel mantiene anche una tabella dei
file aperti nei vari processi, che a sua volta contiene i riferimenti agli
- 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'inode in questione.} e cioè che non ci siano processi che abbiano il
-suddetto file aperto).
+ \index{inode} 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'inode in questione.} e cioè che non ci siano processi che
+abbiano il suddetto file aperto).
Questa proprietà viene spesso usata per essere sicuri di non lasciare file
temporanei su disco in caso di crash dei programmi; la tecnica è quella di
\param{oldpath} o più in generale si è cercato di creare una directory come
sotto-directory di se stessa.
\item[\errcode{ENOTDIR}] Uno dei componenti dei
- \index{\textit{pathname}}\textit{pathname} non è una directory o
- \param{oldpath} è una directory e \param{newpath} esiste e non è una
- directory.
+ \itindex{pathname}\textit{pathname} non è una directory o \param{oldpath}
+ è una directory e \param{newpath} esiste e non è una directory.
\end{errlist}
ed inoltre \errval{EACCES}, \errval{EPERM}, \errval{EMLINK},
\errval{ENOENT}, \errval{ENOMEM}, \errval{EROFS}, \errval{ELOOP} e
\label{sec:file_symlink}
Come abbiamo visto in sez.~\ref{sec:file_link} la funzione \func{link} crea
-riferimenti agli inode\index{inode}, pertanto può funzionare soltanto per file
+riferimenti agli \index{inode}inode, pertanto 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 link diretto
ad una directory.
\file{/boot/boot/boot} e così via.
Per questo motivo il kernel e le librerie prevedono che nella risoluzione di
-un \index{\textit{pathname}}\textit{pathname} possano essere seguiti un numero
+un \itindex{pathname}\textit{pathname} possano essere seguiti un numero
limitato di link simbolici, il cui valore limite è specificato dalla costante
\const{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un
errore ed \var{errno} viene impostata al valore \errcode{ELOOP}.
\label{sec:file_dir_creat_rem}
Benché in sostanza le directory non siano altro che dei file contenenti
-elenchi di nomi ed inode, non è possibile trattarle come file ordinari e
-devono essere create direttamente dal kernel attraverso una opportuna system
-call.\footnote{questo permette anche, attraverso l'uso del VFS, l'utilizzo di
- diversi formati per la gestione dei suddetti elenchi.} La funzione usata
-per creare una directory è \funcd{mkdir}, ed il suo prototipo è:
+elenchi di nomi ed \index{inode}inode, non è possibile trattarle come file
+ordinari e devono essere create direttamente dal kernel attraverso una
+opportuna system call.\footnote{questo permette anche, attraverso l'uso del
+ VFS, l'utilizzo di diversi formati per la gestione dei suddetti elenchi.}
+La funzione usata per creare una directory è \funcd{mkdir}, ed il suo
+prototipo è:
\begin{functions}
\headdecl{sys/stat.h}
\headdecl{sys/types.h}
La funzione crea una nuova directory vuota, che contiene cioè solo le due voci
standard (\file{.} e \file{..}), con il nome indicato dall'argomento
\param{dirname}. Il nome può essere indicato sia come
-\index{\textit{pathname}}\textit{pathname} assoluto che relativo.
+\itindex{pathname}\textit{pathname} assoluto che relativo.
I permessi di accesso alla directory (vedi sez.~\ref{sec:file_access_control})
sono specificati da \param{mode}, i cui possibili valori sono riportati in
errore, nel qual caso \var{errno} assumerà i valori:
\begin{errlist}
\item[\errcode{EPERM}] Il filesystem non supporta la cancellazione di
- directory, oppure la directory che contiene \param{dirname} ha lo sticky
- bit impostato e l'user-ID effettivo del processo non corrisponde al
- proprietario della directory.
+ directory, oppure la directory che contiene \param{dirname} ha lo
+ \itindex{sticky~bit} \textit{sticky bit} impostato e l'user-ID effettivo
+ del processo non corrisponde al proprietario della directory.
\item[\errcode{EACCES}] Non c'è il permesso di scrittura per la directory
che contiene la directory che si vuole cancellare, o non c'è il permesso
di attraversare (esecuzione) una delle directory specificate in
La funzione cancella la directory \param{dirname}, che deve essere vuota (la
directory deve cioè contenere soltanto le due voci standard \file{.} e
\file{..}). Il nome può essere indicato con il
-\index{\textit{pathname}}\textit{pathname} assoluto o relativo.
+\itindex{pathname}\textit{pathname} assoluto o relativo.
La modalità con cui avviene la cancellazione è analoga a quella di
\func{unlink}: fintanto che il numero di link all'inode\index{inode} della
\begin{functions}
\headdecl{sys/types.h}
\headdecl{sys/stat.h}
- \headdecl{fnctl.h}
+ \headdecl{fcntl.h}
\headdecl{unistd.h}
\funcdecl{int mknod(const char *pathname, mode\_t mode, dev\_t dev)}
errore, nel qual caso \var{errno} assumerà i valori:
\begin{errlist}
\item[\errcode{EPERM}] Non si hanno privilegi sufficienti a creare l'inode, o
- il filesystem su cui si è cercato di creare \func{pathname} non supporta
+ il filesystem su cui si è cercato di creare \param{pathname} non supporta
l'operazione.
\item[\errcode{EINVAL}] Il valore di \param{mode} non indica un file, una
fifo o un dispositivo.
\var{umask} (si veda sez.~\ref{sec:file_umask}).
Per il tipo di file può essere specificato solo uno fra: \const{S\_IFREG} per
-un file regolare (che sarà creato vuoto), \const{S\_IFBLK} per un device a
-blocchi, \const{S\_IFCHR} per un device a caratteri e \const{S\_IFIFO} per una
-fifo. Un valore diverso comporterà l'errore \errcode{EINVAL}. Qualora si sia
-specificato in \param{mode} un file di dispositivo, il valore di \param{dev}
-viene usato per indicare a quale dispositivo si fa riferimento.
+un file regolare (che sarà creato vuoto), \const{S\_IFBLK} per un dispositivo
+a blocchi, \const{S\_IFCHR} per un dispositivo a caratteri e \const{S\_IFIFO}
+per una fifo. Un valore diverso comporterà l'errore \errcode{EINVAL}. Qualora
+si sia specificato in \param{mode} un file di dispositivo, il valore di
+\param{dev} viene usato per indicare a quale dispositivo si fa riferimento.
Solo l'amministratore può creare un file di dispositivo o un file regolare
usando questa funzione; ma in Linux\footnote{la funzione non è prevista dallo
\label{sec:file_dir_read}
Benché le directory alla fine non siano altro che dei file che contengono
-delle liste di nomi ed 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 ed \index{inode}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{functions}
La funzione restituisce in \param{result} (come
-\index{\textit{value~result~argument}}\textit{value result argument})
-l'indirizzo dove sono stati salvati i dati, che di norma corrisponde a quello
-della struttura precedentemente allocata e specificata dall'argomento
-\param{entry} (anche se non è assicurato che la funzione usi lo spazio fornito
-dall'utente).
+\itindex{value~result~argument}\textit{value result argument}) l'indirizzo
+dove sono stati salvati i dati, che di norma corrisponde a quello della
+struttura precedentemente allocata e specificata dall'argomento \param{entry}
+(anche se non è assicurato che la funzione usi lo spazio fornito dall'utente).
I vari campi di \struct{dirent} contengono le informazioni relative alle voci
presenti nella directory; sia BSD che SVr4\footnote{POSIX prevede invece solo
ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del campo è
definita come \code{NAME\_MAX+1} che di norma porta al valore di 256 byte
usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero di
-inode cui il file è associato (di solito corrisponde al campo \var{st\_ino} di
-\struct{stat}).
+\index{inode}inode cui il file è associato (di solito corrisponde al campo
+\var{st\_ino} di \struct{stat}).
\begin{figure}[!htb]
\footnotesize \centering
directory, mentre il campo \var{d\_reclen} la lunghezza totale della voce
letta. Con questi due campi diventa possibile, determinando la posizione delle
varie voci, spostarsi all'interno dello stream usando la funzione
-\func{seekdir},\footnote{sia questa funzione che \func{telldir}, sono
+\funcd{seekdir},\footnote{sia questa funzione che \func{telldir}, sono
estensioni prese da BSD, non previste dallo standard POSIX.} il cui
prototipo è:
\begin{prototype}{dirent.h}{void seekdir(DIR *dir, off\_t offset)}
La funzione non ritorna nulla e non segnala errori, è però necessario che il
valore dell'argomento \param{offset} sia valido per lo stream \param{dir};
esso pertanto deve essere stato ottenuto o dal valore di \var{d\_off} di
-\struct{dirent} o dal valore restituito dalla funzione \func{telldir}, che
+\struct{dirent} o dal valore restituito dalla funzione \funcd{telldir}, che
legge la posizione corrente; il prototipo di quest'ultima è:
\begin{prototype}{dirent.h}{off\_t telldir(DIR *dir)}
Ritorna la posizione corrente in un \textit{directory stream}.
Al solito, per la presenza fra gli argomenti di due puntatori a funzione, il
prototipo non è molto comprensibile; queste funzioni però sono quelle che
-controllano rispettivamente la selezione di una voce (\param{select}) e
-l'ordinamento di tutte le voci selezionate (\param{compar}).
+controllano rispettivamente la selezione di una voce (quella passata con
+l'argomento \param{select}) e l'ordinamento di tutte le voci selezionate
+(quella specificata dell'argomento \param{compar}).
La funzione legge tutte le voci della directory indicata dall'argomento
-\param{dir}, passando ciascuna di esse come argomento alla funzione di
-\param{select}; se questa ritorna un valore diverso da zero la voce viene
-inserita in una struttura allocata dinamicamente con \func{malloc}, qualora si
-specifichi un valore \val{NULL} per \func{select} vengono selezionate tutte le
-voci. Tutte le voci selezionate vengono poi inserite un una lista (anch'essa
-allocata con \func{malloc}, che viene riordinata tramite \func{qsort} usando
-la funzione \param{compar} come criterio di ordinamento; alla fine l'indirizzo
-della lista ordinata è restituito nell'argomento \param{namelist}.
-
-Per l'ordinamento sono disponibili anche due funzioni predefinite,
+\param{dir}, passando ciascuna di esse (una struttura \struct{dirent}) come
+argomento della funzione di selezione specificata da \param{select}; se questa
+ritorna un valore diverso da zero la voce viene inserita in un vettore che
+viene allocato dinamicamente con \func{malloc}. Qualora si specifichi un
+valore \val{NULL} per \func{select} vengono selezionate tutte le voci.
+
+Le voci selezionate possono essere riordinate tramite \func{qsort}, le modalità
+del riordinamento possono essere personalizzate usando la funzione
+\param{compar} come criterio di ordinamento di\func{qsort}, la funzione prende
+come argomenti le due strutture \struct{dirent} da confrontare restituendo un
+valore positivo, nullo o negativo per indicarne l'ordinamento; alla fine
+l'indirizzo della lista delle strutture \struct{dirent} così ordinate viene
+restituito nell'argomento \param{namelist}.
+
+Per l'ordinamento (vale a dire come valori possibili per l'argomento
+\param{compar}) sono disponibili anche due funzioni predefinite,
\funcd{alphasort} e \funcd{versionsort}, i cui prototipi sono:
\begin{functions}
\headdecl{dirent.h}
a partire dalla versione 2.1, effettuano anche l'ordinamento alfabetico
tenendo conto delle varie localizzazioni, usando \func{strcoll} al posto di
\func{strcmp}.} anche \func{versionsort}, che ordina i nomi tenendo conto
-del numero di versione (cioè qualcosa per cui \file{file10} viene comunque
-dopo \func{file4}.)
+del numero di versione (cioè qualcosa per cui \texttt{file10} viene comunque
+dopo \texttt{file4}.)
Un semplice esempio dell'uso di queste funzioni è riportato in
fig.~\ref{fig:file_my_ls}, dove si è riportata la sezione principale di un
-programma che, usando la routine di scansione illustrata in
+programma che, usando la funzione di scansione illustrata in
fig.~\ref{fig:file_dirscan}, stampa i nomi dei file contenuti in una directory
e la relativa dimensione (in sostanza una versione semplificata del comando
\cmd{ls}).
\begin{minipage}[c]{15.6cm}
\includecodesample{listati/DirScan.c}
\end{minipage}
- \caption{Codice della routine di scansione di una directory contenuta nel
+ \caption{Codice della funzione di scansione di una directory contenuta nel
file \file{DirScan.c}.}
\label{fig:file_dirscan}
\end{figure}
\subsection{La directory di lavoro}
\label{sec:file_work_dir}
+\itindbeg{pathname}
+
A ciascun processo è associata una directory nel filesystem che è chiamata
\textsl{directory corrente} o \textsl{directory di lavoro} (in inglese
\textit{current working directory}) che è quella a cui si fa riferimento
-quando un \index{\textit{pathname}}\textit{pathname} è espresso in forma
+quando un \itindsub{pathname}{relativo}\textit{pathname} è espresso in forma
relativa, dove il ``\textsl{relativa}'' fa riferimento appunto a questa
directory.
directory corrente di qualunque comando da essa lanciato.
In genere il kernel tiene traccia per ciascun processo dell'inode\index{inode}
-della directory di lavoro, per ottenere il
-\index{\textit{pathname}}\textit{pathname} occorre usare una apposita funzione
-di libreria, \funcd{getcwd}, il cui prototipo è:
+della directory di lavoro, per ottenere il \textit{pathname}
+occorre usare una apposita funzione di libreria, \funcd{getcwd}, il cui
+prototipo è:
\begin{prototype}{unistd.h}{char *getcwd(char *buffer, size\_t size)}
Legge il \textit{pathname} della directory di lavoro corrente.
\end{errlist}}
\end{prototype}
-La funzione restituisce il \index{\textit{pathname}}\textit{pathname} completo
-della directory di lavoro nella stringa puntata da \param{buffer}, che deve
-essere precedentemente allocata, per una dimensione massima di \param{size}.
-Il buffer deve essere sufficientemente lungo da poter contenere il
+La funzione restituisce il \textit{pathname} completo della directory di
+lavoro nella stringa puntata da \param{buffer}, che deve essere
+precedentemente allocata, per una dimensione massima di \param{size}. Il
+buffer deve essere sufficientemente lungo da poter contenere il
\textit{pathname} completo più lo zero di terminazione della stringa. Qualora
esso ecceda le dimensioni specificate con \param{size} la funzione restituisce
un errore.
\param{buffer},\footnote{questa è un'estensione allo standard POSIX.1,
supportata da Linux.} nel qual caso la stringa sarà allocata automaticamente
per una dimensione pari a \param{size} qualora questa sia diversa da zero, o
-della lunghezza esatta del \index{\textit{pathname}}\textit{pathname}
-altrimenti. In questo caso ci si deve ricordare di disallocare la stringa una
-volta cessato il suo utilizzo.
+della lunghezza esatta del \textit{pathname} altrimenti. In questo caso ci si
+deve ricordare di disallocare la stringa una volta cessato il suo utilizzo.
Di questa funzione esiste una versione \code{char *getwd(char *buffer)} fatta
per compatibilità all'indietro con BSD, che non consente di specificare la
dimensione del buffer; esso deve essere allocato in precedenza ed avere una
dimensione superiore a \const{PATH\_MAX} (di solito 256 byte, vedi
sez.~\ref{sec:sys_limits}); il problema è che in Linux non esiste una
-dimensione superiore per un \index{\textit{pathname}}\textit{pathname}, per
-cui non è detto che il buffer sia sufficiente a contenere il nome del file, e
-questa è la ragione principale per cui questa funzione è deprecata.
+dimensione superiore per un \textit{pathname}, per cui non è detto che il
+buffer sia sufficiente a contenere il nome del file, e questa è la ragione
+principale per cui questa funzione è deprecata.
Una seconda funzione simile è \code{char *get\_current\_dir\_name(void)} che è
sostanzialmente equivalente ad una \code{getcwd(NULL, 0)}, con la sola
differenza che essa ritorna il valore della variabile di ambiente \val{PWD},
che essendo costruita dalla shell può contenere un \textit{pathname}
comprendente anche dei link simbolici. Usando \func{getcwd} infatti, essendo
-il \index{\textit{pathname}}\textit{pathname} ricavato risalendo all'indietro
-l'albero della directory, si perderebbe traccia di ogni passaggio attraverso
-eventuali link simbolici.
+il \textit{pathname} ricavato risalendo all'indietro l'albero della directory,
+si perderebbe traccia di ogni passaggio attraverso eventuali link simbolici.
Per cambiare la directory di lavoro si può usare la funzione \funcd{chdir}
(equivalente del comando di shell \cmd{cd}) il cui nome sta appunto per
quale si hanno i permessi di accesso.
Dato che anche le directory sono file, è possibile riferirsi ad esse anche
-tramite il file descriptor, e non solo tramite il
-\index{\textit{pathname}}\textit{pathname}, per fare questo si usa
-\funcd{fchdir}, il cui prototipo è:
+tramite il file descriptor, e non solo tramite il \textit{pathname}, per fare
+questo si usa \funcd{fchdir}, il cui prototipo è:
\begin{prototype}{unistd.h}{int fchdir(int fd)}
Identica a \func{chdir}, ma usa il file descriptor \param{fd} invece del
\textit{pathname}.
quello in cui il processo non ha il permesso di accesso alla directory
specificata da \param{fd}.
+\itindend{pathname}
+
\subsection{I file temporanei}
prima vista. Infatti anche se sembrerebbe banale generare un nome a caso e
creare il file dopo aver controllato che questo non esista, nel momento fra il
controllo e la creazione si ha giusto lo spazio per una possibile \textit{race
- condition}\index{\textit{race~condition}} (si ricordi quanto visto in
+ condition}\itindex{race~condition} (si ricordi quanto visto in
sez.~\ref{sec:proc_race_cond}).
Le \acr{glibc} provvedono varie funzioni per generare nomi di file temporanei,
la prima valida delle seguenti:
\begin{itemize*}
\item La variabile di ambiente \const{TMPNAME} (non ha effetto se non è
- definita o se il programma chiamante è \acr{suid} o \acr{sgid}, vedi
- sez.~\ref{sec:file_suid_sgid}).
+ definita o se il programma chiamante è \itindex{suid~bit} \acr{suid} o
+ \itindex{sgid~bit} \acr{sgid}, vedi sez.~\ref{sec:file_suid_sgid}).
\item il valore dell'argomento \param{dir} (se diverso da \val{NULL}).
\item Il valore della costante \const{P\_tmpdir}.
\item la directory \file{/tmp}.
esistente.
Per evitare di dovere effettuare a mano tutti questi controlli, lo standard
-POSIX definisce la funzione \funcd{tempfile}, il cui prototipo è:
+POSIX definisce la funzione \funcd{tmpfile}, il cui prototipo è:
\begin{prototype}{stdio.h}{FILE *tmpfile (void)}
Restituisce un file temporaneo aperto in lettura/scrittura.
standard non specifica in quale directory verrà aperto il file, ma le
\acr{glibc} prima tentano con \const{P\_tmpdir} e poi con \file{/tmp}. Questa
funzione è rientrante e non soffre di problemi di \textit{race
- condition}\index{\textit{race~condition}}.
+ condition}\itindex{race~condition}.
Alcune versioni meno recenti di Unix non supportano queste funzioni; in questo
caso si possono usare le vecchie funzioni \funcd{mktemp} e \func{mkstemp} che
modificano una stringa di input che serve da modello e che deve essere
conclusa da 6 caratteri \code{X} che verranno sostituiti da un codice
-unico. La prima delle due è analoga a \funcd{tmpnam} e genera un nome casuale,
+unico. La prima delle due è analoga a \func{tmpnam} e genera un nome casuale,
il suo prototipo è:
\begin{prototype}{stlib.h}{char *mktemp(char *template)}
Genera un filename univoco sostituendo le \code{XXXXXX} finali di
\end{prototype}
\noindent dato che \param{template} deve poter essere modificata dalla
funzione non si può usare una stringa costante. Tutte le avvertenze riguardo
-alle possibili \textit{race condition}\index{\textit{race~condition}} date per
+alle possibili \textit{race condition}\itindex{race~condition} date per
\func{tmpnam} continuano a valere; inoltre in alcune vecchie implementazioni
il valore usato per sostituire le \code{XXXXXX} viene formato con il \acr{pid}
del processo più una lettera, il che mette a disposizione solo 26 possibilità
\noindent la directory è creata con permessi \code{0700} (al solito si veda
cap.~\ref{cha:file_unix_interface} per i dettagli); dato che la creazione
della directory è sempre esclusiva i precedenti problemi di \textit{race
- condition}\index{\textit{race~condition}} non si pongono.
+ condition}\itindex{race~condition} non si pongono.
-\section{La manipolazione delle caratteristiche dei files}
+\section{La manipolazione delle caratteristiche dei file}
\label{sec:file_infos}
Come spiegato in sez.~\ref{sec:file_filesystem} tutte le informazioni generali
La lettura delle informazioni relative ai file è fatta attraverso la famiglia
delle funzioni \func{stat} (\funcd{stat}, \funcd{fstat} e \funcd{lstat});
questa è la funzione che ad esempio usa il comando \cmd{ls} per poter ottenere
-e mostrare tutti i dati dei files. I prototipi di queste funzioni sono i
+e mostrare tutti i dati dei file. I prototipi di queste funzioni sono i
seguenti:
\begin{functions}
\headdecl{sys/types.h}
\funcdecl{int lstat(const char *file\_name, struct stat *buf)} Identica a
\func{stat} eccetto che se il \param{file\_name} è un link simbolico vengono
- lette le informazioni relativae ad esso e non al file a cui fa riferimento.
+ lette le informazioni relative ad esso e non al file a cui fa riferimento.
\funcdecl{int fstat(int filedes, struct stat *buf)} Identica a \func{stat}
eccetto che si usa con un file aperto, specificato tramite il suo file
\const{S\_IFCHR} & 0020000 & dispositivo a caratteri \\
\const{S\_IFIFO} & 0010000 & fifo \\
\hline
- \const{S\_ISUID} & 0004000 & set UID bit \\
- \const{S\_ISGID} & 0002000 & set GID bit \\
- \const{S\_ISVTX} & 0001000 & sticky bit \\
+ \const{S\_ISUID} & 0004000 & set UID bit \itindex{suid~bit} \\
+ \const{S\_ISGID} & 0002000 & set GID bit \itindex{sgid~bit} \\
+ \const{S\_ISVTX} & 0001000 & sticky bit \itindex{sticky~bit}\\
\hline
% \const{S\_IRWXU} & 00700 & bitmask per i permessi del proprietario \\
\const{S\_IRUSR} & 00400 & il proprietario ha permesso di lettura \\
Il campo \var{st\_size} contiene la dimensione del file in byte (se si tratta
di un file regolare, nel caso di un link simbolico la dimensione è quella del
-\index{\textit{pathname}}\textit{pathname} che contiene, per le fifo è sempre
-nullo).
+\itindex{pathname}\textit{pathname} che contiene, per le fifo è sempre nullo).
Il campo \var{st\_blocks} definisce la lunghezza del file in blocchi di 512
byte. Il campo \var{st\_blksize} infine definisce la dimensione preferita per
\begin{errlist}
\item[\errcode{EACCES}] il file non ha permesso di scrittura o non si ha il
permesso di esecuzione una delle directory del
- \index{\textit{pathname}}\textit{pathname}.
+ \itindex{pathname}\textit{pathname}.
\item[\errcode{ETXTBSY}] Il file è un programma in esecuzione.
\end{errlist}
ed anche \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT},
\end{prototype}
La funzione prende come argomento \param{times} una struttura
-\struct{utimebuf}, la cui definizione è riportata in
+\struct{utimbuf}, la cui definizione è riportata in
fig.~\ref{fig:struct_utimebuf}, con la quale si possono specificare i nuovi
valori che si vogliono impostare per tempi.
\centering
\includegraphics[width=6cm]{img/fileperm}
\caption{Lo schema dei bit utilizzati per specificare i permessi di un file
- contenuti nel campo \var{st\_mode} di \struct{fstat}.}
+ contenuti nel campo \var{st\_mode} di \struct{stat}.}
\label{fig:file_perm_bit}
\end{figure}
-I restanti tre bit (noti come \acr{suid}, \acr{sgid}, e \textsl{sticky}) sono
-usati per indicare alcune caratteristiche più complesse del meccanismo del
-controllo di accesso su cui torneremo in seguito (in
+I restanti tre bit (noti come \itindex{suid~bit}\textit{suid bit},
+\itindex{sgid~bit}\textit{sgid bit}, e \itindex{sticky~bit} \textit{sticky
+ bit}) sono usati per indicare alcune caratteristiche più complesse del
+meccanismo del controllo di accesso su cui torneremo in seguito (in
sez.~\ref{sec:file_suid_sgid} e sez.~\ref{sec:file_sticky}); lo schema di
allocazione dei bit è riportato in fig.~\ref{fig:file_perm_bit}.
avanti.
La prima regola è che per poter accedere ad un file attraverso il suo
-\textit{pathname} occorre il permesso di esecuzione in ciascuna delle
-directory che compongono il \textit{pathname}; lo stesso vale per aprire un
-file nella directory corrente (per la quale appunto serve il diritto di
-esecuzione).
+\itindex{pathname}\textit{pathname} occorre il permesso di esecuzione in
+ciascuna delle directory che compongono il \textit{pathname}; lo stesso vale
+per aprire un file nella directory corrente (per la quale appunto serve il
+diritto di esecuzione).
Per una directory infatti il permesso di esecuzione significa che essa può
-essere attraversata nella risoluzione del
-\index{\textit{pathname}}\textit{pathname}, ed è distinto dal permesso di
-lettura che invece implica che si può leggere il contenuto della directory.
+essere attraversata nella risoluzione del \itindex{pathname}\textit{pathname},
+ed è distinto dal permesso di lettura che invece implica che si può leggere il
+contenuto della directory.
Questo significa che se si ha il permesso di esecuzione senza permesso di
lettura si potrà lo stesso aprire un file in una directory (se si hanno i
simbolico tutti i permessi come concessi; utente e gruppo a cui esso
appartiene vengono pure ignorati quando il link viene risolto, vengono
controllati solo quando viene richiesta la rimozione del link e quest'ultimo è
-in una directory con lo \textsl{sticky bit} impostato (si veda
-sez.~\ref{sec:file_sticky}).
+in una directory con lo \itindex{sticky~bit} \textit{sticky bit} impostato (si
+veda sez.~\ref{sec:file_sticky}).
La procedura con cui il kernel stabilisce se un processo possiede un certo
permesso (di lettura, scrittura o esecuzione) si basa sul confronto fra
\subsection{I bit \acr{suid} e \acr{sgid}}
\label{sec:file_suid_sgid}
+\itindbeg{suid~bit}
+\itindbeg{sgid~bit}
+
Come si è accennato (in sez.~\ref{sec:file_perm_overview}) nei dodici bit del
campo \var{st\_mode} di \struct{stat} che vengono usati per il controllo di
accesso oltre ai bit dei permessi veri e propri, ci sono altri tre bit che
Infine Linux utilizza il bit \acr{sgid} per una 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}).
+per quel file il \itindex{mandatory~locking} \textit{mandatory locking}
+(affronteremo questo argomento in dettaglio più avanti, in
+sez.~\ref{sec:file_mand_locking}).
+\itindend{suid~bit}
+\itindend{sgid~bit}
\subsection{Il bit \textsl{sticky}}
\label{sec:file_sticky}
+\itindbeg{sticky~bit}
+
L'ultimo dei bit rimanenti, identificato dalla costante \const{S\_ISVTX}, è in
parte un rimasuglio delle origini dei sistemi Unix. A quell'epoca infatti la
-memoria virtuale e l'accesso ai files erano molto meno sofisticati e per
+memoria virtuale e l'accesso ai file erano molto meno sofisticati e per
ottenere la massima velocità possibile per i programmi usati più comunemente
si poteva impostare questo bit.
-L'effetto di questo bit era che il segmento di testo del programma (si veda
-sez.~\ref{sec:proc_mem_layout} per i dettagli) veniva scritto nella swap la
-prima volta che questo veniva lanciato, e vi permaneva fino al riavvio della
-macchina (da questo il nome di \textsl{sticky bit}); essendo la swap un file
-continuo indicizzato direttamente in questo modo si poteva risparmiare in
-tempo di caricamento rispetto alla ricerca del file su disco. Lo
-\textsl{sticky bit} è indicato usando la lettera \cmd{t} al posto della
-\cmd{x} nei permessi per gli altri.
+L'effetto di questo bit era che il \index{segmento!testo} segmento di testo
+del programma (si veda sez.~\ref{sec:proc_mem_layout} per i dettagli) veniva
+scritto nella swap la prima volta che questo veniva lanciato, e vi permaneva
+fino al riavvio della macchina (da questo il nome di \textsl{sticky bit});
+essendo la swap un file continuo o una partizione indicizzata direttamente si
+poteva risparmiare in tempo di caricamento rispetto alla ricerca attraverso la
+struttura del filesystem. Lo \textsl{sticky bit} è indicato usando la lettera
+\texttt{t} al posto della \texttt{x} nei permessi per gli altri.
Ovviamente per evitare che gli utenti potessero intasare la swap solo
l'amministratore era in grado di impostare questo bit, che venne chiamato
costante. Le attuali implementazioni di memoria virtuale e filesystem rendono
sostanzialmente inutile questo procedimento.
-Benché ormai non venga più utilizzato per i file, lo \textsl{sticky bit} ha
-invece assunto un uso importante per le directory;\footnote{lo \textsl{sticky
+Benché ormai non venga più utilizzato per i file, lo \textit{sticky bit} ha
+invece assunto un uso importante per le directory;\footnote{lo \textit{sticky
bit} per le directory è un'estensione non definita nello standard POSIX,
Linux però la supporta, così come BSD e SVr4.} in questo caso se tale bit è
impostato un file potrà essere rimosso dalla directory soltanto se l'utente ha
$ ls -ld /tmp
drwxrwxrwt 6 root root 1024 Aug 10 01:03 /tmp
\end{verbatim}%$
-quindi con lo \textsl{sticky bit} bit impostato. In questo modo qualunque
+quindi con lo \textit{sticky bit} bit impostato. In questo modo qualunque
utente nel sistema può creare dei file in questa directory (che, come
suggerisce il nome, è normalmente utilizzata per la creazione di file
temporanei), ma solo l'utente che ha creato un certo file potrà cancellarlo o
rinominarlo. In questo modo si evita che un utente possa, più o meno
consapevolmente, cancellare i file temporanei creati degli altri utenti.
+\itindend{sticky~bit}
+
\subsection{La titolarità di nuovi file e directory}
\label{sec:file_ownership}
Un esempio tipico per l'uso di questa funzione è quello di un processo che sta
eseguendo un programma coi privilegi di un altro utente (ad esempio attraverso
-l'uso del \acr{suid} bit) che vuole controllare se l'utente originale ha i
-permessi per accedere ad un certo file.
+l'uso del \itindex{suid~bit} \textit{suid bit}) che vuole controllare se
+l'utente originale ha i permessi per accedere ad un certo file.
\subsection{Le funzioni \func{chmod} e \func{fchmod}}
\textbf{\param{mode}} & \textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{S\_ISUID} & 04000 & set user ID \\
- \const{S\_ISGID} & 02000 & set group ID \\
- \const{S\_ISVTX} & 01000 & sticky bit \\
+ \const{S\_ISUID} & 04000 & set user ID \itindex{suid~bit} \\
+ \const{S\_ISGID} & 02000 & set group ID \itindex{sgid~bit}\\
+ \const{S\_ISVTX} & 01000 & sticky bit \itindex{sticky~bit}\\
\hline
\const{S\_IRWXU} & 00700 & l'utente ha tutti i permessi \\
\const{S\_IRUSR} & 00400 & l'utente ha il permesso di lettura \\
per il proprietario, sola lettura per il gruppo e gli altri) sono
corrispondenti al valore ottale $0644$, un programma invece avrebbe anche il
bit di esecuzione attivo, con un valore di $0755$, se si volesse attivare il
-bit \acr{suid} il valore da fornire sarebbe $4755$.
+bit \itindex{suid~bit} \acr{suid} il valore da fornire sarebbe $4755$.
Il cambiamento dei permessi di un file eseguito attraverso queste funzioni ha
comunque alcune limitazioni, previste per motivi di sicurezza. L'uso delle
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 \textit{sticky bit}, se
- l'user-ID 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 \itindex{sticky~bit}
+ \textit{sticky bit}, se l'user-ID 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} riguardo la creazione
dei nuovi file, si può avere il caso in cui il file creato da un processo è
assegnato a un gruppo per il quale il processo non ha privilegi. Per evitare
- che si possa assegnare il bit \acr{sgid} ad un file appartenente a 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'user-ID effettivo del processo è zero).
+ che si possa assegnare il bit \itindex{sgid~bit} \acr{sgid} ad un file
+ appartenente a 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'user-ID effettivo del processo è zero).
\end{enumerate}
-Per alcuni filesystem\footnote{il filesystem \acr{ext2} supporta questa
- caratteristica, che è mutuata da BSD.} è inoltre prevista una ulteriore
-misura di sicurezza, volta a scongiurare l'abuso dei bit \acr{suid} e
-\acr{sgid}; essa consiste nel cancellare automaticamente questi bit dai
-permessi di un file qualora un processo che non appartenga all'amministratore
-effettui una scrittura. In questo modo anche se un utente malizioso scopre un
-file \acr{suid} su cui può scrivere, un'eventuale modifica comporterà la
-perdita di questo privilegio.
+Per alcuni filesystem\footnote{i filesystem più comuni (\textsl{ext2},
+ \textsl{ext3}, \textsl{reiser}) supportano questa caratteristica, che è
+ mutuata da BSD.} è inoltre prevista una ulteriore misura di sicurezza, volta
+a scongiurare l'abuso dei \itindex{suid~bit} bit \acr{suid} e \acr{sgid}; essa
+consiste nel cancellare automaticamente questi bit dai permessi di un file
+qualora un processo che non appartenga all'amministratore\footnote{per la
+ precisione un processo che non dispone della capability
+ \const{CAP\_FSETID}.} effettui una scrittura. In questo modo anche se un
+utente malizioso scopre un file \acr{suid} su cui può scrivere, un'eventuale
+modifica comporterà la perdita di questo privilegio.
\subsection{La funzione \func{umask}}
\label{sec:file_umask}
\errval{EACCES}, \errval{ELOOP}; \func{fchown} anche \errval{EBADF}.}
\end{functions}
-In Linux soltanto l'amministratore può cambiare il proprietario di un file,
-seguendo la semantica di BSD che non consente agli utenti di assegnare i loro
-file ad altri (per evitare eventuali aggiramenti delle quote).
-L'amministratore può cambiare il gruppo di un file, il proprietario può
-cambiare il gruppo dei file che gli appartengono solo se il nuovo gruppo è il
-suo gruppo primario o uno dei gruppi a cui appartiene.
+In Linux soltanto l'amministratore (in sostanza un processo con la
+\itindex{capabilities} capability \const{CAP\_CHOWN}) può cambiare il
+proprietario di un file, seguendo la semantica di BSD che non consente agli
+utenti di assegnare i loro file ad altri (per evitare eventuali aggiramenti
+delle quote). L'amministratore può cambiare il gruppo di un file, il
+proprietario può cambiare il gruppo dei file che gli appartengono solo se il
+nuovo gruppo è il suo gruppo primario o uno dei gruppi di cui fa parte.
La funzione \func{chown} segue i link simbolici, per operare direttamente su
un link simbolico si deve usare la funzione \func{lchown}.\footnote{fino alla
valore per \param{owner} e \param{group} i valori restano immutati.
Quando queste funzioni sono chiamate con successo da un processo senza i
-privilegi di root 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}.
-
-%La struttura fondamentale che contiene i dati essenziali relativi ai file è il
-%cosiddetto \textit{inode}; questo conterrà informazioni come il
-%tipo di file (file di dispositivo, directory, file di dati, per un elenco
-%completo vedi \ntab), i permessi (vedi sez.~\ref{sec:file_perms}), le date (vedi
-%sez.~\ref{sec:file_times}).
+privilegi di root entrambi i bit \itindex{suid~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
+\itindex{mandatory~locking} \textit{mandatory locking}.
\subsection{Un quadro d'insieme sui permessi}
\hline
1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario\\
-&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario\\
- -&1&-&-&-&0&-&-&-&-&-&-&Il \textit{mandatory locking} è abilitato\\
+ -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking}
+ \textit{mandatory locking} è abilitato\\
-&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato\\
-&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario\\
-&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario\\
\label{tab:file_fileperm_bits}
\end{table}
-Per compattezza, nella tabella si sono specificati i bit di \acr{suid},
-\acr{sgid} e \acr{sticky} con la notazione illustrata anche in
-fig.~\ref{fig:file_perm_bit}.
+Per compattezza, nella tabella si sono specificati i bit di \itindex{suid~bit}
+\textit{suid}, \itindex{sgid~bit} \textit{sgid} e \textit{sticky}
+\itindex{sticky~bit} con la notazione illustrata anche in
+fig.~\ref{fig:file_perm_bit}.
In tab.~\ref{tab:file_dirperm_bits} si sono invece riassunti gli effetti dei
vari bit dei permessi per una directory; anche in questo caso si sono
-specificati i bit di \acr{suid}, \acr{sgid} e \acr{sticky} con la notazione
-compatta illustrata in fig.~\ref{fig:file_perm_bit}.
+specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit}
+\textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la notazione compatta
+illustrata in fig.~\ref{fig:file_perm_bit}.
\begin{table}[!htb]
\centering
di norma corrispondente alla radice dell'albero di file e directory come visto
dal kernel (ed illustrato in sez.~\ref{sec:file_organization}), ha per il
processo il significato specifico di directory rispetto alla quale vengono
-risolti i \index{\textit{pathname}!assoluto}\textit{pathname}
+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
\textit{pathname} assoluti da parte di un processo cambiando questa directory,
-così come si fa coi \index{\textit{pathname}!relativo}\textit{pathname}
-relativi cambiando la directory di lavoro.
+così come si fa coi \itindsub{pathname}{relativo}\textit{pathname} relativi
+cambiando la directory di lavoro.
Normalmente la directory radice di un processo coincide anche con la radice
del filesystem usata dal kernel, e dato che il suo valore viene ereditato dal
padre da ogni processo figlio, in generale i processi risolvono i
-\index{\textit{pathname}!assoluto}\textit{pathname} assoluti a partire sempre
-dalla stessa directory, che corrisponde alla \file{/} del sistema.
+\itindsub{pathname}{assoluto}\textit{pathname} assoluti a partire sempre dalla
+stessa directory, che corrisponde alla \file{/} del sistema.
In certe situazioni però, per motivi di sicurezza, è utile poter impedire che
un processo possa accedere a tutto il filesystem; per far questo si può
\end{prototype}
\noindent in questo modo la directory radice del processo diventerà
\param{path} (che ovviamente deve esistere) ed ogni
-\index{\textit{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
+\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
\textsl{imprigionato}.
Solo un processo con i privilegi di amministratore può usare questa funzione,
si cedono i privilegi di root. Infatti se per un qualche motivo il processo
resta con la directory di lavoro fuori dalla \textit{chroot jail}, potrà
comunque accedere a tutto il resto del filesystem usando
-\index{\textit{pathname}!relativo}\textit{pathname} relativi, i quali,
-partendo dalla directory di lavoro che è fuori della \textit{chroot jail},
-potranno (con l'uso di \texttt{..}) risalire fino alla radice effettiva del
-filesystem.
+\itindsub{pathname}{relativo}\textit{pathname} relativi, i quali, partendo
+dalla directory di lavoro che è fuori della \textit{chroot jail}, potranno
+(con l'uso di \texttt{..}) risalire fino alla radice effettiva del filesystem.
Ma se ad un processo restano i privilegi di amministratore esso potrà comunque
portare la sua directory di lavoro fuori dalla \textit{chroot jail} in cui si
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
+
+% LocalWords: sez like filesystem unlink MacOS Windows VMS inode kernel unistd
+% LocalWords: un'etichetta int const char oldpath newpath errno EXDEV EPERM st
+% LocalWords: EEXIST EMLINK EACCES ENAMETOOLONG ENOTDIR EFAULT ENOMEM EROFS ls
+% LocalWords: ELOOP ENOSPC EIO pathname nlink stat vfat fsck EISDIR ENOENT cap
+% LocalWords: POSIX socket fifo sticky root nell'inode system call count crash
+% LocalWords: all'inode descriptor remove rename rmdir stdio glibc libc NFS DT
+% LocalWords: ENOTEMPTY EBUSY mount point EINVAL soft symbolic tab symlink fig
+% LocalWords: dangling access chdir chmod chown creat exec lchown lstat mkdir
+% LocalWords: mkfifo mknod opendir pathconf readlink truncate path buff size
+% LocalWords: grub bootloader grep linux MAXSYMLINKS cat VFS sys dirname fcntl
+% LocalWords: dev l'inode umask IFREG IFBLK IFCHR IFIFO SVr sgid BSD SVID NULL
+% LocalWords: stream dirent EMFILE ENFILE dirfd SOURCE fchdir readdir struct
+% LocalWords: EBADF namlen HAVE thread entry result value argument fileno ino
+% LocalWords: name TYPE OFF RECLEN UNKNOWN REG SOCK CHR BLK type IFTODT DTTOIF
+% LocalWords: DTYPE off reclen seekdir telldir void rewinddir closedir select
+% LocalWords: namelist compar malloc qsort alphasort versionsort strcoll myls
+% LocalWords: strcmp DirScan direntry while current working home shell pwd get
+% LocalWords: dell'inode getcwd ERANGE getwd change fd race condition tmpnam
+% LocalWords: string tmpdir TMP tempnam pfx TMPNAME suid tmp EXCL tmpfile pid
+% LocalWords: EINTR mktemp mkstemp stlib template filename XXXXXX OpenBSD buf
+% LocalWords: mkdtemp fstat filedes nell'header padding ISREG ISDIR ISCHR IFMT
+% LocalWords: ISBLK ISFIFO ISLNK ISSOCK IFSOCK IFLNK IFDIR ISUID UID ISGID GID
+% LocalWords: ISVTX IRUSR IWUSR IXUSR IRGRP IWGRP IXGRP IROTH IWOTH IXOTH du
+% LocalWords: blocks blksize holes lseek TRUNC ftruncate length lenght ETXTBSY
+% LocalWords: hole atime read utime mtime write ctime modification leafnode cp
+% LocalWords: make fchmod fchown utimbuf times actime modtime Mac owner uid fs
+% LocalWords: gid Control List patch mandatory control execute group other all
+% LocalWords: dell' effective passwd IGID locking swap saved text IRWXU IRWXG
+% LocalWords: IRWXO ext reiser capability FSETID mask capabilities chroot jail
+% LocalWords: FTP