Completate funzioni degli extended attributes.
authorSimone Piccardi <piccardi@gnulinux.it>
Sat, 13 Oct 2007 14:26:45 +0000 (14:26 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sat, 13 Oct 2007 14:26:45 +0000 (14:26 +0000)
filedir.tex

index 6ac0c4c03eadb7dc55896c0254aa44b3ea58f9cd..5e72537aa225457808c1dfc1ae079be97ec798da 100644 (file)
@@ -2604,14 +2604,14 @@ 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}.
+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{10cm}|}
+  \begin{tabular}{|c|p{8cm}|}
     \hline
     \textbf{Nome} & \textbf{Descrizione} \\
     \hline
@@ -2653,7 +2653,7 @@ 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}
+\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
@@ -2662,26 +2662,27 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
   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
+  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 capability \index{capabilities}
+  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
-  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{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} è
+\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
@@ -2689,25 +2690,26 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
   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
+  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 nessuno è mai stato
-  capace di indicare un uso sensato degli \textit{extended user attributes}
-  per questi oggetti, o per fifo e socket.
+  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
@@ -2715,30 +2717,29 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
     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
+  \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 amministratitiv della capability
+  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, 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}.
+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, per poterle utilizzare occorre collegare il
-i loro prototipi sono:
+simbolico e ad un file descriptor; i rispettivi prototipi sono:
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{attr/xattr.h} 
@@ -2754,8 +2755,8 @@ i loro prototipi sono:
 
   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
+  \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.
@@ -2769,8 +2770,168 @@ i loro prototipi sono:
   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}
 
@@ -2816,6 +2977,14 @@ 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}.
+
 
 
 
@@ -2919,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
@@ -2953,7 +3119,10 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % 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
+% 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