Risistemazione di system.tex per aggiungere i riferimenti corretti al NSS,
[gapil.git] / sockctrl.tex
index 24c752fc16cca510da7ca5a3be8850f1cd06c713..5efe128ba47c01c7c95b5ad630c5c2993f2d4de5 100644 (file)
@@ -84,31 +84,95 @@ direttive che possono essere usate in questi file, che si trovano nelle
 relative pagine di manuale.
 
 Con il tempo però è divenuto possibile fornire diversi sostituti per
 relative pagine di manuale.
 
 Con il tempo però è divenuto possibile fornire diversi sostituti per
-l'utilizzo delle associazione statiche in \file{/etc/hosts}, inoltre oltre all
-risoluzione dei nomi a dominio si sono aggiunti altri nomi da risolvere, come
-quelli associati alle reti ed ai gruppi di macchine definiti dal servizio NIS,
-o quelli dei protocolli e dei servizi mantenuti nei file statici
-\file{/etc/protocols} e \file{/etc/services}, tutte informazioni che
-normalmente non si trovano su un DNS, ma che in un ambiente distribuito
+l'utilizzo delle associazione statiche in \file{/etc/hosts}, inoltre oltre
+alla risoluzione dei nomi a dominio ci sono anche altri nomi da risolvere,
+come quelli che possono essere associati ad una rete (invece che ad una
+singola macchina) o ai gruppi di macchine definiti dal servizio NIS, o come
+quelli dei protocolli e dei servizi che sono mantenuti nei file statici
+\file{/etc/protocols} e \file{/etc/services}. Tutte queste sono informazioni
+che normalmente non si trovano su un DNS, ma che in un ambiente distribuito
 possono essere centralizzate su opportuni server (ad esempio su LDAP) in grado
 di mantenerle.
 
 possono essere centralizzate su opportuni server (ad esempio su LDAP) in grado
 di mantenerle.
 
+
+
+Il sistema del \textit{Name Service Switch} (cui faremo riferimento in seguito
+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, riportate in
+tab.~\ref{tab:sys_NSS_classes}.
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Classe} & \textbf{Tipo di corrispondenza}\\
+    \hline
+    \hline
+    \texttt{shadow}   & corrispondenze fra username e proprietà dell'utente
+                       (\acr{uid}, ecc.).\\  
+    \texttt{group}    & corrispondenze fra nome del gruppo e proprietà dello 
+                        stesso.\\  
+    \texttt{aliases}  & alias per la posta elettronica\\ 
+    \texttt{ethers}   & corrispondenze fra numero IP e MAC address della
+                        scheda di rete.\\ 
+    \texttt{hosts}    & corrispondenze fra nome a dominio e numero IP.\\ 
+    \texttt{netgroup} & corrispondenze gruppo di rete e macchine che lo
+                        compongono.\\  
+    \texttt{networks} & corrispondenze fra nome di una rete e suo indirizzo
+                        IP.\\  
+    \texttt{protocols}& corrispondenze fra nome di un protocollo e relativo
+                        numero identificativo.\\ 
+    \texttt{rpc}      & corrispondenze fra nome di un servizio RPC e relativo 
+                        numero identificativo.\\ 
+    \texttt{services} & corrispondenze fra nome di un servizio e numero di
+                        porta. \\ 
+    \hline
+  \end{tabular}
+  \caption{Le diverse classi di corrispondenze definite
+    all'interno del \textit{Name Service Switch}.} 
+  \label{tab:sys_NSS_classes}
+\end{table}
+
+
+
 Questo ha portato alla creazione di un sistema di risoluzione più ampio, il
 \textit{Name Service Switch} di cui il \textit{resolver} viene a costituire un
 Questo ha portato alla creazione di un sistema di risoluzione più ampio, il
 \textit{Name Service Switch} di cui il \textit{resolver} viene a costituire un
-sottoinsieme. Questo sistema, che si applica anche alla risoluzioni fra nomi
-di utenti e gruppi e relativi identificatori, permette di definire in maniera
-generica (attraverso una serie di librerie dinamiche) 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 è
+sottoinsieme. Questo sistema permette di definire in maniera generica
+(attraverso una serie di librerie dinamiche) 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 è
 controllato dal file \file{/etc/nsswitch.conf}, ed anche per questo si può
 fare riferimento alle pagine di manuale ed al relativo capitolo nel manuale
 \cite{glibc} delle \textsl{glibc}.
 
 controllato dal file \file{/etc/nsswitch.conf}, ed anche per questo si può
 fare riferimento alle pagine di manuale ed al relativo capitolo nel manuale
 \cite{glibc} delle \textsl{glibc}.
 
+Il
+sistema è controllato dal file \file{/etc/nsswitch.conf}, ed anche per questo
+si può fare riferimento alle pagine di manuale ed al relativo capitolo nel
+manuale \cite{glibc} delle \textsl{glibc}.
+
+
+
+Per questo motivo anche il sistema del \textit{resolver} è stato poi incluso
+all'interno del sistema sistema di risoluzione più ampio costituito dal
+\textit{Name Service Switch} che abbiamo visto in
+sez.~\ref{sec:sys_user_group}, dove sono previste le funzionalità di controllo
+per la risoluzione anche di questo tipo di corrispondenze.  Questo significa
+allora, per quanto riguarda la risoluzione dei nomi a dominio, che oltre ai
+file che abbiamo appena illustrato, dovremo tenere in considerazione anche il
+contenuto del file \file{/etc/nsswitch.conf}.
+
 In ogni caso, qualunque sia la modalità con cui ricevono i dati o il supporto
 In ogni caso, qualunque sia la modalità con cui ricevono i dati o il supporto
-su cui vengono mantenuti, dal punto di vista di un programma che deve
-effettuare la risoluzione di un nome, tutto quello che conta sono le funzioni
-che il \textit{resolver} mette a disposizione, e sono queste quelle che
-tratteremo nelle sezioni successive.
+su cui vengono mantenuti, e che si usino o meno funzionalità aggiuntive
+fornire dal sistema del \textit{Name Service Switch}, dal punto di vista di un
+programma che deve effettuare la risoluzione di un nome, tutto quello che
+conta sono le funzioni che il \textit{resolver} mette a
+disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
+  tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
+quelle che tratteremo nelle sezioni successive.
 
 
 
 
 
 
@@ -146,32 +210,33 @@ fallita.
   \begin{minipage}[c]{15cm}
     \includestruct{listati/hostent.h}
   \end{minipage}
   \begin{minipage}[c]{15cm}
     \includestruct{listati/hostent.h}
   \end{minipage}
-  \caption{La struttura \structd{hostent} .}
+  \caption{La struttura \structd{hostent}.}
   \label{fig:sock_hostent_struct}
 \end{figure}
 
 Per questo motivo all'interno del resolver è stata definita una apposita
 variabile di errore, \var{h\_errno} che viene utilizzata dalle funzioni di
 libreria per indicare quale problema ha causato il fallimento della
   \label{fig:sock_hostent_struct}
 \end{figure}
 
 Per questo motivo all'interno del resolver è stata definita una apposita
 variabile di errore, \var{h\_errno} che viene utilizzata dalle funzioni di
 libreria per indicare quale problema ha causato il fallimento della
-risoluzione. Ad essa si può accedere una volta che la si dichiara con:
-\includecodesnip{listati/herrno.c}
+risoluzione del nome. Ad essa si può accedere una volta che la si dichiara
+con: 
+\includecodesnip{listati/herrno.c} 
 ed i valori che può assumere sono i seguenti:
 \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
 \item[\const{HOST\_NOT\_FOUND}] l'indirizzo richiesto non è valido e la
   macchina indicata è sconosciuta.
 \item[\const{NO\_ADDRESS}] il nome a dominio richiesto è valido, ma non ha un
 ed i valori che può assumere sono i seguenti:
 \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
 \item[\const{HOST\_NOT\_FOUND}] l'indirizzo richiesto non è valido e la
   macchina indicata è sconosciuta.
 \item[\const{NO\_ADDRESS}] il nome a dominio richiesto è valido, ma non ha un
-  indirizzo associato ad esso.
+  indirizzo associato ad esso (alternativamente può essere indicato come
+  \const{NO\_DATA}).
 \item[\const{NO\_RECOVERY}] si è avuto un errore non recuperabile
   nell'interrogazione di un server DNS.
 \item[\const{TRY\_AGAIN}] si è avuto un errore temporaneo nell'interrogazione
   di un server DNS, si può ritentare l'interrogazione in un secondo tempo. 
 \end{basedescript}
 
 \item[\const{NO\_RECOVERY}] si è avuto un errore non recuperabile
   nell'interrogazione di un server DNS.
 \item[\const{TRY\_AGAIN}] si è avuto un errore temporaneo nell'interrogazione
   di un server DNS, si può ritentare l'interrogazione in un secondo tempo. 
 \end{basedescript}
 
-
 Per capire meglio il contenuto della struttura \struct{hostent} conviene
 spendere alcune parole sul funzionamento del DNS. Questo in sostanza è un
 database distribuito organizzato in maniera gerarchica, interrogando il quale
 Per capire meglio il contenuto della struttura \struct{hostent} conviene
 spendere alcune parole sul funzionamento del DNS. Questo in sostanza è un
 database distribuito organizzato in maniera gerarchica, interrogando il quale
-si possono avere una serie di informazioni la principale delle quali è la
+si possono avere una serie di informazioni, la principale delle quali è la
 corrispondenza fra un nome (a dominio) ed indirizzo IP.  Un server DNS
 contiene comunque una serie di altre informazioni; ciascuna voce nel database
 viene chiamata \textit{resource record} e vi è associato un certo
 corrispondenza fra un nome (a dominio) ed indirizzo IP.  Un server DNS
 contiene comunque una serie di altre informazioni; ciascuna voce nel database
 viene chiamata \textit{resource record} e vi è associato un certo
@@ -202,22 +267,31 @@ effettuare la risoluzione del nome, 
 vengono riempite le varie parti della struttura \struct{hostent}. Il primo
 campo della struttura, \var{h\_name} contiene sempre il \textsl{nome
   canonico}, che nel caso del DNS è appunto il nome associato ad un record
 vengono riempite le varie parti della struttura \struct{hostent}. Il primo
 campo della struttura, \var{h\_name} contiene sempre il \textsl{nome
   canonico}, che nel caso del DNS è appunto il nome associato ad un record
-\texttt{A}. Il secondo campo della struttura invece è un puntatore ad vettore
-di puntatori, terminato da un puntatore nullo. Ciascun puntatore del vettore
-fa riferimento ad una delle stringhe che contengono tutti i possibili altri
-nomi associati allo stesso indirzzo (quelli che nel DNS sarebbero record
-\texttt{CNAME}).
-
-Il terzo campo, \var{h\_addrtype}, indica il tipo di indirizzo che è stato
-restituito, e può essere solo \const{AF\_INET} o \const{AF\_INET6}, mentre il
-quarto campo, \var{h\_length}, indica la lunghezza dell'indirizzo stesso in
-byte. Infine il campo \var{h\_addr\_list} è il puntatore ad un vettore di
-puntatori ai singoli indirizzi; il vettore è terminato da un puntatore nullo.
-Inoltre, come illustrato in fig.~\ref{fig:sock_hostent_struct}, viene definito
-per compatibilità il campo \var{h\_addr} corrispondente al puntatore al primo
+\texttt{A}. Il secondo campo della struttura, \var{h\_aliases}, invece è un
+puntatore ad vettore di puntatori, terminato da un puntatore nullo. Ciascun
+puntatore del vettore punta ad una stringa contenente uno degli altri
+possibili nomi associati allo stesso \textsl{nome canonico} (quelli che nel
+DNS vengono inseriti come record di tipo \texttt{CNAME}).
+
+Il terzo campo della struttura, \var{h\_addrtype}, indica il tipo di indirizzo
+che è stato restituito, e può assumere soltanto i valori \const{AF\_INET} o
+\const{AF\_INET6}, mentre il quarto campo, \var{h\_length}, indica la
+lunghezza dell'indirizzo stesso in byte. Infine il campo \var{h\_addr\_list} è
+il puntatore ad un vettore di puntatori ai singoli indirizzi; il vettore è
+terminato da un puntatore nullo.  Inoltre, come illustrato in
+fig.~\ref{fig:sock_hostent_struct}, viene definito il campo \var{h\_addr} come
+sinonimo di \code{h\_addr\_list[0]}, cioè un riferimento diretto al primo
 indirizzo della lista.
 
 indirizzo della lista.
 
-In sostanza 
+
+
+Oltre ai normali nomi a dominio la funzione accetta come argomento
+\param{name} anche indirizzi numerici, in formato dotted decimal per IPv4 o
+con la notazione illustrata in sez.~\ref{sec:IP_ipv6_notation}. In tal caso
+\func{gethostbyname} non eseguirà nessuna interrogazione remota, ma si
+limiterà a copiare la stringa nel campo \var{h\_name} ed a creare la
+corrispondente struttura \var{in\_addr} da indirizzara con
+\code{h\_addr\_list[0]}.