Alcune correzioni ai font dei link, e una trattazione esplicita
[gapil.git] / filedir.tex
index 48c04aeca2620e6f3efcb574c38079df2ccb1fcc..9d41573b157ede2149102e37b992416e36846cf4 100644 (file)
@@ -525,7 +525,7 @@ sia come \itindex{pathname} \textit{pathname} assoluto che come
 \itindex{pathname} \textit{pathname} relativo.
 
 I permessi di accesso (vedi sez.~\ref{sec:file_access_control}) con cui la
-directory viene creata sono specificati dall'argomemto \param{mode}, i cui
+directory viene creata sono specificati dall'argomento \param{mode}, i cui
 possibili valori sono riportati in tab.~\ref{tab:file_permission_const}; si
 tenga presente che questi sono modificati dalla maschera di creazione dei file
 (si veda sez.~\ref{sec:file_perm_management}).  La titolarità della nuova
@@ -812,13 +812,13 @@ il nome del relativo campo; nel nostro caso sono definite le macro
     \textbf{Valore} & \textbf{Tipo di file} \\
     \hline
     \hline
-    \const{DT\_UNKNOWN} & tipo sconosciuto\\
-    \const{DT\_REG}     & file normale\\
-    \const{DT\_DIR}     & directory\\
-    \const{DT\_FIFO}    & fifo\\
-    \const{DT\_SOCK}    & socket\\
-    \const{DT\_CHR}     & dispositivo a caratteri\\
-    \const{DT\_BLK}     & dispositivo a blocchi\\
+    \const{DT\_UNKNOWN} & Tipo sconosciuto.\\
+    \const{DT\_REG}     & File normale.\\
+    \const{DT\_DIR}     & Directory.\\
+    \const{DT\_FIFO}    & Fifo.\\
+    \const{DT\_SOCK}    & Socket.\\
+    \const{DT\_CHR}     & Dispositivo a caratteri.\\
+    \const{DT\_BLK}     & Dispositivo a blocchi.\\
     \hline    
   \end{tabular}
   \caption{Costanti che indicano i vari tipi di file nel campo \var{d\_type}
@@ -1423,13 +1423,13 @@ riportato in tab.~\ref{tab:file_type_macro}.
     \textbf{Macro} & \textbf{Tipo del file} \\
     \hline
     \hline
-    \macro{S\_ISREG(m)}  & file regolare \\
-    \macro{S\_ISDIR(m)}  & directory \\
-    \macro{S\_ISCHR(m)}  & dispositivo a caratteri \\
-    \macro{S\_ISBLK(m)}  & dispositivo a blocchi\\
-    \macro{S\_ISFIFO(m)} & fifo \\
-    \macro{S\_ISLNK(m)}  & link simbolico \\
-    \macro{S\_ISSOCK(m)} & socket \\
+    \macro{S\_ISREG(m)}  & File normale.\\
+    \macro{S\_ISDIR(m)}  & Directory.\\
+    \macro{S\_ISCHR(m)}  & Dispositivo a caratteri.\\
+    \macro{S\_ISBLK(m)}  & Dispositivo a blocchi.\\
+    \macro{S\_ISFIFO(m)} & Fifo.\\
+    \macro{S\_ISLNK(m)}  & Link simbolico.\\
+    \macro{S\_ISSOCK(m)} & Socket.\\
     \hline    
   \end{tabular}
   \caption{Macro per i tipi di file (definite in \texttt{sys/stat.h}).}
@@ -1456,33 +1456,33 @@ un'opportuna combinazione.
     \textbf{Flag} & \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{S\_IFMT}   &  0170000 & maschera per i bit del tipo di file \\
-    \const{S\_IFSOCK} &  0140000 & socket             \\
-    \const{S\_IFLNK}  &  0120000 & link simbolico     \\
-    \const{S\_IFREG}  &  0100000 & file regolare      \\ 
-    \const{S\_IFBLK}  &  0060000 & dispositivo a blocchi   \\
-    \const{S\_IFDIR}  &  0040000 & directory          \\ 
-    \const{S\_IFCHR}  &  0020000 & dispositivo a caratteri \\
-    \const{S\_IFIFO}  &  0010000 & fifo               \\
+    \const{S\_IFMT}   &  0170000 & Maschera per i bit del tipo di file.\\
+    \const{S\_IFSOCK} &  0140000 & Socket.\\
+    \const{S\_IFLNK}  &  0120000 & Link simbolico.\\
+    \const{S\_IFREG}  &  0100000 & File regolare.\\ 
+    \const{S\_IFBLK}  &  0060000 & Dispositivo a blocchi.\\
+    \const{S\_IFDIR}  &  0040000 & Directory.\\
+    \const{S\_IFCHR}  &  0020000 & Dispositivo a caratteri.\\
+    \const{S\_IFIFO}  &  0010000 & Fifo.\\
     \hline
-    \const{S\_ISUID}  &  0004000 & set UID bit \itindex{suid~bit}  \\
-    \const{S\_ISGID}  &  0002000 & set GID bit \itindex{sgid~bit}  \\
-    \const{S\_ISVTX}  &  0001000 & sticky bit  \itindex{sticky~bit}\\
+    \const{S\_ISUID}  &  0004000 & Set UID bit \itindex{suid~bit}.\\
+    \const{S\_ISGID}  &  0002000 & Set GID bit \itindex{sgid~bit}.\\
+    \const{S\_ISVTX}  &  0001000 & Sticky bit \itindex{sticky~bit}.\\
     \hline
-%    \const{S\_IRWXU}  &  00700   & bitmask per i permessi del proprietario  \\
-    \const{S\_IRUSR}  &  00400   & il proprietario ha permesso di lettura   \\
-    \const{S\_IWUSR}  &  00200   & il proprietario ha permesso di scrittura \\
-    \const{S\_IXUSR}  &  00100   & il proprietario ha permesso di esecuzione\\
+%    \const{S\_IRWXU}  &  00700   & Bitmask per i permessi del proprietario.\\
+    \const{S\_IRUSR}  &  00400   & Il proprietario ha permesso di lettura.\\
+    \const{S\_IWUSR}  &  00200   & Il proprietario ha permesso di scrittura.\\
+    \const{S\_IXUSR}  &  00100   & Il proprietario ha permesso di esecuzione.\\
     \hline
-%    \const{S\_IRWXG}  &  00070   & bitmask per i permessi del gruppo        \\
-    \const{S\_IRGRP}  &  00040   & il gruppo ha permesso di lettura         \\
-    \const{S\_IWGRP}  &  00020   & il gruppo ha permesso di scrittura       \\
-    \const{S\_IXGRP}  &  00010   & il gruppo ha permesso di esecuzione      \\
+%    \const{S\_IRWXG}  &  00070   & Bitmask per i permessi del gruppo.\\
+    \const{S\_IRGRP}  &  00040   & Il gruppo ha permesso di lettura.\\
+    \const{S\_IWGRP}  &  00020   & Il gruppo ha permesso di scrittura.\\
+    \const{S\_IXGRP}  &  00010   & Il gruppo ha permesso di esecuzione.\\
     \hline
-%    \const{S\_IRWXO}  &  00007   & bitmask per i permessi di tutti gli altri\\
-    \const{S\_IROTH}  &  00004   & gli altri hanno permesso di lettura      \\
-    \const{S\_IWOTH}  &  00002   & gli altri hanno permesso di esecuzione   \\
-    \const{S\_IXOTH}  &  00001   & gli altri hanno permesso di esecuzione   \\
+%    \const{S\_IRWXO}  &  00007   & Bitmask per i permessi di tutti gli altri\\
+    \const{S\_IROTH}  &  00004   & Gli altri hanno permesso di lettura.\\
+    \const{S\_IWOTH}  &  00002   & Gli altri hanno permesso di esecuzione.\\
+    \const{S\_IXOTH}  &  00001   & Gli altri hanno permesso di esecuzione.\\
     \hline    
   \end{tabular}
   \caption{Costanti per l'identificazione dei vari bit che compongono il campo
@@ -1590,12 +1590,12 @@ funzioni che effettuano cambiamenti su di essi.
     & \textbf{Opzione di \cmd{ls}} \\
     \hline
     \hline
-    \var{st\_atime}& ultimo accesso ai dati del file &\func{read}, 
-    \func{utime} & \cmd{-u}\\ 
-    \var{st\_mtime}& ultima modifica ai dati del file &\func{write}, 
-    \func{utime} & default\\ 
-    \var{st\_ctime}& ultima modifica ai dati dell'inode&\func{chmod}, 
-    \func{utime} & \cmd{-c} \\ 
+    \var{st\_atime}& ultimo accesso ai dati del file    &
+                     \func{read}, \func{utime}          & \cmd{-u}\\
+    \var{st\_mtime}& ultima modifica ai dati del file   &
+                     \func{write}, \func{utime}         & default\\
+    \var{st\_ctime}& ultima modifica ai dati dell'inode &
+                     \func{chmod}, \func{utime}         & \cmd{-c}\\
     \hline
   \end{tabular}
   \caption{I tre tempi associati a ciascun file.}
@@ -1643,47 +1643,54 @@ tempo).
     \hline
     \hline
     \func{chmod}, \func{fchmod} 
-    & --      & --      &$\bullet$& --      & --      & --      & \\
+             & --      & --      &$\bullet$& --      & --      & --      &\\
     \func{chown}, \func{fchown} 
-    & --      & --      &$\bullet$& --      & --      & --      & \\
+             & --      & --      &$\bullet$& --      & --      & --      &\\
     \func{creat}  
-    &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$&  con 
-    \const{O\_CREATE} \\    \func{creat}  
-    & --      &$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$&   
-    con \const{O\_TRUNC} \\    \func{exec}  
-    &$\bullet$& --      & --      & --      & --      & --      & \\
+             &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$&  
+             con \const{O\_CREATE} \\
+    \func{creat}  
+             & --      &$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$&   
+             con \const{O\_TRUNC} \\
+    \func{exec}  
+             &$\bullet$& --      & --      & --      & --      & --      &\\
     \func{lchown}  
-    & --      & --      &$\bullet$& --      & --      & --      & \\
+             & --      & --      &$\bullet$& --      & --      & --      &\\
     \func{link}
-    & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$& \\
+             & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$&\\
     \func{mkdir}
-    &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$& \\
+             &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$&\\
     \func{mkfifo}
-    &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$& \\
+             &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$&\\
+    \func{open}
+             &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$& 
+             con \const{O\_CREATE} \\
     \func{open}
-    &$\bullet$&$\bullet$&$\bullet$& --      &$\bullet$&$\bullet$& con 
-    \const{O\_CREATE} \\    \func{open}
-    & --      &$\bullet$&$\bullet$& --      & --      & --      & con 
-    \const{O\_TRUNC}  \\    \func{pipe}
-    &$\bullet$&$\bullet$&$\bullet$& --      & --      & --      & \\
+             & --      &$\bullet$&$\bullet$& --      & --      & --      & 
+             con \const{O\_TRUNC}  \\
+    \func{pipe}
+             &$\bullet$&$\bullet$&$\bullet$& --      & --      & --      &\\
     \func{read}
-    &$\bullet$& --      & --      & --      & --      & --      & \\
+             &$\bullet$& --      & --      & --      & --      & --      &\\
+    \func{remove}
+             & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$& 
+             se esegue \func{unlink}\\
     \func{remove}
-    & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$& se esegue 
-    \func{unlink}\\    \func{remove}
-    & --      & --      & --      & --      &$\bullet$&$\bullet$& se esegue 
-    \func{rmdir}\\ \func{rename}
-    & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$& per entrambi
-    gli argomenti\\ \func{rmdir}
-    & --      & --      & --      & --      &$\bullet$&$\bullet$& \\ 
+              & --      & --      & --      & --      &$\bullet$&$\bullet$& 
+              se esegue \func{rmdir}\\
+    \func{rename}
+              & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$& 
+              per entrambi gli argomenti\\
+    \func{rmdir}
+              & --      & --      & --      & --      &$\bullet$&$\bullet$&\\ 
     \func{truncate}, \func{ftruncate}
-    & --      &$\bullet$&$\bullet$& --      & --      & --      & \\ 
+              & --      &$\bullet$&$\bullet$& --      & --      & --      &\\ 
     \func{unlink}
-    & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$& \\ 
+              & --      & --      &$\bullet$& --      &$\bullet$&$\bullet$&\\ 
     \func{utime}
-    &$\bullet$&$\bullet$&$\bullet$& --      & --      & --      & \\ 
+              &$\bullet$&$\bullet$&$\bullet$& --      & --      & --      &\\ 
     \func{write}
-    & --      &$\bullet$&$\bullet$& --      & --      & --      & \\ 
+              & --      &$\bullet$&$\bullet$& --      & --      & --      &\\ 
     \hline
   \end{tabular}
   \caption{Prospetto dei cambiamenti effettuati sui tempi di ultimo 
@@ -1865,17 +1872,17 @@ che permettono di accedere al valore numerico di questi bit nel campo
     \textbf{\var{st\_mode}} bit & \textbf{Significato} \\
     \hline 
     \hline 
-    \const{S\_IRUSR}  &  \textit{user-read}, l'utente può leggere     \\
-    \const{S\_IWUSR}  &  \textit{user-write}, l'utente può scrivere   \\
-    \const{S\_IXUSR}  &  \textit{user-execute}, l'utente può eseguire \\ 
-    \hline              
-    \const{S\_IRGRP}  &  \textit{group-read}, il gruppo può leggere    \\
-    \const{S\_IWGRP}  &  \textit{group-write}, il gruppo può scrivere  \\
-    \const{S\_IXGRP}  &  \textit{group-execute}, il gruppo può eseguire\\
-    \hline              
-    \const{S\_IROTH}  &  \textit{other-read}, tutti possono leggere    \\
-    \const{S\_IWOTH}  &  \textit{other-write}, tutti possono scrivere  \\
-    \const{S\_IXOTH}  &  \textit{other-execute}, tutti possono eseguire\\
+    \const{S\_IRUSR} & \textit{user-read}, l'utente può leggere.\\
+    \const{S\_IWUSR} & \textit{user-write}, l'utente può scrivere.\\
+    \const{S\_IXUSR} & \textit{user-execute}, l'utente può eseguire.\\ 
+    \hline            
+    \const{S\_IRGRP} & \textit{group-read}, il gruppo può leggere.\\
+    \const{S\_IWGRP} & \textit{group-write}, il gruppo può scrivere.\\
+    \const{S\_IXGRP} & \textit{group-execute}, il gruppo può eseguire.\\
+    \hline            
+    \const{S\_IROTH} & \textit{other-read}, tutti possono leggere.\\
+    \const{S\_IWOTH} & \textit{other-write}, tutti possono scrivere.\\
+    \const{S\_IXOTH} & \textit{other-execute}, tutti possono eseguire.\\
     \hline              
   \end{tabular}
   \caption{I bit dei permessi di accesso ai file, come definiti in 
@@ -2159,10 +2166,10 @@ contrario (o di errore) ritorna -1.
     \textbf{\param{mode}} & \textbf{Significato} \\
     \hline
     \hline
-    \const{R\_OK} & verifica il permesso di lettura \\
-    \const{W\_OK} & verifica il permesso di scritture \\
-    \const{X\_OK} & verifica il permesso di esecuzione \\
-    \const{F\_OK} & verifica l'esistenza del file \\
+    \const{R\_OK} & Verifica il permesso di lettura. \\
+    \const{W\_OK} & Verifica il permesso di scrittura. \\
+    \const{X\_OK} & Verifica il permesso di esecuzione. \\
+    \const{F\_OK} & Verifica l'esistenza del file. \\
     \hline
   \end{tabular}
   \caption{Valori possibile per l'argomento \param{mode} della funzione 
@@ -2213,24 +2220,24 @@ file.
     \textbf{\param{mode}} & \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{S\_ISUID} & 04000 & set user ID \itindex{suid~bit} \\
-    \const{S\_ISGID} & 02000 & set group ID \itindex{sgid~bit}\\
-    \const{S\_ISVTX} & 01000 & sticky bit \itindex{sticky~bit}\\
+    \const{S\_ISUID} & 04000 & Set user ID \itindex{suid~bit}.\\
+    \const{S\_ISGID} & 02000 & Set group ID \itindex{sgid~bit}.\\
+    \const{S\_ISVTX} & 01000 & Sticky bit \itindex{sticky~bit}.\\
     \hline
-    \const{S\_IRWXU} & 00700 & l'utente ha tutti i permessi \\
-    \const{S\_IRUSR} & 00400 & l'utente ha il permesso di lettura  \\
-    \const{S\_IWUSR} & 00200 & l'utente ha il permesso di scrittura \\
-    \const{S\_IXUSR} & 00100 & l'utente ha il permesso di esecuzione \\
+    \const{S\_IRWXU} & 00700 & L'utente ha tutti i permessi.\\
+    \const{S\_IRUSR} & 00400 & L'utente ha il permesso di lettura.\\
+    \const{S\_IWUSR} & 00200 & L'utente ha il permesso di scrittura.\\
+    \const{S\_IXUSR} & 00100 & L'utente ha il permesso di esecuzione.\\
     \hline
-    \const{S\_IRWXG} & 00070 & il gruppo ha tutti i permessi  \\
-    \const{S\_IRGRP} & 00040 & il gruppo ha il permesso di lettura  \\
-    \const{S\_IWGRP} & 00020 & il gruppo ha il permesso di scrittura \\
-    \const{S\_IXGRP} & 00010 & il gruppo ha il permesso di esecuzione \\
+    \const{S\_IRWXG} & 00070 & Il gruppo ha tutti i permessi.\\
+    \const{S\_IRGRP} & 00040 & Il gruppo ha il permesso di lettura.\\
+    \const{S\_IWGRP} & 00020 & Il gruppo ha il permesso di scrittura.\\
+    \const{S\_IXGRP} & 00010 & Il gruppo ha il permesso di esecuzione.\\
     \hline
-    \const{S\_IRWXO} & 00007 & gli altri hanno tutti i permessi \\
-    \const{S\_IROTH} & 00004 & gli altri hanno il permesso di lettura  \\
-    \const{S\_IWOTH} & 00002 & gli altri hanno il permesso di scrittura \\
-    \const{S\_IXOTH} & 00001 & gli altri hanno il permesso di esecuzione \\
+    \const{S\_IRWXO} & 00007 & Gli altri hanno tutti i permessi.\\
+    \const{S\_IROTH} & 00004 & Gli altri hanno il permesso di lettura.\\
+    \const{S\_IWOTH} & 00002 & Gli altri hanno il permesso di scrittura.\\
+    \const{S\_IXOTH} & 00001 & Gli altri hanno il permesso di esecuzione.\\
     \hline
   \end{tabular}
   \caption{Valori delle costanti usate per indicare i vari bit di
@@ -2551,11 +2558,11 @@ classici mantenuti negli inode.
 Per risolvere questo problema alcuni sistemi unix-like (e fra questi anche
 Linux) hanno introdotto un meccanismo generico che consenta di associare delle
 informazioni ai singoli file,\footnote{l'uso più comune è quello della ACL,
-  che tratteremo a breve, ma si possono inserire anche altre informazioni.}
-detto \textit{Extended Attributes}. Gli \textsl{attributi estesi} non sono
-altro che delle coppie nome/valore che sono associate permanentemente ad un
-oggetto sul filesystem, analoghi di quello che sono le variabili di ambiente
-(vedi sez.~\ref{sec:proc_environ}) per un processo.
+  che tratteremo nella prossima sezione, ma si possono inserire anche altre
+  informazioni.}  detto \textit{Extended Attributes}. Gli \textsl{attributi
+  estesi} non sono altro che delle coppie nome/valore che sono associate
+permanentemente ad un oggetto sul filesystem, analoghi di quello che sono le
+variabili di ambiente (vedi sez.~\ref{sec:proc_environ}) per un processo.
 
 Altri sistemi (come Solaris, MacOS e Windows) hanno adottato un meccanismo
 diverso in cui ad un file sono associati diversi flussi di dati, su cui
@@ -2564,12 +2571,366 @@ con le normali operazioni di lettura e scrittura. Questi non vanno confusi con
 gli \textit{Extended Attributes} (anche se su Solaris hanno lo stesso nome),
 che sono un meccanismo molto più semplice, che pur essendo limitato (potendo
 contenere solo una quantità limitata di informazione) hanno il grande
-vantaggio di essere molto più semplici da realizzare e più
+vantaggio di essere molto più semplici da realizzare, più
 efficienti,\footnote{cosa molto importante, specie per le applicazioni che
   richiedono una gran numero di accessi, come le ACL.} e di garantire
 l'atomicità di tutte le operazioni.
 
+In Linux gli attributi estesi sono sempre associati al singolo 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}, in particolare al momento della scrittura di queste dispense
+essi sono presenti solo su \textsl{ext2}, \textsl{ext3} e \textsl{XFS}.
+Inoltre a seconda della implementazione ci possono essere dei limiti sulla
+quantità di attributi che si possono utilizzare.\footnote{ad esempio nel caso
+  di \textsl{ext2} ed \textsl{ext3} è richiesto che essi siano contenuti
+  all'interno di un singolo blocco (pertanto con dimensioni massime pari a
+  1024, 2048 o 4096 byte a seconda delle dimensioni di quest'ultimo impostate
+  in fase di creazione del filesystem), mentre con \textsl{XFS} non ci sono
+  limiti ed i dati vengono memorizzati in maniera diversa (nell'inode stesso,
+  in un blocco a parte, o in una struttura ad albero dedicata) per mantenerne
+  la scalabilità.} Infine lo spazio utilizzato per mantenere gli attributi
+estesi viene tenuto in conto per il calcolo delle quote di utente e gruppo
+proprietari del file.
+
+Come meccanismo per mantenere informazioni aggiuntive associate al singolo
+file, gli \textit{Extended Attributes} possono avere usi anche molto diversi
+fra loro.  Per poterli distinguere allora sono stati suddivisi in
+\textsl{classi}, a cui poter applicare requisiti diversi per l'accesso e la
+gestione. Per questo motivo il nome di un attributo deve essere sempre
+specificato nella forma \texttt{namespace.attribute}, dove \texttt{namespace}
+fa riferimento alla classe a cui l'attributo appartiene, mentre
+\texttt{attribute} è il nome ad esso assegnato. In tale forma il nome di un
+attributo esteso deve essere univoco. Al momento\footnote{della scrittura di
+  questa sezione, kernel 2.6.23, ottobre 2007.} sono state definite le quattro
+classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}{|c|p{8cm}|}
+    \hline
+    \textbf{Nome} & \textbf{Descrizione} \\
+    \hline
+    \hline
+    \const{security}& Gli \textit{extended security attributes}: vengono
+                      utilizzati dalle estensioni di sicurezza del kernel (i
+                      \itindex{Linux~Security~Modules} \textit{Linux 
+                        Security Modules}), per le realizzazione di meccanismi
+                      evoluti di controllo di accesso come \index{SELinux}
+                      SELinux.\\ 
+    \const{system}  & Gli \textit{extended security attributes}: sono usati
+                      dal kernel per memorizzare dati di sistema associati ai
+                      file come le \itindex{Access~Control~List} ACL (vedi
+                      sez.~\ref{sec:file_ACL}) o le \itindex{capabilities}
+                      \textit{capabilities} (vedi
+                      sez.~\ref{sec:proc_capabilities}).\\
+    \const{trusted} & I \textit{trusted extended attributes}: vengono
+                      utilizzati per poter realizzare in user space 
+                      meccanismi che consentano di mantenere delle
+                      informazioni sui file che non devono essere accessibili
+                      ai processi ordinari.\\
+    \const{user}    & Gli \textit{extended user attributes}: utilizzati per
+                      mantenere informazioni aggiuntive sui file (come il
+                      \textit{mime-type}, la codifica dei caratteri o del
+                      file) accessibili dagli utenti.\\
+    \hline
+  \end{tabular}
+  \caption{I nomi utilizzati valore di \texttt{namespace} per distinguere le
+    varie classi di \textit{Extended Attributes}.}
+  \label{tab:extended_attribute_class}
+\end{table}
+
+
+Dato che uno degli usi degli \textit{Extended Attributes} è quello che li
+impiega per realizzare delle estensioni (come le ACL, \index{SELinux} SELinux,
+ecc.) al tradizionale meccanismo dei controlli di accesso di Unix, l'accesso
+ai loro valori viene regolato in maniera diversa a seconda sia della loro
+classe sia di quali, fra le estensioni che li utilizzano, sono poste in uso.
+In particolare, per ciascuna delle classi riportate in
+tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
+\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}}
+\item[\texttt{security}] L'accesso agli \textit{extended security attributes}
+  dipende dalle politiche di sicurezza stabilite da loro stessi tramite
+  l'utilizzo di un sistema di controllo basato sui
+  \itindex{Linux~Security~Modules} \textit{Linux Security Modules} (ad esempio
+  \index{SELinux} SELinux). Pertanto l'accesso in lettura o scrittura dipende
+  dalle politiche di sicurezza implementate all'interno dal modulo di
+  sicurezza che si sta utilizzando al momento (ciascuno avrà le sue). Se non è
+  stato caricato nessun modulo di sicurezza l'accesso in lettura sarà
+  consentito a tutti i processi, mentre quello in scrittura solo ai processi
+  con privilegi amministrativi dotati della \index{capabilities}
+  \textit{capability} \const{CAP\_SYS\_ADMIN}.
+
+\item[\texttt{system}] Anche l'accesso agli \textit{extended system
+    attributes} dipende dalle politiche di accesso che il kernel realizza
+  anche utilizzando gli stessi valori in essi contenuti. Ad esempio nel caso
+  delle ACL l'accesso è consentito in lettura ai processi che hanno la
+  capacità di eseguire una ricerca sul file (cioè hanno il permesso di lettura
+  sulla directory che contiene il file) ed in scrittura al proprietario del
+  file o ai processi dotati della \textit{capability} \index{capabilities}
+  \const{CAP\_FOWNER}.\footnote{vale a dire una politica di accesso analoga a
+    quella impiegata per gli ordinari permessi dei file.}
+
+\item[\texttt{trusted}] L'accesso ai \textit{trusted extended attributes}, sia
+  per la lettura che per la scrittura, è consentito soltanto ai processi con
+  privilegi amministrativi dotati della \index{capabilities}
+  \textit{capability} \const{CAP\_SYS\_ADMIN}. In questo modo si possono
+  utilizzare questi attributi per realizzare in user space dei meccanismi di
+  controllo che accedono ad informazioni non disponibili ai processi ordinari.
+
+\item[\texttt{user}] L'accesso agli \textit{extended user attributes} è
+  regolato dagli ordinari permessi dei file a cui essi fanno riferimento:
+  occorre avere il permesso di lettura per leggerli e quello di scrittura per
+  scriverli o modificarli. Dato l'uso di questi attributi, si è scelto cioè di
+  applicare per il loro accesso gli stessi criteri che si usano per l'accesso
+  al contenuto dei file (o delle directory) cui essi fanno riferimento.
+
+  Questa scelta vale però soltanto per i file e le directory ordinarie, se
+  valesse in generale infatti si avrebbe un serio problema di sicurezza dato
+  che esistono diversi oggetti sul filesystem per i quali è normale avere
+  avere il permesso di scrittura consentito a tutti gli utenti, come i link
+  simbolici, o alcuni file di dispositivo come \texttt{/dev/null}. Se fosse
+  possibile usare su di essi gli \textit{extended user attributes} un utente
+  qualunque potrebbe inserirvi dati a piacere.\footnote{la cosa è stata notata
+    su XFS, dove questo comportamento permetteva, non essendovi limiti sullo
+    spazio occupabile dagli \textit{Extended Attributes}, di bloccare il
+    sistema riempiendo il disco.}
+
+  La semantica del controllo di accesso che abbiamo indicato inoltre non
+  avrebbe alcun senso al di fuori di file e directory: i permessi di lettura e
+  scrittura per un file di dispositivo attengono alle capacità di accesso al
+  dispositivo sottostante,\footnote{motivo per cui si può formattare un disco
+    anche se \texttt{/dev} è su un filesystem in sola lettura.} mentre per i
+  link simbolici questi vengono semplicemente ignorati: in nessuno dei due
+  casi hanno a che fare con il contenuto del file, e nella discussione
+  relativa all'uso degli \textit{extended user attributes} nessuno è mai stato
+  capace di indicare una qualche forma sensata di utilizzo degli stessi per
+  link simbolici o file di dispositivo, e neanche per le fifo o i socket.
+
+  Per questo motivo gli \textit{extended user attributes} sono stati
+  completamente disabilitati per tutto ciò che non sia un file regolare o una
+  directory.\footnote{si può verificare la semantica adottata consultando il
+    file \texttt{fs/xattr.c} 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}.  Questo è un altro caso particolare, in cui il premesso di
+  scrittura viene usato, unito alla presenza dello \itindex{sticky~bit}
+  \textit{sticky bit}, per garantire il permesso di creazione di nuovi file.
+  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 capability
+  \index{capabilities} \const{CAP\_FOWNER}.
+\end{basedescript}
+
+Le funzioni per la gestione degli attributi estesi, come altre funzioni di
+gestione avanzate specifiche di Linux, non fanno parte delle \acr{glibc}, e
+sono fornite da una apposita libreria, \texttt{libattr}, che deve essere
+installata a parte;\footnote{la versione corrente della libreria è
+  \texttt{libattr1}, e nel caso si usi Debian la si può installare con il
+  pacchetto omonimo ed il collegato \texttt{libattr1-dev}.}  pertanto se un
+programma le utilizza si dovrà indicare esplicitamente l'uso della suddetta
+libreria invocando il compilatore con l'opzione \texttt{-lattr}.
+
+Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni,
+\funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che consentono
+rispettivamente di richiedere gli attributi relativi a un file, a un link
+simbolico e ad un file descriptor; i rispettivi prototipi sono:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{attr/xattr.h} 
+  
+  \funcdecl{ssize\_t getxattr(const char *path, const char *name, void
+    *value, size\_t size)} 
+
+  \funcdecl{ssize\_t lgetxattr(const char *path, const char *name, void
+    *value, size\_t size)} 
+
+  \funcdecl{ssize\_t fgetxattr(int filedes, const char *name, void *value,
+    size\_t size)}
+
+  Le funzioni leggono il valore di un attributo esteso.
+  
+  \bodydesc{Le funzioni restituiscono un intero positivo che indica la
+    dimensione dell'attributo richiesto in caso di successo, e $-1$ in caso di
+    errore, nel qual caso \var{errno} assumerà i valori:
+  \begin{errlist}
+  \item[\errcode{ENOATTR}] l'attributo richiesto non esiste.
+  \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
+    non è sufficiente per contenere il risultato.
+  \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
+    filesystem o sono disabilitati.
+  \end{errlist}
+  Oltre a questi potranno essere restituiti tutti gli errori di \func{stat},
+  ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso
+  all'attributo.  }
+\end{functions}
+
+Le funzioni \func{getxattr} e \func{lgetxattr} prendono come primo argomento
+un pathname che indica il file di cui si vuole richiedere un attributo, la
+sola differenza è che la seconda, se il pathname indica un link simbolico,
+restituisce gli attributi di quest'ultimo e non quelli del file a cui esso fa
+riferimento. La funzione \func{fgetxattr} prende invece come primo argomento
+un numero di file descriptor, e richiede gli attributi del file ad esso
+associato.
+
+Tutte e tre le funzioni richiedono di specificare nell'argomento \param{name}
+il nome dell'attributo di cui si vuole ottenere il valore. Il nome deve essere
+indicato comprensivo di prefisso del \textit{namespace} cui appartiene (uno
+dei valori di tab.~\ref{tab:extended_attribute_class}) nella forma
+\texttt{namespace.attributename}, come stringa terminata da un carattere NUL.
+Il suo valore verrà restituito nel buffer puntato dall'argomento \param{value}
+per una dimensione massima di \param{size} byte;\footnote{gli attributi estesi
+  possono essere costituiti arbitrariamente da dati testuali o binari.}  se
+quest'ultima non è sufficiente si avrà un errore di \errcode{ERANGE}.
+
+Per evitare di dover indovinare la dimensione di un attributo per tentativi si
+può eseguire una interrogazione utilizzando un valore nullo per \param{size};
+in questo caso non verrà letto nessun dato, ma verrà restituito come valore di
+ritorno della funzione chiamata la dimensione totale dell'attributo esteso
+richiesto, che si potrà usare come stima per allocare un buffer di dimensioni
+sufficienti.\footnote{si parla di stima perché anche se le funzioni
+  restituiscono la dimensione esatta dell'attributo al momento in cui sono
+  eseguite, questa potrebbe essere modificata in qualunque momento da un
+  successivo accesso eseguito da un altro processo.}
+
+Un secondo gruppo di funzioni è quello che consente di impostare il valore di
+un attributo esteso, queste sono \funcd{setxattr}, \funcd{lsetxattr} e
+\funcd{fsetxattr}, e consentono di operare rispettivamente su un file, su un
+link simbolico o specificando un file descriptor; i loro prototipi sono:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{attr/xattr.h} 
+  
+  \funcdecl{int setxattr(const char *path, const char *name, const void
+    *value, size\_t size, int flags)}
+
+  \funcdecl{int lsetxattr(const char *path, const char *name, const void
+    *value, size\_t size, int flags)}
+
+  \funcdecl{int fsetxattr(int filedes, const char *name, const void *value,
+    size\_t size, int flags)}
+
+  Impostano il valore di un attributo esteso.
+  
+  \bodydesc{Le funzioni restituiscono 0 in caso di successo, e $-1$ in caso di
+    errore, nel qual caso \var{errno} assumerà i valori:
+  \begin{errlist}
+  \item[\errcode{ENOATTR}] si è usato il flag \const{XATTR\_REPLACE} e
+    l'attributo richiesto non esiste.
+  \item[\errcode{EEXIST}] si è usato il flag \const{XATTR\_CREATE} ma
+    l'attributo esiste già.
+  \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
+    filesystem o sono disabilitati.
+  \end{errlist}
+  Oltre a questi potranno essere restituiti tutti gli errori di \func{stat},
+  ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso
+  all'attributo.  
+}
+\end{functions}
+
+Le tre funzioni prendono come primo argomento un valore adeguato al loro
+scopo, usato in maniera del tutto identica a quanto visto in precedenza per le
+analoghe che leggono gli attributi estesi. Il secondo argomento \param{name}
+deve indicare, anche in questo caso con gli stessi criteri appena visti per le
+analoghe \func{getxattr}, \func{lgetxattr} e \func{fgetxattr}, il nome
+(completo di suffisso) dell'attributo su cui si vuole operare. 
+
+Il valore che verrà assegnato all'attributo dovrà essere preparato nel buffer
+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
+esista, nel qual caso verrà sovrascritto, altrimenti si avrà errore, mentre
+con \const{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'è.
+
+Le funzioni finora illustrate permettono di leggere o scrivere gli attributi
+estesi, ma sarebbe altrettanto utile poter vedere quali sono gli attributi
+presenti; a questo provvedono le funzioni \funcd{listxattr},
+\funcd{llistxattr} e \funcd{flistxattr} i cui prototipi sono:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{attr/xattr.h} 
+  
+  \funcdecl{ssize\_t listxattr(const char *path, char *list, size\_t size)}
+
+  \funcdecl{ssize\_t llistxattr(const char *path, char *list, size\_t size)}
+
+  \funcdecl{ssize\_t flistxattr(int filedes, char *list, size\_t size)}
+
+  Leggono la lista degli attributi estesi di un file.
+  
+  \bodydesc{Le funzioni restituiscono un intero positivo che indica la
+    dimensione della lista in caso di successo, e $-1$ in caso di errore, nel
+    qual caso \var{errno} assumerà i valori:
+  \begin{errlist}
+  \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
+    non è sufficiente per contenere il risultato.
+  \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
+    filesystem o sono disabilitati.
+  \end{errlist}
+  Oltre a questi potranno essere restituiti tutti gli errori di \func{stat},
+  ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso
+  all'attributo.  
+}
+\end{functions}
+
+Come per le precedenti le tre funzioni leggono gli attributi rispettivamente
+di un file, un link simbolico o specificando un file descriptor, da
+specificare con il loro primo argomento. Gli altri due argomenti, identici per
+tutte e tre, indicano rispettivamente il puntatore \param{list} al buffer dove
+deve essere letta la lista e la dimensione \param{size} di quest'ultimo.
+
+La lista viene fornita come sequenza non ordinata dei nomi dei singoli
+attributi estesi (sempre comprensivi del prefisso della loro classe) ciascuno
+dei quali è terminato da un carattere nullo. I nomi sono inseriti nel buffer
+uno di seguito all'altro. Il valore di ritorno della funzione indica la
+dimensione totale della lista in byte.
+
+Come per le funzioni di lettura dei singoli attributi se le dimensioni del
+buffer non sono sufficienti si avrà un errore, ma è possibile ottenere dal
+valore di ritorno della funzione una stima della dimensione totale della lista
+usando per \param{size} un valore nullo. 
+
+Infine per rimuovere semplicemente un attributo esteso, si ha a disposizione
+un ultimo gruppo di funzioni: \funcd{removexattr}, \funcd{lremovexattr} e
+\funcd{fremovexattr}; i rispettivi prototipi sono:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{attr/xattr.h} 
+  
+  \funcdecl{int removexattr(const char *path, const char *name)}
+
+  \funcdecl{int lremovexattr(const char *path, const char *name)}
+
+  \funcdecl{int fremovexattr(int filedes, const char *name)}
+
+
+  Rimuovono un attributo esteso di un file.
+  
+  \bodydesc{Le funzioni restituiscono 0 in caso di successo, e $-1$ in caso di
+    errore, nel qual caso \var{errno} assumerà i valori:
+  \begin{errlist}
+  \item[\errcode{ENOATTR}] l'attributo richiesto non esiste.
+  \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
+    filesystem o sono disabilitati.
+  \end{errlist}
+  ed inoltre tutti gli errori di \func{stat}.  
+}
+\end{functions}
 
+Le tre funzioni rimuovono l'attributo esteso indicato dall'argomento
+\param{name} rispettivamente di un file, un link simbolico o specificando un
+file descriptor, da specificare con il loro primo argomento.  Anche in questo
+caso l'argomento \param{name} deve essere specificato con le modalità già
+illustrate in precedenza per le altre funzioni relative agli attributi estesi.
 
 
 \itindend{Extended~Attributes}
@@ -2578,7 +2939,7 @@ l'atomicit
 % sistema è nei pacchetti libxattr1-dev e attr
 
 
-\subsection{Le ACL}
+\subsection{Le \textit{Access  Control List}}
 \label{sec:file_ACL}
 
 
@@ -2590,30 +2951,43 @@ le esigenze pi
 rispondere in maniera adeguata a situazioni che richiedono una gestione
 complessa dei permessi di accesso.\footnote{già un requisito come quello di
   dare accesso in scrittura ad alcune persone ed in sola lettura ad altre non
-  si può soddisfare in maniera soddifacente.}
+  si può soddisfare in maniera soddisfacente.}
 
 Per questo motivo erano state progressivamente introdotte nelle varie versioni
 di Unix dei meccanismi di gestione dei permessi dei file più flessibili, nella
-forma delle cosiddette \textit{Access Control List}.  Nello sforzo di
-standardizzare queste funzionalità era stato creato un gruppo di lavoro il cui
-scopo era estendere lo standard POSIX 1003 attraverso due nuovi insiemi di
-specifiche, la POSIX 1003.1e per l'interfaccia di programmazione e la POSIX
-1003.2c per i comandi di shell.
+forma delle cosiddette \textit{Access Control List} (indicate usualmente con
+la sigla ACL).  Nello sforzo di standardizzare queste funzionalità era stato
+creato un gruppo di lavoro il cui scopo era estendere lo standard POSIX 1003
+attraverso due nuovi insiemi di specifiche, la POSIX 1003.1e per l'interfaccia
+di programmazione e la POSIX 1003.2c per i comandi di shell.
 
 Gli obiettivi erano però forse troppo ambizioni, e nel gennaio del 1998 i
 finanziamenti vennero ritirati senza che si fosse arrivati alla definizione di
 uno standard, dato però che una parte della documentazione prodotta era di
 alta qualità venne deciso di rilasciare al pubblico la diciassettesima bozza
-del documento, quella che va sotto il nome di POSIX 1003.1e Draft 17, che è
-divenuta la base sulla quale si definiscono quelle che vanno sotto il nome di
-\textit{Posix ACL}.
+del documento, quella che va sotto il nome di \textit{POSIX 1003.1e Draft 17},
+che è divenuta la base sulla quale si definiscono le cosiddette \textit{Posix
+  ACL}.
 
 A differenza di altri sistemi (ad esempio FreeBSD) nel caso di Linux si è
-scelto di realizzare le ACL attraverso l'interfaccia degli \textit{Extended
-  Attributes}, e fornire tutte le relative funzioni di gestione tramite una
-liberia, \texttt{libacl} che nasconde i dettagli implementativi delle stesse e
-presenta ai programmi una interfaccia che fa riferimento allo standard POSIX
-1003.1e.
+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.
+
+Anche in questo caso le funzioni di questa libreria non fanno parte delle
+\acr{glibc} e devono essere installate a parte;\footnote{la versione corrente
+  della libreria è \texttt{libacl1}, e nel caso si usi Debian la si può
+  installare con il pacchetto omonimo ed il collegato \texttt{libacl1-dev}.}
+pertanto se un programma le utilizza si dovrà indicare esplicitamente l'uso
+della libreria \texttt{libacl} invocando il compilatore con l'opzione
+\texttt{-lacl}.
+
+
+
+
 
 \itindend{Access~Control~List}
 
@@ -2654,8 +3028,8 @@ cambiando la directory di lavoro.
 Normalmente la directory radice di un processo coincide anche con la radice
 del filesystem usata dal kernel, e dato che il suo valore viene ereditato dal
 padre da ogni processo figlio, in generale i processi risolvono i
-\itindsub{pathname}{assoluto}\textit{pathname} assoluti a partire sempre dalla
-stessa directory, che corrisponde alla \file{/} del sistema.
+\itindsub{pathname}{assoluto} \textit{pathname} assoluti a partire sempre
+dalla stessa directory, che corrisponde alla radice del sistema.
 
 In certe situazioni però, per motivi di sicurezza, è utile poter impedire che
 un processo possa accedere a tutto il filesystem; per far questo si può
@@ -2711,6 +3085,9 @@ contiene i file.  Si tenga presente per
 replicare all'interno della \textit{chroot jail} tutti i file (in genere
 programmi e librerie) di cui il server potrebbe avere bisogno.
 
+
+
+
 % 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
@@ -2740,7 +3117,12 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  gid Control List patch mandatory control execute group other all
 % LocalWords:  dell' effective passwd IGID locking swap saved text IRWXU IRWXG
 % LocalWords:  IRWXO ext reiser capability FSETID mask capabilities chroot jail
-% LocalWords:  FTP Di filter reiserfs
+% LocalWords:  FTP Di filter reiserfs Attributes Solaris Posix FreeBSD libacl
+% LocalWords:  XFS SELinux namespace attribute security trusted Draft Modules
+% LocalWords:  attributes mime ADMIN FOWNER libattr lattr getxattr lgetxattr
+% LocalWords:  fgetxattr attr ssize ENOATTR ENOTSUP NUL setxattr lsetxattr list
+% LocalWords:  fsetxattr flags XATTR REPLACE listxattr llistxattr flistxattr
+% LocalWords:  removexattr lremovexattr fremovexattr attributename lacl
 
 %%% Local Variables: 
 %%% mode: latex