semantica BSD. Linux invece segue normalmente quella che viene chiamata
semantica SVr4: di norma un nuovo file viene creato, seguendo la prima
opzione, con il \ids{GID} del processo, se però la directory in cui viene
-creato ha il bit \acr{sgid} impostato allora viene usata la seconda
-opzione. L'adozione di questa semantica però può essere controllata,
+creato ha il bit \acr{sgid} dei permessi impostato allora viene usata la
+seconda opzione. L'adozione di questa semantica però può essere controllata,
all'interno di alcuni filesystem,\footnote{con il kernel 2.6.25 questi erano
- \acr{ext2}, \acr{ext3}, \acr{ext4}, e XFS.} con l'uso dell'opzione di
+ \acr{ext2}, \acr{ext3}, \acr{ext4}, e \acr{XFS}.} con l'uso dell'opzione di
montaggio \texttt{grpid}, che se attivata fa passare all'uso della semantica
BSD.
stata creata una nuova \textit{system call} per \func{chown} che seguisse i
collegamenti simbolici.} La funzione \func{fchown} opera su un file aperto,
essa è mutuata da BSD, ma non è nello standard POSIX. Un'altra estensione
-rispetto allo standard POSIX è che specificando -1 come valore
-per \param{owner} e \param{group} i valori restano immutati.
+rispetto allo standard POSIX è che specificando $-1$ come valore per
+\param{owner} e \param{group} i valori restano immutati.
Quando queste funzioni sono chiamate con successo da un processo senza i
privilegi di amministratore entrambi i bit \acr{suid} e \acr{sgid} vengono
supportarle, ma questo è ormai vero per praticamente tutti i filesystem più
comuni, con l'eccezione di NFS per il quale esiste però il supporto per le
versioni NFSv2 e NFSv3 del protocollo, con NFSv4 esistono invece delle ACL
- native che hannno una semantica diversa, su cui si possono mappare le ACL
- POSIX, su quelle di NFSv4, ma l'inverso è possibile solo in forma
- incompleta.} su cui le si vogliono utilizzare con l'opzione \texttt{acl}
-attiva. Dato che si tratta di una estensione è infatti opportuno utilizzarle
-soltanto laddove siano necessarie.
+ native che hanno una semantica diversa, su di esse possono mappare le ACL
+ POSIX, ma l'inverso è possibile solo in forma incompleta.} su cui le si
+vogliono utilizzare con l'opzione \texttt{acl} attiva. Dato che si tratta di
+una estensione è infatti opportuno utilizzarle soltanto laddove siano
+necessarie.
Una ACL è composta da un insieme di voci, e ciascuna voce è a sua volta
-costituita da un \textsl{tipo}, da un eventuale
-\textsl{qualificatore},\footnote{deve essere presente soltanto per le voci di
- tipo \const{ACL\_USER} e \const{ACL\_GROUP}.} e da un insieme di permessi.
-Ad ogni oggetto sul filesystem si può associare una ACL che ne governa i
-permessi di accesso, detta \textit{access ACL}. Inoltre per le directory si
-può impostare una ACL aggiuntiva, detta ``\textit{Default ACL}'', che serve ad
-indicare quale dovrà essere la ACL assegnata di default nella creazione di un
-file all'interno della directory stessa. Come avviene per i permessi le ACL
-possono essere impostate solo del proprietario del file, o da un processo con
-la capacità \const{CAP\_FOWNER}.
+costituita da un \textsl{tipo}, da un eventuale \textsl{qualificatore} (deve
+essere presente soltanto per le voci di tipo \const{ACL\_USER} e
+\const{ACL\_GROUP}) e da un insieme di permessi. Ad ogni oggetto sul
+filesystem si può associare una ACL che ne governa i permessi di accesso,
+detta \textit{access ACL}. Inoltre per le directory si può impostare una ACL
+aggiuntiva, detta ``\textit{Default ACL}'', che serve ad indicare quale dovrà
+essere la ACL assegnata di default nella creazione di un file all'interno
+della directory stessa. Come avviene per i permessi le ACL possono essere
+impostate solo del proprietario del file, o da un processo con la capacità
+\const{CAP\_FOWNER}.
\begin{table}[htb]
\centering
Una ACL può poi contenere un numero arbitrario di voci di tipo
\const{ACL\_USER} e \const{ACL\_GROUP}, ciascuna delle quali indicherà i
permessi assegnati all'utente e al gruppo indicato dal relativo qualificatore.
-Ovviamente ciascuna di queste voci dovrà fare riferimento ad un utente o ad un
+Ovviamente ciascuna di queste voci dovrà fare riferimento a un utente o a un
gruppo diverso, e non corrispondenti a quelli proprietari del file. Inoltre se
in una ACL esiste una voce di uno di questi due tipi, è obbligatoria anche la
presenza di una ed una sola voce di tipo \const{ACL\_MASK}, che negli altri
\const{ACL\_GROUP\_OBJ}).
Per la gestione delle ACL lo standard \textit{POSIX 1003.1e Draft 17} ha
-previsto delle apposite funzioni ed tutta una serie di tipi di dati
-dedicati;\footnote{fino a definire un tipo di dato e delle costanti apposite
- per identificare i permessi standard di lettura, scrittura ed esecuzione.}
-tutte le operazioni devono essere effettuate attraverso tramite questi tipi di
-dati, che incapsulano tutte le informazioni contenute nelle ACL. La prima di
-queste funzioni che prendiamo in esame è \funcd{acl\_init}, il cui prototipo
-è:
+previsto delle apposite funzioni ed tutta una serie di tipi di dati dedicati,
+arrivando fino a definire un tipo di dato e delle costanti apposite per
+identificare i permessi standard di lettura, scrittura ed esecuzione. Tutte
+le operazioni devono essere effettuate attraverso tramite questi tipi di dati,
+che incapsulano tutte le informazioni contenute nelle ACL.
+
+La prima di queste funzioni che prendiamo in esame (si ricordi che come per
+tutte le altre per poterla usare occorre invocare il compilatore con l'opzione
+\texttt{-l acl}) è \funcd{acl\_init}, il cui prototipo è:
\begin{funcproto}{
\fhead{sys/types.h}
in caso di fallimento verrà restituito un puntatore nullo di tipo
``\code{(acl\_t) NULL}'' e si dovrà, in questa come in tutte le funzioni
seguenti che restituiscono un oggetto di tipo \type{acl\_t}, confrontare il
-valore di ritorno della funzione con \val{NULL}.\footnote{a voler essere
- estremamente pignoli si dovrebbe usare ``\code{(acl\_t) NULL}'', ma è
- sufficiente fare un confronto direttamente con \val{NULL} essendo cura del
- compilatore fare le conversioni necessarie.}
+valore di ritorno della funzione con \val{NULL} (anche se, a voler essere
+estremamente pignoli, si dovrebbe usare ``\code{(acl\_t) NULL}'', ma è
+sufficiente fare un confronto direttamente con \val{NULL} essendo cura del
+compilatore fare le conversioni necessarie).
Una volta che si siano completate le operazioni sui dati di una ACL la memoria
allocata per un oggetto \type{acl\_t} dovrà essere liberata esplicitamente
Le due funzioni ritornano, con un oggetto di tipo \type{acl\_t}, il valore
della ACL correntemente associata ad un file, che può essere identificato
tramite un file descriptor usando \func{acl\_get\_fd} o con un
-\textit{pathname} usando \func{acl\_get\_file}. Nel caso di quest'ultima
-funzione, che può richiedere anche la ACL relativa ad una directory, il
-secondo argomento \param{type} consente di specificare se si vuole ottenere la
-ACL di default o quella di accesso. Questo argomento deve essere di tipo
-\typed{acl\_type\_t} e può assumere solo i due valori riportati in
-tab.~\ref{tab:acl_type}.
+\textit{pathname} usando \func{acl\_get\_file}.
+
+Nel caso di quest'ultima funzione, che può richiedere anche la ACL relativa ad
+una directory, il secondo argomento \param{type} consente di specificare se si
+vuole ottenere la ACL di default o quella di accesso. Questo argomento deve
+essere di tipo \typed{acl\_type\_t} e può assumere solo i due valori riportati
+in tab.~\ref{tab:acl_type}.
\begin{table}[htb]
\centering
verrà restituita una ACL vuota.
Infine si potrà creare una ACL direttamente dalla sua rappresentazione
-testuale con la funzione \funcd{acl\_from\_text}, il cui prototipo è:
+testuale con la funzione \funcd{acl\_from\_text}, il cui prototipo è:
\begin{funcproto}{
\fhead{sys/types.h}
la rappresentazione testuale della ACL che si vuole creare, la memoria
necessaria viene automaticamente allocata ed in caso di successo viene
restituito come valore di ritorno un oggetto di tipo \type{acl\_t} con il
-contenuto della stessa, che come per le precedenti funzioni, dovrà essere
+contenuto della stessa, che, come per le precedenti funzioni, dovrà essere
disallocato esplicitamente al termine del suo utilizzo.
La rappresentazione testuale di una ACL è quella usata anche dai comandi
\end{Example}
dove il tipo può essere uno fra \texttt{user}, \texttt{group}, \texttt{other}
e \texttt{mask}. Il qualificatore è presente solo per \texttt{user} e
-\texttt{group} e indica l'utente o il gruppo a cui la voce si riferisce; i
-permessi sono espressi con una tripletta di lettere analoga a quella usata per
-i permessi dei file.\footnote{vale a dire ``\texttt{r}'' per il permesso di
- lettura, ``\texttt{w}'' per il permesso di scrittura, ``\texttt{x}'' per il
- permesso di esecuzione (scritti in quest'ordine) e ``\texttt{-}'' per
- l'assenza del permesso.}
+\texttt{group} ed indica l'utente o il gruppo a cui la voce si riferisce,
+mentre i permessi sono espressi con una tripletta di lettere analoga a quella
+usata per i permessi dei file, vale a dire ``\texttt{r}'' per il permesso di
+lettura, ``\texttt{w}'' per il permesso di scrittura, ``\texttt{x}'' per il
+permesso di esecuzione (scritti in quest'ordine) e ``\texttt{-}'' per
+l'assenza del permesso.
Un possibile esempio di rappresentazione della ACL di un file ordinario a cui,
oltre ai permessi ordinari, si è aggiunto un altro utente con un accesso in
group::r--
other::r--
user:piccardi:r--
+group:gapil:r--
\end{Example}
Va precisato che i due tipi \texttt{user} e \texttt{group} sono usati
-rispettivamente per indicare delle voci relative ad utenti e
-gruppi,\footnote{cioè per voci di tipo \const{ACL\_USER\_OBJ} e
- \const{ACL\_USER} per \texttt{user} e \const{ACL\_GROUP\_OBJ} e
- \const{ACL\_GROUP} per \texttt{group}.} applicate sia a quelli proprietari
-del file che a quelli generici; quelle dei proprietari si riconoscono per
-l'assenza di un qualificatore, ed in genere si scrivono per prima delle altre.
-Il significato delle voci di tipo \texttt{mask} e \texttt{mark} è evidente. In
-questa forma si possono anche inserire dei commenti precedendoli con il
-carattere ``\texttt{\#}''.
+rispettivamente per indicare delle voci relative ad utenti e gruppi (cioè per
+voci di tipo \const{ACL\_USER\_OBJ} e \const{ACL\_USER} per \texttt{user} e
+\const{ACL\_GROUP\_OBJ} e \const{ACL\_GROUP} per \texttt{group}) applicate sia
+a quelli proprietari del file che a quelli generici. Quelle dei proprietari si
+riconoscono per l'assenza di un qualificatore, ed in genere si scrivono per
+prima delle altre. Il significato delle voci di tipo \texttt{mask} e
+\texttt{mark} è evidente. Usando questa forma estesa si possono anche inserire
+dei commenti nel testo precedendoli con il carattere ``\texttt{\#}''.
La forma breve prevede invece la scrittura delle singole voci su una riga,
separate da virgole; come specificatori del tipo di voce si possono usare le
testuale della ACL in caso di successo e \var{NULL} per un errore, nel qual
caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida.
+ \item[\errcode{EINVAL}] o \param{acl} non è un puntatore ad una ACL o la ACL
+ che esso indica non è valida o non può esser tradotta in forma testuale.
\item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
\end{errlist}
}
\end{funcproto}
-La funzione restituisce il puntatore ad una stringa terminata da NUL
-contenente la rappresentazione in forma estesa della ACL passata come
+La funzione restituisce il puntatore ad una stringa, terminata da un NUL,
+contenente la rappresentazione testuale in forma estesa della ACL passata come
argomento, ed alloca automaticamente la memoria necessaria. Questa dovrà poi
-essere liberata, quando non più necessaria, con \func{acl\_free}. Se
-nell'argomento \param{len\_p} si passa un valore puntatore ad una variabile
-intera in questa verrà restituita (come \textit{value result argument}) la
-dimensione della stringa con la rappresentazione testuale, non comprendente il
-carattere nullo finale.
+essere liberata, quando non più necessaria, con \func{acl\_free}. Se
+nell'argomento \param{len\_p} si passa come valore il puntatore ad una
+variabile intera, in questa verrà restituita (come \textit{value result
+ argument}) la dimensione della stringa con la rappresentazione testuale, non
+comprendente il carattere nullo finale.
La seconda funzione, che permette di controllare con una gran dovizia di
particolari la generazione della stringa contenente la rappresentazione
\hline
\hline
\constd{TEXT\_ABBREVIATE} & Stampa le voci in forma abbreviata.\\
- \constd{TEXT\_NUMERIC\_IDS} & non effettua la risoluzione numerica di
- \ids{UID} e \ids{GID}.\\
+ \constd{TEXT\_NUMERIC\_IDS} & Non effettua la risoluzione di
+ \ids{UID} e \ids{GID} lasciando i valori
+ numerici.\\
\constd{TEXT\_SOME\_EFFECTIVE}&Per ciascuna voce che contiene permessi che
vengono eliminati dalla \const{ACL\_MASK}
viene generato un commento con i permessi
}
\end{funcproto}
-Ottenuta con \func{acl\_size} la dimensione per il buffer di una ACL lo si
-potrà allocare direttamente con \func{malloc}. La rappresentazione binaria di
-una ACL si potrà invece ottenere con la funzione \funcd{acl\_copy\_ext}, il
-cui prototipo è:
+Ottenuta con \func{acl\_size} la dimensione del buffer necessaria per potervi
+memorizzare una ACL questo dovrà potrà essere allocato direttamente con
+\func{malloc}, ed a questo punto vi si potrà salvare la rappresentazione
+binaria della precedente ACL utilizzando la funzione \funcd{acl\_copy\_ext},
+il cui prototipo è:
\begin{funcproto}{
\fhead{sys/types.h}
della ACL in caso di successo e $-1$ per un 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{EINVAL}] la ACL indicata da \param{acl} non è valida, o
+ \param{acl} non è un puntatore ad una ACL o \param{size} è negativo o
+ nullo.
\item[\errcode{ERANGE}] il valore di \param{size} è più piccolo della
- dimensione della rappresentazione della ACL.
+ dimensione della rappresentazione binaria della ACL.
\end{errlist}
}
\end{funcproto}
La funzione scriverà la rappresentazione binaria della ACL indicata da
-\param{acl} sul buffer di dimensione \param{size}
-all'indirizzo \param{buf\_p}, 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}.
+\param{acl} sul buffer di dimensione \param{size} all'indirizzo
+\param{buf\_p}, 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 da una rappresentazione
binaria si potrà usare la funzione \funcd{acl\_copy\_int}, il cui prototipo è:
Una volta che si disponga della ACL desiderata, questa potrà essere impostata
su un file o una directory. Per impostare una ACL sono disponibili due
-funzioni; la prima è \funcd{acl\_set\_file}, che opera sia su file che su
-directory, ed il cui prototipo è:
+funzioni: \funcd{acl\_set\_file}, che opera sia su file che su directory
+usando un \textit{pathname}, e \funcd{acl\_set\_file} che opera solo su file
+usando un file descriptor; i rispettivi prototipi sono:
\begin{funcproto}{
\fhead{sys/types.h}
\fhead{sys/acl.h}
\fdecl{int acl\_set\_file(const char *path, acl\_type\_t type, acl\_t acl)}
\fdesc{Imposta una ACL su un file o una directory.}
+\fdecl{int acl\_set\_fd(int fd, acl\_t acl)}
+\fdesc{Imposta una ACL su un file descriptor.}
}
-{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{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 un valore non corretto.
+ ha un valore non corretto per \func{acl\_set\_file} o o ha più voci di
+ quante se ne possono assegnare al file per \func{acl\_set\_fd}.
\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{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR},
- \errval{EPERM}, \errval{EROFS} nel loro significato generico.}
+ ed inoltre nel loro significato generico \errval{EPERM}, \errval{EROFS} per
+ entrambe, \errval{EBADF} per \func{acl\_set\_fd}, \errval{ENAMETOOLONG},
+ \errval{ENOENT}, \errval{ENOTDIR} per \func{acl\_set\_file}.}
\end{funcproto}
-La funzione consente di assegnare la ACL contenuta in \param{acl} al file o
-alla directory indicate dal \textit{pathname} \param{path}, mentre
-con \param{type} si indica il tipo di ACL utilizzando le costanti di
-tab.~\ref{tab:acl_type}, ma si tenga presente che le ACL di default possono
-essere solo impostate qualora \param{path} indichi una directory. Inoltre
-perché la funzione abbia successo la ACL dovrà essere valida, e contenere
-tutti le voci necessarie, unica eccezione è quella in cui si specifica una ACL
-vuota per cancellare la ACL di default associata a
-\param{path}.\footnote{questo però è una estensione della implementazione delle
- ACL di Linux, la bozza di standard POSIX.1e prevedeva l'uso della apposita
- funzione \funcd{acl\_delete\_def\_file}, che prende come unico argomento il
- \textit{pathname} della directory di cui si vuole cancellare l'ACL di
- default, per i dettagli si ricorra alla pagina di manuale.} La seconda
-funzione che consente di impostare una ACL è \funcd{acl\_set\_fd}, ed il suo
-prototipo è:
-
-\begin{funcproto}{
-\fhead{sys/types.h}
-\fhead{sys/acl.h}
-\fdecl{int acl\_set\_fd(int fd, acl\_t acl)}
-\fdesc{Imposta una ACL su un file descriptor.}
-}
-
-{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
- caso \var{errno} assumerà uno dei valori:
- \begin{errlist}
- \item[\errcode{EINVAL}] o \param{acl} non è una ACL valida, o ha più voci di
- quante se ne possono assegnare al file indicato da \param{fd}.
- \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{EPERM}, \errval{EROFS} nel loro
- significato generico.
-}
-\end{funcproto}
-
-La funzione è del tutto è analoga a \func{acl\_set\_file} ma opera
-esclusivamente sui file identificati tramite un file descriptor. Non dovendo
-avere a che fare con directory (e con la conseguente possibilità di avere una
-ACL di default) la funzione non necessita che si specifichi il tipo di ACL,
-che sarà sempre di accesso, e prende come unico argomento, a parte il file
+Con \func{acl\_set\_file} si assegna la ACL contenuta in \param{acl} al file o
+alla directory indicate da \param{path}, con \param{type} che indica il tipo
+di ACL con le costanti di tab.~\ref{tab:acl_type}; si tenga presente però che
+le ACL di default possono essere solo impostate qualora \param{path} indichi
+una directory. Inoltre perché la funzione abbia successo la ACL dovrà essere
+valida, e contenere tutti le voci necessarie, con l'eccezione si specifica una
+ACL vuota per cancellare la ACL di default associata a \param{path}, valida
+solo in caso di directory.\footnote{questo però è una estensione della
+ implementazione delle ACL di Linux, la bozza di standard POSIX.1e prevedeva
+ l'uso della apposita funzione \funcd{acl\_delete\_def\_file}, che prende
+ come unico argomento il \textit{pathname} della directory di cui si vuole
+ cancellare l'ACL di default, per i dettagli si ricorra alla pagina di
+ manuale.}
+
+La seconda funzione, \func{acl\_set\_fd}, è del tutto è analoga alla prima, ma
+non dovendo avere a che fare con directory (e la conseguente possibilità di
+avere una ACL di default) non necessita che si specifichi il tipo di ACL, che
+sarà sempre di accesso, e prende come unico argomento, a parte il file
descriptor, la ACL da impostare.
Le funzioni viste finora operano a livello di una intera ACL, eseguendo in una
funzioni però sono alquanto macchinose da utilizzare per cui è molto 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 pagine di
+descrizione sommaria; chi fosse interessato può ricorrere alle pagine di
manuale.
Se si vuole operare direttamente sui contenuti di un oggetto di tipo
prima funzione si potrà poi ripetere la lettura per ottenere i puntatori alle
singole voci successive alla prima.
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{\codesamplewidth}
+ \includecodesample{listati/mygetfacl.c}
+ \end{minipage}
+ \normalsize
+ \caption{Corpo principale del programma \texttt{mygetfacl.c}.}
+ \label{fig:proc_mygetfacl}
+\end{figure}
+
Una volta ottenuti detti puntatori si potrà operare sui contenuti delle
singole voci: con le funzioni \funcm{acl\_get\_tag\_type},
\funcm{acl\_get\_qualifier}, \funcm{acl\_get\_permset} si potranno leggere
si è distribuito il programma \texttt{mygetfacl.c}, che consente di leggere le
ACL di un file, passato come argomento.
-\begin{figure}[!htb]
- \footnotesize \centering
- \begin{minipage}[c]{\codesamplewidth}
- \includecodesample{listati/mygetfacl.c}
- \end{minipage}
- \normalsize
- \caption{Corpo principale del programma \texttt{mygetfacl.c}.}
- \label{fig:proc_mygetfacl}
-\end{figure}
-
La sezione principale del programma, da cui si è rimossa la sezione sulla
gestione delle opzioni, è riportata in fig.~\ref{fig:proc_mygetfacl}. Il
programma richiede un unico argomento (\texttt{\small 16-20}) che indica il
\textit{inode}) da parte di utenti e gruppi.
Dato che la funzionalità ha senso solo per i filesystem su cui si mantengono i
-dati degli utenti\footnote{in genere la si attiva sul filesystem che contiene
- le \textit{home} degli utenti, dato che non avrebbe senso per i file di
- sistema che in genere appartengono all'amministratore.} essa deve essere
-attivata esplicitamente. Questo si fa, per tutti i filesystem che le
-supportano, tramite due distinte opzioni di montaggio, \texttt{usrquota} e
-\texttt{grpquota} che abilitano le quote rispettivamente per gli utenti e per
-i gruppi. Così è possibile usare le limitazioni sulle quote o sugli utenti o
+dati degli utenti essa deve essere attivata esplicitamente.\footnote{in genere
+ la si attiva sul filesystem che contiene le \textit{home} degli utenti, dato
+ che non avrebbe senso per i file di sistema che in genere appartengono
+ all'amministratore.} Questo si fa, per tutti i filesystem che le supportano,
+tramite due distinte opzioni di montaggio, \texttt{usrquota} e
+\texttt{grpquota}, che abilitano le quote rispettivamente per gli utenti e per
+i gruppi. Così è possibile usare le limitazioni delle quote o sugli utenti o
sui gruppi o su entrambi.
+Dal kernel 4.1, ed inizialmente solo per il filesystem XFS, sono diventate
+disponibili un terzo tipo di quote, dette \textit{project quota}, che
+consentono di applicare delle quote ad un ``\textsl{progetto}'', identificato
+come ramo di albero sotto una directory, per il quale possono essere imposti
+dei limiti (di nuovo in termini di spazio disco o \textit{inode}) per i file
+che ne fanno parte. Si può così porre dei limiti sul contenuto di un ramo di
+albero.
+
Il meccanismo prevede che per ciascun filesystem che supporta le quote disco
(i vari \textit{extN}, \textit{btrfs}, \textit{XFS}, \textit{JFS},
\textit{ReiserFS}) il kernel provveda sia a mantenere aggiornati i dati
-relativi al consumo delle risorse da parte degli utenti e dei gruppi, che a
-far rispettare i limiti imposti dal sistema, con la generazione di un errore
-di \errcode{EDQUOT} per tutte le operazioni sui file che porterebbero ad un
-superamento degli stessi. Si tenga presente che questi due compiti sono
-separati, il primo si attiva al montaggio del filesystem con il supporto per
-le quote, il secondo deve essere abilitato esplicitamente.
+relativi al consumo delle risorse da parte degli utenti e dei gruppi (e del
+progetto), che a far rispettare i limiti imposti dal sistema, con la
+generazione di un errore di \errcode{EDQUOT} per tutte le operazioni sui file
+che porterebbero ad un superamento degli stessi. Si tenga presente che questi
+due compiti sono separati, il primo si attiva al montaggio del filesystem con
+il supporto per le quote, il secondo deve essere abilitato esplicitamente.
Per il mantenimento dei dati di consumo delle risorse vengono usati due file
riservati nella directory radice del filesystem su cui si sono attivate le
quote, uno per le quote utente e l'altro per le quote gruppo.\footnote{la cosa
vale per tutti i filesystem tranne \textit{XFS} che mantiene i dati
- internamente.} Con la versione 2 del supporto delle quote, che da anni è
+ internamente, compresi quelli per le \textit{project quota}, che pertanto,
+ essendo questo l'unico filesyste che le supporta, non hanno un file ad esse
+ riservato.} Con la versione 2 del supporto delle quote, che da anni è
l'unica rimasta in uso, questi file sono \texttt{aquota.user} e
\texttt{aquota.group}, in precedenza erano \texttt{quota.user} e
\texttt{quota.group}.
caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\item[\errcode{EACCES}] si è richiesto \const{Q\_QUOTAON}, ma il file delle
- quote indicato da \param{addr} non esiste o non è un file ordinario.
+ quote indicato da \param{addr} esiste ma non è un file ordinario o no sta
+ su \param{dev}.
\item[\errcode{EBUSY}] si è richiesto \const{Q\_QUOTAON}, ma le quote sono
già attive.
- \item[\errcode{EFAULT}] \param{addr} non è un puntatore valido.
+ \item[\errcode{EFAULT}] \param{addr} o \param{dev} non sono un puntatori
+ validi.
\item[\errcode{EINVAL}] o \param{cmd} non è un comando valido,
o il dispositivo \param{dev} non esiste.
\item[\errcode{EIO}] errore di lettura/scrittura sul file delle quote.
% TODO rivedere gli errori
La funzione richiede che il filesystem sul quale si vuole operare, che deve
-essere specificato con il nome del relativo file di dispositivo
-nell'argomento \param{dev}, sia montato con il supporto delle quote
-abilitato. Per le operazioni che lo richiedono inoltre si dovrà indicare con
-l'argomento \param{id} l'utente o il gruppo (specificati rispettivamente per
-\ids{UID} e \ids{GID}) su cui si vuole operare, o altri dati relativi
-all'operazione. Alcune operazioni più complesse usano infine
-l'argomento \param{addr} per indicare un indirizzo ad un area di memoria il
-cui utilizzo dipende dall'operazione stessa.
+essere specificato con il nome del relativo file di dispositivo nell'argomento
+\param{dev}, sia montato con il supporto delle quote abilitato. Per le
+operazioni che lo richiedono inoltre si dovrà indicare con l'argomento
+\param{id} l'utente o il gruppo o il progetto (specificati rispettivamente per
+\ids{UID}, \ids{GID} o identificativo) su cui si vuole operare,\footnote{nel
+ caso di \textit{project quota} gli identificativi vengono associati alla
+ directory base del progetto nel file \file{/etc/projects}, ed impostati con
+ \cmd{xfs\_quota}, l'argomento è di natura sistemistica e va al di là dello
+ scopo di questo testo.} o altri dati relativi all'operazione. Alcune
+operazioni più complesse usano infine l'argomento \param{addr} per indicare un
+indirizzo ad un area di memoria il cui utilizzo dipende dall'operazione
+stessa.
La funzione prevede la possibilità di eseguire una serie operazioni sulle
quote molto diverse fra loro, la scelta viene effettuata tramite il primo
}
La macro consente di specificare, oltre al tipo di operazione, da indicare con
-l'argomento \param{subcmd} se questa deve applicarsi alle quote utente o alle
-quote gruppo. Questo viene indicato dall'argomento \param{type} che deve
-essere sempre definito ed assegnato ad uno fra i due valori \const{USRQUOTA} o
-\const{GRPQUOTA}.
+l'argomento \param{subcmd}, se questa deve applicarsi alle quote utente o alle
+quote gruppo o alle quote progetto. Questo viene indicato dall'argomento
+\param{type} che deve essere sempre definito ed assegnato ad uno fra i valori
+\const{USRQUOTA}, \const{GRPQUOTA} e \const{PRJQUOTA}.
\begin{table}[htb]
\centering
prestazioni migliori in conseguenza di un minore frazionamento dei dati e di
indici più corti.}
-Come accennato realizzazione delle quote disco ha visto diverse revisioni, con
-modifiche sia del formato delle stesse che dei nomi dei file utilizzate. Per
-questo alcune operazioni di gestione (in particolare \const{Q\_QUOTAON} e
-\const{Q\_GETFMT}) e possono fare riferimento a queste versioni, che vengono
-identificate tramite le costanti di tab.~\ref{tab:quotactl_id_format}.
+Come accennato la realizzazione delle quote disco ha visto diverse revisioni,
+con modifiche sia del formato delle stesse che dei nomi dei file
+utilizzati. Per questo alcune operazioni di gestione (in particolare
+\const{Q\_QUOTAON} e \const{Q\_GETFMT}) e possono fare riferimento a queste
+versioni, che vengono identificate tramite le costanti di
+tab.~\ref{tab:quotactl_id_format}.
\begin{table}[htb]
\centering