Materiale sugli extended attributes, inizio di un esempio ed qualche
[gapil.git] / filedir.tex
index 48c04aeca2620e6f3efcb574c38079df2ccb1fcc..6ac0c4c03eadb7dc55896c0254aa44b3ea58f9cd 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
@@ -2569,6 +2576,199 @@ 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 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{10cm}|}
+    \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
+  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 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
+  in lettura che in scrittura, è consentito soltanto ai processi 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 dato che esistono
+  diversi oggetti sul filesystem per i quali è normale avere avere il permesso
+  di scrittura aperto a tutti, 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 infatti 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 nessuno è mai stato
+  capace di indicare un uso sensato degli \textit{extended user attributes}
+  per questi oggetti, o per fifo e 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
+  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 amministratitiv della capability
+  \index{capabilities} \const{CAP\_FOWNER}.
+\end{basedescript}
+
+Le funzioni per la gestione degli attributi estesi, come altre funzioni di
+gestione avanzate, non sono 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 libreria invocando il compilatore
+con attraverso 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, per poterle utilizzare occorre collegare il
+i loro 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 numero 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}
+
 
 
 
@@ -2578,7 +2778,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 +2790,35 @@ 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 quelle che vanno sotto il
+nome di \textit{Posix ACL}.
 
 A differenza di altri sistemi (ad esempio FreeBSD) nel caso di Linux si è
-scelto di realizzare le ACL attraverso l'interfaccia degli \textit{Extended
-  Attributes}, e fornire tutte le relative funzioni di gestione tramite una
-liberia, \texttt{libacl} che nasconde i dettagli implementativi delle stesse e
-presenta ai programmi una interfaccia che fa riferimento allo standard POSIX
-1003.1e.
+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.
+
+
+
+
 
 \itindend{Access~Control~List}
 
@@ -2654,8 +2859,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 +2916,12 @@ 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 +2951,9 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  gid Control List patch mandatory control execute group other all
 % LocalWords:  dell' effective passwd IGID locking swap saved text IRWXU IRWXG
 % LocalWords:  IRWXO ext reiser capability FSETID mask capabilities chroot jail
-% LocalWords:  FTP Di 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
 
 %%% Local Variables: 
 %%% mode: latex