%% sockctrl.tex
%%
-%% Copyright (C) 2004-2016 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2004-2017 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Prefazione",
Per risolvere questa serie di problemi la risoluzione dei nomi a dominio
eseguità dal \textit{resolver} è stata inclusa all'interno di un meccanismo
generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi
-associate chiamato \textit{Name Service Switch} cui abbiamo accennato anche in
+associate chiamato \textit{Name Service Switch}, cui abbiamo accennato anche in
sez.~\ref{sec:sys_user_group} per quanto riguarda la gestione dei dati
associati a utenti e gruppi. Il sistema è stato introdotto la prima volta
nelle librerie standard di Solaris e le \acr{glibc} hanno ripreso lo stesso
L'esistenza di vari tipi di informazioni è un altro dei motivi per cui il
\textit{resolver} prevede, oltre a quelle relative alla semplice risoluzione
dei nomi, un insieme di funzioni specifiche dedicate all'interrogazione di un
-server DNS, tutte nella forma \texttt{res\_}\textsl{\texttt{nome}}.
-Tradizionalmente la prima di queste funzioni è \funcd{res\_init}, il cui
-prototipo è:
+server DNS, tutte nella forma \texttt{res\_}\textsl{\texttt{nome}}. La prima
+di queste funzioni è \funcd{res\_init}, il cui prototipo è:
\begin{funcproto}{
\fhead{netinet/in.h}
}
\end{funcproto}
+
La funzione legge il contenuto dei file di configurazione (i già citati
\file{resolv.conf} e \file{host.conf}) per impostare il dominio di default,
gli indirizzi dei server DNS da contattare e l'ordine delle ricerche; se non
definito un dominio di default sarà usato quello associato con l'indirizzo
locale (ma questo può essere sovrascritto con l'uso della variabile di
ambiente \envvar{LOCALDOMAIN}). In genere non è necessario eseguire questa
-funzione direttamente in quanto viene automaticamente chiamata la prima volta
-che si esegue una delle altre.
+funzione esplicitamente, in quanto viene automaticamente chiamata la prima
+volta che si esegue una qualunque delle altre.
Le impostazioni e lo stato del \textit{resolver} inizializzati da
\func{res\_init} vengono mantenuti in una serie di variabili raggruppate nei
-campi di una apposita struttura \var{\_res} usata da tutte queste
-funzioni. Essa viene definita in \headfiled{resolv.h} ed è utilizzata
-internamente alle funzioni essendo definita come variabile globale; questo
-consente anche di accedervi direttamente all'interno di un qualunque
-programma, una volta che la sia opportunamente dichiarata come:
+campi di una apposita struttura. Questa struttura viene definita in
+\headfiled{resolv.h} e mantenuta nella variabile globale \var{\_res}, che
+viene utilizzata internamente da tutte le funzioni dell'interfaccia. Questo
+consente anche di accedere direttamente al contenuto della variabile
+all'interno di un qualunque programma, una volta che la sia opportunamente
+dichiarata con:
\includecodesnip{listati/resolv_option.c}
-Dato che l'uso di una variabile globale rende tutte le funzioni classiche non
-rientranti, con l'uscita di BIND 8.2 è stata introdotta una nuova interfaccia
-in cui tutte le nuove funzioni (il cui nome è ottenuto apponendo una
-``\texttt{n}'' al nome di quella tradizionale nella forma
-\texttt{res\_n\textsl{nome}}). Tutte le nuove funzioni prendono un primo
-argomento aggiuntivo, \param{statep}, che punti ad una struttura dello stesso
-tipo, che verrà usato per mantenere lo stato del \textit{resolver} e potrà
-essere usata senza problemi anche con programmi \textit{multithread}. Anche
-in questo caso per poterlo utilizzare occorrerà una opportuna dichiarazione
-del tipo di dato con:
+Dato che l'uso di una variabile globale rende tutte le funzioni
+dell'interfaccia classica non rientranti, queste sono state deprecate in
+favore di una nuova interfaccia in cui esse sono state sostituite da
+altrettante nuove funzioni, il cui nome è ottenuto apponendo una
+``\texttt{n}'' al nome di quella tradizionale (cioè nella forma
+\texttt{res\_n\textsl{nome}}). Tutte le nuove funzioni sono identiche alle
+precedenti, ma hanno un primo argomento aggiuntivo, \param{statep}, puntatore
+ad una struttura dello stesso tipo di \var{\_res}. Questo consente di usare
+una variabile locale per mantenere lo stato del \textit{resolver}, rendendo le
+nuove funzioni rientranti. In questo caso per poter utilizzare il nuovo
+argomento occorrerà una opportuna dichiarazione del relativo tipo di dato con:
\includecodesnip{listati/resolv_newoption.c}
-e la nuova funzione che utilizzata per inizializzare il \textit{resolver} (che
-come la precedente viene chiamata automaticamente dalle altre funzioni) è
-\funcd{res\_ninit} il cui prototipo è:
+
+Così la nuova funzione utilizzata per inizializzare il \textit{resolver} (che
+come la precedente viene chiamata automaticamente da tutte altre funzioni) è
+\funcd{res\_ninit}, ed il suo prototipo è:
\begin{funcproto}{
\fhead{netinet/in.h}
\end{funcproto}
Indipendentemente da quale versione delle funzioni si usino, tutti i campi
-della struttura sono ad uso interno, e vengono usualmente inizializzate da
-\func{res\_init} o \func{res\_ninit} in base al contenuto dei file di
-configurazione e ad una serie di valori di default. L'unico campo che può
-essere utile modificare è \var{\_res.options}, una maschera binaria che
-contiene una serie di bit di opzione che permettono di controllare il
-comportamento del \textit{resolver}.
+della struttura (\var{\_res} o la variabile puntata da \param{statep}) sono ad
+uso interno, e vengono usualmente inizializzate da \func{res\_init} o
+\func{res\_ninit} in base al contenuto dei file di configurazione e ad una
+serie di valori di default. L'unico campo che può essere utile modificare è
+\var{\_res.options} (o l'equivalente della variabile puntata
+da\param{statep}), una maschera binaria che contiene una serie di bit che
+esprimono le opzioni che permettono di controllare il comportamento del
+\textit{resolver}.
\begin{table}[htb]
\centering
\constd{RES\_AAONLY} & Accetta solo risposte autoritative.\\
\constd{RES\_USEVC} & Usa connessioni TCP per contattare i server
invece che l'usuale UDP.\\
- \constd{RES\_PRIMARY} & Interroga soltanto server DNS primari.
- \\
+ \constd{RES\_PRIMARY} & Interroga soltanto server DNS primari.\\
\constd{RES\_IGNTC} & Ignora gli errori di troncamento, non ritenta la
richiesta con una connessione TCP.\\
\constd{RES\_RECURSE} & Imposta il bit che indica che si desidera
contengono cioè un ``\texttt{.}'').\\
\constd{RES\_STAYOPEN} & Usato con \const{RES\_USEVC} per mantenere
aperte le connessioni TCP fra interrogazioni
- diverse. \\
+ diverse.\\
\constd{RES\_DNSRCH} & Se attivo \func{res\_search} esegue le ricerche
di nomi di macchine nel dominio corrente o nei
domini ad esso sovrastanti.\\
Per utilizzare questa funzionalità per modificare le impostazioni direttamente
da programma occorrerà impostare un opportuno valore per questo campo ed
-invocare esplicitamente \func{res\_init}, dopo di che le altre funzioni
-prenderanno le nuove impostazioni. Le costanti che definiscono i vari bit di
-questo campo, ed il relativo significato sono illustrate in
+invocare esplicitamente \func{res\_init} o \func{res\_ninit}, dopo di che le
+altre funzioni prenderanno le nuove impostazioni. Le costanti che definiscono
+i vari bit di questo campo, ed il relativo significato sono illustrate in
tab.~\ref{tab:resolver_option}; trattandosi di una maschera binaria un valore
deve essere espresso con un opportuno OR aritmetico di dette costanti; ad
esempio il valore di default delle opzioni, espresso dalla costante
pratica oggi viene utilizzata soltanto quella degli indirizzi internet; le
costanti che identificano dette classi, da usare come valore per l'argomento
\param{class} delle precedenti funzioni, sono riportate in
-tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe
- \constd{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta.}
+tab.~\ref{tab:DNS_address_class} (esisteva in realtà anche una classe
+\constd{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta).
\begin{table}[htb]
\centering
Come accennato le tipologie di dati che sono mantenibili su un server DNS sono
diverse, ed a ciascuna di essa corrisponde un diverso tipo di \textit{resource
record}. L'elenco delle costanti, ripreso dai file di dichiarazione
- \headfiled{arpa/nameser.h} e \headfiled{arpa/nameser\_compat.h}, che
+\headfiled{arpa/nameser.h} e \headfiled{arpa/nameser\_compat.h}, che
definiscono i valori che si possono usare per l'argomento \param{type} per
specificare il tipo di \textit{resource record} da richiedere è riportato in
tab.~\ref{tab:DNS_record_type}; le costanti (tolto il \texttt{T\_} iniziale)
(cioè i suoi \textit{resource record} vengono mantenuti in quelli che sono
usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo di dominio
è identificato da un nome che è appunto identico a quello delle costanti di
- tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.} e che
+ tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.} e che
normalmente sono anche usati come nomi per indicare i record.
\begin{table}[!htb]
\begin{basedescript}{\desclabelwidth{1.2cm}\desclabelstyle{\nextlinelabel}}
\item[\texttt{A}] viene usato per indicare la corrispondenza fra un nome a
dominio ed un indirizzo IPv4; ad esempio la corrispondenza fra
- \texttt{dodds.truelite.it} e l'indirizzo IP \texttt{62.48.34.25}.
+ \texttt{jojo.truelite.it} e l'indirizzo IP \texttt{62.48.34.25}.
\item[\texttt{AAAA}] viene usato per indicare la corrispondenza fra un nome a
dominio ed un indirizzo IPv6; è chiamato in questo modo dato che la
dimensione di un indirizzo IPv6 è quattro volte quella di un indirizzo IPv4.
Come accennato in caso di successo le due funzioni di richiesta restituiscono
il risultato della interrogazione al server, in caso di insuccesso l'errore
-invece viene segnalato da un valore di ritorno pari a -1, ma in questo caso,
+invece viene segnalato da un valore di ritorno pari a $-1$, ma in questo caso,
non può essere utilizzata la variabile \var{errno} per riportare un codice di
errore, in quanto questo viene impostato per ciascuna delle chiamate al
sistema utilizzate dalle funzioni del \textit{resolver}, non avrà alcun
stampare l'errore a video, analoghe a quelle di sez.~\ref{sec:sys_strerror}
per \var{errno}, ma che usano il valore di \var{h\_errno}; la prima è
\funcd{herror} ed il suo prototipo è:
+
+
+\begin{funcproto}{
+\fhead{netdb.h}
+\fdecl{void herror(const char *string)}
+\fdesc{Stampa un errore di risoluzione.}
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+ caso \var{errno} assumerà uno dei valori:
+ \begin{errlist}
+ \end{errlist}
+ ed inoltre
+ nel loro significato generico.}
+\end{funcproto}
+
+
+
\begin{functions}
-\headdecl{netdb.h}
-\funcdecl{void herror(const char *string)}
+\headdecl{
+\funcdecl{
-Stampa un errore di risoluzione.
+.
\end{functions}
La funzione è l'analoga di \func{perror} e stampa sullo standard error un