semplificare l'inizializzazione in maniera molto comoda.
Altre due funzioni che consentono di creare una ACL già inizializzata sono
-\funcd{acl\_get\_fd} e \funcd{acl\_get\_file}, che però sono per lo più
-utilizzate per leggere la ACL corrente di un file; i rispettivi prototipi
-sono:
+\funcd{acl\_get\_fd} e \funcd{acl\_get\_file}, che consentono di leggere la
+ACL di un file; i rispettivi prototipi sono:
\begin{funcproto}{
\fhead{sys/types.h}
\fhead{sys/acl.h}
\fdecl{acl\_t acl\_get\_file(const char *path\_p, acl\_type\_t type)}
\fdecl{acl\_t acl\_get\_fd(int fd)}
-\fdesc{Ottiene i dati delle ACL di un file.}
+\fdesc{Leggono i dati delle ACL di un file.}
}
-{La funzione ritorna un oggetto di tipo \type{acl\_t} in caso di successo e
- \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
- dei valori:
+{Le funzioni ritornano un oggetto di tipo \type{acl\_t} in caso di successo e
+ \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
+ \item[\errcode{ACCESS}] non c'è accesso per una componente di
+ \param{path\_p} o si è richiesta una ACL di default per un file (solo per
+ \func{acl\_get\_file}).
\item[\errcode{EINVAL}] \param{type} non ha un valore valido (solo per
\func{acl\_get\_file}).
\item[\errcode{ENOTSUP}] il filesystem cui fa riferimento il file non
supporta le ACL.
\end{errlist}
- ed inoltre \errval{EBADF} per \func{acl\_get\_fd}, e \errval{EACCES},
- \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR}, per
- \func{acl\_get\_file}. }
+ ed inoltre \errval{ENOMEM} per entrambe, \errval{EBADF} per
+ \func{acl\_get\_fd}, e \errval{ENAMETOOLONG}, \errval{ENOENT},
+ \errval{ENOTDIR}, per \func{acl\_get\_file} nel loro significato generico. }
\end{funcproto}
Le due funzioni ritornano, con un oggetto di tipo \type{acl\_t}, il valore
Ottenuta la ACL la si converte in formato testuale (\texttt{\small 27}) con la
funzione \func{acl\_to\_text}, controllando di nuovo se l'operazione ha
-successo (\texttt{\small 23--26}) ed uscendo in caso contrario. Si provvede
-infine a stampare la rappresentazione testuale (\texttt{\small 28}) e dopo
-aver liberato (\texttt{\small 29--30}) le risorse allocate automaticamente,
-si conclude l'esecuzione.
+successo (\texttt{\small 28--31}) ed uscendo in caso contrario. Si provvede
+infine a stampare la rappresentazione testuale (\texttt{\small 32}) e dopo
+aver liberato (\texttt{\small 33--34}) le risorse allocate automaticamente, si
+conclude l'esecuzione.
\subsection{La gestione delle quote disco}
\fdesc{Imposta le \textit{capabilities}.}
}
-{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\item[\errcode{EFAULT}] si è indicato un puntatore sbagliato o nullo
% LocalWords: lazy encfs sshfs setfsent getfsent getfsfile getfsspec endfsent
% LocalWords: setmntent getmntent addmntent endmntent hasmntopt such offsetof
% LocalWords: member scan attack EOVERFLOW BITS blkcnt rdev FDCWD functions
-% LocalWords: faccessat grpid lacl AppArmor capsetp
+% LocalWords: faccessat grpid lacl AppArmor capsetp mygetfacl
%%% Local Variables:
%%% mode: latex
--- /dev/null
+#include <sys/types.h> /* primitive system data types */
+#include <stdlib.h> /* C standard library */
+#include <stdio.h> /* standard I/O library */
+#include <unistd.h> /* unix standard library */
+#include <sys/acl.h> /* acl library (use -l acl) */
+
+int main(int argc, char *argv[])
+{
+/*
+ * Variables definition
+ */
+ acl_t acl;
+ ssize_t size;
+ char * buffer;
+ ...
+ /* must have an argument */
+ if ((argc - optind) != 1) {
+ printf("Wrong number of arguments %d\n", argc - optind);
+ usage();
+ }
+ /* main body */
+ acl = acl_get_file(argv[1], ACL_TYPE_ACCESS);
+ if (acl == NULL) {
+ perror("cannot get acl for file");
+ return 1;
+ }
+ buffer = acl_to_text(acl, &size);
+ if (buffer == NULL) {
+ perror("cannot convert acl");
+ return 1;
+ }
+ printf("ACL for file '%s':\n%s\n", argv[1], buffer);
+ acl_free(acl);
+ acl_free(buffer);
+ return 0;
+}