Materiale sulle funzioni di interrogazione dei nomi e del resolver
[gapil.git] / sockctrl.tex
1 %% sockctrl.tex
2 %%
3 %% Copyright (C) 2004 Simone Piccardi.  Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
9 %% License".
10 %%
11 \chapter{La gestione dei socket}
12 \label{cha:sock_generic_management}
13
14 Esamineremo in questo capitolo una serie di funzionalità aggiuntive relative
15 alla gestione dei socket, come la gestione della risoluzione di nomi e
16 indirizzi, le impostazioni delle varie proprietà ed opzioni relative ai
17 socket, e le funzioni di controllo che permettono di modificarne il
18 comportamento.
19
20
21 \section{La risoluzione dei nomi}
22 \label{sec:sock_name_resolution}
23
24 Negli esempi dei capitoli precedenti abbiamo sempre identificato le singole
25 macchine attraverso indirizzi numerici, sfruttando al più le funzioni di
26 conversione elementare illustrate in sez.~\ref{sec:sock_addr_func} che
27 permettono di passare da un indirizzo espresso in forma dotted decimal ad un
28 numero. Vedremo in questa sezione le funzioni utilizzate per poter utilizzare
29 dei nomi simbolici al posto dei valori numerici, e viceversa quelle che
30 permettono di ottenere i nomi simbolici associati ad indirizzi, porte o altre
31 proprietà del sistema.
32
33
34 \subsection{La struttura del \textit{resolver}}
35 \label{sec:sock_resolver}
36
37 La risoluzione dei nomi è associata tradizionalmente al servizio del
38 \textit{Domain Name Service} che permette di identificare le macchine su
39 internet invece che per numero IP attraverso il relativo \textsl{nome a
40   dominio}.\footnote{non staremo ad entrare nei dettagli della definizione di
41   cosa è un nome a dominio, dandolo per noto, una introduzione alla
42   problematica si trova in \cite{AGL} (cap. 9) mentre per una trattazione
43   approfondita di tutte le problematiche relative al DNS si può fare
44   riferimento a \cite{DNSbind}.} In realtà per DNS si intendono spesso i
45 server che forniscono su internet questo servizio, mentre nel nostro caso
46 affronteremo la problematica dal lato client, di un qualunque programma che
47 necessita di compiere questa operazione.
48
49 \begin{figure}[htb]
50   \centering
51   \includegraphics[width=10cm]{img/resolver}
52   \caption{Schema di funzionamento delle routine del \textit{resolver}.}
53   \label{fig:sock_resolver_schema}
54 \end{figure}
55
56 Inoltre quella fra nomi a dominio e indirizzi IP non è l'unica corrispondenza
57 possibile fra nomi simbolici e valori numerici, come abbiamo visto anche in
58 sez.~\ref{sec:sys_user_group} per le corrispondenze fra nomi di utenti e
59 gruppi e relativi identificatori numerici; per quanto riguarda però tutti i
60 nomi associati a identificativi o servizi relativi alla rete il servizio di
61 risoluzione è gestito in maniera unificata da un insieme di routine fornite
62 con le librerie del C, detto appunto \textit{resolver}.
63
64 Lo schema di funzionamento del \textit{resolver} è illustrato in
65 fig.~\ref{fig:sock_resolver_schema}; in sostanza i programmi hanno a
66 disposizione un insieme di funzioni di libreria con cui chiamano il
67 \textit{resolver}, indicate con le freccie nere. Ricevuta la richiesta è
68 quest'ultimo che, sulla base della sua configurazione, esegue le operazioni
69 necessarie a fornire la risposta, che possono essere la lettura delle
70 informazioni mantenute nei relativi dei file statici presenti sulla macchina,
71 una interrogazione ad un DNS (che a sua volta, per il funzionamento del
72 protocollo può interrogarene altri) o la richiesta ad altri server per i quali
73 sia fornito il supporto, come LDAP.\footnote{la sigla LDAP fa riferimento ad
74   un protocollo, il \textit{Lightweight Directory Access Protocol}, che
75   prevede un meccanismo per la gestione di \textsl{elenchi} di informazioni
76   via rete; il contenuto di un elenco può essere assolutamente generico, e
77   questo permette il manenimento dei più vari tipi di informazioni su una
78   infrastruttura di questo tipo.}
79
80 La configurazione del \textit{resolver} attiene più alla amministrazione di
81 sistema che alla programmazione, ciò non di meno, prima di trattare le varie
82 funzioni di librerie utilizzate dai programmi, vale la pena fare una
83 panoramica generale.  Originariamente la configurazione del \textit{resolver}
84 riguardava esclusivamente le questioni relative alla gestione dei nomi a
85 dominio, e prevedeva solo l'utilizzo del DNS e del file statico
86 \file{/etc/hosts}.
87
88 Per questo aspetto il file di configurazione principale del sistema è
89 \file{/etc/resolv.conf} che contiene in sostanza l'elenco degli indirizzi IP
90 dei server DNS da contattare; a questo si affianca il file
91 \file{/etc/host.conf} il cui scopo principale è indicare l'ordine in cui
92 eseguire la risoluzione dei nomi (se usare prima i valori di \file{/etc/hosts}
93 o quelli del DNS). Tralasciamo i dettagli relativi alle varie direttive che
94 possono essere usate in questi file, che si trovano nelle rispettive pagine di
95 manuale.
96
97 Con il tempo però è divenuto possibile fornire diversi sostituti per
98 l'utilizzo delle associazione statiche in \file{/etc/hosts}, inoltre oltre
99 alla risoluzione dei nomi a dominio ci sono anche altri nomi da risolvere,
100 come quelli che possono essere associati ad una rete (invece che ad una
101 singola macchina) o ai gruppi di macchine definiti dal servizio
102 NIS,\footnote{il \textit{Network Information Service} è un servizio, creato da
103   Sun, e poi diffuso su tutte le piattaforme unix-like, che permette di
104   raggruppare all'interno di una rete (in quelli che appunto vengono chiamati
105   \textit{netgroup}) varie macchine, centralizzando i servizi di definizione
106   di utenti e gruppi e di autenticazione, oggi è sempre più spesso sostituito
107   da LDAP.} o come quelli dei protocolli e dei servizi che sono mantenuti nei
108 file statici \file{/etc/protocols} e \file{/etc/services}.  Molte di queste
109 informazioni non si trovano su un DNS, ma in una rete locale può essere molto
110 utile centralizzare il mentenimento di alcune di esse su opportuni server.
111 Inoltre l'uso di diversi supporti possibili per le stesse informazioni (ad
112 esempio il nome delle macchine può essere mantenuto sia tramite
113 \file{/etc/hosts}, che con il DNS, che con NIS) comporta il problema
114 dell'ordine in cui questi vengono interrogati.\footnote{con le implementazioni
115   classiche i vari supporti erano introdotti modificando direttamente le
116   funzioni di liberia, prevedendo un ordine di interrogazione predefinito e
117   non modificabile (a meno di una ricompilazione delle librerie stesse).}
118
119 Per risolvere questa serie di problemi la risoluzione dei nomi a dominio
120 eseguira dal \textit{resolver} è stata inclusa all'interno di un meccanismo
121 generico per la risoluzione di corripondenze fra nomi ed informazioni ad essi
122 associate chiamato \textit{Name Service Switch}\footnote{il sistema è stato
123   introdotto la prima volta nelle librerie standard di Solaris, le \acr{glibc}
124   hanno ripreso lo stesso schema, si tenga presente che questo sistema non
125   esiste per altre librerie standard come le \acr{libc5} o le \acr{uclib}.}
126 cui abbiamo accennato anche in sez.~\ref{sec:sys_user_group} per quanto
127 riguarda la gestione dei dati associati a utenti e gruppi.  Il \textit{Name
128   Service Switch} (cui spesso si fa riferimento con l'acronimo NSS) è un
129 sistema di librerie dinamiche che permette di definire in maniera generica sia
130 i supporti su cui mantenere i dati di corrispondenza fra nomi e valori
131 numerici, sia l'ordine in cui effettuare le ricerche sui vari supporti
132 disponibili. Il sistema prevede una serie di possibili classi di
133 corrispondenza, quelle attualmente definite sono riportate in
134 tab.~\ref{tab:sys_NSS_classes}.
135
136 \begin{table}[htb]
137   \footnotesize
138   \centering
139   \begin{tabular}[c]{|l|p{8cm}|}
140     \hline
141     \textbf{Classe} & \textbf{Tipo di corrispondenza}\\
142     \hline
143     \hline
144     \texttt{shadow}   & corrispondenze fra username e proprietà dell'utente
145                        (\acr{uid}, ecc.).\\  
146     \texttt{group}    & corrispondenze fra nome del gruppo e proprietà dello 
147                         stesso.\\  
148     \texttt{aliases}  & alias per la posta elettronica\\ 
149     \texttt{ethers}   & corrispondenze fra numero IP e MAC address della
150                         scheda di rete.\\ 
151     \texttt{hosts}    & corrispondenze fra nome a dominio e numero IP.\\ 
152     \texttt{netgroup} & corrispondenze gruppo di rete e macchine che lo
153                         compongono.\\  
154     \texttt{networks} & corrispondenze fra nome di una rete e suo indirizzo
155                         IP.\\  
156     \texttt{protocols}& corrispondenze fra nome di un protocollo e relativo
157                         numero identificativo.\\ 
158     \texttt{rpc}      & corrispondenze fra nome di un servizio RPC e relativo 
159                         numero identificativo.\\ 
160     \texttt{services} & corrispondenze fra nome di un servizio e numero di
161                         porta. \\ 
162     \hline
163   \end{tabular}
164   \caption{Le diverse classi di corrispondenze definite
165     all'interno del \textit{Name Service Switch}.} 
166   \label{tab:sys_NSS_classes}
167 \end{table}
168
169 Il sistema  del \textit{Name Service  Switch} è controllato dal  contenuto del
170 file \file{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo una
171   convezione  comune per  i  file  di configurazione  le  righe vuote  vengono
172   ignorate  e  tutto  quello  che  segue un  carattere  ``\texttt{\#}''  viene
173   considerato un  commento.} di configurazione per ciascuna  di queste classi,
174 che  viene inizia  col nome  di tab.~\ref{tab:sys_NSS_classes}  seguito  da un
175 carattere ``\texttt{:}'' e  prosegue con la lista dei  \textsl{servizi} su cui
176 le  relative informazioni sono  raggiungibili, scritti  nell'ordine in  cui si
177 vuole siano interrogati.
178
179 Ogni  servizio è  specificato  a sua  volta  da un  nome, come  \texttt{file},
180 \texttt{dns},  \texttt{db},  ecc.  che  identifica la  libreria  dinamica  che
181 realizza l'interfaccia  con esso. Per  ciascun servizio se \texttt{NAME}  è il
182 nome  utilizzato  dentro   \file{/etc/nsswitch.conf},  dovrà  essere  presente
183 (usualmente  in   \file{/lib})  una  libreria   \texttt{libnss\_NAME}  che  ne
184 implementa le funzioni.
185
186 In ogni caso, qualunque sia la modalità con cui ricevono i dati o il supporto
187 su cui vengono mantenuti, e che si usino o meno funzionalità aggiuntive
188 fornire dal sistema del \textit{Name Service Switch}, dal punto di vista di un
189 programma che deve effettuare la risoluzione di un nome a dominio, tutto
190 quello che conta sono le funzioni classiche che il \textit{resolver} mette a
191 disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
192   tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
193 quelle che tratteremo nelle sezioni successive.
194
195
196 \subsection{Le funzioni di interrogazione del \textit{resolver}}
197 \label{sec:sock_resolver_functions}
198
199 Prima di trattare le funzioni usate normalmente nella risoluzione dei nomi a
200 dominio conviene trattare in maniera più dettagliata il meccanismo principale
201 da esse utilizzato e cioè quello del servizio DNS. Come accennato questo,
202 benché in teoria sia solo uno dei possibili supporti su cui mantenere le
203 informazioni, in pratica costituisce il meccanismo principale con cui vengono
204 risolti i nomi a dominio.  Per questo motivo esistono una serie di funzioni di
205 libreria che servono specificamente ad esseguire delle interrogazioni verso un
206 server DNS, funzioni che poi vengono utilizzate per realizzare le funzioni
207 generiche di libreria usate anche dal sistema del \textit{resolver}.
208
209 Il sistema del DNS è in sostanza di un database distribuito organizzato in
210 maniera gerarchica, i dati vengono mantenuti in tanti server distinti ciascuno
211 dei quali si occupa della risoluzione del proprio \textsl{dominio}; i nomi a
212 dominio sono organizzati in una struttura ad albero analoga a quella
213 dell'albero dei file, con domini di primo livello (come i \texttt{.org}),
214 secondo livello (come \texttt{.truelite.it}), ecc.  In questo caso le
215 separazioni sono fra i vari livelli sono definite dal carattere ``\texttt{.}''
216 ed i nomi devono essere risolti da destra verso sinistra.\footnote{per chi si
217   stia chiedendo quale sia la radice di questo albero, cioè l'equivalente di
218   ``\texttt{/}'', la risposta è il dominio speciale ``\texttt{.}'', che in
219   genere non viene mai scritto esplicitamente, ma che, come chiunque abbia
220   configurato un server DNS sa bene, esiste ed è gestito dai cosiddetti
221   \textit{root DNS} che risolvono i domini di primo livello.} Il meccanismo
222 funziona con il criterio della \textsl{delegazione}, un server responsabile
223 per un dominio di primo livello può delegare la risoluzione degli indirizzi
224 per un suo dominio di secondo livello ad un altro server, il quale a sua volta
225 potrà delegare la risoluzione di un eventuale sottodominio di terzo livello ad
226 un altro server ancora.
227
228 In realtà un server DNS è in grado di fare altro rispetto alla risoluzione di
229 un nome a dominio in un indirizzo IP; ciascuna voce nel database viene
230 chiamata \textit{resource record}, e può contenere diverse informazioni. In
231 genere i \textit{resource record} vengono classificati per la \textsl{classe
232   di indirizzi} cui i dati contenuti fanno riferimento, e per il \textsl{tipo}
233 di questi ultimi.\footnote{ritroveremo classi di indirizzi e tipi di record
234   più avanti in tab.~\ref{tab:DNS_address_class} e
235   tab.~\ref{tab:DNS_record_type}.}  Oggigiorno i dati mantenuti nei server DNS
236 sono quasi esclusivamente relativi ad indirizzi internet, per cui in pratica
237 viene utilizzata soltanto una classe di indirizzi; invece le corrispondenze
238 fra un nome a dominio ed un indirizzo IP sono solo uno fra i vari tipi di
239 informazione che un server DNS fornisce normalmente.
240
241 L'esistenza di vari tipi di informazioni è un'altro dei motivi per cui il
242 \textit{resolver} prevede, rispetto a quelle relative alla semplice
243 risoluzione dei nomi, un insieme di funzioni specifiche dedicate
244 all'interrogazione di un server DNS; la prima di queste funzioni è
245 \funcd{res\_init}, il cui prototipo è:
246 \begin{functions}
247   \headdecl{netinet/in.h} \headdecl{arpa/nameser.h} \headdecl{resolv.h}
248   \funcdecl{int res\_init(void)}
249
250 Inizializza il sistema del \textit{resolver}.
251
252 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
253   errore.}
254 \end{functions}
255
256 La funzione legge il contenuto dei file di configurazione (i già citati
257 \file{resolv.conf} e \file{host.conf}) per impostare il dominio di default,
258 gli indirizzi dei server DNS da contattare e l'ordine delle ricerche; se non
259 sono specificati server verrà utilizzato l'indirizzo locale, e se non è
260 definito un dominio di default sarà usato quello associato con l'indirizzo
261 locale (ma questo può essere sovrascritto con l'uso della variabile di
262 ambiente \texttt{LOCALDOMAIN}). In genere non è necessario eseguire questa
263 funzione direttamente in quanto viene automaticamente chiamata la prima volta
264 che si esegue una delle altre.
265
266 Le impostazioni e lo stato del \textit{resolver} vengono mantenuti in una
267 serie di variabili raggruppate nei campi di una apposita struttura \var{\_res}
268 usata da tutte queste funzioni. Essa viene definita in \file{resolv.h} ed è
269 utilizzata internamente alle funzioni essendo definita come variabile globale;
270 questo consente anche di accedervi direttamente all'interno di un qualunque
271 programma, una volta che la sia opportunamente dichiarata come:
272 \includecodesnip{listati/resolv_option.c}
273
274 Tutti i campi della struttura sono ad uso interno, e vengono usualmente
275 inizializzati da \func{res\_init} in base al contenuto dei file di
276 configurazione e ad una serie di valori di default. L'unico campo che può
277 essere utile modificare è \var{\_res.options}, una maschera binaria che
278 contiene una serie di bit di opzione che permettono di controllare il
279 comportamento del \textit{resolver}. 
280
281 \begin{table}[htb]
282   \centering
283   \footnotesize
284   \begin{tabular}[c]{|l|p{8cm}|}
285     \hline
286     \textbf{Costante} & \textbf{Significato} \\
287     \hline
288     \hline
289     \const{RES\_INIT}       & viene attivato se è stata chiamata
290                               \func{res\_init}. \\
291     \const{RES\_DEBUG}      & stampa dei messaggi di debug.\\
292     \const{RES\_AAONLY}     & accetta solo risposte autoritative.\\
293     \const{RES\_USEVC}      & usa connessioni TCP per contattare i server 
294                               invece che l'usuale UDP.\\
295     \const{RES\_PRIMARY}    & interroga soltanto server DNS primari.
296                               \\
297     \const{RES\_IGNTC}      & ignora gli errori di troncamento, non ritenta la
298                               richiesta con una connessione TCP.\\
299     \const{RES\_RECURSE}    & imposta il bit che indica che si desidera
300                               eseguire una interrogazione ricorsiva.\\
301     \const{RES\_DEFNAMES}   & se attivo \func{res\_search} aggiunge il nome
302                               del dominio di default ai nomi singoli (che non
303                               contengono cioè un ``\texttt{.}'').\\
304     \const{RES\_STAYOPEN}   & usato con \const{RES\_USEVC} per mantenere
305                               aperte le connesioni TCP fra interrogazioni
306                               diverse. \\
307     \const{RES\_DNSRCH}     & se attivo \func{res\_search} esegue le ricerche
308                               di nomi di macchine nel dominio corrente o nei
309                               domini ad esso sovrastanti.\\
310     \const{RES\_INSECURE1}  & blocca i controlli di sicurezza di tipo 1.\\
311     \const{RES\_INSECURE2}  & blocca i controlli di sicurezza di tipo 2.\\
312     \const{RES\_NOALIASES}  & blocca l'uso della variabile di ambiente
313                               \texttt{HOSTALIASES}.\\ 
314     \const{RES\_USE\_INET6} & restituisce indirizzi IPv6 con
315                               \func{gethostbyname}. \\
316     \const{RES\_ROTATE}     & ruota la lista dei server DNS dopo ogni
317                               interrogazione.\\
318     \const{RES\_NOCHECKNAME}& non controlla i nomi per verificarne la
319                               correttezza sintattica. \\
320     \const{RES\_KEEPTSIG}   & non elimina i record di tipo \texttt{TSIG}.\\
321     \const{RES\_BLAST}      & \\
322     \const{RES\_DEFAULT}    & è l'insieme di \const{RES\_RECURSE},
323                               \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}.\\
324     \hline
325   \end{tabular}
326   \caption{Costanti utilizzabili come valori per \var{\_res.options}.}
327   \label{tab:resolver_option}
328 \end{table}
329
330 Per utilizzare questa funzionalità per modificare le impostazioni direttamente
331 da programma occorrerà impostare un opportuno valore per questo campo ed
332 invocare esplicitamente \func{res\_init}, dopo di che le altre funzioni
333 prenderanno le nuove impostazioni. Le costanti che definiscono i vari bit di
334 questo campo, ed il relativo significato sono illustrate in
335 tab.~\ref{tab:resolver_option}; trattandosi di una maschera binaria un valore
336 deve essere espresso con un opportuno OR aritmetico di dette costanti; ad
337 esempio il valore di default delle opzioni, epsresso dalla costante
338 \const{RES\_DEFAULT}, è definito come:
339 \includecodesnip{listati/resolv_option_def.c}
340
341 Non tratteremo il significato degli altri campi non essendovi necessità di
342 modificarli direttamente; gran parte di essi sono infatti impostati dal
343 contenuto dei file di configurazione, mentre le funzionalità controllate da
344 alcuni di esse possono essere modificate con l'uso delle opportune variabili
345 di ambiente come abbiamo visto per \texttt{LOCALDOMAIN}. In particolare con
346 \texttt{RES\_RETRY} si soprassiede il valore del campo \var{retry} che
347 controlla quante volte viene ripetuto il tentativo di connettersi ad un server
348 DNS prima di dichiarare fallimento; il valore di default è 4, un valore nullo
349 significa bloccare l'uso del DNS. Infine con \texttt{RES\_TIMEOUT} si
350 soprassiede il valore del campo \var{retrans},\footnote{preimpostato al valore
351   della omonima costante \const{RES\_TIMEOUT} di \file{resolv.h}.} che è il
352 valore preso come base (in numero di secondi) per definire la scadenza di una
353 richiesta, ciascun tentativo di richiesta fallito viene ripetuto raddoppianto
354 il tempo di scadenza per il numero massimo di volte stabilito da
355 \texttt{RES\_RETRY}.
356
357 La funzione di interrogazione principale è \funcd{res\_query}, che serve ad
358 eseguire una richiesta ad un server DNS per un nome a dominio
359 \textsl{completamente specificato} (quello che si chiama FQDN, \textit{Fully
360   Qualified Domain Name}); il suo prototipo è:
361
362 \begin{functions}
363 \headdecl{netinet/in.h}
364 \headdecl{arpa/nameser.h}
365 \headdecl{resolv.h}
366 \funcdecl{int res\_query(const char *dname, int class, int type,
367               unsigned char *answer, int anslen)}
368
369   Esegue una interrogazione al DNS.
370
371 \bodydesc{La funzione restituisce un valore positivo pari alla lunghezza dei
372     dati scritti nel buffer \param{answer} in caso di successo e -1 in caso di
373     errore.}
374 \end{functions}
375
376 La funzione esegue una interrogazione ad un server DNS relativa al nome da
377 risolvere passato nella stringa indirizzata da \param{dname}, inoltre deve
378 essere specificata la classe di indirizzi in cui eseguire la ricerca con
379 \param{class}, ed il tipo di \textit{resource record} che si vuole ottenere
380 con \param{type}. Il risultato della ricerca verrà scritto nel buffer di
381 lunghezza \param{anslen} puntato da \param{answer} che si sarà opportunamente
382 allocato in precedenza.
383
384
385 Una seconda funzione di ricerca, analoga a \func{res\_query}, che prende gli
386 stessi argomenti, ma che esegue l'interrogazione con le funzionalità
387 addizionali previste dalle due opzioni \const{RES\_DEFNAMES} e
388 \const{RES\_DNSRCH}, è \funcd{res\_search}, il cui prototipo è:
389 \begin{functions}
390 \headdecl{netinet/in.h}
391 \headdecl{arpa/nameser.h}
392 \headdecl{resolv.h}
393 \funcdecl{int res\_search(const char *dname, int class, int type,
394               unsigned char *answer, int anslen)}
395
396   Esegue una interrogazione al DNS.
397   
398   \bodydesc{La funzione restituisce un valore positivo pari alla lunghezza dei
399     dati scritti nel buffer \param{answer} in caso di successo e -1 in caso di
400     errore.}
401 \end{functions}
402
403 In sostanza la funzione ripete una serie di chiamate a \func{res\_query}
404 aggiungendo al nome contenuto nella stringa \param{dname} il dominio di
405 default da cercare, fermandosi non appena trova un risultato.  Il risultato di
406 entrambe le funzioni viene scritto nel formato opportuno (che sarà diverso a
407 seconda del tipo di record richiesto) nel buffer di ritorno; sarà compito del
408 programma (o di altre funzioni) estrarre i relativi dati, esistono una serie
409 di funzioni interne usate per la scansione di questi dati, per chi fosse
410 interessato una trattazione dettagliata è riportata nel quattordicesimo
411 capitolo di \cite{DNSbind}.
412
413 Le classi di indirizzi supportate da un server DNS sono tre, ma di queste in
414 pratica oggi viene utilizzata soltanto quella degli indirizzi internet; le
415 costanti che identificano dette classi, da usare come valore per l'argomento
416 \param{class} delle precedenti funzioni, sono riportate in
417 tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe
418   \const{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta.}
419
420 \begin{table}[htb]
421   \centering
422   \footnotesize
423   \begin{tabular}[c]{|l|p{8cm}|}
424     \hline
425     \textbf{Costante} & \textbf{Significato} \\
426     \hline
427     \hline
428     \const{C\_IN}   & indirizzi internet, in pratica i soli utilizzati oggi.\\
429     \const{C\_HS}   & indirizzi \textit{Hesiod}, utilizzati solo al MIT, oggi
430                       completamente estinti. \\
431     \const{C\_CHAOS}& indizzi per la rete \textit{Chaosnet}, un'altra rete
432                       sperimentale nata al MIT. \\
433     \const{C\_ANY}  & indica un indirizzo di classe qualunque.\\
434     \hline
435   \end{tabular}
436   \caption{Costanti identificative delle classi di indirizzi per l'argomento
437     \param{class} di \func{res\_query}.}
438   \label{tab:DNS_address_class}
439 \end{table}
440
441 Come accennato le tipologie di dati che sono mantenibili su un server DNS sono
442 diverse, ed a ciascuna di essa corriponde un diverso tipo di \textit{resource
443   record}. L'elenco delle costanti\footnote{ripreso dai file di dichiarazione
444   \file{arpa/nameser.h} e \file{arpa/nameser\_compat.h}.} che definiscono i
445 valori che si possono usare per l'argomento \param{type} per specificare il
446 tipo di \textit{resource record} da richiedere è riportato in
447 tab.~\ref{tab:DNS_record_type}; le costanti (tolto il \texttt{T\_} iniziale)
448 hanno gli stessi nomi usati per identificare i record nei file di zona di
449 BIND,\footnote{BIND, acronimo di \textit{Berkley Internet Name Domain}, è una
450   implementazione di un server DNS, ed, essendo utilizzata nella stragrande
451   maggioranza dei casi, fa da rifererimento; i dati relativi ad un certo
452   dominio (cioè i suoi \textit{resource record} vengono mantenuti in quelli
453   che sono usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo
454   di dominio è identificato da un nome che è appunto identico a quello delle
455   costanti di tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.}
456 e che normalmente sono anche usati come nomi per indicare i record.
457
458 \begin{table}[!htb]
459   \centering
460   \footnotesize
461   \begin{tabular}[c]{|l|l|}
462     \hline
463     \textbf{Costante} & \textbf{Significato} \\
464     \hline
465     \hline
466     \const{T\_A}     & indirizzo di una stazione.\\
467     \const{T\_NS}    & server DNS autoritativo per il dominio richiesto.\\
468     \const{T\_MD}    & destinazione per la posta elettronica.\\
469     \const{T\_MF}    & redistributore per la posta elettronica.\\
470     \const{T\_CNAME} & nome canonico.\\
471     \const{T\_SOA}   & inzio di una zona di autorità.\\
472     \const{T\_MB}    & nome a dominio di una casella di posta.\\
473     \const{T\_MG}    & nome di un membro di un gruppo di posta.\\
474     \const{T\_MR}    & nome di un cambiamento di nome per la posta.\\
475     \const{T\_NULL}  & record nullo.\\
476     \const{T\_WKS}   & servizio noto.\\
477     \const{T\_PTR}   & risoluzione inversa di un indirizzo numerico.\\
478     \const{T\_HINFO} & informazione sulla stazione.\\
479     \const{T\_MINFO} & informazione sulla casella di posta.\\
480     \const{T\_MX}    & server cui instradare la posta per il dominio.\\
481     \const{T\_TXT}   & stringhe di testo (libere).\\
482     \const{T\_RP}    & nome di un responsabile (\textit{responsible person}).\\
483     \const{T\_AFSDB} & database per una cella AFS.\\
484     \const{T\_X25}   & indirizzo di chiamata per X.25.\\
485     \const{T\_ISDN}  & indirizzo di chiamata per ISDN.\\
486     \const{T\_RT}    & router.\\
487     \const{T\_NSAP}  & indirizzo NSAP.\\
488     \const{T\_NSAP\_PTR}& risoluzione inversa per NSAP (deprecato).\\
489     \const{T\_SIG}   & firma digitale di sicurezza.\\
490     \const{T\_KEY}   & chiave per firma.\\
491     \const{T\_PX}    & corrispondenza per la posta X.400.\\
492     \const{T\_GPOS}  & posizione grografica.\\
493     \const{T\_AAAA}  & indirizzo IPv6.\\
494     \const{T\_LOC}   & informazione di collocazione.\\
495     \const{T\_NXT}   & dominio successivo.\\
496     \const{T\_EID}   & identificatore di punto conclusivo.\\
497     \const{T\_NIMLOC}& posizionatore \textit{nimrod}.\\
498     \const{T\_SRV}   & servizio.\\
499     \const{T\_ATMA}  & indirizzo ATM.\\
500     \const{T\_NAPTR} & puntatore ad una \textit{naming authority} .\\
501     \const{T\_TSIG}  & firma di transazione.\\
502     \const{T\_IXFR}  & trasferimento di zona incrementale.\\
503     \const{T\_AXFR}  & trasferimento di zona di autorità.\\
504     \const{T\_MAILB} & trasferimento di record di caselle di posta.\\
505     \const{T\_MAILA} & trasferimento di record di server di posta.\\
506     \const{T\_ANY}   & valore generico.\\
507     \hline
508   \end{tabular}
509   \caption{Costanti identificative del tipo di record per l'argomento
510     \param{type} di \func{res\_query}.}
511   \label{tab:DNS_record_type}
512 \end{table}
513
514
515 L'elenco di tab.~\ref{tab:DNS_record_type} è quello di \textsl{tutti} i
516 \textit{resource record} definiti, con una breve descrizione del relativo
517 significato.  Di tutti questi però viene impiegato correntemente solo un
518 piccolo sottoinsieme, alcuni sono obsoleti ed altri fanno riferimento a dati
519 applicativi che non ci interessano non avendo nulla a che fare con la
520 risoluzione degli indirizzi IP, pertanto non entreremo nei dettagli del
521 significato di tutti i \textit{resource record}, ma solo di quelli usati dalle
522 funzioni del \textit{resolver}. Questi sono sostanzialmente i seguenti (per
523 indicarli si è usata la notazione dei file di zona di BIND):
524 \begin{basedescript}{\desclabelwidth{1.2cm}\desclabelstyle{\nextlinelabel}}
525 \item[\texttt{A}] viene usato per indicare la corripondenza fra un nome a
526   dominio ed un indirizzo IPv4; ad esempio la corrispondenza fra
527   \texttt{dodds.truelite.it} e l'indirizzo IP \texttt{62.48.34.25}.
528 \item[\texttt{AAAA}] viene usato per indicare la corrispondenza fra un nome a
529   dominio ed un indirizzo IPv6; è chiamato in questo modo dato che la
530   dimensione di un indirizzo IPv6 è quattro volte quella di un indirizzo IPv4.
531 \item[\texttt{PTR}] per fornire la corripondenza inversa fra un indirizzo IP
532   ed un nome a dominio ad esso associato si utilizza questo tipo di record (il
533   cui nome sta per \textit{pointer}).
534 \item[\texttt{CNAME}] qualora si abbiamo più nomi che corrispondono allo
535   stesso indirizzo (come ad esempio \texttt{www.truelite.it}, o
536   \texttt{sources.truelite.it}, che fanno sempre riferimento a
537   \texttt{dodds.truelite.it}) si può usare questo tipo di record per creare
538   degli \textit{alias} in modo da associare un qualunque altro nome al
539   \textsl{nome canonico} della macchina (si chiama così quello associato al
540   record \texttt{A}).
541 \end{basedescript}
542
543 Come accennato in caso di successo le due funzioni di richiesta restituiscono
544 il risultato della interrogazione al server, in caso di insuccesso l'errore
545 invece viene segnalato da un valore di ritorno pari a -1, ma in questo caso,
546 non può essere utilizzata la variabile \var{errno} per riportare un codice di
547 errore, in quanto questo viene impostato per ciascuna delle chiamate al
548 sistema utilizzate dalle funzioni del \textit{resolver}, non avrà alcun
549 significato nell'indicare quale parte del procedimento di risoluzione è
550 fallita.
551
552 Per questo motivo è stata definita una variabile di errore separata,
553 \var{h\_errno}, che viene utilizzata dalle funzioni del \textit{resolver} per
554 indicare quale problema ha causato il fallimento della risoluzione del nome.
555 Ad essa si può accedere una volta che la si dichiara con:
556 \includecodesnip{listati/herrno.c} 
557 ed i valori che può assumere, con il relativo significato, sono riportati in
558 tab.~\ref{tab:h_errno_values}.
559
560 \begin{table}[!htb]
561   \centering
562   \footnotesize
563   \begin{tabular}[c]{|l|p{10cm}|}
564     \hline
565     \textbf{Costante} & \textbf{Significato} \\
566     \hline
567     \hline
568     \const{HOST\_NOT\_FOUND} & l'indirizzo richiesto non è valido e la
569                                macchina indicata è sconosciuta. \\
570     \const{NO\_ADDRESS}      & il nome a dominio richiesto è valido, ma non ha
571                                un indirizzo associato ad esso
572                                (alternativamente può essere indicato come 
573                                \const{NO\_DATA}). \\
574     \const{NO\_RECOVERY}     & si è avuto un errore non recuperabile
575                                nell'interrogazione di un server DNS. \\
576     \const{TRY\_AGAIN}       & si è avuto un errore temporaneo
577                                nell'interrogazione di un server DNS, si può
578                                ritentare l'interrogazione in un secondo
579                                tempo. \\
580     \hline
581   \end{tabular}
582   \caption{Valori possibili della variabile \var{h\_errno}.}
583   \label{tab:h_errno_values}
584 \end{table}
585
586 Insieme alla nuova variabile vengono definite anche due nuove funzioni per
587 stampare l'errore a video, analoghe a quelle di sez.~\ref{sec:sys_strerror}
588 per \var{errno}, ma che usano il valore di \var{h\_errno}; la prima è
589 \funcd{herror} ed il suo prototipo è:
590 \begin{functions}
591 \headdecl{netdb.h}
592 \funcdecl{void herror(const char *string)}
593
594 Stampa un errore di risoluzione.
595 \end{functions}
596
597 La funzione è l'analoga di \func{perror} e stampa sullo standard error un
598 messaggio di errore corrispondente al valore corrente di \var{h\_errno}, a cui
599 viene anteposta la stringa \param{string} passata come argomento.  La seconda
600 funzione è \funcd{hstrerror} ed il suo prototipo è:
601 \begin{functions}
602 \headdecl{netdb.h}
603 \funcdecl{const char *hstrerror(int err)}
604
605 Restituisce una stringa corripondente ad un errore di risoluzione.
606 \end{functions}
607 \noindent che, come  l'analoga \func{strerror}, restituise una stringa con un
608 messaggio di errore già formattato, corrispondente al codice passato come
609 argomento (che si presume sia dato da \var{h\_errno}).
610
611
612
613
614 \subsection{La risoluzione dei nomi a dominio}
615 \label{sec:sock_name_services}
616
617 La principale funzionalità del \textit{resolver} resta quella di risolvere i
618 nomi a dominio in indirizzi IP, per cui non ci dedicheremo oltre alle funzioni
619 di richiesta generica ed esamineremo invece le funzioni a questo dedicate. La
620 prima funzione è \funcd{gethostbyname} il cui scopo è ottenere l'indirizzo di
621 una stazione noto il suo nome a dominio, il suo prototipo è:
622 \begin{prototype}{netdb.h}
623 {struct hostent *gethostbyname(const char *name)}
624
625 Determina l'indirizzo associato al nome a dominio \param{name}.
626
627 \bodydesc{La funzione restituisce in caso di successo il puntatore ad una
628   struttura di tipo \struct{hostent} contenente i dati associati al nome a
629   dominio, o un puntatore nullo in caso di errore.}
630 \end{prototype}
631
632 La funzione prende come argomento una stringa \param{name} contenente il nome
633 a dominio che si vuole risolvere, in caso di successo i dati ad esso relativi
634 vengono memorizzati in una opportuna struttura \struct{hostent} la cui
635 definizione è riportata in fig.~\ref{fig:sock_hostent_struct}. 
636
637 \begin{figure}[!htb]
638   \footnotesize \centering
639   \begin{minipage}[c]{15cm}
640     \includestruct{listati/hostent.h}
641   \end{minipage}
642   \caption{La struttura \structd{hostent}.}
643   \label{fig:sock_hostent_struct}
644 \end{figure}
645
646 Quando un programma chiama \func{gethostbyname} e questa usa il DNS per
647 effettuare la risoluzione del nome, è con i valori contenuti nei relativi
648 record che vengono riempite le varie parti della struttura \struct{hostent}.
649 Il primo campo della struttura, \var{h\_name} contiene sempre il \textsl{nome
650   canonico}, che nel caso del DNS è appunto il nome associato ad un record
651 \texttt{A}. Il secondo campo della struttura, \var{h\_aliases}, invece è un
652 puntatore ad vettore di puntatori, terminato da un puntatore nullo. Ciascun
653 puntatore del vettore punta ad una stringa contenente uno degli altri
654 possibili nomi associati allo stesso \textsl{nome canonico} (quelli che nel
655 DNS vengono inseriti come record di tipo \texttt{CNAME}).
656
657 Il terzo campo della struttura, \var{h\_addrtype}, indica il tipo di indirizzo
658 che è stato restituito, e può assumere soltanto i valori \const{AF\_INET} o
659 \const{AF\_INET6}, mentre il quarto campo, \var{h\_length}, indica la
660 lunghezza dell'indirizzo stesso in byte. 
661
662 Infine il campo \var{h\_addr\_list} è il puntatore ad un vettore di puntatori
663 ai singoli indirizzi; il vettore è terminato da un puntatore nullo.  Inoltre,
664 come illustrato in fig.~\ref{fig:sock_hostent_struct}, viene definito il campo
665 \var{h\_addr} come sinonimo di \code{h\_addr\_list[0]}, cioè un riferimento
666 diretto al primo indirizzo della lista.
667
668 Oltre ai normali nomi a dominio la funzione accetta come argomento
669 \param{name} anche indirizzi numerici, in formato dotted decimal per IPv4 o
670 con la notazione illustrata in sez.~\ref{sec:IP_ipv6_notation} per IPv6. In
671 tal caso \func{gethostbyname} non eseguirà nessuna interrogazione remota, ma
672 si limiterà a copiare la stringa nel campo \var{h\_name} ed a creare la
673 corrispondente struttura \var{in\_addr} da indirizzare con
674 \code{h\_addr\_list[0]}.
675
676 Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi
677 IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
678 l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi
679 chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per
680 modificare le opzioni del resolver; dato che questo non è molto comodo è stata
681 definita\footnote{questa è una estensione fornita dalle \acr{glibc},
682   disponibile anche in altri sistemi unix-like.} un'altra funzione,
683 \funcd{gethostbyname2}, il cui prototipo è:
684 \begin{functions}
685   \headdecl{netdb.h} 
686   \headdecl{sys/socket.h}
687   \funcdecl{struct hostent *gethostbyname2(const char *name, int af)}
688
689 Determina l'indirizzo di tipo \param{af} associato al nome a dominio
690 \param{name}.
691
692 \bodydesc{La funzione restituisce in caso di successo il puntatore ad una
693   struttura di tipo \struct{hostent} contenente i dati associati al nome a
694   dominio, o un puntatore nullo in caso di errore.}
695 \end{functions}
696
697 In questo caso la funzione prende un secondo argomento \param{af} che indica
698 (i soli valori consentiti sono \const{AF\_INET} o \const{AF\_INET6}, per
699 questo è necessario l'uso di \texttt{sys/socket.h}) la famiglia di indirizzi
700 che dovrà essere utilizzata nei risultati restituiti dalla funzione. Per tutto
701 il resto la funzione è identica a \func{gethostbyname}, ed identici sono i
702 suoi risultati.
703
704 \begin{figure}[!htb]
705   \footnotesize \centering
706   \begin{minipage}[c]{15cm}
707     \includecodesample{listati/myhost.c}
708   \end{minipage}
709   \normalsize
710   \caption{Esempio di codice per la risoluzione di un indirizzo.}
711   \label{fig:myhost_example}
712 \end{figure}
713
714 Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in
715 fig.~\ref{fig:myhost_example} è riportato un estratto del codice di un
716 programma che esegue una semplice interrogazione al \textit{resolver} usando
717 \func{gethostbyname} e poi ne stampa a video i risultati. Al solito il
718 sorgente completo, he comprende il trattamento delle opzioni ed una funzione
719 per stampare un messaggio di aiuto, è nel file \texttt{myhost.c} dei sorgenti
720 allegati alla guida.
721
722 Il programma richiede un solo argomento che specifichi il nome da cercare,
723 senza il quale (\texttt{\small 12--15}) esce con un errore. Dopo di che
724 (\texttt{\small 16}) si limita a chiamare \func{gethostbyname}, ricendo il
725 risultato nel puntatore \var{data}. Questo (\texttt{\small 17--20}) viene
726 controllato per rilevare eventuali errori, nel qual caso il programma esce
727 dopo aver stampato un messaggio con \func{herror}. 
728
729 Se invece la risoluzione è andata a buon fine si inizia (\texttt{\small 21})
730 con lo stampare il nome canonico, dopo di che (\texttt{\small 22--26}) si
731 stampano eventuali altri nomi. Per questo prima (\texttt{\small 22}) si prende
732 il puntatore alla cima della lista che contiene i nomi e poi (\texttt{\small
733   23--26}) si esegue un ciclo che sarà ripetuto fin tanto che nella lista si
734 troveranno dei puntatori validi\footnote{si ricordi che la lista viene
735   terminata da un puntatore nullo.} per le stringhe dei nomi; prima
736 (\texttt{\small 24}) si stamperà la stringa e poi (\texttt{\small 25}) si
737 provvederà ad incrementare il puntatore per passare al successivo elemento
738 della lista.
739
740 Una volta stampati i nomi si passerà a stampare gli indirizzi, il primo passo
741 (\texttt{\small 27--34}) è allora quello di riconoscere il tipo di indirizzo
742 sulla base del valore del campo \var{h\_addrtype}, stampandolo a video. Si è
743 anche previsto di stampare un errore nel caso (che non dovrebbe mai accadere)
744 di un indirizzo non valido.
745
746 Infine (\texttt{\small 35--40}) si stamperanno i valori degli indirizzi, di
747 nuovo (\texttt{\small 35}) si inizializzerà un puntatore alla cima della lista
748 e si eseguirà un ciclo fintanto che questo punterà ad indirizzi validi in
749 maniera analoga a quanto fatto in precedenza per i nomi a dominio. Si noti
750 come, essendo il campo \var{h\_addr\_list} un puntatore ad strutture di
751 indirizzi generiche, questo sia ancora di tipo \texttt{char **} e si possa
752 riutilizzare lo stesso puntatore usato per i nomi.
753
754 Per ciascun indirizzo valido si provvederà (\texttt{\small 37}) ad una
755 conversione con la funzione \func{inet\_ntop} (vedi
756 sez.~\ref{sec:sock_addr_func}) passandole gli opportuni argomenti, questa
757 restituirà la stringa da stampare (\texttt{\small 38}) con il valore
758 dell'indirizzo in \var{buffer}, che si è avuto la cura di dichiarare
759 inizialmente (\texttt{\small 10}) con dimensioni adeguate; dato che la
760 funzione è in grado di tenere conto automaticamente del tipo di indirizzo non
761 ci sono precauzioni particolari da prendere.\footnote{volendo essere pignoli
762   si dovrebbe controllarne lo stato di uscita, lo si è tralasciato per non
763   appesantire il codice, dato che in caso di indirizzi non validi si sarebbe
764   avuto un errore con \func{gethostbyname}, ma si ricordi che la sicurezza non
765   è mai troppa.}
766
767 Le funzioni illustrate finora hanno un difetto: utilizzando una area di
768 memoria interna per allocare i contenuti della struttura \struct{hostent} non
769 possono essere rientranti. Questo comporta anche che in due successive
770 chiamate i dati potranno essere sovrascritti. Si tenga presente poi che
771 copiare il contenuto della sola struttura non è sufficiente per salvare tutti
772 i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
773 essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
774 una chiamata, occorrerà eseguire quella che si chiama una
775 \index{\textit{deep~copy}}\textit{deep copy}.\footnote{si chiama così quella
776   tecnica per cui, quando si deve copiare il contenuto di una struttura
777   complessa (con puntatori che puntano ad altri dati, che a loro volta possono
778   essere puntatori ad altri dati) si deve copiare non solo il contenuto della
779   struttura, ma eseguire una scansione per risolvere anche tutti i puntatori
780   contenuti in essa (e così via se vi sono altre sottostrutture con altri
781   puntatori) e copiare anche i dati da questi referenziati.}
782
783 Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
784 versioni rientranti delle precedenti funzioni, al solito queste sono
785 caratterizzate dall'avere un suffisso \texttt{\_r}, pertanto avremo le due
786 funzioni \funcd{gethostbyname\_r} e \funcd{gethostbyname2\_r} i cui prototipi
787 sono:
788 \begin{functions}
789   \headdecl{netdb.h} 
790   \headdecl{sys/socket.h}
791   \funcdecl{int gethostbyname\_r(const char *name, struct hostent *ret, 
792     char *buf, size\_t buflen, struct hostent **result, int *h\_errnop)}
793   \funcdecl{int gethostbyname2\_r(const char *name, int af,
794          struct hostent *ret, char *buf, size\_t buflen, 
795          struct hostent **result, int *h\_errnop)}
796   
797   Versioni rientranti delle funzioni \func{gethostbyname} e
798   \func{gethostbyname2}. 
799        
800   \bodydesc{Le funzioni restituiscono 0 in caso di successo ed un valore
801     negativo in caso di errore.}
802 \end{functions}
803
804 Gli argomenti \param{name} (e \param{af} per \func{gethostbyname2\_r}) hanno
805 lo stesso significato visto in precedenza. Tutti gli altri argomenti hanno lo
806 stesso significato per entrambe le funzioni. Per evitare l'uso di variabili
807 globali si dovrà allocare preventivamente una struttura \struct{hostent} in
808 cui ricevere il risultato, passandone l'indirizzo alla funzione nell'argomento
809 \param{ret}.  Inoltre, dato che \struct{hostent} contiene dei puntatori, dovrà
810 essere allocato anche un buffer in cui le funzioni possano scrivere tutti i
811 dati del risultato dell'interrogazione da questi puntati; l'indirizzo e la
812 lunghezza di questo buffer devono essere indicati con gli argomenti
813 \param{buf} e \param{buflen}.
814
815 Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati
816 come \index{\textit{value~result~argument}}\textit{value result argument}, si
817 deve specificare l'indirizzo della variabile su cui la funzione dovrà salvare
818 il codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
819 puntatatore che si userà per accedere i dati con \param{result}.
820
821 In caso di successo entrambe le funzioni restituiscono un valore nullo,
822 altrimenti restituiscono un codice di errore negativo e all'indirizzo puntato
823 da \param{result} sarà salvato un puntatore nullo, mentre a quello puntato da
824 \param{h\_errnop} sarà salvato il valore del codice di errore, dato che per
825 essere rientrante la funzione non può la variabile globale \var{h\_errno}. In
826 questo caso il codice di errore, oltre ai valori di
827 tab.~\ref{tab:h_errno_values}, può avere anche quello di \errcode{ERANGE}
828 qualora il buffer allocato su \param{buf} non sia sufficiente a contenere i
829 dati, in tal caso si dovrà semplicemente ripetere l'esecuzione della funzione
830 con un buffer di dimensione maggiore.
831
832 Una delle caratteristiche delle interrogazioni al servizio DNS è che queste
833 sono normalmente eseguite con il protocollo UDP, ci sono casi in cui si
834 preferisce che vengano usate connessioni permanenti con il protocollo TCP. Per
835 ottenere questo\footnote{si potrebbero impostare direttamente le opzioni di
836   \var{\_\_res.options}, ma queste funzioni permettono di semplificare la
837   procedura.} sono previste delle funzioni apposite; la prima è
838 \funcd{sethostent}, il cui prototipo è:
839 \begin{prototype}{netdb.h}
840 {void sethostent(int stayopen)}
841
842 Richiede l'uso di connessioni per le interrogazioni ad un server DNS.
843
844 \bodydesc{La funzione non restituisce nulla.}
845 \end{prototype}
846
847 La funzione permette di richiedere l'uso di connessioni TCP per la richiesta
848 dei dati, e che queste restino aperte per successive richieste. Il valore
849 dell'argomento \param{stayopen} indica se attivare questa funzionalità, un
850 valore pari a 1 (o diverso da zero), che indica una condizione vera in C,
851 attiva la funzionalità.  Come si attiva l'uso delle connessioni TCP lo si può
852 disattivare con la funzione \funcd{endhostent}; il suo prototipo è:
853 \begin{prototype}{netdb.h}
854 {void endhostent(void)}
855
856 Disattiva l'uso di connessioni per le interrogazioni ad un server DNS.
857
858 \bodydesc{La funzione non restituisce nulla.}
859 \end{prototype}
860 \noindent e come si può vedere la funzione è estremamente semplice, non
861 richiedendo nessun argomento.
862
863
864 Infine si può richiedere la risoluzione inversa di un indirizzo IP od IPv6,
865 per ottenerne il nome a dominio ad esso associato, per fare questo si può
866 usare la funzione \funcd{gethostbyaddr}, il cui prototipo è:
867 \begin{functions}
868   \headdecl{netdb.h} 
869   \headdecl{sys/socket.h} 
870   \funcdecl{struct hostent *gethostbyaddr(const char *addr, int len, int type)}
871
872   Richiede la risoluzione inversa di un indirizzo IP.
873        
874   \bodydesc{La funzione restituisce l'indirizzo ad una struttura
875     \struct{hostent} in caso di successo ed \const{NULL} in caso di errore.}
876 \end{functions}
877
878 In questo caso l'argomento \param{addr} dovrà essere il puntatore ad una
879 appropriata struttura contentente il valore dell'indirizzo IP (o IPv6) che si
880 vuole risolvere. L'uso del tipo \type{char *} per questo argomento è storico,
881 il dato dovrà essere fornito in una struttura \struct{in\_addr}\footnote{si
882   ricordi che, come illustrato in fig.~\ref{fig:sock_sa_ipv4_struct}, questo
883   in realtà corrisponde ad un numero intero, da esprimere comunque in
884   \textit{network order}, non altrettanto avviene però per \var{in6\_addr},
885   pertanto è sempre opportuno inizializzare questi indirizzi con
886   \func{inet\_pton} (vedi sez.~\ref{sec:sock_conv_func_gen}).}  per un
887 indirizzo IPv4 ed una struttura \struct{in6\_addr} per un indirizzo IPv6,
888 mentre in \param{len} se ne dovrà specificare la dimensione (rispettivamente 4
889 o 16), infine l'argomento \param{type} indica il tipo di indirizzo e dovrà
890 essere o \const{AF\_INET} o \const{AF\_INET6}.
891
892 La funzione restituisce, in caso di successo, un puntatore ad una struttura
893 \struct{hostent}, solo che in questo caso la ricerca viene eseguita
894 richiedendo al DNS un record di tipo \texttt{PTR} corrispondente all'indirizzo
895 specificato. In caso di errore al solito viene usata la variabile
896 \var{h\_errno} per restituire un opportuno codice. In questo caso l'unico
897 campo del risultato che interessa è \var{h\_name} che conterrà il nome a
898 dominio, la funziona comunque inizializza anche il primo campo della lista
899 \var{h\_addr\_list} col valore dell'indirizzo passato come argomento.
900
901 Per risolvere il problema dell'uso da parte delle due funzioni
902 \func{gethostbyname} e \func{gethostbyaddr} di memoria statica che può essere
903 socrascritta fra due chiamate successive, e per avere sempre la possibilità di
904 indicare esplicitamente il tipo di indirizzi voluto (cosa che non è possibile
905 con \func{gethostbyname}), vennero introdotte due nuove funzioni di
906 risoluzione,\footnote{le funzioni sono presenti nelle \acr{glibc} versione
907   2.1.96, ma essendo considerate deprecate (vedi
908   sez.~\ref{sec:sock_advanced_name_services}) sono state rimosse nelle
909   versioni successive.} \funcd{getipnodebyname} e \funcd{getipnodebyaddr}, i
910 cui prototipi sono:
911 \begin{functions}
912   \headdecl{netdb.h} 
913   \headdecl{sys/types.h} 
914   \headdecl{sys/socket.h} 
915
916   \funcdecl{struct hostent *getipnodebyname(const char *name, int af, int
917     flags, int *error\_num)} 
918
919   \funcdecl{struct hostent *getipnodebyaddr(const void *addr, size\_t len,
920     int af, int *error\_num)}
921
922   Richiedono rispettivamente la risoluzione e la risoluzione inversa di un
923   indirizzo IP.
924        
925   \bodydesc{Entrambe le funzioni restituiscono l'indirizzo ad una struttura
926     \struct{hostent} in caso di successo ed \const{NULL} in caso di errore.}
927 \end{functions}
928
929 Entrambe le funzioni supportano esplicitamente la scelta di una famiglia di
930 indirizzi con l'argomento \param{af} (che può assumere i valori
931 \const{AF\_INET} o \const{AF\_INET6}), e restituiscono un codice di errore
932 (identico a quelli precedentemente illustrati in
933 tab.~\ref{tab:h_errno_values}) nella variabile puntata da
934 \param{error\_num}. La funzione \func{getipnodebyaddr} richiede poi che si
935 specifichi l'indirizzo come per \func{gethostbyaddr} passando anche la
936 lunghezza dello stesso nell'argomento \param{len}.
937
938 La funzione \func{getipnodebyname} prende come primo argomento il nome da
939 risolvere, inoltre prevede un apposito argomento \param{flags}, da usare come
940 maschera binaria, che permette di specificarne il comportamento nella
941 risoluzione dei diversi tipi di indirizzi (IPv4 e IPv6); ciascun bit
942 dell'argomento esprime una diversa opzione, e queste possono essere specificate
943 con un OR aritmetico delle costanti riportate in
944 tab.~\ref{tab:sock_getipnodebyname_flags}.
945
946 \begin{table}[!htb]
947   \centering
948   \footnotesize
949   \begin{tabular}[c]{|l|p{10cm}|}
950     \hline
951     \textbf{Costante} & \textbf{Significato} \\
952     \hline
953     \hline
954     \const{AI\_V4MAPPED}  & usato con \const{AF\_INET6} per richiedere una
955                             ricerca su un indirizzo IPv4 invece che IPv6; gli
956                             eventuali risultati saranno rimappati su indirizzi 
957                             IPv6.\\
958     \const{AI\_ALL}       & usato con \const{AI\_V4MAPPED}; richiede sia
959                             indirizzi IPv4 che IPv6, e gli indirizzi IPv4
960                             saranno rimappati in IPv6.\\
961     \const{AI\_ADDRCONFIG}& richiede che una richiesta IPv4 o IPv6 venga
962                             eseguita solo se almeno una interfaccia del
963                             sistema è associata ad un indirizzo di tale tipo.\\
964     \const{AI\_DEFAULT}   & il valore di default, è equivalente alla
965                             combinazione di \const{AI\_ADDRCONFIG} e di
966                             \const{AI\_V4MAPPED)}.\\  
967     \hline
968   \end{tabular}
969   \caption{Valori possibili per i bit dell'argomento \param{flags} della
970     funzione \func{getipnodebyname}.}
971   \label{tab:sock_getipnodebyname_flags}
972 \end{table}
973
974 Entrambe le funzioni restituiscono un puntatore ad una struttura \var{hostent}
975 allocata dinamicamente che contiene i risultati della ricerca, e per questo
976 non soffrono dei problemi dovuti all'uso di una sezione statica di memoria
977 presenti con le precedenti \func{gethostbyname} e \func{gethostbyaddr}.
978 Questo però comporta la necessità di deallocare esplicitamente la memoria
979 occupata dai risultati una volta che questi non siano più necessari, onde
980 evitare perdite di memoria; a tale scopo viene fornita la funzione
981 \funcd{freehostent}, il cui prototipo è:
982 \begin{functions}
983   \headdecl{netdb.h} 
984   \headdecl{sys/types.h} 
985   \headdecl{sys/socket.h} 
986
987   \funcdecl{void freehostent(struct hostent *ip)} 
988
989   Disalloca una struttura \var{hostent}.
990        
991   \bodydesc{La funzione non ritorna nulla.}
992 \end{functions}
993
994 La funzione permette di disallocare una struttura \var{hostent}
995 precedentemente allocata in una chiamata di \func{getipnodebyname} o
996 \func{getipnodebyaddr}, e prende come argomento l'indirizzo restituito da una
997 di queste funzioni.
998
999 Infine per concludere la nostra panoramica sulle funzioni di risoluzione dei
1000 nomi dobbiamo citare le funzioni che permettono di interrogare gli altri
1001 servizi di risoluzione dei nomi illustrati in sez.~\ref{sec:sock_resolver}; in
1002 generale infatti ci sono una serie di funzioni nella forma
1003 \texttt{getXXXbyname} e \texttt{getXXXbyaddr} per ciascuna delle informazioni
1004 di rete mantenute dal \textit{Name Service Switch} che permettono
1005 rispettivamente di trovare una corrispondenza cercando per nome o per numero.
1006
1007 L'elenco di queste funzioni è riportato nelle colonne finali di
1008 tab.~\ref{tab:name_resolution_functions}, dove le si sono suddivise rispetto
1009 al tipo di informazione che forniscono (riportato in prima colonna). Nella
1010 tabella si è anche riportato il file su cui vengono ordinariamente mantenute
1011 queste informazioni, che può essere sostituito da un qualunque supporto
1012 interno al \textit{Name Service Switch}, anche se usualmente questo avviene
1013 solo per la risoluzione degli indirizzi. Ciascuna funzione fa riferimento ad
1014 una sua apposita struttura che contiene i relativi dati, riportata in terza
1015 colonna.
1016
1017 \begin{table}[!htb]
1018   \centering
1019   \footnotesize
1020   \begin{tabular}[c]{|l|l|l|l|l|}
1021     \hline
1022     \textbf{Informazione}&\textbf{File}&\textbf{Struttura}&
1023     \multicolumn{2}{|c|}{\textbf{Funzioni}}\\
1024     \hline
1025     \hline
1026     indirizzo&\file{/etc/hosts}&\struct{hostent}&\func{gethostbyname}&
1027              \func{gethostbyaddr}\\ 
1028     servizio &\file{/etc/services}&\struct{servent}&\func{getservbyname}&
1029              \func{getservbyaddr}\\ 
1030     rete     &\file{/etc/networks}&\struct{netent}&\func{getnetbyname}&
1031              \func{getnetbyaddr}\\ 
1032     protocollo&\file{/etc/protocols}&\struct{protoent}&\func{getprotobyname}&
1033               \func{getprotobyaddr}\\ 
1034     \hline
1035   \end{tabular}
1036   \caption{Funzioni di risoluzione dei nomi per i vari servizi del
1037     \textit{Name Service Switch}.}
1038   \label{tab:name_resolution_functions}
1039 \end{table}
1040
1041 Delle funzioni di tab.~\ref{tab:name_resolution_functions} abbiamo trattato
1042 finora soltanto quelle relative alla risoluzione dei nomi, dato che sono le
1043 più usate, e prevedono praticamente da sempre la necessità di rivolgersi ad
1044 una entità esterna; per le altre invece, estensioni fornite dal NSS a parte,
1045 si fa sempre riferimento ai dati mantenuti nei rispettivi file. 
1046
1047 Consideriamo allora una ricerca sui nomi dei servizi, le due funzioni in
1048 questione sono \funcd{getservbyname} e \funcd{getservbyaddr} i cui prototopi
1049 sono:
1050 \begin{functions}
1051   \headdecl{netdb.h} 
1052   \funcdecl{struct servent *getservbyname(const char *name, const char *proto)}
1053   \funcdecl{struct servent *getservbyport(int port, const char *proto)} 
1054
1055   Disalloca una struttura \var{hostent}.
1056        
1057   \bodydesc{La funzione non ritorna nulla.}
1058 \end{functions}
1059
1060
1061
1062 Oltre alle precedenti funzioni di ricerca sono definite anche delle ulteriori
1063 funzioni generiche che permettono di accedere direttamente al contenuto dei
1064 file contenenti le informazioni; come le precedenti esse sono tutte nella
1065 forma \texttt{setXXXent}, \texttt{getXXXent} ed \texttt{endXXXent}, e sono
1066 analoghe a quelle viste in sez.~\ref{sec:sys_user_group} per la lettura delle
1067 informazioni relative ai dati degli utenti e dei gruppi (vedi
1068 tab.~\ref{tab:sys_passwd_func}) che pure sono mantenute tremite il
1069 \textit{Name Service Switch}.
1070
1071
1072
1073
1074
1075
1076 \subsection{Le funzioni avanzate per la risoluzione dei nomi}
1077 \label{sec:sock_advanced_name_services}
1078
1079 Quelle illustrate nella sezione precedente sono le funzioni classiche per la
1080 risoluzione di nomi ed indirizzi IP, ma abbiamo già visto come esse soffrano
1081 di vari inconvenienti come il fatto che usano informazioni statiche, e non
1082 prevedono la possibilità di avere diverse classi di indirizzi. Anche se sono
1083 state create delle estensioni o metodi diversi che permettono di risolvere
1084 questi inconvenienti, non c'è comunque una interfaccia sufficientemente
1085 generica 
1086
1087
1088 Per questo motivo lo standard Posix 1003.1-2001 indicava come deprecate le
1089 varie \func{gethostbyaddr}, \func{gethostbyname}, \var{getipnodebyname} e
1090 \var{getipnodebyaddr} per introdurre una interfaccia 
1091
1092
1093
1094 rimane comunque il problema generico che si deve sapere
1095 in anticipo quale tipo di indirizzi devo
1096
1097
1098
1099 \section{Le opzioni dei socket}
1100 \label{sec:TCP_sock_options}
1101
1102 Finora abbiamo trattato i socket nel loro comportamento più comune, è però
1103 possibile attivare alcune modalità diverse di funzionamento degli stessi
1104
1105 Dato che la maggior parte delle opzioni dei socket sono relative ai socket
1106 TCP, ed hanno poi significato analogo quando usate con altri socket, abbiamo
1107 preferito trattare l'argomento in generale in questa sezione piuttosto che nel
1108 capitolo dedicato alla trattazione generica dei socket.
1109
1110 \section{Altre funzioni di controllo}
1111 \label{sec:TCP_sock_ctrl}
1112
1113
1114
1115
1116
1117 %%% Local Variables: 
1118 %%% mode: latex
1119 %%% TeX-master: "gapil"
1120 %%% End: