\label{tab:proc_capabilities}
\end{table}
-\footnotetext[18]{questa capacità è presente soltato a partire dai kernel
+\footnotetext[21]{questa capacità è presente soltato a partire dai kernel
della serie 2.4.x.}
\footnotetext{questa capacità è presente soltato a partire dai kernel della
sez.~\ref{sec:proc_setuid}; il loro significato è il seguente:
\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}}
\item[\textit{effective}] l'insieme delle \textit{capabilities}
- ``\textsl{effettive}'', cioè quelle che vengono effettivamente usate dal
- kernel per eseguire il controllo di accesso per le operazioni compiute dal
- processo.
+ ``\textsl{effettive}'', cioè di quelle che vengono effettivamente usate dal
+ kernel quando deve eseguire il controllo di accesso per le varie operazioni
+ compiute dal processo.
\item[\textit{permitted}] l'insieme delle \textit{capabilities}
- ``\textsl{permesse}'', cioè l'insieme di quelle che un processo \textsl{può}
- impostare come \textsl{effettive} se ha la capacità \const{CAP\_SETPCAP}. Se
- un processo cancella una capacità da questo insieme non potrà più
- riassumerla (almeno che non esegua un programma che è \acr{suid} di root).
+ ``\textsl{permesse}'', cioè l'insieme di quelle capacità che un processo
+ \textsl{può} impostare come \textsl{effettive}. Se un processo cancella una
+ capacità da questo insieme non potrà più riassumerla (almeno che non esegua
+ un programma che è \acr{suid} di root).
\item[\textit{inherited}] l'insieme delle \textit{capabilities}
- \textsl{ereditate}, cioè quelle che vengono trasmesse ad un nuovo programma
- eseguito attraverso una chiamata ad \func{exec} (con l'eccezione del caso
- che questo sia \acr{suid} di root).
+ ``\textsl{ereditate}'', cioè quelle che vengono trasmesse ad un nuovo
+ programma eseguito attraverso una chiamata ad \func{exec} (con l'eccezione
+ del caso che questo sia \acr{suid} di root).
\end{basedescript}
-
Oltre a questi tre insiemi, che sono relativi al singolo processo, il kernel
mantiene un insieme generale valido per tutto il sistema, chiamato
\itindex{capabilities~bounding~set} \textit{capabilities bounding set}. Ogni
eseguito nel sistema (di norma cioè da \texttt{/sbin/init}), ogni processo
eseguito successivamente (cioè con \textsl{pid} diverso da 1) anche se
eseguito con privilegi di amministratore può al più rimuovere uno dei bit
-dell'insieme: questo significa che una volta rimossa da esso una
-\textit{capability} essa non sarà più disponibile, neanche per
-l'amministratore, a meno di un riavvio.
-
+dell'insieme: questo significa che una volta rimossa una \textit{capability}
+dal \textit{capabilities bounding set} essa non sarà più disponibile, neanche
+per l'amministratore, a meno di un riavvio.
-Quando viene messo in esecuzione (con \func{exec}) un processo eredita le
+Quando viene messo in esecuzione (con \func{exec}) un processo eredita (nel
+senso che assume negli insiemi \textit{effective} e \textit{permitted}) le
\textit{capabilities} mantenute nell'insieme \textit{inherited}, a meno che
non sia eseguito un programma \acr{suid} di root o la \func{exec} sia stata
eseguita da un programma con \textsl{uid} reale zero; in tal caso il programma
ottiene tutte le \textit{capabilities} presenti nel \textit{capabilities
- bounding set}.
+ bounding set}. In questo modo si può far si che ad un processo eseguito in
+un secondo tempo possano essere trasmesse solo un insieme limitato di
+capacità, impedendogli di recuperare quelle assenti nell'insieme
+\textit{inherited}. Si tenga presente invece che attraverso una \func{fork}
+vengono mantenute le stesse capacità del processo padre.
+
+Per la gestione delle \textit{capabilities} Linux usa due funzioni,
+\funcd{capget} e \funcd{capset}, che permettono rispettivamente di leggerne ed
+impostarne i valori, i cui rispettivi prototipi sono:
+\begin{functions}
+ \headdecl{sys/capability.h}
+
+ \funcdecl{int capget(cap\_user\_header\_t hdrp, cap\_user\_data\_t datap)}
+ Legge le \textit{capabilities}.
+
+ \funcdecl{int capset(cap\_user\_header\_t hdrp, const cap\_user\_data\_t
+ datap)}
+ Imposta le \textit{capabilities}.
+
+
+ \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 in caso
+ di errore, nel qual caso \var{errno} può assumere i valori:
+ \begin{errlist}
+ \item[\errcode{ESRCH}] si è fatto riferimento ad un processo inesistente.
+ \item[\errcode{EPERM}] si è tentato di aggiungere una capacità
+ nell'insieme delle \textit{capabilities} permesse, o di impostare una
+ capacità non presente nell'insieme di quelle permesse negli insieme
+ delle effettive o ereditate, o si è cercato di impostare una
+ \textit{capability} di un altro processo senza avare
+ \const{CAP\_SETPCAP}.
+ \end{errlist}
+ ed inoltre \errval{EFAULT} ed \errval{EINVAL}}
+\end{functions}
+
+Queste due funzioni costituiscono una interfaccia di basso livello, ed usano
+due strutture specifiche di Linux, la cui definizione è riportata in
+fig.~\ref{fig:cap_kernel_struct}. Queste ultime, come le due funzioni
+precedenti, sono soggette ad essere modificate con il cambiamento del kernel
+(in particolare i tipi di dati delle strutture) ed anche se finora
+l'interfaccia è risultata stabile,
+
+\begin{figure}[!htb]
+ \footnotesize
+ \centering
+ \begin{minipage}[c]{15cm}
+ \includestruct{listati/tms.h}
+ \end{minipage}
+ \normalsize
+ \caption{Le strutture specifiche di Linux per l'interfaccia di gestione di
+ basso livello delle \textit{capabilities}.}
+ \label{fig:cap_kernel_struct}
+\end{figure}
+sono definite in una apposita struttura del kernel,
+Per la gestione delle \textit{capabilities} lo standard POSIX.1e prevede l'uso
+di uno specifico tipo di dato \type{cap\_t}, che
questo è anche il massimo valore che può essere assegnato a questo argomento.
-\subsection{La contabilità in stile BSD}
+\subsection{La \textsl{contabilità} in stile BSD}
\label{sec:sys_bsd_accounting}
-Una ultima modalità per monitorare l'uso delle risorse è quella, se si è
-compilato il kernel con il relativo supporto,\footnote{se cioè si è abilitata
- l'opzione di compilazione \texttt{CONFIG\_BSD\_PROCESS\_ACCT}.} di attivare
-il cosiddetto \textit{BSD accounting}, che consente di registrare su file una
+Una ultima modalità per monitorare l'uso delle risorse è, se si è compilato il
+kernel con il relativo supporto,\footnote{se cioè si è abilitata l'opzione di
+ compilazione \texttt{CONFIG\_BSD\_PROCESS\_ACCT}.} quella di attivare il
+cosiddetto \textit{BSD accounting}, che consente di registrare su file una
serie di informazioni\footnote{contenute nella struttura \texttt{acct}
definita nel file \texttt{include/linux/acct.h} dei sorgenti del kernel.}
riguardo alla \textsl{contabilità} delle risorse utilizzate da ogni processo
il processo abbia i privilegi di amministratore (è necessaria la
\itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi
sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \const{NULL} per
-\param{filename} il \textit{BSD accounting} viene invece disabilitato.
+\param{filename} il \textit{BSD accounting} viene invece disabilitato. Un
+semplice esempio per l'uso di questa funzione è riportato nel programma
+\texttt{AcctCtrl.c} dei sorgenti allegati alla guida.
-Quando si attiva la contabilità il file che si indica deve esistere; esso
+Quando si attiva la contabilità, il file che si indica deve esistere; esso
verrà aperto in sola scrittura;\footnote{si applicano al pathname indicato da
\param{filename} tutte le restrizioni viste in cap.~\ref{cha:file_intro}.}
le informazioni verranno registrate in \textit{append} in coda al file tutte