Riforzo di nuovo
[gapil.git] / session.tex
index 5d994d3b614f47b837c65eebb7bcce0f05668252..17bfaa961275bd542f0189a63c2aeb8235036334 100644 (file)
@@ -702,10 +702,10 @@ solo localmente; se si vogliono inviare i messaggi ad un'altro sistema occorre
 farlo esplicitamente con un socket UDP, o utilizzare le capacità di reinvio
 del servizio.
 
-La prima funzione definita dall'interfaccia è \func{openlog}; essa in generale
-non è necessaria per l'uso del servizio, ma permette di impostare alcuni
-valori che controllano gli effetti delle chiamate successive; il suo prototipo
-è: 
+La prima funzione definita dall'interfaccia è \func{openlog}, che apre una
+connessione al servizio di \textit{syslog}; essa in generale non è necessaria
+per l'uso del servizio, ma permette di impostare alcuni valori che controllano
+gli effetti delle chiamate successive; il suo prototipo è:
 \begin{prototype}{syslog.h}{void openlog(const char *ident, int option, 
 int facility)}
 
@@ -717,9 +717,18 @@ Apre una connessione al sistema di \textit{syslog}.
 La funzione permette di specificare, tramite \param{ident}, l'identità di chi
 ha inviato il messaggio (di norma si passa il nome del programma, come
 specificato da \code{argv[0]}); la stringa verrà preposta all'inizio di ogni
-messaggio. Il parametro \param{facility} permette invece di specificare
-l'omonimo indice; i valori possibili sono riportati in
-\tabref{tab:sess_syslog_facility}.
+messaggio. Si tenga presente che il valore di \param{ident} che si passa alla
+funzione è un puntatore, se la stringa cui punta viene cambiata lo sarà pure
+nei successivi messaggi, e se viene cancellata i risultati potranno essere
+impredicibili, per questo è sempre opportuno usare una stringa costante.
+
+L'argomento \param{facility} permette invece di preimpostare per le successive
+chiamate l'omonimo indice che classifica la categoria del messaggio.
+L'argomento è interpretato come una maschera binaria, e pertanto è possibile
+inviare i messaggi su più categorie alla volta; i valori delle costanti che
+identificano ciascuna categoria sono riportati in
+\tabref{tab:sess_syslog_facility}, il valore di \param{facility} deve essere
+specificato con un OR aritmetico.
 
 \begin{table}[htb]
 \centering
@@ -751,6 +760,107 @@ l'omonimo indice; i valori possibili sono riportati in
 \label{tab:sess_syslog_facility}
 \end{table}
 
+L'argomento \param{option} serve invece per controllare il comportamento della
+funzione \func{openlog} e delle modalità con cui le successive chiamate
+scriveranno i messaggi, anch'esso viene specificato come maschera binaria
+composta con un OR aritmetico di una qualunque delle costanti riportate in
+\tabref{tab:sess_openlog_option}.
+
+\begin{table}[htb]
+\centering
+\begin{tabular}[c]{|l|p{8cm}|}
+\hline
+\textbf{Valore}& \textbf{Significato}\\
+\hline
+\hline
+\macro{LOG\_CONS}   & Scrive sulla console quando. \\
+\macro{LOG\_NDELAY} & Sostituisce \macro{LOG\_AUTH}.\\
+\macro{LOG\_NOWAIT} & Messaggi dei demoni di gestione dei comandi
+                      programmati (\cmd{cron} e \cmd{at}).\\
+\macro{LOG\_ODELAY} & .\\
+\macro{LOG\_PERROR} & Stampa anche su \file{stderr}.\\
+\macro{LOG\_PID}    & Inserisce nei messaggi il \acr{pid} del processo
+                      chiamante. \\
+\hline
+\end{tabular}
+\caption{Valori possibili per l'argomento \param{option} di \func{openlog}.}
+\label{tab:sess_openlog_option}
+\end{table}
+
+La funzione che si usa per generare un messaggio è \func{syslog}, dato che
+l'uso di \func{openlog} è ozionale, sarà quest'ultima a provvede a chiamare la
+prima qualora ciò non sia stato fatto (nel qual caso il valore di
+\param{ident} è nullo). Il suo prototipo è:
+\begin{prototype}{syslog.h}
+{void syslog(int priority, const char *format, ...)}
+
+Genera un messaggio di priorità \param{priority}.
+
+\bodydesc{La funzione non restituisce nulla.}
+\end{prototype}
+
+Il comportamento della funzione è analogo quello di \func{printf}, e il valore
+dell'argomento \param{format} è identico a quello descritto nella pagina di
+manuale di quest'ultima (per i valori principali si può vedere la trattazione
+sommaria che se ne è fatto in \secref{sec:file_formatted_io}); l'unica
+differenza è che la sequenza \cmd{\%m} viene rimpiazzata dalla stringa
+restituita da \code{strerror(errno)}. Gli argomenti seguenti i primi due
+devono essere forniti secondo quanto richiesto da \func{format}.
+
+ L'argomento \param{priority} permette di impostare sia la \textit{facility} 
+ che la \textit{priority} del messaggio. In realtà viene prevalentemente usato 
+ per specificare solo quest'ultima in quanto la prima viene di norma 
+ preimpostata con \func{openlog}. La priorità è indicata con un valore
+ numerico\footnote{le \acr{glibc}, seguendo POSIX.1-2001, prevedono otto
+   diverse priorità ordinate da 0 a 7, in ordine di importanza decrescente;
+   questo comporta che i tre bit meno significativi dell'argomento
+   \param{priority} sono occupati da questo valore, mentre i restanti bit più
+   significativi vengono usati per specificare la \textit{facility}.}
+ specificabile attraverso le costanti riportate in
+ \secref{tab:sess_syslog_priority}.  Nel caso si voglia specificare anche la
+ \textit{facility} basta eseguire un OR aritmetico del valore della priorità
+ con la maschera binaria delle costanti di \tabref{tab:sess_syslog_facility}.
+
+\begin{table}[htb]
+\centering
+\begin{tabular}[c]{|l|p{8cm}|}
+\hline
+\textbf{Valore}& \textbf{Significato}\\
+\hline
+\hline
+\macro{LOG\_EMERG}   & Il sistema è inutilizzabile. \\
+\macro{LOG\_ALERT}   & C'è una emergenza che richiede intervento immediato.\\
+\macro{LOG\_CRIT}    & Si è in una condizione critica.\\
+\macro{LOG\_ERR}     & Si è in una condizione di errore.\\
+\macro{LOG\_WARNING} & Messaggio di avvertimento.\\
+\macro{LOG\_NOTICE}  & Notizia significativa relativa al comportamento.\\
+\macro{LOG\_INFO}    & Messaggio informativo. \\
+\macro{LOG\_DEBUG}   & Messaggio di debug.\\
+\hline
+\end{tabular}
+ \caption{Valori possibili per l'indice di importanza del messaggio da
+  specificare nell'argomento \param{priority} di \func{syslog}.}
+\label{tab:sess_syslog_priority}
+\end{table}
+
+  Una ulteriore funzione, \func{setlogmask}, permette di filtrare
+  preliminarmente i messaggi in base alla loro priorità; il suo prototipo è:
+\begin{prototype}{syslog.h}
+  {int setlogmask(int mask)}
+
+Imposta la maschera dei log al valore specificato.
+
+\bodydesc{La funzione restituisce il precedente valore.}
+\end{prototype}
+
+Le routine di gestione mantengono per ogni processo una maschera che
+determina quale delle chiamate effettuate a \func{syslog} verrà
+effettivamente registrata. La registrazione viene disabilitata per tutte
+quelle priorità che non rientrano nella maschera; questa viene settata
+usando la macro \code{LOG\_MASK(p)} dove \code{p} è una delle costanti di
+\secref{tab:sess_syslog_priority}. É inoltre disponibile anche la macro
+\code{LOG\_UPTO(p)} che permette di specificare automaticamente tutte le
+priorità fino ad un certo valore.