Altre cose sulle ACL
authorSimone Piccardi <piccardi@gnulinux.it>
Sat, 6 Dec 2008 23:25:55 +0000 (23:25 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sat, 6 Dec 2008 23:25:55 +0000 (23:25 +0000)
filedir.tex

index 83a2d281cb284c7907b469ddeb054db2967bbfc5..d093641d30a68f57c762e19874046b38a78b6183 100644 (file)
@@ -3683,6 +3683,189 @@ disallocato con una chiamata ad \func{acl\_free}. Si tenga presente infine che
 questa funzione è una estensione specifica di Linux, e non è presente nella
 bozza dello standard POSIX.1e.
 
+Per quanto utile per la visualizzazione o l'impostazione da comando delle ACL,
+la forma testuale non è la più efficiente per poter memorizzare i dati
+relativi ad una ACL, ad esempio quando si vuole eseguirne una copia a scopo di
+archiviazione. Per questo è stata prevista la possibilità di utilizzare una
+rappresentazione delle ACL in una apposita forma binaria contigua e
+persistente. È così possibile copiare il valore di una ACL in un buffer e da
+questa rappresentazione tornare indietro e generare una ACL. 
+
+Lo standard POSIX.1e prevede a tale scopo tre funzioni, la prima e più
+semplice è \funcd{acl\_size}, che consente di ottenere la dimensione che avrà
+la citata rappresentazione binaria, in modo da poter allocare per essa un
+buffer di dimensione sufficiente, il suo prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{sys/acl.h}
+  
+  \funcdecl{ssize\_t acl\_size(acl\_t acl)}
+
+  Determina la dimensione della rappresentazione binaria di una ACL.
+
+  \bodydesc{La funzione restituisce in caso di successo la dimensione in byte
+    della rappresentazione binaria della ACL indicata da \param{acl} e $-1$ in
+    caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida.
+  \end{errlist}
+
+}
+\end{functions}
+
+Prima di effettuare la lettura della rappresentazione binaria è sempre
+necessario allocare un buffer di dimensione sufficiente a contenerla, pertanto
+prima si dovrà far ricorso a \funcd{acl\_size} per ottenere tale dimensione e
+poi allocare il buffer con una delle funzioni di
+sez.~\ref{sec:proc_mem_alloc}. Una volta terminato l'uso della
+rappresentazione binaria, il buffer dovrà essere esplicitamente disallocato.
+
+La funzione che consente di leggere la rappresentazione binaria di una ACL è
+\funcd{acl\_copy\_ext}, il cui prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{sys/acl.h}
+  
+  \funcdecl{ssize\_t acl\_copy\_ext(void *buf\_p, acl\_t acl, ssize\_t size)}
+
+  Ottiene la rappresentazione binaria di una ACL.
+
+  \bodydesc{La funzione restituisce in caso di successo la dimensione in byte
+    della rappresentazione binaria della ACL indicata da \param{acl} e $-1$ in
+    caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida o
+    \param{size} è negativo o nullo.
+  \item[\errcode{ERANGE}] il valore di \param{size} è più piccolo della
+    dimensione della rappresentazione della ACL.
+  \end{errlist}
+
+}
+\end{functions}
+
+La funzione salverà la rappresentazione binaria della ACL indicata da
+\param{acl} sul buffer posto all'indirizzo \param{buf\_p} e lungo \param{size}
+byte, restituendo la dimensione della stessa come valore di ritorno. Qualora
+la dimensione della rappresentazione ecceda il valore di \param{size} la
+funzione fallirà con un errore di \errcode{ERANGE}. La funzione non ha nessun
+effetto sulla ACL indicata da \param{acl}.
+
+Viceversa se si vuole ripristinare una ACL a partire dalla rappresentazione
+binaria della stessa disponibile in un buffer si potrà usare la funzione 
+\funcd{acl\_copy\_int}, il cui prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{sys/acl.h}
+  
+  \funcdecl{ssize\_t acl\_copy\_int(const void *buf\_p)}
+
+  Ripristina la rappresentazione binaria di una ACL.
+
+  \bodydesc{La funzione restituisce un oggetto di tipo \type{acl\_t} in caso
+    di successo e \code{(acl\_t)NULL} in caso di errore, nel qual caso
+    \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] il buffer all'indirizzo \param{buf\_p} non contiene
+    una rappresentazione corretta di una ACL.
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare un oggetto
+    \type{acl\_t} per la ACL richiesta.
+  \end{errlist}
+
+}
+\end{functions}
+
+La funzione in caso di successo alloca autonomamente un oggetto di tipo
+\type{acl\_t} che viene restituito come valore di ritorno con il contenuto
+della ACL rappresentata dai dati contenuti nel buffer puntato da
+\param{buf\_p}. Si ricordi che come per le precedenti funzioni l'oggetto
+\type{acl\_t} dovrà essere disallocato esplicitamente al termine del suo
+utilizzo.
+
+Una volta che si disponga della ACL desiderata, questa potrà essere impostata
+su un file o una directory. Per far questo sono disponibili due funzioni; la
+prima è \funcd{acl\_set\_file}, il cui prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{sys/acl.h}
+  
+  \funcdecl{int acl\_set\_file(const char *path, acl\_type\_t type, acl\_t
+    acl)}
+
+  Imposta una ACL su un file.
+
+  \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
+    errore, nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EACCES}] o un generico errore di accesso a \param{path} o il
+    valore di \param{type} specifica una ACL il cui tipo non può essere
+    assegnato a \param{path}.
+  \item[\errcode{EINVAL}] o \param{acl} non è una ACL valida, o \param{type}
+    ha in valore non corretto.
+  \item[\errcode{ENOSPC}] non c'è spazio disco sufficiente per contenere i
+    dati aggiuntivi della ACL.
+  \item[\errcode{ENOTSUP}] si è cercato di impostare una ACL su un file
+    contenuto in un filesystem che non supporta le ACL.
+  \end{errlist}
+  ed inoltre \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENAMETOOLONG},
+  \errval{EROFS}, \errval{EPERM}.
+}
+\end{functions}
+
+La funzione ...
+
+%TODO: finire
+
+La seconda funzione che consente di impostare una ACL è
+\funcd{acl\_set\_fd}, il cui prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{sys/acl.h}
+  
+  \funcdecl{int acl\_set\_fd(int fd, acl\_t acl)}
+
+  Imposta una ACL su un file descriptor.
+
+  \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
+    errore, nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EBADF}].
+  \item[\errcode{EINVAL}] o \param{acl} non è una ACL valida, o \param{type}
+    ha in valore non corretto.
+  \item[\errcode{ENOSPC}] non c'è spazio disco sufficiente per contenere i
+    dati aggiuntivi della ACL.
+  \item[\errcode{ENOTSUP}] si è cercato di impostare una ACL su un file
+    contenuto in un filesystem che non supporta le ACL.
+  \end{errlist}
+  ed inoltre \errval{EBADF}, \errval{EROFS}, \errval{EPERM}.
+}
+\end{functions}
+
+Le funzioni viste finora operano a livello di una intera ACL, eseguendo in una
+sola volta tutte le operazioni relative a tutte le voci in essa contenuta. In
+generale è possibile modificare un singolo valore all'interno di una singola
+voce direttamente con le funzioni previste dallo standardo POSIX.1e.  Queste
+funzioni però sono alquanto macchinose da utilizzare per cui è probabilmente
+più semplice operare direttamente sulla rappresentazione testuale. Questo è il
+motivo per non tratteremo nei dettagli dette funzioni, fornendone solo una
+descrizione sommaria; chi fosse interessato potrà ricorrere alle pagina di
+manuale.
+
+Se si vuole operare direttamente sui contenuti di un oggetto di tipo
+\type{acl\_t} infatti occorre fare riferimento alle singole voci tramite gli
+opportuni puntatori di tipo \type{acl\_entry\_t}, che possono essere ottenuti
+dalla funzione \funcd{acl\_get\_entry} (per una voce esistente) o dalla
+funzione \funcd{acl\_create\_entry} per una voce da aggiungere. Nel caso della
+prima funzione si potrà poi ripetere la lettura per ottenere i puntatori alle
+singoli voci. 
+
+Una volta ottenuti detti puntatori si porà operare sui contenuti delle singole
+voci ...
+
+
+%TODO: finire
+
+
+
 
 \itindend{Access~Control~List}