Completate funzioni degli extended attributes.
[gapil.git] / filedir.tex
index a91b26f9d1c9635eb9633ff46efb3d743299176b..5e72537aa225457808c1dfc1ae079be97ec798da 100644 (file)
@@ -2579,11 +2579,7 @@ l'atomicit
 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. L'accesso agli attributi estesi è
-regolato dagli ordinari permessi dei file: occorre il permesso di lettura per
-leggerli e quello di scrittura per scriverli o modificarli; il permesso di
-esecuzione viene invece interpretato coma la capacità di ottenere la lista
-degli attributi presenti.
+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
@@ -2591,53 +2587,351 @@ 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
-  dell'ordine di 1024, 2048 o 4096 byte a seconda delle dimensioni di
-  quest'ultimo impostate in fase di formattazione), mentre con \textsl{XFS}
-  non ci sono limiti ed i dati vengono memorizzati in maniera diversa
-  (nell'inode stesso, in un blocco a parte, in una struttura ad albero
-  dedicata) per mantentere 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 accennato gli \textit{Extended Attributes} costituiscono un meccanismo
-per mantenere informazioni ulteriori associate al singolo file, che possono
-avere gli usi più disparati.\footnote{come accennato sono usati per le ACL che
-  vedremo in sez.~\ref{sec:file_ACL}, ma anche per le estensioni di SELinux.}
-Per poter distinguere i vari utilizzi possibili gli attributi sono stati
-suddivisi in diverse \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},
-\textit{namespace} fa riferimento alla classe a cui l'attributo appartiene; al
-momento della scrittura di queste dispense essi sono definite le seguenti
-classi:
-
-
-
-
-
-
+  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|l|}
+  \begin{tabular}{|c|p{8cm}|}
     \hline
-    \textbf{Nome} & \textbf{Classe} \\
+    \textbf{Nome} & \textbf{Descrizione} \\
     \hline
     \hline
-    \const{security}& . \\
-    \const{system}  & . \\
-    \const{trusted} & . \\
-    \const{user}    & . \\
+    \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
-    varue classi di \textit{Extended Attributes}.}
+    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}
 
@@ -2645,7 +2939,7 @@ classi:
 % sistema è nei pacchetti libxattr1-dev e attr
 
 
-\subsection{Le ACL}
+\subsection{Le \textit{Access  Control List}}
 \label{sec:file_ACL}
 
 
@@ -2661,11 +2955,11 @@ complessa dei permessi di accesso.\footnote{gi
 
 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
@@ -2676,11 +2970,20 @@ che 
 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
-libreria, \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}.
 
 
 
@@ -2785,9 +3088,6 @@ 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
@@ -2818,6 +3118,11 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % 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 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