From: Simone Piccardi Date: Sun, 18 Jul 2004 23:04:43 +0000 (+0000) Subject: Altro materiale relativo alle funzioni del resolver e alle relative opzioni, X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=4e3373d365196f6ce538057dd912f6e89424bf92 Altro materiale relativo alle funzioni del resolver e alle relative opzioni, aggiungo anche un po' di definizioni --- diff --git a/listati/resolv_option.c b/listati/resolv_option.c new file mode 100644 index 0000000..ebe8f92 --- /dev/null +++ b/listati/resolv_option.c @@ -0,0 +1 @@ + extern struct state _res; diff --git a/listati/resolv_option_def.c b/listati/resolv_option_def.c new file mode 100644 index 0000000..8d45d78 --- /dev/null +++ b/listati/resolv_option_def.c @@ -0,0 +1 @@ +#define RES_DEFAULT (RES_RECURSE | RES_DEFNAMES | RES_DNSRCH) diff --git a/sockctrl.tex b/sockctrl.tex index 512c380..1b99e53 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -115,21 +115,22 @@ dell'ordine in cui questi vengono interrogati.\footnote{con le implementazioni funzioni di liberia, prevedendo un ordine di interrogazione predefinito e non modificabile (a meno di una ricompilazione delle librerie stesse).} -Per risolvere questa serie di problemi il sistema del \textit{resolver} è -stato incluso all'interno di un meccanismo generico per la risoluzione di -corripondenze fra nomi ed informazioni ad essi associate chiamato \textit{Name - Service Switch}\footnote{il sistema è stato introdotto la prima volta nelle - librerie standard di Solaris, le \acr{glibc} hanno ripreso lo stesso schema, - si tenga presente che questo sistema non esiste per altre librerie standard - come le \acr{libc5} o le \acr{uclib}.} cui abbiamo accennato anche in -sez.~\ref{sec:sys_user_group} per quanto riguarda la gestione dei dati -associati a utenti e gruppi. Il \textit{Name Service Switch} (cui spesso si -fa riferimento con l'acronimo NSS) è un sistema di librerie dinamiche che -permette di definire in maniera generica sia i supporti su cui mantenere i -dati di corrispondenza fra nomi e valori numerici, sia l'ordine in cui -effettuare le ricerche sui vari supporti disponibili. Il sistema prevede una -serie di possibili classi di corrispondenza, quelle attualmente definite sono -riportate in tab.~\ref{tab:sys_NSS_classes}. +Per risolvere questa serie di problemi la risoluzione dei nomi a dominio +eseguira dal \textit{resolver} è stata inclusa all'interno di un meccanismo +generico per la risoluzione di corripondenze fra nomi ed informazioni ad essi +associate chiamato \textit{Name Service Switch}\footnote{il sistema è stato + introdotto la prima volta nelle librerie standard di Solaris, le \acr{glibc} + hanno ripreso lo stesso schema, si tenga presente che questo sistema non + esiste per altre librerie standard come le \acr{libc5} o le \acr{uclib}.} +cui abbiamo accennato anche in sez.~\ref{sec:sys_user_group} per quanto +riguarda la gestione dei dati associati a utenti e gruppi. Il \textit{Name + Service Switch} (cui spesso si fa riferimento con l'acronimo NSS) è un +sistema di librerie dinamiche che permette di definire in maniera generica sia +i supporti su cui mantenere i dati di corrispondenza fra nomi e valori +numerici, sia l'ordine in cui effettuare le ricerche sui vari supporti +disponibili. Il sistema prevede una serie di possibili classi di +corrispondenza, quelle attualmente definite sono riportate in +tab.~\ref{tab:sys_NSS_classes}. \begin{table}[htb] \footnotesize @@ -207,7 +208,7 @@ generiche di libreria usate anche dal sistema del \textit{resolver}. Il sistema del DNS è in sostanza di un database distribuito organizzato in maniera gerarchica, la manutenzione dei dati è mantenuta in tanti server distinti ciascuno dei quali si occupa della risoluzione del proprio -\textit{dominio}; i nomi a dominio sono poi organizzati in una struttura ad +\textsl{dominio}; i nomi a dominio sono poi organizzati in una struttura ad albero analoga a quella dell'albero dei file in un sistema unix-like, con domini di primo livello (come i \texttt{.org}), secondo livello (come \texttt{.truelite.it}), ecc. In questo caso le separazioni sono fra i vari @@ -219,15 +220,106 @@ livello ad un altro server, il quale a sua volta potr di un eventuale sottodominio di terzo livello ad un altro server ancora. In realtà un server DNS contiene comunque una serie di altre informazioni; -ciascuna voce nel database viene chiamata \textit{resource record}, e viene -vi è associato un certo \textsl{tipo}, identificato da una sigla. +ciascuna voce nel database viene chiamata \textit{resource record}, e può +contenere diverse informazioni; in genere i \textit{resource record} vengono +classificati per la \textsl{classe di indirizzi} cui i dati contenuti fanno +riferimento, e per il \textsl{tipo} di questi ultimi. Oggigiorno i dati +mantenuti nei server DNS sono sostanzialmente relativi soltanto ad indirizzi +internet, per cui in pratica c'è soltanto una classe di indirizzi utilizzata, +i dati invece possono essere di vario tipo, uno dei quali è appunto la +corrispondenza fra nome a dominio e numero IP. + +L'esistenza di vari tipi di informazioni ottenibili da un server DNS è +un'altro dei motivi per cui il \textit{resolver} prevede un insieme di +funzioni dedicato rispetto a quelle della semplice risoluzione dei nomi; la +prima di queste è \funcd{res\_init}, il cui prototipo è: +\begin{functions} +\headdecl{netinet/in.h} +\headdecl{arpa/nameser.h} +\headdecl{resolv.h} +\funcdecl{int res\_init(void)} + +Inizializza il sistema del \textit{resolver}. + +\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di + errore.} +\end{functions} + +La funzione legge il contenuto dei file di configurazione per impostare il +dominio di default, gli indirizzi dei server DNS da contattare e l'ordine +delle ricerche; se non sono specificati server verrà utilizzato l'indirizzo +locale, e se non è definito un dominio di default sarà usato quello associato +con l'indirizzo locale. In genere si deve eseguire questa funzione prima di +chiamare tutte le altre. + +Le impostazioni del resolver e lo stato del sistema vengono mantenute in una +serie di variabili globali contenuti in una apposita struttura interna, +definita in \file{resolv.h}, che può essere acceduta una volta che la si +dichiara con: +\includecodesnip{listati/resolv_option.c} + +Tutti i campi della struttura sono ad uso interno, l'unico che può essere +utile modificare è il campo \var{\_res.options}, che è una maschera binaria +che permette di controllare il comportamento del resolver, modificandone +alcune impostazioni direttamente da programma prima di invocare +\func{res\_init}. Le costanti che definiscono i vari bit di questo campo, con +il relativo significato sono illustrate in tab.~\ref{tab:resolver_option}, un +valore deve essere espresso con un opportuno OR aritmetico di dette costanti; +ad esempio il valore di default dato dalla costante \const{RES\_DEFAULT} è +definito come: +\includecodesnip{listati/resolv_option_def.c} +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Costante} & \textbf{Significato} \\ + \hline + \hline + \const{RES\_INIT} & viene attivato se è stata chiamata + \func{res\_init}. \\ + \const{RES\_DEBUG} & stampa dei messaggi di debug.\\ + \const{RES\_AAONLY} & accetta solo risposte autoritative.\\ + \const{RES\_USEVC} & usa connessioni TCP per contattare i server + invece che l'usuale UDP.\\ + \const{RES\_PRIMARY} & interroga soltanto server DNS primari. + \\ + \const{RES\_IGNTC} & ignora gli errori di troncamento, non ritenta la + richiesta con una connessione TCP.\\ + \const{RES\_RECURSE} & imposta il bit che indica che si desidera + eseguire una interrogazione ricorsiva.\\ + \const{RES\_DEFNAMES} & se attivo \func{res\_search} aggiunge il nome + del dominio di default ai nomi singoli (che non + contengono cioè un ``\texttt{.}'').\\ + \const{RES\_STAYOPEN} & usato con \const{RES\_USEVC} per mantenere + aperte le connesioni TCP fra interrogazioni + diverse. \\ + \const{RES\_DNSRCH} & se attivo \func{res\_search} esegue le ricerche + di nomi di macchine nel dominio corrente o nei + domini ad esso sovrastanti.\\ + \const{RES\_INSECURE1} & blocca i controlli di sicurezza di tipo 1.\\ + \const{RES\_INSECURE2} & blocca i controlli di sicurezza di tipo 2.\\ + \const{RES\_NOALIASES} & blocca l'uso della variabile di ambiente + \texttt{HOSTALIASES}.\\ + \const{RES\_USE\_INET6} & restituisce indirizzi IPv6 con + \func{gethostbyname}. \\ + \const{RES\_ROTATE} & ruota la lista dei server DNS dopo ogni + interrogazione.\\ + \const{RES\_NOCHECKNAME}& non controlla i nomi per verificarne la + correttezza sintattica. \\ + \const{RES\_KEEPTSIG} & non elimina i record di tipo \texttt{TSIG}.\\ + \const{RES\_BLAST} & \\ + \const{RES\_DEFAULT} & è l'insieme di \const{RES\_RECURSE}, + \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}.\\ + \hline + \end{tabular} + \caption{Costanti utilizzabili come valori per \var{\_res.options}.} + \label{tab:resolver_option} +\end{table} -interrogando il quale si possono avere una serie di informazioni, -la principale delle quali è appunto la corrispondenza fra un nome (a dominio) -ed indirizzo IP. Per quanto ci interessa i tipi di \textit{resource record} che vengono