Correzioni ed aggiustamenti vari, passati dall'uso di caption2 a quello di
[gapil.git] / sockctrl.tex
1 %% sockctrl.tex
2 %%
3 %% Copyright (C) 2004-2005 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 \textit{dotted
28   decimal} ad un numero. Vedremo in questa sezione le funzioni utilizzate per
29 poter utilizzare dei nomi simbolici al posto dei valori numerici, e viceversa
30 quelle che permettono di ottenere i nomi simbolici associati ad indirizzi,
31 porte o altre proprietà del sistema.
32
33
34 \subsection{La struttura del \textit{resolver}}
35 \label{sec:sock_resolver}
36
37 \index{\textit{resolver}|(}
38 La risoluzione dei nomi è associata tradizionalmente al servizio del
39 \textit{Domain Name Service} che permette di identificare le macchine su
40 internet invece che per numero IP attraverso il relativo \textsl{nome a
41   dominio}.\footnote{non staremo ad entrare nei dettagli della definizione di
42   cosa è un nome a dominio, dandolo per noto, una introduzione alla
43   problematica si trova in \cite{AGL} (cap. 9) mentre per una trattazione
44   approfondita di tutte le problematiche relative al DNS si può fare
45   riferimento a \cite{DNSbind}.} In realtà per DNS si intendono spesso i
46 server che forniscono su internet questo servizio, mentre nel nostro caso
47 affronteremo la problematica dal lato client, di un qualunque programma che
48 necessita di compiere questa operazione.
49
50 \begin{figure}[htb]
51   \centering
52   \includegraphics[width=9cm]{img/resolver}
53   \caption{Schema di funzionamento delle routine del \textit{resolver}.}
54   \label{fig:sock_resolver_schema}
55 \end{figure}
56
57 Inoltre quella fra nomi a dominio e indirizzi IP non è l'unica corrispondenza
58 possibile fra nomi simbolici e valori numerici, come abbiamo visto anche in
59 sez.~\ref{sec:sys_user_group} per le corrispondenze fra nomi di utenti e
60 gruppi e relativi identificatori numerici; per quanto riguarda però tutti i
61 nomi associati a identificativi o servizi relativi alla rete il servizio di
62 risoluzione è gestito in maniera unificata da un insieme di routine fornite
63 con le librerie del C, detto appunto \textit{resolver}.
64
65 Lo schema di funzionamento del \textit{resolver} è illustrato in
66 fig.~\ref{fig:sock_resolver_schema}; in sostanza i programmi hanno a
67 disposizione un insieme di funzioni di libreria con cui chiamano il
68 \textit{resolver}, indicate con le frecce nere. Ricevuta la richiesta è
69 quest'ultimo che, sulla base della sua configurazione, esegue le operazioni
70 necessarie a fornire la risposta, che possono essere la lettura delle
71 informazioni mantenute nei relativi dei file statici presenti sulla macchina,
72 una interrogazione ad un DNS (che a sua volta, per il funzionamento del
73 protocollo, può interrogarne altri) o la richiesta ad altri server per i quali
74 sia fornito il supporto, come LDAP.\footnote{la sigla LDAP fa riferimento ad
75   un protocollo, il \textit{Lightweight Directory Access Protocol}, che
76   prevede un meccanismo per la gestione di \textsl{elenchi} di informazioni
77   via rete; il contenuto di un elenco può essere assolutamente generico, e
78   questo permette il mantenimento dei più vari tipi di informazioni su una
79   infrastruttura di questo tipo.}
80
81 La configurazione del \textit{resolver} attiene più alla amministrazione di
82 sistema che alla programmazione, ciò non di meno, prima di trattare le varie
83 funzioni di librerie utilizzate dai programmi, vale la pena fare una
84 panoramica generale.  Originariamente la configurazione del \textit{resolver}
85 riguardava esclusivamente le questioni relative alla gestione dei nomi a
86 dominio, e prevedeva solo l'utilizzo del DNS e del file statico
87 \file{/etc/hosts}.
88
89 Per questo aspetto il file di configurazione principale del sistema è
90 \file{/etc/resolv.conf} che contiene in sostanza l'elenco degli indirizzi IP
91 dei server DNS da contattare; a questo si affianca il file
92 \file{/etc/host.conf} il cui scopo principale è indicare l'ordine in cui
93 eseguire la risoluzione dei nomi (se usare prima i valori di \file{/etc/hosts}
94 o quelli del DNS). Tralasciamo i dettagli relativi alle varie direttive che
95 possono essere usate in questi file, che si trovano nelle rispettive pagine di
96 manuale.
97
98 Con il tempo però è divenuto possibile fornire diversi sostituti per
99 l'utilizzo delle associazione statiche in \file{/etc/hosts}, inoltre oltre
100 alla risoluzione dei nomi a dominio ci sono anche altri nomi da risolvere,
101 come quelli che possono essere associati ad una rete (invece che ad una
102 singola macchina) o ai gruppi di macchine definiti dal servizio
103 NIS,\footnote{il \textit{Network Information Service} è un servizio, creato da
104   Sun, e poi diffuso su tutte le piattaforme unix-like, che permette di
105   raggruppare all'interno di una rete (in quelli che appunto vengono chiamati
106   \textit{netgroup}) varie macchine, centralizzando i servizi di definizione
107   di utenti e gruppi e di autenticazione, oggi è sempre più spesso sostituito
108   da LDAP.} o come quelli dei protocolli e dei servizi che sono mantenuti nei
109 file statici \file{/etc/protocols} e \file{/etc/services}.  Molte di queste
110 informazioni non si trovano su un DNS, ma in una rete locale può essere molto
111 utile centralizzare il mantenimento di alcune di esse su opportuni server.
112 Inoltre l'uso di diversi supporti possibili per le stesse informazioni (ad
113 esempio il nome delle macchine può essere mantenuto sia tramite
114 \file{/etc/hosts}, che con il DNS, che con NIS) comporta il problema
115 dell'ordine in cui questi vengono interrogati.\footnote{con le implementazioni
116   classiche i vari supporti erano introdotti modificando direttamente le
117   funzioni di libreria, prevedendo un ordine di interrogazione predefinito e
118   non modificabile (a meno di una ricompilazione delle librerie stesse).}
119
120 Per risolvere questa serie di problemi la risoluzione dei nomi a dominio
121 eseguirà dal \textit{resolver} è stata inclusa all'interno di un meccanismo
122 generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi
123 associate chiamato \textit{Name Service Switch}\footnote{il sistema è stato
124   introdotto la prima volta nelle librerie standard di Solaris, le \acr{glibc}
125   hanno ripreso lo stesso schema, si tenga presente che questo sistema non
126   esiste per altre librerie standard come le \acr{libc5} o le \acr{uclib}.}
127 cui abbiamo accennato anche in sez.~\ref{sec:sys_user_group} per quanto
128 riguarda la gestione dei dati associati a utenti e gruppi.  Il \textit{Name
129   Service Switch} (cui spesso si fa riferimento con l'acronimo NSS) è un
130 sistema di librerie dinamiche che permette di definire in maniera generica sia
131 i supporti su cui mantenere i dati di corrispondenza fra nomi e valori
132 numerici, sia l'ordine in cui effettuare le ricerche sui vari supporti
133 disponibili. Il sistema prevede una serie di possibili classi di
134 corrispondenza, quelle attualmente definite sono riportate in
135 tab.~\ref{tab:sys_NSS_classes}.
136
137 \begin{table}[htb]
138   \footnotesize
139   \centering
140   \begin{tabular}[c]{|l|p{8cm}|}
141     \hline
142     \textbf{Classe} & \textbf{Tipo di corrispondenza}\\
143     \hline
144     \hline
145     \texttt{shadow}   & corrispondenze fra username e proprietà dell'utente
146                        (\acr{uid}, ecc.).\\  
147     \texttt{group}    & corrispondenze fra nome del gruppo e proprietà dello 
148                         stesso.\\  
149     \texttt{aliases}  & alias per la posta elettronica\\ 
150     \texttt{ethers}   & corrispondenze fra numero IP e MAC address della
151                         scheda di rete.\\ 
152     \texttt{hosts}    & corrispondenze fra nome a dominio e numero IP.\\ 
153     \texttt{netgroup} & corrispondenze gruppo di rete e macchine che lo
154                         compongono.\\  
155     \texttt{networks} & corrispondenze fra nome di una rete e suo indirizzo
156                         IP.\\  
157     \texttt{protocols}& corrispondenze fra nome di un protocollo e relativo
158                         numero identificativo.\\ 
159     \texttt{rpc}      & corrispondenze fra nome di un servizio RPC e relativo 
160                         numero identificativo.\\ 
161     \texttt{services} & corrispondenze fra nome di un servizio e numero di
162                         porta. \\ 
163     \hline
164   \end{tabular}
165   \caption{Le diverse classi di corrispondenze definite
166     all'interno del \textit{Name Service Switch}.} 
167   \label{tab:sys_NSS_classes}
168 \end{table}
169
170 Il sistema  del \textit{Name Service  Switch} è controllato dal  contenuto del
171 file \file{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo una
172   convezione  comune per  i  file  di configurazione  le  righe vuote  vengono
173   ignorate  e  tutto  quello  che  segue un  carattere  ``\texttt{\#}''  viene
174   considerato un  commento.} di configurazione per ciascuna  di queste classi,
175 che  viene inizia  col nome  di tab.~\ref{tab:sys_NSS_classes}  seguito  da un
176 carattere ``\texttt{:}'' e  prosegue con la lista dei  \textsl{servizi} su cui
177 le  relative informazioni sono  raggiungibili, scritti  nell'ordine in  cui si
178 vuole siano interrogati.
179
180 Ogni  servizio è  specificato  a sua  volta  da un  nome, come  \texttt{file},
181 \texttt{dns},  \texttt{db},  ecc.  che  identifica la  libreria  dinamica  che
182 realizza l'interfaccia  con esso. Per  ciascun servizio se \texttt{NAME}  è il
183 nome  utilizzato  dentro   \file{/etc/nsswitch.conf},  dovrà  essere  presente
184 (usualmente  in   \file{/lib})  una  libreria   \texttt{libnss\_NAME}  che  ne
185 implementa le funzioni.
186
187 In ogni caso, qualunque sia la modalità con cui ricevono i dati o il supporto
188 su cui vengono mantenuti, e che si usino o meno funzionalità aggiuntive
189 fornire dal sistema del \textit{Name Service Switch}, dal punto di vista di un
190 programma che deve effettuare la risoluzione di un nome a dominio, tutto
191 quello che conta sono le funzioni classiche che il \textit{resolver} mette a
192 disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
193   tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
194 quelle che tratteremo nelle sezioni successive.
195
196
197 \subsection{Le funzioni di interrogazione del \textit{resolver}}
198 \label{sec:sock_resolver_functions}
199
200 Prima di trattare le funzioni usate normalmente nella risoluzione dei nomi a
201 dominio conviene trattare in maniera più dettagliata il meccanismo principale
202 da esse utilizzato e cioè quello del servizio DNS. Come accennato questo,
203 benché in teoria sia solo uno dei possibili supporti su cui mantenere le
204 informazioni, in pratica costituisce il meccanismo principale con cui vengono
205 risolti i nomi a dominio.  Per questo motivo esistono una serie di funzioni di
206 libreria che servono specificamente ad eseguire delle interrogazioni verso un
207 server DNS, funzioni che poi vengono utilizzate per realizzare le funzioni
208 generiche di libreria usate anche dal sistema del \textit{resolver}.
209
210 Il sistema del DNS è in sostanza di un database distribuito organizzato in
211 maniera gerarchica, i dati vengono mantenuti in tanti server distinti ciascuno
212 dei quali si occupa della risoluzione del proprio \textsl{dominio}; i nomi a
213 dominio sono organizzati in una struttura ad albero analoga a quella
214 dell'albero dei file, con domini di primo livello (come i \texttt{.org}),
215 secondo livello (come \texttt{.truelite.it}), ecc.  In questo caso le
216 separazioni sono fra i vari livelli sono definite dal carattere ``\texttt{.}''
217 ed i nomi devono essere risolti da destra verso sinistra.\footnote{per chi si
218   stia chiedendo quale sia la radice di questo albero, cioè l'equivalente di
219   ``\texttt{/}'', la risposta è il dominio speciale ``\texttt{.}'', che in
220   genere non viene mai scritto esplicitamente, ma che, come chiunque abbia
221   configurato un server DNS sa bene, esiste ed è gestito dai cosiddetti
222   \textit{root DNS} che risolvono i domini di primo livello.} Il meccanismo
223 funziona con il criterio della \textsl{delegazione}, un server responsabile
224 per un dominio di primo livello può delegare la risoluzione degli indirizzi
225 per un suo dominio di secondo livello ad un altro server, il quale a sua volta
226 potrà delegare la risoluzione di un eventuale sottodominio di terzo livello ad
227 un altro server ancora.
228
229 In realtà un server DNS è in grado di fare altro rispetto alla risoluzione di
230 un nome a dominio in un indirizzo IP; ciascuna voce nel database viene
231 chiamata \textit{resource record}, e può contenere diverse informazioni. In
232 genere i \textit{resource record} vengono classificati per la \textsl{classe
233   di indirizzi} cui i dati contenuti fanno riferimento, e per il \textsl{tipo}
234 di questi ultimi.\footnote{ritroveremo classi di indirizzi e tipi di record
235   più avanti in tab.~\ref{tab:DNS_address_class} e
236   tab.~\ref{tab:DNS_record_type}.}  Oggigiorno i dati mantenuti nei server DNS
237 sono quasi esclusivamente relativi ad indirizzi internet, per cui in pratica
238 viene utilizzata soltanto una classe di indirizzi; invece le corrispondenze
239 fra un nome a dominio ed un indirizzo IP sono solo uno fra i vari tipi di
240 informazione che un server DNS fornisce normalmente.
241
242 L'esistenza di vari tipi di informazioni è un altro dei motivi per cui il
243 \textit{resolver} prevede, rispetto a quelle relative alla semplice
244 risoluzione dei nomi, un insieme di funzioni specifiche dedicate
245 all'interrogazione di un server DNS; la prima di queste funzioni è
246 \funcd{res\_init}, il cui prototipo è:
247 \begin{functions}
248   \headdecl{netinet/in.h} \headdecl{arpa/nameser.h} \headdecl{resolv.h}
249   \funcdecl{int res\_init(void)}
250
251 Inizializza il sistema del \textit{resolver}.
252
253 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
254   errore.}
255 \end{functions}
256
257 La funzione legge il contenuto dei file di configurazione (i già citati
258 \file{resolv.conf} e \file{host.conf}) per impostare il dominio di default,
259 gli indirizzi dei server DNS da contattare e l'ordine delle ricerche; se non
260 sono specificati server verrà utilizzato l'indirizzo locale, e se non è
261 definito un dominio di default sarà usato quello associato con l'indirizzo
262 locale (ma questo può essere sovrascritto con l'uso della variabile di
263 ambiente \texttt{LOCALDOMAIN}). In genere non è necessario eseguire questa
264 funzione direttamente in quanto viene automaticamente chiamata la prima volta
265 che si esegue una delle altre.
266
267 Le impostazioni e lo stato del \textit{resolver} vengono mantenuti in una
268 serie di variabili raggruppate nei campi di una apposita struttura \var{\_res}
269 usata da tutte queste funzioni. Essa viene definita in \file{resolv.h} ed è
270 utilizzata internamente alle funzioni essendo definita come variabile globale;
271 questo consente anche di accedervi direttamente all'interno di un qualunque
272 programma, una volta che la sia opportunamente dichiarata come:
273 \includecodesnip{listati/resolv_option.c}
274
275 Tutti i campi della struttura sono ad uso interno, e vengono usualmente
276 inizializzati da \func{res\_init} in base al contenuto dei file di
277 configurazione e ad una serie di valori di default. L'unico campo che può
278 essere utile modificare è \var{\_res.options}, una maschera binaria che
279 contiene una serie di bit di opzione che permettono di controllare il
280 comportamento del \textit{resolver}. 
281
282 \begin{table}[htb]
283   \centering
284   \footnotesize
285   \begin{tabular}[c]{|l|p{8cm}|}
286     \hline
287     \textbf{Costante} & \textbf{Significato} \\
288     \hline
289     \hline
290     \const{RES\_INIT}       & viene attivato se è stata chiamata
291                               \func{res\_init}. \\
292     \const{RES\_DEBUG}      & stampa dei messaggi di debug.\\
293     \const{RES\_AAONLY}     & accetta solo risposte autoritative.\\
294     \const{RES\_USEVC}      & usa connessioni TCP per contattare i server 
295                               invece che l'usuale UDP.\\
296     \const{RES\_PRIMARY}    & interroga soltanto server DNS primari.
297                               \\
298     \const{RES\_IGNTC}      & ignora gli errori di troncamento, non ritenta la
299                               richiesta con una connessione TCP.\\
300     \const{RES\_RECURSE}    & imposta il bit che indica che si desidera
301                               eseguire una interrogazione ricorsiva.\\
302     \const{RES\_DEFNAMES}   & se attivo \func{res\_search} aggiunge il nome
303                               del dominio di default ai nomi singoli (che non
304                               contengono cioè un ``\texttt{.}'').\\
305     \const{RES\_STAYOPEN}   & usato con \const{RES\_USEVC} per mantenere
306                               aperte le connessioni TCP fra interrogazioni
307                               diverse. \\
308     \const{RES\_DNSRCH}     & se attivo \func{res\_search} esegue le ricerche
309                               di nomi di macchine nel dominio corrente o nei
310                               domini ad esso sovrastanti.\\
311     \const{RES\_INSECURE1}  & blocca i controlli di sicurezza di tipo 1.\\
312     \const{RES\_INSECURE2}  & blocca i controlli di sicurezza di tipo 2.\\
313     \const{RES\_NOALIASES}  & blocca l'uso della variabile di ambiente
314                               \texttt{HOSTALIASES}.\\ 
315     \const{RES\_USE\_INET6} & restituisce indirizzi IPv6 con
316                               \func{gethostbyname}. \\
317     \const{RES\_ROTATE}     & ruota la lista dei server DNS dopo ogni
318                               interrogazione.\\
319     \const{RES\_NOCHECKNAME}& non controlla i nomi per verificarne la
320                               correttezza sintattica. \\
321     \const{RES\_KEEPTSIG}   & non elimina i record di tipo \texttt{TSIG}.\\
322     \const{RES\_BLAST}      & \\
323     \const{RES\_DEFAULT}    & è l'insieme di \const{RES\_RECURSE},
324                               \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}.\\
325     \hline
326   \end{tabular}
327   \caption{Costanti utilizzabili come valori per \var{\_res.options}.}
328   \label{tab:resolver_option}
329 \end{table}
330
331 Per utilizzare questa funzionalità per modificare le impostazioni direttamente
332 da programma occorrerà impostare un opportuno valore per questo campo ed
333 invocare esplicitamente \func{res\_init}, dopo di che le altre funzioni
334 prenderanno le nuove impostazioni. Le costanti che definiscono i vari bit di
335 questo campo, ed il relativo significato sono illustrate in
336 tab.~\ref{tab:resolver_option}; trattandosi di una maschera binaria un valore
337 deve essere espresso con un opportuno OR aritmetico di dette costanti; ad
338 esempio il valore di default delle opzioni, espresso dalla costante
339 \const{RES\_DEFAULT}, è definito come:
340 \includecodesnip{listati/resolv_option_def.c}
341
342 Non tratteremo il significato degli altri campi non essendovi necessità di
343 modificarli direttamente; gran parte di essi sono infatti impostati dal
344 contenuto dei file di configurazione, mentre le funzionalità controllate da
345 alcuni di esse possono essere modificate con l'uso delle opportune variabili
346 di ambiente come abbiamo visto per \texttt{LOCALDOMAIN}. In particolare con
347 \texttt{RES\_RETRY} si soprassiede il valore del campo \var{retry} che
348 controlla quante volte viene ripetuto il tentativo di connettersi ad un server
349 DNS prima di dichiarare fallimento; il valore di default è 4, un valore nullo
350 significa bloccare l'uso del DNS. Infine con \texttt{RES\_TIMEOUT} si
351 soprassiede il valore del campo \var{retrans},\footnote{preimpostato al valore
352   della omonima costante \const{RES\_TIMEOUT} di \file{resolv.h}.} che è il
353 valore preso come base (in numero di secondi) per definire la scadenza di una
354 richiesta, ciascun tentativo di richiesta fallito viene ripetuto raddoppiando
355 il tempo di scadenza per il numero massimo di volte stabilito da
356 \texttt{RES\_RETRY}.
357
358 La funzione di interrogazione principale è \funcd{res\_query}, che serve ad
359 eseguire una richiesta ad un server DNS per un nome a dominio
360 \textsl{completamente specificato} (quello che si chiama FQDN, \textit{Fully
361   Qualified Domain Name}); il suo prototipo è:
362
363 \begin{functions}
364 \headdecl{netinet/in.h}
365 \headdecl{arpa/nameser.h}
366 \headdecl{resolv.h}
367 \funcdecl{int res\_query(const char *dname, int class, int type,
368               unsigned char *answer, int anslen)}
369
370   Esegue una interrogazione al DNS.
371
372 \bodydesc{La funzione restituisce un valore positivo pari alla lunghezza dei
373     dati scritti nel buffer \param{answer} in caso di successo e -1 in caso di
374     errore.}
375 \end{functions}
376
377 La funzione esegue una interrogazione ad un server DNS relativa al nome da
378 risolvere passato nella stringa indirizzata da \param{dname}, inoltre deve
379 essere specificata la classe di indirizzi in cui eseguire la ricerca con
380 \param{class}, ed il tipo di \textit{resource record} che si vuole ottenere
381 con \param{type}. Il risultato della ricerca verrà scritto nel buffer di
382 lunghezza \param{anslen} puntato da \param{answer} che si sarà opportunamente
383 allocato in precedenza.
384
385
386 Una seconda funzione di ricerca, analoga a \func{res\_query}, che prende gli
387 stessi argomenti, ma che esegue l'interrogazione con le funzionalità
388 addizionali previste dalle due opzioni \const{RES\_DEFNAMES} e
389 \const{RES\_DNSRCH}, è \funcd{res\_search}, il cui prototipo è:
390 \begin{functions}
391 \headdecl{netinet/in.h}
392 \headdecl{arpa/nameser.h}
393 \headdecl{resolv.h}
394 \funcdecl{int res\_search(const char *dname, int class, int type,
395               unsigned char *answer, int anslen)}
396
397   Esegue una interrogazione al DNS.
398   
399   \bodydesc{La funzione restituisce un valore positivo pari alla lunghezza dei
400     dati scritti nel buffer \param{answer} in caso di successo e -1 in caso di
401     errore.}
402 \end{functions}
403
404 In sostanza la funzione ripete una serie di chiamate a \func{res\_query}
405 aggiungendo al nome contenuto nella stringa \param{dname} il dominio di
406 default da cercare, fermandosi non appena trova un risultato.  Il risultato di
407 entrambe le funzioni viene scritto nel formato opportuno (che sarà diverso a
408 seconda del tipo di record richiesto) nel buffer di ritorno; sarà compito del
409 programma (o di altre funzioni) estrarre i relativi dati, esistono una serie
410 di funzioni interne usate per la scansione di questi dati, per chi fosse
411 interessato una trattazione dettagliata è riportata nel quattordicesimo
412 capitolo di \cite{DNSbind}.
413
414 Le classi di indirizzi supportate da un server DNS sono tre, ma di queste in
415 pratica oggi viene utilizzata soltanto quella degli indirizzi internet; le
416 costanti che identificano dette classi, da usare come valore per l'argomento
417 \param{class} delle precedenti funzioni, sono riportate in
418 tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe
419   \const{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta.}
420
421 \begin{table}[htb]
422   \centering
423   \footnotesize
424   \begin{tabular}[c]{|l|p{8cm}|}
425     \hline
426     \textbf{Costante} & \textbf{Significato} \\
427     \hline
428     \hline
429     \const{C\_IN}   & indirizzi internet, in pratica i soli utilizzati oggi.\\
430     \const{C\_HS}   & indirizzi \textit{Hesiod}, utilizzati solo al MIT, oggi
431                       completamente estinti. \\
432     \const{C\_CHAOS}& indirizzi per la rete \textit{Chaosnet}, un'altra rete
433                       sperimentale nata al MIT. \\
434     \const{C\_ANY}  & indica un indirizzo di classe qualunque.\\
435     \hline
436   \end{tabular}
437   \caption{Costanti identificative delle classi di indirizzi per l'argomento
438     \param{class} di \func{res\_query}.}
439   \label{tab:DNS_address_class}
440 \end{table}
441
442 Come accennato le tipologie di dati che sono mantenibili su un server DNS sono
443 diverse, ed a ciascuna di essa corrisponde un diverso tipo di \textit{resource
444   record}. L'elenco delle costanti\footnote{ripreso dai file di dichiarazione
445   \file{arpa/nameser.h} e \file{arpa/nameser\_compat.h}.} che definiscono i
446 valori che si possono usare per l'argomento \param{type} per specificare il
447 tipo di \textit{resource record} da richiedere è riportato in
448 tab.~\ref{tab:DNS_record_type}; le costanti (tolto il \texttt{T\_} iniziale)
449 hanno gli stessi nomi usati per identificare i record nei file di zona di
450 BIND,\footnote{BIND, acronimo di \textit{Berkley Internet Name Domain}, è una
451   implementazione di un server DNS, ed, essendo utilizzata nella stragrande
452   maggioranza dei casi, fa da riferimento; i dati relativi ad un certo
453   dominio (cioè i suoi \textit{resource record} vengono mantenuti in quelli
454   che sono usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo
455   di dominio è identificato da un nome che è appunto identico a quello delle
456   costanti di tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.}
457 e che normalmente sono anche usati come nomi per indicare i record.
458
459 \begin{table}[!htb]
460   \centering
461   \footnotesize
462   \begin{tabular}[c]{|l|l|}
463     \hline
464     \textbf{Costante} & \textbf{Significato} \\
465     \hline
466     \hline
467     \const{T\_A}     & indirizzo di una stazione.\\
468     \const{T\_NS}    & server DNS autoritativo per il dominio richiesto.\\
469     \const{T\_MD}    & destinazione per la posta elettronica.\\
470     \const{T\_MF}    & redistributore per la posta elettronica.\\
471     \const{T\_CNAME} & nome canonico.\\
472     \const{T\_SOA}   & inizio di una zona di autorità.\\
473     \const{T\_MB}    & nome a dominio di una casella di posta.\\
474     \const{T\_MG}    & nome di un membro di un gruppo di posta.\\
475     \const{T\_MR}    & nome di un cambiamento di nome per la posta.\\
476     \const{T\_NULL}  & record nullo.\\
477     \const{T\_WKS}   & servizio noto.\\
478     \const{T\_PTR}   & risoluzione inversa di un indirizzo numerico.\\
479     \const{T\_HINFO} & informazione sulla stazione.\\
480     \const{T\_MINFO} & informazione sulla casella di posta.\\
481     \const{T\_MX}    & server cui instradare la posta per il dominio.\\
482     \const{T\_TXT}   & stringhe di testo (libere).\\
483     \const{T\_RP}    & nome di un responsabile (\textit{responsible person}).\\
484     \const{T\_AFSDB} & database per una cella AFS.\\
485     \const{T\_X25}   & indirizzo di chiamata per X.25.\\
486     \const{T\_ISDN}  & indirizzo di chiamata per ISDN.\\
487     \const{T\_RT}    & router.\\
488     \const{T\_NSAP}  & indirizzo NSAP.\\
489     \const{T\_NSAP\_PTR}& risoluzione inversa per NSAP (deprecato).\\
490     \const{T\_SIG}   & firma digitale di sicurezza.\\
491     \const{T\_KEY}   & chiave per firma.\\
492     \const{T\_PX}    & corrispondenza per la posta X.400.\\
493     \const{T\_GPOS}  & posizione geografica.\\
494     \const{T\_AAAA}  & indirizzo IPv6.\\
495     \const{T\_LOC}   & informazione di collocazione.\\
496     \const{T\_NXT}   & dominio successivo.\\
497     \const{T\_EID}   & identificatore di punto conclusivo.\\
498     \const{T\_NIMLOC}& posizionatore \textit{nimrod}.\\
499     \const{T\_SRV}   & servizio.\\
500     \const{T\_ATMA}  & indirizzo ATM.\\
501     \const{T\_NAPTR} & puntatore ad una \textit{naming authority} .\\
502     \const{T\_TSIG}  & firma di transazione.\\
503     \const{T\_IXFR}  & trasferimento di zona incrementale.\\
504     \const{T\_AXFR}  & trasferimento di zona di autorità.\\
505     \const{T\_MAILB} & trasferimento di record di caselle di posta.\\
506     \const{T\_MAILA} & trasferimento di record di server di posta.\\
507     \const{T\_ANY}   & valore generico.\\
508     \hline
509   \end{tabular}
510   \caption{Costanti identificative del tipo di record per l'argomento
511     \param{type} di \func{res\_query}.}
512   \label{tab:DNS_record_type}
513 \end{table}
514
515
516 L'elenco di tab.~\ref{tab:DNS_record_type} è quello di \textsl{tutti} i
517 \textit{resource record} definiti, con una breve descrizione del relativo
518 significato.  Di tutti questi però viene impiegato correntemente solo un
519 piccolo sottoinsieme, alcuni sono obsoleti ed altri fanno riferimento a dati
520 applicativi che non ci interessano non avendo nulla a che fare con la
521 risoluzione degli indirizzi IP, pertanto non entreremo nei dettagli del
522 significato di tutti i \textit{resource record}, ma solo di quelli usati dalle
523 funzioni del \textit{resolver}. Questi sono sostanzialmente i seguenti (per
524 indicarli si è usata la notazione dei file di zona di BIND):
525 \begin{basedescript}{\desclabelwidth{1.2cm}\desclabelstyle{\nextlinelabel}}
526 \item[\texttt{A}] viene usato per indicare la corrispondenza fra un nome a
527   dominio ed un indirizzo IPv4; ad esempio la corrispondenza fra
528   \texttt{dodds.truelite.it} e l'indirizzo IP \texttt{62.48.34.25}.
529 \item[\texttt{AAAA}] viene usato per indicare la corrispondenza fra un nome a
530   dominio ed un indirizzo IPv6; è chiamato in questo modo dato che la
531   dimensione di un indirizzo IPv6 è quattro volte quella di un indirizzo IPv4.
532 \item[\texttt{PTR}] per fornire la corrispondenza inversa fra un indirizzo IP
533   ed un nome a dominio ad esso associato si utilizza questo tipo di record (il
534   cui nome sta per \textit{pointer}).
535 \item[\texttt{CNAME}] qualora si abbiamo più nomi che corrispondono allo
536   stesso indirizzo (come ad esempio \texttt{www.truelite.it}, o
537   \texttt{sources.truelite.it}, che fanno sempre riferimento a
538   \texttt{dodds.truelite.it}) si può usare questo tipo di record per creare
539   degli \textit{alias} in modo da associare un qualunque altro nome al
540   \textsl{nome canonico} della macchina (si chiama così quello associato al
541   record \texttt{A}).
542 \end{basedescript}
543
544 Come accennato in caso di successo le due funzioni di richiesta restituiscono
545 il risultato della interrogazione al server, in caso di insuccesso l'errore
546 invece viene segnalato da un valore di ritorno pari a -1, ma in questo caso,
547 non può essere utilizzata la variabile \var{errno} per riportare un codice di
548 errore, in quanto questo viene impostato per ciascuna delle chiamate al
549 sistema utilizzate dalle funzioni del \textit{resolver}, non avrà alcun
550 significato nell'indicare quale parte del procedimento di risoluzione è
551 fallita.
552
553 Per questo motivo è stata definita una variabile di errore separata,
554 \var{h\_errno}, che viene utilizzata dalle funzioni del \textit{resolver} per
555 indicare quale problema ha causato il fallimento della risoluzione del nome.
556 Ad essa si può accedere una volta che la si dichiara con:
557 \includecodesnip{listati/herrno.c} 
558 ed i valori che può assumere, con il relativo significato, sono riportati in
559 tab.~\ref{tab:h_errno_values}.
560
561 \begin{table}[!htb]
562   \centering
563   \footnotesize
564   \begin{tabular}[c]{|l|p{10cm}|}
565     \hline
566     \textbf{Costante} & \textbf{Significato} \\
567     \hline
568     \hline
569     \const{HOST\_NOT\_FOUND} & l'indirizzo richiesto non è valido e la
570                                macchina indicata è sconosciuta. \\
571     \const{NO\_ADDRESS}      & il nome a dominio richiesto è valido, ma non ha
572                                un indirizzo associato ad esso
573                                (alternativamente può essere indicato come 
574                                \const{NO\_DATA}). \\
575     \const{NO\_RECOVERY}     & si è avuto un errore non recuperabile
576                                nell'interrogazione di un server DNS. \\
577     \const{TRY\_AGAIN}       & si è avuto un errore temporaneo
578                                nell'interrogazione di un server DNS, si può
579                                ritentare l'interrogazione in un secondo
580                                tempo. \\
581     \hline
582   \end{tabular}
583   \caption{Valori possibili della variabile \var{h\_errno}.}
584   \label{tab:h_errno_values}
585 \end{table}
586
587 Insieme alla nuova variabile vengono definite anche due nuove funzioni per
588 stampare l'errore a video, analoghe a quelle di sez.~\ref{sec:sys_strerror}
589 per \var{errno}, ma che usano il valore di \var{h\_errno}; la prima è
590 \funcd{herror} ed il suo prototipo è:
591 \begin{functions}
592 \headdecl{netdb.h}
593 \funcdecl{void herror(const char *string)}
594
595 Stampa un errore di risoluzione.
596 \end{functions}
597
598 La funzione è l'analoga di \func{perror} e stampa sullo standard error un
599 messaggio di errore corrispondente al valore corrente di \var{h\_errno}, a cui
600 viene anteposta la stringa \param{string} passata come argomento.  La seconda
601 funzione è \funcd{hstrerror} ed il suo prototipo è:
602 \begin{functions}
603 \headdecl{netdb.h}
604 \funcdecl{const char *hstrerror(int err)}
605
606 Restituisce una stringa corrispondente ad un errore di risoluzione.
607 \end{functions}
608 \noindent che, come  l'analoga \func{strerror}, restituisce una stringa con un
609 messaggio di errore già formattato, corrispondente al codice passato come
610 argomento (che si presume sia dato da \var{h\_errno}).
611 \index{\textit{resolver}|)}
612
613
614
615
616 \subsection{La risoluzione dei nomi a dominio}
617 \label{sec:sock_name_services}
618
619 La principale funzionalità del \index{\textit{resolver}}\textit{resolver}
620 resta quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
621 dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le
622 funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui
623 scopo è ottenere l'indirizzo di una stazione noto il suo nome a dominio, il
624 suo prototipo è:
625 \begin{prototype}{netdb.h}
626 {struct hostent *gethostbyname(const char *name)}
627
628 Determina l'indirizzo associato al nome a dominio \param{name}.
629
630 \bodydesc{La funzione restituisce in caso di successo il puntatore ad una
631   struttura di tipo \struct{hostent} contenente i dati associati al nome a
632   dominio, o un puntatore nullo in caso di errore.}
633 \end{prototype}
634
635 La funzione prende come argomento una stringa \param{name} contenente il nome
636 a dominio che si vuole risolvere, in caso di successo i dati ad esso relativi
637 vengono memorizzati in una opportuna struttura \struct{hostent} la cui
638 definizione è riportata in fig.~\ref{fig:sock_hostent_struct}. 
639
640 \begin{figure}[!htb]
641   \footnotesize \centering
642   \begin{minipage}[c]{15cm}
643     \includestruct{listati/hostent.h}
644   \end{minipage}
645   \caption{La struttura \structd{hostent} per la risoluzione dei nomi a
646     dominio e degli indirizzi IP.}
647   \label{fig:sock_hostent_struct}
648 \end{figure}
649
650 Quando un programma chiama \func{gethostbyname} e questa usa il DNS per
651 effettuare la risoluzione del nome, è con i valori contenuti nei relativi
652 record che vengono riempite le varie parti della struttura \struct{hostent}.
653 Il primo campo della struttura, \var{h\_name} contiene sempre il \textsl{nome
654   canonico}, che nel caso del DNS è appunto il nome associato ad un record
655 \texttt{A}. Il secondo campo della struttura, \var{h\_aliases}, invece è un
656 puntatore ad vettore di puntatori, terminato da un puntatore nullo. Ciascun
657 puntatore del vettore punta ad una stringa contenente uno degli altri
658 possibili nomi associati allo stesso \textsl{nome canonico} (quelli che nel
659 DNS vengono inseriti come record di tipo \texttt{CNAME}).
660
661 Il terzo campo della struttura, \var{h\_addrtype}, indica il tipo di indirizzo
662 che è stato restituito, e può assumere soltanto i valori \const{AF\_INET} o
663 \const{AF\_INET6}, mentre il quarto campo, \var{h\_length}, indica la
664 lunghezza dell'indirizzo stesso in byte. 
665
666 Infine il campo \var{h\_addr\_list} è il puntatore ad un vettore di puntatori
667 ai singoli indirizzi; il vettore è terminato da un puntatore nullo.  Inoltre,
668 come illustrato in fig.~\ref{fig:sock_hostent_struct}, viene definito il campo
669 \var{h\_addr} come sinonimo di \code{h\_addr\_list[0]}, cioè un riferimento
670 diretto al primo indirizzo della lista.
671
672 Oltre ai normali nomi a dominio la funzione accetta come argomento
673 \param{name} anche indirizzi numerici, in formato dotted decimal per IPv4 o
674 con la notazione illustrata in sez.~\ref{sec:IP_ipv6_notation} per IPv6. In
675 tal caso \func{gethostbyname} non eseguirà nessuna interrogazione remota, ma
676 si limiterà a copiare la stringa nel campo \var{h\_name} ed a creare la
677 corrispondente struttura \var{in\_addr} da indirizzare con
678 \code{h\_addr\_list[0]}.
679
680 Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi
681 IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
682 l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi
683 chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per
684 modificare le opzioni del \index{\textit{resolver}}\textit{resolver}; dato che
685 questo non è molto comodo è stata definita\footnote{questa è una estensione
686   fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.}
687 un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è:
688 \begin{functions}
689   \headdecl{netdb.h} 
690   \headdecl{sys/socket.h}
691   \funcdecl{struct hostent *gethostbyname2(const char *name, int af)}
692
693 Determina l'indirizzo di tipo \param{af} associato al nome a dominio
694 \param{name}.
695
696 \bodydesc{La funzione restituisce in caso di successo il puntatore ad una
697   struttura di tipo \struct{hostent} contenente i dati associati al nome a
698   dominio, o un puntatore nullo in caso di errore.}
699 \end{functions}
700
701 In questo caso la funzione prende un secondo argomento \param{af} che indica
702 (i soli valori consentiti sono \const{AF\_INET} o \const{AF\_INET6}, per
703 questo è necessario l'uso di \texttt{sys/socket.h}) la famiglia di indirizzi
704 che dovrà essere utilizzata nei risultati restituiti dalla funzione. Per tutto
705 il resto la funzione è identica a \func{gethostbyname}, ed identici sono i
706 suoi risultati.
707
708 \begin{figure}[!htb]
709   \footnotesize \centering
710   \begin{minipage}[c]{15cm}
711     \includecodesample{listati/mygethost.c}
712   \end{minipage}
713   \normalsize
714   \caption{Esempio di codice per la risoluzione di un indirizzo.}
715   \label{fig:mygethost_example}
716 \end{figure}
717
718 Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in
719 fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un
720 programma che esegue una semplice interrogazione al
721 \index{\textit{resolver}}\textit{resolver} usando \func{gethostbyname} e poi
722 ne stampa a video i risultati. Al solito il sorgente completo, che comprende
723 il trattamento delle opzioni ed una funzione per stampare un messaggio di
724 aiuto, è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
725
726 Il programma richiede un solo argomento che specifichi il nome da cercare,
727 senza il quale (\texttt{\small 12--15}) esce con un errore. Dopo di che
728 (\texttt{\small 16}) si limita a chiamare \func{gethostbyname}, ricevendo il
729 risultato nel puntatore \var{data}. Questo (\texttt{\small 17--20}) viene
730 controllato per rilevare eventuali errori, nel qual caso il programma esce
731 dopo aver stampato un messaggio con \func{herror}. 
732
733 Se invece la risoluzione è andata a buon fine si inizia (\texttt{\small 21})
734 con lo stampare il nome canonico, dopo di che (\texttt{\small 22--26}) si
735 stampano eventuali altri nomi. Per questo prima (\texttt{\small 22}) si prende
736 il puntatore alla cima della lista che contiene i nomi e poi (\texttt{\small
737   23--26}) si esegue un ciclo che sarà ripetuto fin tanto che nella lista si
738 troveranno dei puntatori validi\footnote{si ricordi che la lista viene
739   terminata da un puntatore nullo.} per le stringhe dei nomi; prima
740 (\texttt{\small 24}) si stamperà la stringa e poi (\texttt{\small 25}) si
741 provvederà ad incrementare il puntatore per passare al successivo elemento
742 della lista.
743
744 Una volta stampati i nomi si passerà a stampare gli indirizzi, il primo passo
745 (\texttt{\small 27--34}) è allora quello di riconoscere il tipo di indirizzo
746 sulla base del valore del campo \var{h\_addrtype}, stampandolo a video. Si è
747 anche previsto di stampare un errore nel caso (che non dovrebbe mai accadere)
748 di un indirizzo non valido.
749
750 Infine (\texttt{\small 35--40}) si stamperanno i valori degli indirizzi, di
751 nuovo (\texttt{\small 35}) si inizializzerà un puntatore alla cima della lista
752 e si eseguirà un ciclo fintanto che questo punterà ad indirizzi validi in
753 maniera analoga a quanto fatto in precedenza per i nomi a dominio. Si noti
754 come, essendo il campo \var{h\_addr\_list} un puntatore ad strutture di
755 indirizzi generiche, questo sia ancora di tipo \texttt{char **} e si possa
756 riutilizzare lo stesso puntatore usato per i nomi.
757
758 Per ciascun indirizzo valido si provvederà (\texttt{\small 37}) ad una
759 conversione con la funzione \func{inet\_ntop} (vedi
760 sez.~\ref{sec:sock_addr_func}) passandole gli opportuni argomenti, questa
761 restituirà la stringa da stampare (\texttt{\small 38}) con il valore
762 dell'indirizzo in \var{buffer}, che si è avuto la cura di dichiarare
763 inizialmente (\texttt{\small 10}) con dimensioni adeguate; dato che la
764 funzione è in grado di tenere conto automaticamente del tipo di indirizzo non
765 ci sono precauzioni particolari da prendere.\footnote{volendo essere pignoli
766   si dovrebbe controllarne lo stato di uscita, lo si è tralasciato per non
767   appesantire il codice, dato che in caso di indirizzi non validi si sarebbe
768   avuto un errore con \func{gethostbyname}, ma si ricordi che la sicurezza non
769   è mai troppa.}
770
771 Le funzioni illustrate finora hanno un difetto: utilizzando una area di
772 memoria interna per allocare i contenuti della struttura \struct{hostent} non
773 possono essere rientranti. Questo comporta anche che in due successive
774 chiamate i dati potranno essere sovrascritti. Si tenga presente poi che
775 copiare il contenuto della sola struttura non è sufficiente per salvare tutti
776 i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
777 essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
778 una chiamata, occorrerà eseguire quella che si chiama una
779 \index{\textit{deep~copy}}\textit{deep copy}.\footnote{si chiama così quella
780   tecnica per cui, quando si deve copiare il contenuto di una struttura
781   complessa (con puntatori che puntano ad altri dati, che a loro volta possono
782   essere puntatori ad altri dati) si deve copiare non solo il contenuto della
783   struttura, ma eseguire una scansione per risolvere anche tutti i puntatori
784   contenuti in essa (e così via se vi sono altre sottostrutture con altri
785   puntatori) e copiare anche i dati da questi referenziati.}
786
787 Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
788 versioni rientranti delle precedenti funzioni, al solito queste sono
789 caratterizzate dall'avere un suffisso \texttt{\_r}, pertanto avremo le due
790 funzioni \funcd{gethostbyname\_r} e \funcd{gethostbyname2\_r} i cui prototipi
791 sono:
792 \begin{functions}
793   \headdecl{netdb.h} 
794   \headdecl{sys/socket.h}
795   \funcdecl{int gethostbyname\_r(const char *name, struct hostent *ret, 
796     char *buf, size\_t buflen, struct hostent **result, int *h\_errnop)}
797   \funcdecl{int gethostbyname2\_r(const char *name, int af,
798          struct hostent *ret, char *buf, size\_t buflen, 
799          struct hostent **result, int *h\_errnop)}
800   
801   Versioni rientranti delle funzioni \func{gethostbyname} e
802   \func{gethostbyname2}. 
803        
804   \bodydesc{Le funzioni restituiscono 0 in caso di successo ed un valore
805     negativo in caso di errore.}
806 \end{functions}
807
808 Gli argomenti \param{name} (e \param{af} per \func{gethostbyname2\_r}) hanno
809 lo stesso significato visto in precedenza. Tutti gli altri argomenti hanno lo
810 stesso significato per entrambe le funzioni. Per evitare l'uso di variabili
811 globali si dovrà allocare preventivamente una struttura \struct{hostent} in
812 cui ricevere il risultato, passandone l'indirizzo alla funzione nell'argomento
813 \param{ret}.  Inoltre, dato che \struct{hostent} contiene dei puntatori, dovrà
814 essere allocato anche un buffer in cui le funzioni possano scrivere tutti i
815 dati del risultato dell'interrogazione da questi puntati; l'indirizzo e la
816 lunghezza di questo buffer devono essere indicati con gli argomenti
817 \param{buf} e \param{buflen}.
818
819 Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati
820 come \index{\textit{value~result~argument}}\textit{value result argument}, si
821 deve specificare l'indirizzo della variabile su cui la funzione dovrà salvare
822 il codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
823 puntatore che si userà per accedere i dati con \param{result}.
824
825 In caso di successo entrambe le funzioni restituiscono un valore nullo,
826 altrimenti restituiscono un codice di errore negativo e all'indirizzo puntato
827 da \param{result} sarà salvato un puntatore nullo, mentre a quello puntato da
828 \param{h\_errnop} sarà salvato il valore del codice di errore, dato che per
829 essere rientrante la funzione non può la variabile globale \var{h\_errno}. In
830 questo caso il codice di errore, oltre ai valori di
831 tab.~\ref{tab:h_errno_values}, può avere anche quello di \errcode{ERANGE}
832 qualora il buffer allocato su \param{buf} non sia sufficiente a contenere i
833 dati, in tal caso si dovrà semplicemente ripetere l'esecuzione della funzione
834 con un buffer di dimensione maggiore.
835
836 Una delle caratteristiche delle interrogazioni al servizio DNS è che queste
837 sono normalmente eseguite con il protocollo UDP, ci sono casi in cui si
838 preferisce che vengano usate connessioni permanenti con il protocollo TCP. Per
839 ottenere questo\footnote{si potrebbero impostare direttamente le opzioni di
840   \var{\_\_res.options}, ma queste funzioni permettono di semplificare la
841   procedura.} sono previste delle funzioni apposite; la prima è
842 \funcd{sethostent}, il cui prototipo è:
843 \begin{prototype}{netdb.h}
844 {void sethostent(int stayopen)}
845
846 Richiede l'uso di connessioni per le interrogazioni ad un server DNS.
847
848 \bodydesc{La funzione non restituisce nulla.}
849 \end{prototype}
850
851 La funzione permette di richiedere l'uso di connessioni TCP per la richiesta
852 dei dati, e che queste restino aperte per successive richieste. Il valore
853 dell'argomento \param{stayopen} indica se attivare questa funzionalità, un
854 valore pari a 1 (o diverso da zero), che indica una condizione vera in C,
855 attiva la funzionalità.  Come si attiva l'uso delle connessioni TCP lo si può
856 disattivare con la funzione \funcd{endhostent}; il suo prototipo è:
857 \begin{prototype}{netdb.h}
858 {void endhostent(void)}
859
860 Disattiva l'uso di connessioni per le interrogazioni ad un server DNS.
861
862 \bodydesc{La funzione non restituisce nulla.}
863 \end{prototype}
864 \noindent e come si può vedere la funzione è estremamente semplice, non
865 richiedendo nessun argomento.
866
867
868 Infine si può richiedere la risoluzione inversa di un indirizzo IP od IPv6,
869 per ottenerne il nome a dominio ad esso associato, per fare questo si può
870 usare la funzione \funcd{gethostbyaddr}, il cui prototipo è:
871 \begin{functions}
872   \headdecl{netdb.h} 
873   \headdecl{sys/socket.h} 
874   \funcdecl{struct hostent *gethostbyaddr(const char *addr, int len, int type)}
875
876   Richiede la risoluzione inversa di un indirizzo IP.
877        
878   \bodydesc{La funzione restituisce l'indirizzo ad una struttura
879     \struct{hostent} in caso di successo ed \const{NULL} in caso di errore.}
880 \end{functions}
881
882 In questo caso l'argomento \param{addr} dovrà essere il puntatore ad una
883 appropriata struttura contenente il valore dell'indirizzo IP (o IPv6) che si
884 vuole risolvere. L'uso del tipo \type{char *} per questo argomento è storico,
885 il dato dovrà essere fornito in una struttura \struct{in\_addr}\footnote{si
886   ricordi che, come illustrato in fig.~\ref{fig:sock_sa_ipv4_struct}, questo
887   in realtà corrisponde ad un numero intero, da esprimere comunque in
888   \textit{network order}, non altrettanto avviene però per \var{in6\_addr},
889   pertanto è sempre opportuno inizializzare questi indirizzi con
890   \func{inet\_pton} (vedi sez.~\ref{sec:sock_conv_func_gen}).}  per un
891 indirizzo IPv4 ed una struttura \struct{in6\_addr} per un indirizzo IPv6,
892 mentre in \param{len} se ne dovrà specificare la dimensione (rispettivamente 4
893 o 16), infine l'argomento \param{type} indica il tipo di indirizzo e dovrà
894 essere o \const{AF\_INET} o \const{AF\_INET6}.
895
896 La funzione restituisce, in caso di successo, un puntatore ad una struttura
897 \struct{hostent}, solo che in questo caso la ricerca viene eseguita
898 richiedendo al DNS un record di tipo \texttt{PTR} corrispondente all'indirizzo
899 specificato. In caso di errore al solito viene usata la variabile
900 \var{h\_errno} per restituire un opportuno codice. In questo caso l'unico
901 campo del risultato che interessa è \var{h\_name} che conterrà il nome a
902 dominio, la funziona comunque inizializza anche il primo campo della lista
903 \var{h\_addr\_list} col valore dell'indirizzo passato come argomento.
904
905 Per risolvere il problema dell'uso da parte delle due funzioni
906 \func{gethostbyname} e \func{gethostbyaddr} di memoria statica che può essere
907 sovrascritta fra due chiamate successive, e per avere sempre la possibilità di
908 indicare esplicitamente il tipo di indirizzi voluto (cosa che non è possibile
909 con \func{gethostbyname}), vennero introdotte due nuove funzioni di
910 risoluzione,\footnote{le funzioni sono presenti nelle \acr{glibc} versione
911   2.1.96, ma essendo considerate deprecate (vedi
912   sez.~\ref{sec:sock_advanced_name_services}) sono state rimosse nelle
913   versioni successive.} \funcd{getipnodebyname} e \funcd{getipnodebyaddr}, i
914 cui prototipi sono:
915 \begin{functions}
916   \headdecl{netdb.h} 
917   \headdecl{sys/types.h} 
918   \headdecl{sys/socket.h} 
919
920   \funcdecl{struct hostent *getipnodebyname(const char *name, int af, int
921     flags, int *error\_num)} 
922
923   \funcdecl{struct hostent *getipnodebyaddr(const void *addr, size\_t len,
924     int af, int *error\_num)}
925
926   Richiedono rispettivamente la risoluzione e la risoluzione inversa di un
927   indirizzo IP.
928        
929   \bodydesc{Entrambe le funzioni restituiscono l'indirizzo ad una struttura
930     \struct{hostent} in caso di successo ed \const{NULL} in caso di errore.}
931 \end{functions}
932
933 Entrambe le funzioni supportano esplicitamente la scelta di una famiglia di
934 indirizzi con l'argomento \param{af} (che può assumere i valori
935 \const{AF\_INET} o \const{AF\_INET6}), e restituiscono un codice di errore
936 (con valori identici a quelli precedentemente illustrati in
937 tab.~\ref{tab:h_errno_values}) nella variabile puntata da \param{error\_num}.
938 La funzione \func{getipnodebyaddr} richiede poi che si specifichi l'indirizzo
939 come per \func{gethostbyaddr} passando anche la lunghezza dello stesso
940 nell'argomento \param{len}.
941
942 La funzione \func{getipnodebyname} prende come primo argomento il nome da
943 risolvere, inoltre prevede un apposito argomento \param{flags}, da usare come
944 maschera binaria, che permette di specificarne il comportamento nella
945 risoluzione dei diversi tipi di indirizzi (IPv4 e IPv6); ciascun bit
946 dell'argomento esprime una diversa opzione, e queste possono essere specificate
947 con un OR aritmetico delle costanti riportate in
948 tab.~\ref{tab:sock_getipnodebyname_flags}.
949
950 \begin{table}[!htb]
951   \centering
952   \footnotesize
953   \begin{tabular}[c]{|l|p{10cm}|}
954     \hline
955     \textbf{Costante} & \textbf{Significato} \\
956     \hline
957     \hline
958     \const{AI\_V4MAPPED}  & usato con \const{AF\_INET6} per richiedere una
959                             ricerca su un indirizzo IPv4 invece che IPv6; gli
960                             eventuali risultati saranno rimappati su indirizzi 
961                             IPv6.\\
962     \const{AI\_ALL}       & usato con \const{AI\_V4MAPPED}; richiede sia
963                             indirizzi IPv4 che IPv6, e gli indirizzi IPv4
964                             saranno rimappati in IPv6.\\
965     \const{AI\_ADDRCONFIG}& richiede che una richiesta IPv4 o IPv6 venga
966                             eseguita solo se almeno una interfaccia del
967                             sistema è associata ad un indirizzo di tale tipo.\\
968     \const{AI\_DEFAULT}   & il valore di default, è equivalente alla
969                             combinazione di \const{AI\_ADDRCONFIG} e di
970                             \const{AI\_V4MAPPED)}.\\  
971     \hline
972   \end{tabular}
973   \caption{Valori possibili per i bit dell'argomento \param{flags} della
974     funzione \func{getipnodebyname}.}
975   \label{tab:sock_getipnodebyname_flags}
976 \end{table}
977
978 Entrambe le funzioni restituiscono un puntatore ad una struttura \var{hostent}
979 che contiene i risultati della ricerca, che viene allocata dinamicamente
980 insieme a tutto lo spazio necessario a contenere i dati in essa referenziati;
981 per questo motivo queste funzioni non soffrono dei problemi dovuti all'uso di
982 una sezione statica di memoria presenti con le precedenti \func{gethostbyname}
983 e \func{gethostbyaddr}.  L'uso di una allocazione dinamica però comporta anche
984 la necessità di deallocare esplicitamente la memoria occupata dai risultati
985 una volta che questi non siano più necessari; a tale scopo viene fornita la
986 funzione \funcd{freehostent}, il cui prototipo è:
987 \begin{functions}
988   \headdecl{netdb.h} 
989   \headdecl{sys/types.h} 
990   \headdecl{sys/socket.h} 
991
992   \funcdecl{void freehostent(struct hostent *ip)} 
993
994   Disalloca una struttura \var{hostent}.
995        
996   \bodydesc{La funzione non ritorna nulla.}
997 \end{functions}
998
999 La funzione permette di disallocare una struttura \var{hostent}
1000 precedentemente allocata in una chiamata di \func{getipnodebyname} o
1001 \func{getipnodebyaddr}, e prende come argomento l'indirizzo restituito da una
1002 di queste funzioni.
1003
1004 Infine per concludere la nostra panoramica sulle funzioni di risoluzione dei
1005 nomi dobbiamo citare le funzioni che permettono di interrogare gli altri
1006 servizi di risoluzione dei nomi illustrati in sez.~\ref{sec:sock_resolver}; in
1007 generale infatti ci sono una serie di funzioni nella forma
1008 \texttt{getXXXbyname} e \texttt{getXXXbyaddr} per ciascuna delle informazioni
1009 di rete mantenute dal \textit{Name Service Switch} che permettono
1010 rispettivamente di trovare una corrispondenza cercando per nome o per numero.
1011
1012 L'elenco di queste funzioni è riportato nelle colonne finali di
1013 tab.~\ref{tab:name_resolution_functions}, dove le si sono suddivise rispetto
1014 al tipo di informazione che forniscono (riportato in prima colonna). Nella
1015 tabella si è anche riportato il file su cui vengono ordinariamente mantenute
1016 queste informazioni, che però può essere sostituito da un qualunque supporto
1017 interno al \textit{Name Service Switch} (anche se usualmente questo avviene
1018 solo per la risoluzione degli indirizzi). Ciascuna funzione fa riferimento ad
1019 una sua apposita struttura che contiene i relativi dati, riportata in terza
1020 colonna.
1021
1022 \begin{table}[!htb]
1023   \centering
1024   \footnotesize
1025   \begin{tabular}[c]{|l|l|l|l|l|}
1026     \hline
1027     \textbf{Informazione}&\textbf{File}&\textbf{Struttura}&
1028     \multicolumn{2}{|c|}{\textbf{Funzioni}}\\
1029     \hline
1030     \hline
1031     indirizzo&\file{/etc/hosts}&\struct{hostent}&\func{gethostbyname}&
1032              \func{gethostbyaddr}\\ 
1033     servizio &\file{/etc/services}&\struct{servent}&\func{getservbyname}&
1034              \func{getservbyaddr}\\ 
1035     rete     &\file{/etc/networks}&\struct{netent}&\func{getnetbyname}&
1036              \func{getnetbyaddr}\\ 
1037     protocollo&\file{/etc/protocols}&\struct{protoent}&\func{getprotobyname}&
1038               \func{getprotobyaddr}\\ 
1039     \hline
1040   \end{tabular}
1041   \caption{Funzioni di risoluzione dei nomi per i vari servizi del
1042     \textit{Name Service Switch}.}
1043   \label{tab:name_resolution_functions}
1044 \end{table}
1045
1046 Delle funzioni di tab.~\ref{tab:name_resolution_functions} abbiamo trattato
1047 finora soltanto quelle relative alla risoluzione dei nomi, dato che sono le
1048 più usate, e prevedono praticamente da sempre la necessità di rivolgersi ad
1049 una entità esterna; per le altre invece, estensioni fornite dal NSS a parte,
1050 si fa sempre riferimento ai dati mantenuti nei rispettivi file. 
1051
1052 Dopo la risoluzione dei nomi a dominio una delle ricerche più comuni è quella
1053 sui nomi dei servizi noti (cioè \texttt{http}, \texttt{smtp}, ecc.) da
1054 associare alle rispettive porte, le due funzioni da utilizzare per questo sono
1055 \funcd{getservbyname} e \funcd{getservbyaddr}, che permettono rispettivamente
1056 di ottenere il numero di porta associato ad un servizio dato il nome e
1057 viceversa; i loro prototipi sono:
1058 \begin{functions}
1059   \headdecl{netdb.h} 
1060   \funcdecl{struct servent *getservbyname(const char *name, const char *proto)}
1061   \funcdecl{struct servent *getservbyport(int port, const char *proto)} 
1062
1063   Risolvono il nome di un servizio nel rispettivo numero di porta e viceversa.
1064        
1065   \bodydesc{Ritornano il puntatore ad una struttura \struct{servent} con i
1066     risultati in caso di successo, o \const{NULL} in caso di errore.}
1067 \end{functions}
1068
1069 Entrambe le funzioni prendono come ultimo argomento una stringa \param{proto}
1070 che indica il protocollo per il quale si intende effettuare la
1071 ricerca,\footnote{le informazioni mantenute in \file{/etc/services} infatti
1072   sono relative sia alle porte usate su UDP che su TCP, occorre quindi
1073   specificare a quale dei due protocolli si fa riferimento.} che nel caso si
1074 IP può avere come valori possibili solo \texttt{udp} o
1075 \texttt{tcp};\footnote{in teoria si potrebbe avere un qualunque protocollo fra
1076   quelli citati in \file{/etc/protocols}, posto che lo stesso supporti il
1077   concetto di \textsl{porta}, in pratica questi due sono gli unici presenti.}
1078 se si specifica un puntatore nullo la ricerca sarà eseguita su un protocollo
1079 qualsiasi.
1080
1081 Il primo argomento è il nome del servizio per \func{getservbyname},
1082 specificato tramite la stringa \param{name}, mentre \func{getservbyport}
1083 richiede il numero di porta in \param{port}. Entrambe le funzioni eseguono una
1084 ricerca sul file \file{/etc/services}\footnote{il \textit{Name Service Switch}
1085   astrae il concetto a qualunque supporto su cui si possano mantenere i
1086   suddetti dati. } ed estraggono i dati dalla prima riga che corrisponde agli
1087 argomenti specificati; se la risoluzione ha successo viene restituito un
1088 puntatore ad una apposita struttura \struct{servent} contenente tutti i
1089 risultati), altrimenti viene restituito un puntatore nullo.  Si tenga presente
1090 che anche in questo caso i dati vengono mantenuti in una area di memoria
1091 statica e che quindi la funzione non è rientrante.
1092
1093 \begin{figure}[!htb]
1094   \footnotesize \centering
1095   \begin{minipage}[c]{15cm}
1096     \includestruct{listati/servent.h}
1097   \end{minipage}
1098   \caption{La struttura \structd{servent} per la risoluzione dei nomi dei
1099     servizi e dei numeri di porta.}
1100   \label{fig:sock_servent_struct}
1101 \end{figure}
1102
1103 La definizione della struttura \struct{servent} è riportata in
1104 fig.~\ref{fig:sock_servent_struct}, il primo campo, \var{s\_name} contiene
1105 sempre il nome canonico del servizio, mentre \var{s\_aliases} è un puntatore
1106 ad un vettore di stringhe contenenti gli eventuali nomi alternativi
1107 utilizzabili per identificare lo stesso servizio. Infine \var{s\_port}
1108 contiene il numero di porta e \var{s\_proto} il nome del protocollo.
1109
1110 Come riportato in tab.~\ref{tab:name_resolution_functions} ci sono analoghe
1111 funzioni per la risoluzione del nome dei protocolli e delle reti; non staremo
1112 a descriverle nei dettagli, in quanto il loro uso è molto limitato, esse
1113 comunque hanno una struttura del tutto analoga alle precedenti, e tutti i
1114 dettagli relativi al loro funzionamento possono essere trovati nelle
1115 rispettive pagine di manuale.
1116
1117 Oltre alle funzioni di ricerca esistono delle ulteriori funzioni che prevedono
1118 una lettura sequenziale delle informazioni mantenute nel \textit{Name Service
1119   Switch} (in sostanza permettono di leggere i file contenenti le informazioni
1120 riga per riga), che sono analoghe a quelle elencate in
1121 tab.~\ref{tab:sys_passwd_func} per le informazioni relative ai dati degli
1122 utenti e dei gruppi.  Nel caso specifico dei servizi avremo allora le tre
1123 funzioni \funcd{setservent}, \funcd{getservent} e \funcd{endservent} i cui
1124 prototipi sono:
1125 \begin{functions}
1126   \headdecl{netdb.h} 
1127   \funcdecl{void setservent(int stayopen)} 
1128   Apre il file \file{/etc/services} e si posiziona al suo inizio.
1129
1130   \funcdecl{struct servent *getservent(void)}
1131   Legge la voce successiva nel file \file{/etc/services}.      
1132
1133   \funcdecl{void endservent(void)} 
1134   Chiude il file \file{/etc/services}.
1135
1136   \bodydesc{Le due funzioni \func{setservent} e \func{endservent} non
1137     restituiscono nulla, \func{getservent} restituisce il puntatore ad una
1138     struttura \struct{servent} in caso di successo e \const{NULL} in caso di
1139     errore o fine del file.}
1140 \end{functions}
1141
1142 La prima funzione, \func{getservent}, legge una singola voce a partire dalla
1143 posizione corrente in \file{/etc/services}, pertanto si può eseguire una
1144 lettura sequenziale dello stesso invocandola più volte. Se il file non è
1145 aperto provvede automaticamente ad aprirlo, nel qual caso leggerà la prima
1146 voce. La seconda funzione, \func{setservent}, permette di aprire il file
1147 \file{/etc/services} per una successiva lettura, ma se il file è già stato
1148 aperto riporta la posizione di lettura alla prima voce del file, in questo
1149 modo si può far ricominciare da capo una lettura sequenziale. L'argomento
1150 \param{stayopen}, se diverso da zero, fa sì che il file resti aperto anche fra
1151 diverse chiamate a \func{getservbyname} e \func{getservbyaddr}.\footnote{di
1152   default dopo una chiamata a queste funzioni il file viene chiuso, cosicché
1153   una successiva chiamata a \func{getservent} riparte dall'inizio.}  La terza
1154 funzione, \funcd{endservent}, provvede semplicemente a chiudere il file.
1155
1156 Queste tre funzioni per la lettura sequenziale di nuovo sono presenti per
1157 ciascuno dei vari tipi di informazione relative alle reti di
1158 tab.~\ref{tab:name_resolution_functions}; questo significa che esistono
1159 altrettante funzioni nella forma \texttt{setXXXent}, \texttt{getXXXent} e
1160 \texttt{endXXXent}, analoghe alle precedenti per la risoluzione dei servizi,
1161 che abbiamo riportato in tab.~\ref{tab:name_sequential_read}.  Essendo, a
1162 parte il tipo di informazione che viene trattato, sostanzialmente identiche
1163 nel funzionamento e di scarso utilizzo, non staremo a trattarle una per una,
1164 rimandando alle rispettive pagine di manuale.
1165
1166 \begin{table}[!htb]
1167   \centering
1168   \footnotesize
1169   \begin{tabular}[c]{|l|l|l|l|}
1170     \hline
1171     \textbf{Informazione}&\multicolumn{3}{|c|}{\textbf{Funzioni}}\\
1172     \hline
1173     \hline
1174     indirizzo&\func{sethostent}&\func{gethostent}&\func{endhostent} \\
1175     servizio &cd te\func{setservent}&\func{getservent}&\func{endservent}\\ 
1176     rete     &\func{setnetent}&\func{getnetent}&\func{endnetent}\\ 
1177     protocollo&\func{setprotoent}&\func{getprotoent}&\func{endprotoent}\\ 
1178     \hline
1179   \end{tabular}
1180   \caption{Funzioni lettura sequenziale dei dati del \textit{Name Service
1181       Switch}.} 
1182   \label{tab:name_sequential_read}
1183 \end{table}
1184
1185
1186
1187
1188
1189 \subsection{Le funzioni avanzate per la risoluzione dei nomi}
1190 \label{sec:sock_advanced_name_services}
1191
1192 Quelle illustrate nella sezione precedente sono le funzioni classiche per la
1193 risoluzione di nomi ed indirizzi IP, ma abbiamo già visto come esse soffrano
1194 di vari inconvenienti come il fatto che usano informazioni statiche, e non
1195 prevedono la possibilità di avere diverse classi di indirizzi. Anche se sono
1196 state create delle estensioni o metodi diversi che permettono di risolvere
1197 alcuni di questi inconvenienti,\footnote{rimane ad esempio il problema
1198   generico che si deve sapere in anticipo quale tipo di indirizzi IP (IPv4 o
1199   IPv6) corrispondono ad un certo nome a dominio.}  comunque esse non
1200 forniscono una interfaccia sufficientemente generica.
1201
1202 Inoltre in genere quando si ha a che fare con i socket non esiste soltanto il
1203 problema della risoluzione del nome che identifica la macchina, ma anche
1204 quello del servizio a cui ci si vuole rivolgere.  Per questo motivo con lo
1205 standard POSIX 1003.1-2001 sono state indicate come deprecate le varie
1206 funzioni \func{gethostbyaddr}, \func{gethostbyname}, \var{getipnodebyname} e
1207 \var{getipnodebyaddr} ed è stata introdotta una interfaccia completamente
1208 nuova.
1209
1210 La prima funzione di questa interfaccia è \funcd{getaddrinfo},\footnote{la
1211   funzione è definita, insieme a \func{getnameinfo} che vedremo più avanti,
1212   nell'\href{http://www.ietf.org/rfc/rfc2553.txt} {RFC~2553}.} che combina le
1213 funzionalità delle precedenti \func{getipnodebyname}, \func{getipnodebyaddr},
1214 \func{getservbyname} e \func{getservbyport}, consentendo di ottenere
1215 contemporaneamente sia la risoluzione di un indirizzo simbolico che del nome
1216 di un servizio; il suo prototipo è:
1217 \begin{functions}
1218   \headdecl{netdb.h} 
1219   \headdecl{sys/socket.h} 
1220   \headdecl{netdb.h} 
1221
1222   \funcdecl{int getaddrinfo(const char *node, const char *service, const
1223     struct addrinfo *hints, struct addrinfo **res)}
1224
1225   Esegue una risoluzione di un nome a dominio e di un nome di servizio.
1226
1227   \bodydesc{La funzione restituisce 0 in caso di successo o un codice di
1228     errore diverso da zero in caso di fallimento.}
1229 \end{functions}
1230
1231 La funzione prende come primo argomento il nome della macchina che si vuole
1232 risolvere, specificato tramite la stringa \param{node}. Questo argomento,
1233 oltre ad un comune nome a dominio, può indicare anche un indirizzo numerico in
1234 forma \textit{dotted-decimal} per IPv4 o in formato esadecimale per IPv6.  Si
1235 può anche specificare il nome di una rete invece che di una singola macchina.
1236 Il secondo argomento, \param{service}, specifica invece il nome del servizio
1237 che si intende risolvere. Per uno dei due argomenti si può anche usare il
1238 valore \const{NULL}, nel qual caso la risoluzione verrà effettuata soltanto
1239 sulla base del valore dell'altro.
1240
1241 Il terzo argomento, \param{hints}, deve essere invece un puntatore ad una
1242 struttura \struct{addrinfo} usata per dare dei \textsl{suggerimenti} al
1243 procedimento di risoluzione riguardo al protocollo o del tipo di socket che si
1244 intenderà utilizzare; \func{getaddrinfo} infatti permette di effettuare
1245 ricerche generiche sugli indirizzi, usando sia IPv4 che IPv6, e richiedere
1246 risoluzioni sui nomi dei servizi indipendentemente dal protocollo (ad esempio
1247 TCP o UDP) che questi possono utilizzare.
1248
1249 \begin{figure}[!htb]
1250   \footnotesize \centering
1251   \begin{minipage}[c]{15cm}
1252     \includestruct{listati/addrinfo.h}
1253   \end{minipage}
1254   \caption{La struttura \structd{addrinfo} usata nella nuova interfaccia POSIX
1255     per la risoluzione di nomi a dominio e servizi.}
1256   \label{fig:sock_addrinfo_struct}
1257 \end{figure}
1258
1259 La struttura \struct{addrinfo}, la cui definizione\footnote{la definizione è
1260   ripresa direttamente dal file \texttt{netdb.h} in questa struttura viene
1261   dichiarata, la pagina di manuale riporta \type{size\_t} come tipo di dato
1262   per il campo \var{ai\_addrlen}, qui viene usata quanto previsto dallo
1263   standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi di
1264   dati sono comunque equivalenti.} è riportata in
1265 fig.~\ref{fig:sock_addrinfo_struct}, viene usata sia in ingresso, per passare
1266 dei valori di controllo alla funzione, che in uscita, per ricevere i
1267 risultati. Il primo campo, \var{ai\_flags}, è una maschera binaria di bit che
1268 permettono di controllare le varie modalità di risoluzione degli indirizzi,
1269 che viene usato soltanto in ingresso. I tre campi successivi \var{ai\_family},
1270 \var{ai\_socktype}, e \var{ai\_protocol} contengono rispettivamente la
1271 famiglia di indirizzi, il tipo di socket e il protocollo, in ingresso vengono
1272 usati per impostare una selezione (impostandone il valore nella struttura
1273 puntata da \param{hints}), mentre in uscita indicano il tipo di risultato
1274 contenuto nella struttura. 
1275
1276 Tutti i campi seguenti vengono usati soltanto in uscita; il campo
1277 \var{ai\_addrlen} indica la dimensione della struttura degli indirizzi
1278 ottenuta come risultato, il cui contenuto sarà memorizzato nella struttura
1279 \struct{sockaddr} posta all'indirizzo puntato dal campo \var{ai\_addr}. Il
1280 campo \var{ai\_canonname} è un puntatore alla stringa contenente il nome
1281 canonico della macchina, ed infine, quando la funzione restituisce più di un
1282 risultato, \var{ai\_next} è un puntatore alla successiva struttura
1283 \struct{addrinfo} della lista.
1284
1285 Ovviamente non è necessario dare dei suggerimenti in ingresso, ed usando
1286 \const{NULL} come valore per l'argomento \param{hints} si possono compiere
1287 ricerche generiche.  Se però si specifica un valore non nullo questo deve
1288 puntare ad una struttura \struct{addrinfo} precedentemente allocata nella
1289 quale siano stati opportunamente impostati i valori dei campi
1290 \var{ai\_family}, \var{ai\_socktype}, \var{ai\_protocol} ed \var{ai\_flags}.
1291
1292 I due campi \var{ai\_family} e \var{ai\_socktype} prendono gli stessi valori
1293 degli analoghi argomenti della funzione \func{socket}; in particolare per
1294 \var{ai\_family} si possono usare i valori di tab.~\ref{tab:net_pf_names} ma
1295 sono presi in considerazione solo \const{PF\_INET} e \const{PF\_INET6}, mentre
1296 se non si vuole specificare nessuna famiglia di indirizzi si può usare il
1297 valore \const{PF\_UNSPEC}.  Allo stesso modo per \var{ai\_socktype} si possono
1298 usare i valori illustrati in sez.~\ref{sec:sock_type} per indicare per quale
1299 tipo di socket si vuole risolvere il servizio indicato, anche se i soli
1300 significativi sono \const{SOCK\_STREAM} e \const{SOCK\_DGRAM}; in questo caso,
1301 se non si vuole effettuare nessuna risoluzione specifica, si potrà usare un
1302 valore nullo.
1303
1304 Il campo \var{ai\_protocol} permette invece di effettuare la selezione dei
1305 risultati per il nome del servizio usando il numero identificativo del
1306 rispettivo protocollo di trasporto (i cui valori possibili sono riportati in
1307 \file{/etc/protocols}); di nuovo i due soli valori utilizzabili sono quelli
1308 relativi a UDP e TCP, o il valore nullo che indica di ignorare questo campo
1309 nella selezione.
1310
1311 Infine l'ultimo campo è \var{ai\_flags}; che deve essere impostato come una
1312 maschera binaria; i bit di questa variabile infatti vengono usati per dare
1313 delle indicazioni sul tipo di risoluzione voluta, ed hanno valori analoghi a
1314 quelli visti in sez.~\ref{sec:sock_name_services} per \func{getipnodebyname};
1315 il valore di \var{ai\_flags} può essere impostata con un OR aritmetico delle
1316 costanti di tab.~\ref{tab:ai_flags_values}, ciascuna delle quali identifica un
1317 bit della maschera.
1318
1319 \begin{table}[!htb]
1320   \centering
1321   \footnotesize
1322   \begin{tabular}[c]{|l|p{10cm}|}
1323     \hline
1324     \textbf{Costante} & \textbf{Significato} \\
1325     \hline
1326     \hline
1327     \const{AI\_PASSIVE}    & viene utilizzato per ottenere un indirizzo in
1328                              formato adatto per una successiva chiamata a
1329                              \func{bind}. Se specificato quando si è usato 
1330                              \const{NULL} come valore per \param{node} gli
1331                              indirizzi restituiti saranno inizializzati al
1332                              valore generico (\const{INADDR\_ANY} per IPv4 e
1333                              \const{IN6ADDR\_ANY\_INIT} per IPv6), altrimenti
1334                              verrà usato l'indirizzo dell'interfaccia di
1335                              \textit{loopback}. Se invece non è impostato gli
1336                              indirizzi verranno restituiti in formato adatto ad
1337                              una chiamata a \func{connect} o \func{sendto}.\\
1338     \const{AI\_CANONNAME}  & richiede la restituzione del nome canonico della
1339                              macchina, che verrà salvato in una stringa il cui
1340                              indirizzo sarà restituito nel campo
1341                              \var{ai\_canonname} della prima struttura
1342                              \struct{addrinfo} dei risultati. Se il nome
1343                              canonico non è disponibile al suo posto
1344                              viene restituita una copia di \param{node}. \\ 
1345     \const{AI\_NUMERICHOST}& se impostato il nome della macchina specificato
1346                              con \param{node} deve essere espresso in forma
1347                              numerica, altrimenti sarà restituito un errore
1348                              \const{EAI\_NONAME} (vedi
1349                              tab.~\ref{tab:addrinfo_error_code}), in questo
1350                              modo si evita ogni chiamata alle funzioni di
1351                              risoluzione.\\ 
1352     \const{AI\_V4MAPPED}   & stesso significato dell'analoga di
1353                              tab.~\ref{tab:sock_getipnodebyname_flags}.\\  
1354     \const{AI\_ALL}        & stesso significato dell'analoga di
1355                              tab.~\ref{tab:sock_getipnodebyname_flags}.\\ 
1356     \const{AI\_ADDRCONFIG} & stesso significato dell'analoga di
1357                              tab.~\ref{tab:sock_getipnodebyname_flags}.\\ 
1358     \hline
1359   \end{tabular}
1360   \caption{Costanti associate ai bit del campo \var{ai\_flags} della struttura 
1361     \struct{addrinfo}.} 
1362   \label{tab:ai_flags_values}
1363 \end{table}
1364
1365 Come ultimo argomento di \func{getaddrinfo} deve essere passato un puntatore
1366 ad una variabile (di tipo puntatore ad una struttura \struct{addrinfo}) che
1367 verrà utilizzata dalla funzione per riportare (come \textit{value result
1368   argument}) i propri risultati. La funzione infatti è rientrante, ed alloca
1369 autonomamente tutta la memoria necessaria in cui verranno riportati i
1370 risultati della risoluzione.  La funzione scriverà in \param{res} il puntatore
1371 iniziale ad una \textit{linked list} di strutture di tipo \struct{addrinfo}
1372 contenenti tutte le informazioni ottenute.
1373
1374 La funzione restituisce un valore nullo in caso di successo, o un codice in
1375 caso di errore. I valori usati come codice di errore sono riportati in
1376 tab.~\ref{tab:addrinfo_error_code}; dato che la funzione utilizza altre
1377 funzioni e chiamate al sistema per ottenere il suo risultato in generale il
1378 valore di \var{errno} non è significativo, eccetto il caso in cui si sia
1379 ricevuto un errore di \const{EAI\_SYSTEM}, nel qual caso l'errore
1380 corrispondente è riportato tramite \var{errno}.
1381
1382 \begin{table}[!htb]
1383   \centering
1384   \footnotesize
1385   \begin{tabular}[c]{|l|p{10cm}|}
1386     \hline
1387     \textbf{Costante} & \textbf{Significato} \\
1388     \hline
1389     \hline
1390     \const{EAI\_FAMILY}  & la famiglia di indirizzi richiesta non è
1391                            supportata. \\ 
1392     \const{EAI\_SOCKTYPE}& il tipo di socket richiesto non è supportato. \\
1393     \const{EAI\_BADFLAGS}& il campo \var{ai\_flags} contiene dei valori non
1394                            validi. \\
1395     \const{EAI\_NONAME}  & il nome a dominio o il servizio non sono noti,
1396                            viene usato questo errore anche quando si specifica
1397                            il valore \const{NULL} per entrambi gli argomenti
1398                            \param{node} e \param{service}. \\
1399     \const{EAI\_SERVICE} & il servizio richiesto non è disponibile per il tipo
1400                            di socket richiesto, anche se può esistere per
1401                            altri tipi di socket. \\
1402     \const{EAI\_ADDRFAMILY}& la rete richiesta non ha nessun indirizzo di rete
1403                            per la famiglia di indirizzi specificata. \\
1404     \const{EAI\_NODATA}  & la macchina specificata esiste, ma non ha nessun
1405                            indirizzo di rete definito. \\
1406     \const{EAI\_MEMORY}  & è stato impossibile allocare la memoria necessaria
1407                            alle operazioni. \\
1408     \const{EAI\_FAIL}    & il DNS ha restituito un errore di risoluzione  
1409                            permanente. \\
1410     \const{EAI\_AGAIN}   & il DNS ha restituito un errore di risoluzione  
1411                            temporaneo, si può ritentare in seguito. \\
1412     \const{EAI\_SYSTEM}  & c'è stato un errore di sistema, si può controllare
1413                            \var{errno} per i dettagli. \\
1414 %    \hline
1415 % estensioni GNU, trovarne la documentazione
1416 %    \const{EAI\_INPROGRESS}& richiesta in corso. \\
1417 %    \const{EAI\_CANCELED}& la richiesta è stata cancellata.\\
1418 %    \const{EAI\_NOTCANCELED}& la richiesta non è stata cancellata. \\
1419 %    \const{EAI\_ALLDONE} & tutte le richieste sono complete. \\
1420 %    \const{EAI\_INTR}    & richiesta interrotta. \\
1421     \hline
1422   \end{tabular}
1423   \caption{Costanti associate ai valori dei codici di errore della funzione
1424     \func{getaddrinfo}.} 
1425   \label{tab:addrinfo_error_code}
1426 \end{table}
1427
1428 Come per i codici di errore di \func{gethostbyname} anche in questo caso è
1429 fornita una apposita funzione, analoga di \func{strerror}, che consente di
1430 utilizzarli direttamente per stampare a video un messaggio esplicativo; la
1431 funzione è \func{gai\_strerror} ed il suo prototipo è:
1432 \begin{functions}
1433   \headdecl{netdb.h} 
1434
1435   \funcdecl{const char *gai\_strerror(int errcode)}
1436
1437   Fornisce il messaggio corrispondente ad un errore di \func{getaddrinfo}.
1438
1439   \bodydesc{La funzione restituisce il puntatore alla stringa contenente il
1440     messaggio di errore.}
1441 \end{functions}
1442
1443 La funzione restituisce un puntatore alla stringa contenente il messaggio
1444 corrispondente dal codice di errore \param{errcode} ottenuto come valore di
1445 ritorno di \func{getaddrinfo}.  La stringa è allocata staticamente, ma essendo
1446 costante, ed accessibile in sola lettura, questo non comporta nessun problema
1447 di rientranza della funzione.
1448
1449 Dato che ad un certo nome a dominio possono corrispondere più indirizzi IP
1450 (sia IPv4 che IPv6), e che un certo servizio può essere fornito su protocolli
1451 e tipi di socket diversi, in generale, a meno di non aver eseguito una
1452 selezione specifica attraverso l'uso di \param{hints}, si otterrà una diversa
1453 struttura \struct{addrinfo} per ciascuna possibilità.  Ad esempio se si
1454 richiede la risoluzione del servizio \textit{echo} per l'indirizzo
1455 \texttt{www.truelite.it}, e si imposta \const{AI\_CANONNAME} per avere anche
1456 la risoluzione del nome canonico, si avrà come risposta della funzione la
1457 lista illustrata in fig.~\ref{fig:sock_addrinfo_list}.
1458
1459 \begin{figure}[!htb]
1460   \centering
1461   \includegraphics[width=10cm]{img/addrinfo_list}
1462   \caption{La \textit{linked list} delle strutture \struct{addrinfo}
1463     restituite da \func{getaddrinfo}.}
1464   \label{fig:sock_addrinfo_list}
1465 \end{figure}
1466
1467 Come primo esempio di uso di \func{getaddrinfo} vediamo un programma
1468 elementare di interrogazione del \index{\textit{resolver}}\textit{resolver}
1469 basato questa funzione, il cui corpo principale è riportato in
1470 fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa
1471 la gestione delle opzioni in cui è gestita l'eventuale inizializzazione
1472 dell'argomento \var{hints} per restringere le ricerche su protocolli, tipi di
1473 socket o famiglie di indirizzi, è disponibile nel file \texttt{mygetaddr.c}
1474 dei sorgenti allegati alla guida.
1475
1476 \begin{figure}[!htb]
1477   \footnotesize \centering
1478   \begin{minipage}[c]{15cm}
1479     \includecodesample{listati/mygetaddr.c}
1480   \end{minipage}
1481   \normalsize
1482   \caption{Esempio di codice per la risoluzione di un indirizzo.}
1483   \label{fig:mygetaddr_example}
1484 \end{figure}
1485
1486 Il corpo principale inizia controllando (\texttt{\small 1--5}) il numero di
1487 argomenti passati, che devono essere sempre due, e corrispondere
1488 rispettivamente all'indirizzo ed al nome del servizio da risolvere. A questo
1489 segue la chiamata (\texttt{\small 7}) alla funzione \func{getaddrinfo}, ed il
1490 successivo controllo (\texttt{\small 8--11}) del suo corretto funzionamento,
1491 senza il quale si esce immediatamente stampando il relativo codice di errore.
1492
1493 Se la funzione ha restituito un valore nullo il programma prosegue
1494 inizializzando (\texttt{\small 12}) il puntatore \var{ptr} che sarà usato nel
1495 successivo ciclo (\texttt{\small 14--35}) di scansione della lista delle
1496 strutture \struct{addrinfo} restituite dalla funzione. Prima di eseguire
1497 questa scansione (\texttt{\small 12}) viene stampato il valore del nome
1498 canonico che è presente solo nella prima struttura.
1499
1500 La scansione viene ripetuta (\texttt{\small 14}) fintanto che si ha un
1501 puntatore valido. La selezione principale è fatta sul campo \var{ai\_family},
1502 che stabilisce a quale famiglia di indirizzi fa riferimento la struttura in
1503 esame. Le possibilità sono due, un indirizzo IPv4 o IPv6, se nessuna delle due
1504 si verifica si provvede (\texttt{\small 27--30}) a stampare un messaggio di
1505 errore ed uscire.\footnote{questa eventualità non dovrebbe mai verificarsi,
1506   almeno fintanto che la funzione \func{getaddrinfo} lavora correttamente.}
1507
1508 Per ciascuno delle due possibili famiglie di indirizzi si estraggono le
1509 informazioni che poi verranno stampate alla fine del ciclo (\texttt{\small
1510   31--34}). Il primo caso esaminato (\texttt{\small 15--21}) è quello degli
1511 indirizzi IPv4, nel qual caso prima se ne stampa l'indentificazione
1512 (\texttt{\small 16}) poi si provvede a ricavare la struttura degli indirizzi
1513 (\texttt{\small 17}) indirizzata dal campo \var{ai\_addr}, eseguendo un
1514 opportuno casting del puntatore per poter estrarre da questa la porta
1515 (\texttt{\small 18}) e poi l'indirizzo (\texttt{\small 19}) che verrà
1516 convertito con una chiamata ad \func{inet\_ntop}.
1517
1518 La stessa operazione (\texttt{\small 21--27}) viene ripetuta per gli indirizzi
1519 IPv6, usando la rispettiva struttura degli indirizzi. Si noti anche come in
1520 entrambi i casi per la chiamata a \func{inet\_ntop} si sia dovuto passare il
1521 puntatore al campo contenente l'indirizzo IP nella struttura puntata dal campo
1522 \var{ai\_addr}.\footnote{il meccanismo è complesso a causa del fatto che al
1523   contrario di IPv4, in cui l'indirizzo IP può essere espresso con un semplice
1524   numero intero, in IPv6 questo deve essere necessariamente fornito come
1525   struttura, e pertanto anche se nella struttura puntata da \var{ai\_addr}
1526   sono presenti direttamente i valori finali, per l'uso con \func{inet\_ntop}
1527   occorre comunque passare un puntatore agli stessi (ed il costrutto
1528   \code{\&addr6->sin6\_addr} è corretto in quanto l'operatore \texttt{->} ha
1529   on questo caso precedenza su \texttt{\&}).}
1530
1531 Una volta estratte dalla struttura \struct{addrinfo} tutte le informazioni
1532 relative alla risoluzione richiesta e stampati i relativi valori, l'ultimo
1533 passo (\texttt{\small 34}) è di estrarre da \var{ai\_next} l'indirizzo della
1534 eventuale successiva struttura presente nella lista e ripetere il ciclo, fin
1535 tanto che, completata la scansione, questo avrà un valore nullo e si potrà
1536 terminare (\texttt{\small 36}) il programma.
1537
1538 Si tenga presente che \func{getaddrinfo} non garantisce nessun particolare
1539 ordinamento della lista delle strutture \struct{addrinfo} restituite, anche se
1540 usualmente i vari indirizzi IP (se ne è presente più di uno) sono forniti
1541 nello stesso ordine in cui vengono inviati dal server DNS. In particolare
1542 nulla garantisce che vengano forniti prima i dati relativi ai servizi di un
1543 determinato protocollo o tipo di socket, se ne sono presenti di diversi.  Se
1544 allora utilizziamo il nostro programma potremo verificare il risultato:
1545 \begin{Verbatim}
1546 [piccardi@gont sources]$ ./mygetaddr -c  gapil.truelite.it echo
1547 Canonical name sources2.truelite.it
1548 IPv4 address:
1549         Indirizzo 62.48.34.25
1550         Protocollo 6
1551         Porta 7
1552 IPv4 address:
1553         Indirizzo 62.48.34.25
1554         Protocollo 17
1555         Porta 7
1556 \end{Verbatim}
1557 %$
1558
1559 Una volta estratti i risultati dalla \textit{linked list} puntata da
1560 \param{res} se questa non viene più utilizzata si dovrà avere cura di
1561 disallocare opportunamente tutta la memoria, per questo viene fornita
1562 l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è:
1563 \begin{functions}
1564   \headdecl{netdb.h} 
1565
1566   \funcdecl{void freeaddrinfo(struct addrinfo *res)}
1567
1568   Libera la memoria allocata da una precedente chiamata a \func{getaddrinfo}.
1569
1570   \bodydesc{La funzione non restituisce nessun codice di errore.}
1571 \end{functions}
1572
1573 La funzione prende come unico argomento il puntatore \param{res}, ottenuto da
1574 una precedente chiamata a \func{getaddrinfo}, e scandisce la lista delle
1575 strutture per liberare tutta la memoria allocata. Dato che la funzione non ha
1576 valori di ritorno deve essere posta molta cura nel passare un valore valido
1577 per \param{res}.
1578
1579 Si tenga presente infine che se si copiano i risultati da una delle strutture
1580 \struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre
1581 avere cura di eseguire una \index{\textit{deep~copy}}\textit{deep copy} in cui
1582 si copiano anche tutti i dati presenti agli indirizzi contenuti nella
1583 struttura \struct{addrinfo}, perché una volta disallocati i dati con
1584 \func{freeaddrinfo} questi non sarebbero più disponibili. 
1585
1586 Anche la nuova intefaccia definita da POSIX prevede una nuova funzione per
1587 eseguire la risoluzione inversa e determinare nomi di servizi e di dominio
1588 dati i rispettivi valori numerici. La funzione che sostituisce le varie
1589 \func{gethostbyname}, \func{geipnodebyname} e \func{getservname} è
1590 \funcd{getnameinfo}, ed il suo prototipo è:
1591 \begin{functions}
1592   \headdecl{sys/socket.h}
1593   \headdecl{netdb.h}
1594
1595   \funcdecl{int getnameinfo(const struct sockaddr *sa, socklen\_t salen, char
1596     *host, size\_t hostlen, char *serv, size\_t servlen, int flags)}
1597
1598   Risolve il contenuto di una struttura degli indirizzi in maniera
1599   indipendente dal protocollo.
1600
1601   \bodydesc{La funzione restituisce 0 in caso di successo e un codice di
1602     errore diverso da zero altrimenti.}
1603 \end{functions}
1604
1605 La principale caratteristica di \func{getnameinfo} è che la funzione è in
1606 grado di eseguire una risoluzione inversa in maniera indipendente dal
1607 protocollo; il suo primo argomento \param{sa} infatti è il puntatore ad una
1608 struttura degli indirizzi generica, che può contenere sia indirizzi IPv4 che
1609 IPv6, la cui dimensione deve comunque essere specificata con l'argomento
1610 \param{salen}. 
1611
1612 I risultati della funzione saranno restituiti nelle due stringhe puntate da
1613 \param{host} e \param{serv}, che dovranno essere state precedentemente
1614 allocate per una lunghezza massima che deve essere specificata con gli altri
1615 due argomenti \param{hostlen} e \param{servlen}. Si può, quando non si è
1616 interessati ad uno dei due, passare il valore \const{NULL} come argomento,
1617 così che la corrispondente informazione non verrà richiesta. Infine l'ultimo
1618 argomento \param{flags} è una maschera binaria i cui bit consentono di
1619 impostare le modalità con cui viene eseguita la ricerca, e deve essere
1620 specificato attraverso l'OR aritmetico dei valori illustrati in
1621 tab.~\ref{tab:getnameinfo_flags}.
1622
1623 \begin{table}[!htb]
1624   \centering
1625   \footnotesize
1626   \begin{tabular}[c]{|l|p{10cm}|}
1627     \hline
1628     \textbf{Costante} & \textbf{Significato} \\
1629     \hline
1630     \hline
1631     \const{NI\_NOFQDN}     & richiede che venga restituita solo il nome della
1632                              macchina all'interno del dominio al posto del
1633                              nome completo (FQDN).\\
1634     \const{NI\_NUMERICHOST}& richiede che venga restituita la forma numerica
1635                              dell'indirizzo (questo succede sempre se il nome
1636                              non può essere ottenuto).\\ 
1637     \const{NI\_NAMEREQD}   & richiede la restituzione di un errore se il nome
1638                              non può essere risolto.\\
1639     \const{NI\_NUMERICSERV}& richiede che il servizio venga restituito in
1640                              forma numerica (attraverso il numero di porta).\\
1641     \const{NI\_DGRAM}      & richiede che venga restituito il nome del
1642                              servizio su UDP invece che quello su TCP per quei
1643                              pichi servizi (porte 512-214) che soni diversi
1644                              nei due protocolli.\\
1645     \hline
1646   \end{tabular}
1647   \caption{Costanti associate ai bit dell'argomento \param{flags} della  
1648     funzione \func{getnameinfo}.} 
1649   \label{tab:getnameinfo_flags}
1650 \end{table}
1651
1652 La funzione ritorna zero in caso di successo, e scrive i propri risultati agli
1653 indirizzi indicati dagli argomenti \param{host} e \param{serv} come stringhe
1654 terminate dal carattere NUL, a meno che queste non debbano essere troncate
1655 qualora la loro dimensione ecceda quelle specificate dagli argomenti
1656 \param{hostlen} e \param{servlen}. Sono comunque definite le due costanti
1657 \const{NI\_MAXHOST} e \const{NI\_MAXSERV}\footnote{in Linux le due costanti
1658   sono definite in \file{netdb.h} ed hanno rispettivamente il valore 1024 e
1659   12.}  che possono essere utilizzate come limiti massimi.  In caso di errore
1660 viene restituito invece un codice che assume gli stessi valori illustrati in
1661 tab.~\ref{tab:addrinfo_error_code}.
1662
1663 A questo punto possiamo fornire degli esempi di utilizzo della nuova
1664 interfaccia, adottandola per le precedenti implementazioni del client e del
1665 server per il servizio \textit{echo}; dato che l'uso delle funzioni appena
1666 illustrate (in particolare di \func{getaddrinfo}) è piuttosto complesso,
1667 essendo necessaria anche una impostazione diretta dei campi dell'argomento
1668 \param{hints}, provvederemo una interfaccia semplificata per i due casi visti
1669 finora, quello in cui si specifica nel client un indirizzo remoto per la
1670 connessione al server, e quello in cui si specifica nel server un indirizzo
1671 locale su cui porsi in ascolto.
1672
1673 La prima funzione della nostra intefaccia semplificata è \func{sockconn} che
1674 permette di ottenere un socket, connesso all'indirizzo ed al servizio
1675 specificati. Il corpo della funzione è riportato in
1676 fig.~\ref{fig:sockconn_code}, il codice completo è nel file \file{SockUtil.c}
1677 dei sorgenti allegati alla guida, che contiene varie funzioni di utilità per
1678 l'uso dei socket.
1679
1680 \begin{figure}[!htb]
1681   \footnotesize \centering
1682   \begin{minipage}[c]{15cm}
1683     \includecodesample{listati/sockconn.c}
1684   \end{minipage}
1685   \normalsize
1686   \caption{Il codice della funzione \func{sockconn}.}
1687   \label{fig:sockconn_code}
1688 \end{figure}
1689
1690 La funzione prende quattro argomenti, i primi due sono le stringhe che
1691 indicano il nome della macchina a cui collegarsi ed il relativo servizio su
1692 cui sarà effettuata la risoluzione; seguono il protocollo da usare (da
1693 specificare con il valore numerico di \file{/etc/protocols}) ed il tipo di
1694 socket (al solito specificato con i valori illustrati in
1695 sez.~\ref{sec:sock_type}).  La funzione ritorna il valore del file descriptor
1696 associato al socket (un numero positivo) in caso di successo, o -1 in caso di
1697 errore; per risolvere il problema di non poter passare indietro i valori di
1698 ritorno di \func{getaddrinfo} contenenti i relativi codici di
1699 errore\footnote{non si può avere nessuna certezza che detti valori siano
1700   negativi, è questo è invece nessario per evitare ogni possibile ambiguità
1701   nei confronti del valore di ritorno in caso di successo.} si sono stampati i
1702 messaggi d'errore direttamente nella funzione.
1703
1704 Una volta definite le variabili necessarie (\texttt{\small 3--5}) la funzione
1705 prima (\texttt{\small 6}) azzera il contenuto della struttura \var{hint} e poi
1706 provvede (\texttt{\small 7--9}) ad inizializzarne i valori necessari per la
1707 chiamata (\texttt{\small 10}) a \func{getaddrinfo}. Di quest'ultima si
1708 controlla (\texttt{\small 12-16}) il codice di ritorno, in modo da stampare un
1709 avviso di errore, azzerare \var{errno} ed uscire in caso di errore.  Dato che
1710 ad una macchina possono corrispondere più indirizzi IP, e di tipo diverso (sia
1711 IPv4 che IPv6), mantre il servizio può essere in ascolto soltanto su uno solo
1712 di questi, si provvede a tentare la connessione per ciascun indirizzo
1713 restituito all'interno di un ciclo (\texttt{\small 18-40}) di scansione della
1714 lista restituita da \func{getaddrinfo}, ma prima (\texttt{\small 17}) si salva
1715 il valore del puntatore per poterlo riutilizzare alla fine per disallocare la
1716 lista.
1717
1718 Il ciclo viene ripetuto (\texttt{\small 18}) fintanto che si hanno indirizzi
1719 validi, ed inizia (\texttt{\small 19}) con l'apertura del socket; se questa
1720 fallisce si controlla (\texttt{\small 20}) se sono disponibili altri
1721 indirizzi, nel qual caso si passa al successivo (\texttt{\small 21}) e si
1722 riprende (\texttt{\small 22}) il ciclo da capo; se non ve ne sono si stampa
1723 l'errore ritornando immediatamente (\texttt{\small 24-27}). Quando la
1724 creazione del socket ha avuto successo si procede (\texttt{\small 29})
1725 direttamente con la connessione, di nuovo in caso di fallimento viene ripetuto
1726 (\texttt{\small 30--38}) il controllo se vi sono o no altri indirizzi da
1727 provare nella stessa modalità fatta in precedenza, aggiungendovi però in
1728 entrambi i casi (\texttt{\small 32} e (\texttt{\small 36}) la chiusura del
1729 socket precedentemente aperto, che non è più utilizzabile.
1730
1731 Se la connessione ha avuto successo invece si termina (\texttt{\small 39})
1732 direttamente il ciclo, e prima di ritornare (\texttt{\small 31}) il valore del
1733 file descriptor del socket si provvede (\texttt{\small 30}) a liberare le
1734 strutture \struct{addrinfo} allocate da \func{getaddrinfo} utilizzando il
1735 valore del relativo puntatore precedentemente (\texttt{\small 17}) salvato.
1736 Si noti come per la funzione sia del tutto irrilevante se la struttura
1737 ritornata contiene indirizzi IPv6 o IPv4, in quanto si fa uso direttamente dei
1738 dati relativi alle strutture degli indirizzi di \struct{addrinfo} che sono
1739 \textsl{opachi} rispetto all'uso della funzione \func{connect}.
1740
1741 \begin{figure}[!htb]
1742   \footnotesize \centering
1743   \begin{minipage}[c]{15cm}
1744     \includecodesample{listati/TCP_echo_fifth.c}
1745   \end{minipage}
1746   \normalsize
1747   \caption{Il nuovo codice per la connessione del client \textit{echo}.}
1748   \label{fig:TCP_echo_fifth}
1749 \end{figure}
1750
1751 Per usare questa funzione possiamo allora modificare ulteriormente il nostro
1752 programma client per il servizio \textit{echo}; in questo caso rispetto al
1753 codice usato finora per collegarsi (vedi fig.~\ref{fig:TCP_echo_client_1})
1754 avremo una semplificazione per cui il corpo principale del nostro client
1755 diventerà quello illustrato in fig.~\ref{fig:TCP_echo_fifth}, in cui le
1756 chiamate a \func{socket}, \func{inet\_pton} e \func{connect} sono sostituite
1757 da una singola chiamata a \func{sockconn}. Inoltre il nuovo client (il cui
1758 codice completo è nel file \file{TCP\_echo\_fifth.c} dei sorgenti allegati)
1759 consente di utilizzare come argomento del programma un nome a dominio al posto
1760 dell'indirizzo numerico, e può utilizzare sia indirizzi IPv4 che IPv6.
1761
1762 \begin{figure}[!htb]
1763   \footnotesize \centering
1764   \begin{minipage}[c]{15cm}
1765     \includecodesample{listati/sockbind.c}
1766   \end{minipage}
1767   \normalsize
1768   \caption{Il codice della funzione \func{sockbind}.}
1769   \label{fig:sockbind_code}
1770 \end{figure}
1771
1772 La seconda funzione di ausilio è \func{sockbind}, il cui corpo principale è
1773 riportato in fig.~\ref{fig:sockbind_code} (al solito il sorgente completo è
1774 nel file \file{sockbind.c} dei sorgenti allegati alla guida). Come si può
1775 notare la funzione è del tutto analoga alla precedente \func{sockconn}, e
1776 prende gli stessi argomenti, però invece di eseguire una connessione con
1777 \func{connect} si limita a chiamare \func{bind} per collegare il socket ad una
1778 porta.
1779
1780 Dato che la funzione è pensata per essere utilizzata da un server ci si può
1781 chiedere a quale scopo mantenere l'argomento \param{host} quando l'indirizzo
1782 di questo è usualmente noto. Si ricordi però quanto detto in
1783 sez.~\ref{sec:TCP_func_bind}, relativamente al significato della scelta di un
1784 indirizzo specifico come argomento di \func{bind}, che consente di porre il
1785 server in ascolto su uno solo dei possibili diversi indirizzi presenti su di
1786 una macchina.  Se non si vuole che la funzione esegua \func{bind} su un
1787 indirizzo specifico, ma utilizzi l'indirizzo generico, occorrerà avere cura di
1788 passare un valore \const{NULL} come valore per l'argomento \var{host}; l'uso
1789 del valore \const{AI\_PASSIVE} serve ad ottenere il valore generico nella
1790 rispettiva struttura degli indirizzi.
1791
1792 Come già detto la funzione è analoga a \func{sockconn} ed inizia azzerando ed
1793 inizializzando (\texttt{\small 6-11}) opportunamente la struttura \var{hint}
1794 con i valori ricevuti come argomenti, soltanto che in questo caso si è usata
1795 (\texttt{\small 8}) una impostazione specifica dei flag di \var{hint} usando
1796 \const{AI\_PASSIVE} per indicare che il socket sarà usato per una apertura
1797 passiva. Per il resto la chiamata (\texttt{\small 12-18}) a \func{getaddrinfo}
1798 e ed il ciclo principale (\texttt{\small 20--42}) sono identici, solo che si è
1799 sostituita (\texttt{\small 31}) la chiamata a \func{connect} con una chiamata
1800 a \func{bind}. Anche la conclusione (\texttt{\small 43--44}) della funzione è
1801 identica. 
1802
1803 Si noti come anche in questo caso si siano inserite le stampe degli errori
1804 sullo standard error, nonostante la funzione possa essere invocata da un
1805 demone. Nel nostro caso questo non è un problema in quanto se la funzione non
1806 ha successo il programma deve uscire immediatamente prima di essere posto in
1807 background, e può quindi scrivere gli errori direttamente sullo standard
1808 error.
1809
1810 \begin{figure}[!htb]
1811   \footnotesize \centering
1812   \begin{minipage}[c]{15cm}
1813     \includecodesample{listati/TCP_echod_third.c}
1814   \end{minipage}
1815   \normalsize
1816   \caption{Nuovo codice per l'apertura passiva del server \textit{echo}.}
1817   \label{fig:TCP_echod_third}
1818 \end{figure}
1819
1820 Con l'uso di questa funzione si può modificare anche il codice del nostro
1821 server \textit{echo}, che rispetto a quanto illustrato nella versione iniziale
1822 di fig.~\ref{fig:TCP_echo_server_first_code} viene modificato nella forma
1823 riportata in fig.~\ref{fig:TCP_echod_third}. In questo caso il socket su cui
1824 porsi in ascolto viene ottenuto (\texttt{\small 15--18}) da \func{sockbind}
1825 che si cura anche della eventuale risoluzione di un indirizzo specifico sul
1826 quale si voglia far ascoltare il server.
1827
1828
1829
1830 \section{Le opzioni dei socket}
1831 \label{sec:sock_options}
1832
1833 Benché dal punto di vista del loro uso come canali di trasmissione di dati i
1834 socket siano trattati allo stesso modo dei file, ed acceduti tramite i file
1835 descriptor, la normale interfaccia usata per la gestione dei file non è
1836 sufficiente a poterne controllare tutte le caratteristiche, che variano tra
1837 l'altro a seconda del loro tipo (e della relativa forma di comunicazione
1838 sottostante). In questa sezione vedremo allora quali sono le funzioni dedicate
1839 alla gestione delle caratteristiche specifiche dei vari tipi di socket, le
1840 cosiddette \textit{socket options}.
1841
1842
1843 \subsection{Le funzioni \func{setsockopt} e \func{getsockopt}}
1844 \label{sec:sock_setsockopt}
1845
1846 Le varie caratteristiche dei socket possono essere gestite attraverso l'uso di
1847 due funzioni generiche che permettono rispettivamente di impostarle e di
1848 recuperarne il valore corrente. La prima di queste due funzioni, quella usata
1849 per impostare le \textit{socket options}, è \funcd{setsockopt}, ed il suo
1850 prototipo è:
1851 \begin{functions}
1852   \headdecl{sys/socket.h}
1853   \headdecl{sys/types.h}
1854
1855   \funcdecl{int setsockopt(int sock, int level, int optname, const void
1856     *optval, socklen\_t optlen)}
1857   Imposta le opzioni di un socket.
1858
1859   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
1860     errore, nel qual caso \var{errno} assumerà i valori:
1861   \begin{errlist}
1862   \item[\errcode{EBADF}]  il file descriptor \param{sock} non è valido.
1863   \item[\errcode{EFAULT}] l'indirizzo \param{optval} non è valido.
1864   \item[\errcode{EINVAL}] il valore di \param{optlen} non è valido.
1865   \item[\errcode{ENOPROTOOPT}] l'opzione scelta non esiste per il livello
1866     indicato. 
1867   \item[\errcode{ENOTSOCK}] il file descriptor \param{sock} non corrisponde ad
1868     un socket.
1869   \end{errlist}
1870 }
1871 \end{functions}
1872
1873
1874 Il primo argomento della funzione, \param{sock}, indica il socket su cui si
1875 intende operare; per indicare l'opzione da impostare si devono usare i due
1876 argomenti successivi, \param{level} e \param{optname}.  Come abbiamo visto in
1877 sez.~\ref{sec:net_protocols} i protocolli di rete sono strutturati su vari
1878 livelli, ed l'interfaccia dei socket può usarne più di uno. Si avranno allora
1879 funzionalità e caratteristiche diverse per ciascun protocollo usato da un
1880 socket, e quindi saranno anche diverse le opzioni che si potranno impostare
1881 per ciascun socket, a seconda del \textsl{livello} (trasporto, rete, ecc.) su
1882 cui si vuole andare ad operare.
1883
1884 Il valore di \param{level} seleziona allora il protocollo su cui vuole
1885 intervenire, mentre \param{optname} permette di scegliere su quale delle
1886 opzioni che sono definite per quel protocollo si vuole operare. In sostanza la
1887 selezione di una specifica opzione viene fatta attraverso una coppia di valori
1888 \param{level} e \param{optname} e chiaramente la funzione avrà successo
1889 soltanto se il protocollo in questione prevede quella opzione ed è utilizzato
1890 dal socket.  Infine \param{level} prevede anche il valore speciale
1891 \const{SOL\_SOCKET} usato per le opzioni generiche che sono disponibili per
1892 qualunque tipo di socket.
1893
1894 I valori usati per \param{level}, corrispondenti ad un dato protocollo usato
1895 da un socket, sono quelli corrispondenti al valore numerico che identifica il
1896 suddetto protocollo in \file{/etc/protocols}; dato che la leggibilità di un
1897 programma non trarrebbe certo beneficio dall'uso diretto dei valori numerici,
1898 più comunemente si indica il protocollo tramite le apposite costanti
1899 \texttt{SOL\_*} riportate in tab.~\ref{tab:sock_option_levels}, dove si sono
1900 riassunti i valori che possono essere usati per l'argomento
1901 \param{level}.\footnote{la notazione in questo caso è, purtroppo, abbastanza
1902   confusa: infatti in Linux il valore si può impostare sia usando le costanti
1903   \texttt{SOL\_*}, che le analoghe \texttt{IPPROTO\_*} (citate anche da
1904   Stevens in \cite{UNP1}); entrambe hanno gli stessi valori che sono
1905   equivalenti ai numeri di protocollo di \file{/etc/protocols}, con una
1906   eccesione specifica, che è quella del protocollo ICMP, per la quale non
1907   esista una costante, il che è comprensibile dato che il suo valore, 1, è
1908   quello che viene assegnato a \const{SOL\_SOCKET}.}
1909
1910 \begin{table}[!htb]
1911   \centering
1912   \footnotesize
1913   \begin{tabular}[c]{|l|l|}
1914     \hline
1915     \textbf{Livello} & \textbf{Significato} \\
1916     \hline
1917     \hline
1918     \const{SOL\_SOCKET}& opzioni generiche dei socket.\\
1919     \const{SOL\_IP}    & opzioni specifiche per i socket che usano IPv4.\\
1920     \const{SOL\_TCP}   & opzioni per i socket che usano TCP.\\
1921     \const{SOL\_IPV6}  & opzioni specifiche per i socket che usano IPv6.\\
1922     \const{SOL\_ICMPV6}& opzioni specifiche per i socket che usano ICMPv6.\\
1923     \hline
1924   \end{tabular}
1925   \caption{Possibili valori dell'argomento \param{level} delle 
1926     funzioni \func{setsockopt} e \func{getsockopt}.} 
1927   \label{tab:sock_option_levels}
1928 \end{table}
1929
1930 Il quarto argomento, \param{optval} è un puntatore ad una zona di memoria che
1931 contiene i dati che specificano il valore dell'opzione che si vuole passare al
1932 socket, mentre l'ultimo argomento \param{optlen},\footnote{questo argomento è
1933   in realtà sempre di tipo \ctyp{int}, come era nelle \acr{libc4} e
1934   \acr{libc5}; l'uso di \ctyp{socklen\_t} è stato introdotto da POSIX (valgono
1935   le stesse considerazioni per l'uso di questo tipo di dato fatte in
1936   sez.~\ref{sec:TCP_func_accept}) ed adottato dalle \acr{glibc}.} è la
1937 dimensione in byte dei dati presenti all'indirizzo indicato da \param{optval}.
1938 Dato che il tipo di dati varia a seconda dell'opzione scelta, occorrerà
1939 individuare qual'è quello che deve essere usato, ed utilizzare le opportune
1940 variabili.
1941
1942 La gran parte delle opzioni utilizzano per \param{optval} un valore intero, se
1943 poi l'opzione esprime una condizione logica, il valore è sempre un intero, am
1944 si dovrà usare un valore non nullo per abilitarla ed un valore nullo per
1945 disabilitarla.  Se invece l'opzione non prevede di dover ricevere nessun tipo
1946 di valore si deve impostare \param{optval} a \const{NULL}. Un piccolo numero
1947 di opzioni però usano dei tipi di dati peculiari, è questo il motivo per cui
1948 \param{optval} è stato definito come puntatore generico.
1949
1950 La seconda funzione usata per controllare le proprietà dei socket è
1951 \funcd{getsockopt}, che serve a leggere i valori delle opzioni dei socket ed a
1952 farsi restituire i dati relativi al loro funzionamento; il suo prototipo è:
1953 \begin{functions}
1954   \headdecl{sys/socket.h}
1955   \headdecl{sys/types.h}
1956
1957   \funcdecl{int getsockopt(int s, int level, int optname, void *optval,
1958     socklen\_t *optlen)} Legge le opzioni di un socket.
1959
1960   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
1961     errore, nel qual caso \var{errno} assumerà i valori:
1962   \begin{errlist}
1963   \item[\errcode{EBADF}] il file descriptor \param{sock} non è valido.
1964   \item[\errcode{EFAULT}] l'indirizzo \param{optval} o quello di
1965     \param{optlen} non è valido.
1966   \item[\errcode{ENOPROTOOPT}] l'opzione scelta non esiste per il livello
1967     indicato. 
1968   \item[\errcode{ENOTSOCK}] il file descriptor \param{sock} non corrisponde ad
1969     un socket.
1970   \end{errlist}
1971 }
1972 \end{functions}
1973
1974 I primi tre argomenti sono identici ed hanno lo stesso significato di quelli
1975 di \func{setsockopt}, anche se non è detto che tutte le opzioni siano definite
1976 per entrambe le funzioni. In questo caso \param{optval} viene usato per
1977 ricevere le informazioni ed indica l'indirizzo a cui andranno scritti i dati
1978 letti dal socket, infine \param{optlen} diventa un puntatore ad una variabile
1979 che viene usata come \textit{value result argument} per indicare, prima della
1980 chiamata della funzione, la lunghezza del buffer allocato per \param{optval} e
1981 per ricevere indietro, dopo la chiamata della funzione, la dimensione
1982 effettiva dei dati scritti su di esso. Se la dimenzione del buffer allocato
1983 per \param{optval} non è sufficiente si avrà un errore.
1984
1985
1986
1987 \subsection{Le opzioni generiche}
1988 \label{sec:sock_generic_options}
1989
1990 Come accennato esiste un insieme generico di opzioni dei socket che possono
1991 applicarsi a qualunque tipo di socket,\footnote{una descrizione di queste
1992   opzioni è generalmente disponibile nella settima sezione delle pagine di
1993   manuale, nel caso specifico la si può consultare con \texttt{man 7 socket}.}
1994 indipendentemente da quale protocollo venga poi utilizzato. Se si vuole
1995 operare su queste opzioni generiche il livello da utilizzare è
1996 \const{SOL\_SOCKET}; si è riportato un elenco di queste opzioni in
1997 tab.~\ref{tab:sock_opt_socklevel}.
1998
1999
2000 \begin{table}[!htb]
2001   \centering
2002   \footnotesize
2003   \begin{tabular}[c]{|l|c|c|c|l|l|}
2004     \hline
2005     \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
2006                     \textbf{Descrizione}\\
2007     \hline
2008     \hline
2009     \const{SO\_KEEPALIVE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
2010                           controlla l'attività della connessione.\\
2011     \const{SO\_OOBINLINE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
2012                           lascia in linea i dati \textit{out-of-band}.\\
2013     \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
2014                           basso livello sul buffer di ricezione.\\
2015     \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$&         &\texttt{int}&
2016                           basso livello sul buffer di trasmissione.\\
2017     \const{SO\_RCVTIMEO} &$\bullet$&$\bullet$&         &\texttt{timeval}& 
2018                           timeout in ricezione.\\
2019     \const{SO\_SNDTIMEO} &$\bullet$&$\bullet$&         &\texttt{timeval}& 
2020                           timeout in trasmissione.\\
2021     \const{SO\_BSDCOMPAT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
2022                           abilita la compatibilità con BSD.\\
2023     \const{SO\_PASSCRED} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
2024                           abilita la ricezione di credenziali.\\
2025     \const{SO\_PEERCRED} &$\bullet$&         &         &\texttt{ucred}& 
2026                           restituisce le credenziali del processo remoto.\\
2027     \const{SO\_BINDTODEVICE}&$\bullet$&$\bullet$&         &\texttt{char *}& 
2028                           lega il socket ad un dispositivo.\\
2029     \const{SO\_DEBUG}    &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
2030                           abilita il debugging sul socket.\\
2031     \const{SO\_REUSEADDR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
2032                           consente il riutilizzo di un indirizzo locale.\\
2033     \const{SO\_TYPE}     &$\bullet$&         &         &\texttt{int}& 
2034                           restituisce il tipo di socket.\\
2035     \const{SO\_ACCEPTCONN}&$\bullet$&        &         &\texttt{int}& 
2036                           indica se il socket è in ascolto.\\
2037     \const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
2038                           non invia attraverso un gateway.\\
2039     \const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
2040                           attiva o disattiva il \textit{broadcast}.\\
2041     \const{SO\_SNDBUF}   &$\bullet$&$\bullet$&         &\texttt{int}& 
2042                           imposta dimensione del buffer di trasmissione.\\
2043     \const{SO\_RCVBUF}   &$\bullet$&$\bullet$&         &\texttt{int}& 
2044                           imposta dimensione del buffer di ricezione.\\
2045     \const{SO\_LINGER}   &$\bullet$&$\bullet$&         &\texttt{linger}&
2046                           indugia nella chiusura con dati da spedire.\\
2047     \const{SO\_PRIORITY} &$\bullet$&$\bullet$&         &\texttt{int}& 
2048                           imposta la priorità del socket.\\
2049     \const{SO\_ERROR}    &$\bullet$&         &         &\texttt{int}& 
2050                           riceve e cancella gli errori pendenti.\\
2051    \hline
2052   \end{tabular}
2053   \caption{Le opzioni disponibili al livello \const{SOL\_SOCKET}.} 
2054   \label{tab:sock_opt_socklevel}
2055 \end{table}
2056
2057 La tabella elenca le costanti che identificano le singole opzioni da usare
2058 come valore per \param{optname}; le due colonne seguenti indicano per quali
2059 delle due funzioni (\func{getsockopt} o \func{setsockopt}) l'opzione è
2060 disponibile, mentre la colonna successiva indica, quando di ha a che fare con
2061 un valore di \param{optval} intero, se l'opzione è da considerare un numero o
2062 un valore logico. Si è inoltre riportato sulla quinta colonna il tipo di dato
2063 usato per \param{optval} ed una breve descrizione del significato delle
2064 singole opzioni sulla sesta.
2065
2066
2067 Dato che le descrizioni di tab.~\ref{tab:sock_opt_socklevel} sono estremamente
2068 sommarie, vale la pena entrare in dettagli maggiori; questo ci consentirà
2069 anche di trattare i vari casi particolari, dato che nonostante queste opzioni
2070 siano indicate al livello generico, alcune di esse han senso solo per alcuni
2071 tipi di socket. L'elenco dettagliato del significato di ciascuna di esse è
2072 allora il seguente:
2073 \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
2074 \item[\const{SO\_KEEPALIVE}] una connessione può restare attiva se non viene
2075   effettuato alcun traffico su di essa; in certi casi però può essere utile
2076   controllarne lo stato per accorgersi di eventuali problemi. Per questo, se
2077   si imposta questa opzione, è cura del kernel inviare degli appositi messaggi
2078   sulla rete (detti appunto \textit{keep-alive}) per verificare se la
2079   connessione è attiva.  L'opzione funziona soltanto con socket che supportino
2080   le connessioni (non ha senso per socket UDP ad esempio), ed utilizza per
2081   \param{optval} un intero usato come valore logico. 
2082
2083   L'opzione si applica principalmente ai socket TCP.  Con le impostazioni di
2084   default (che sono riprese da BSD) Linux emette un messaggio di
2085   \textit{keep-alive} verso l'altro capo della connessione se questa è rimasta
2086   senza traffico per più di due ore. Se è tutto a posto il messaggio viene
2087   ricevuto e verrà emesso un segmento ACK di risposta, alla cui ricezione
2088   ripartirà un'altro ciclo di attesa per altre due ore di inattività; tutto
2089   ciò viene effettuato dal kernel e le applicazioni non riceveranno nessun
2090   dato. 
2091
2092   In caso di problemi invece si possono avere i due casi già illustrati in
2093   sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione prococe del
2094   server: il primo è quello in cui la macchina remota è caduta ed è stata
2095   riavviata, per cui dopo il riavvio la connessione non viene più
2096   riconosciuta,\footnote{si ricordi che un normale riavvio non ha questo
2097     effetto, in quanto si passa per la chiusura del processo, che chiude anche
2098     il socket inviando un segmento FIN all'altro capo della connessione.} e si
2099   otterrà come risposta un RST. In tal caso il socket viene chiuso dopo aver
2100   impostato un errore \errcode{ECONNRESET}.
2101
2102   Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
2103   più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di
2104   75 secondi ad un massimo di 9 volte\footnote{entrambi questi valori possono
2105     essere opportunamente modificati con gli opportuni parametri illustrati in
2106     sez.~\ref{sec:sock_sysctl}, si tenga presente che però questo vale a
2107     livello di kernel ed i valori saranno applicati a \textsl{tutti} i
2108     socket.} (per un totale di 11 minuti e 15 secondi) dopo di che, se non si
2109   è ricevuta nessuna risposta, il socket viene chiuso dopo aver impostato un
2110   errore di \errcode{ETIMEDOUT}. Se invece si riceve in risposta ad uno di
2111   questi messaggi un pacchetto ICMP di destinazione irraggiungibile, verrà
2112   restituito l'errore corrispondente. 
2113
2114   In generale questa opzione serve per individuare una caduta della
2115   connessione,\footnote{il crash di un processo di nuovo comporta la chiusura
2116     di tutti i file che aveva aperti e la relativa emissione degli opportuni
2117     segmenti FIN nel caso dei socket.} e viene usata sui server per evitare di
2118   mantenere impegnate le risorse dedicate a trattare delle connessioni in
2119   realtà terminate.  Abilitandola le connessioni effettivamente terminate
2120   vengono chiuse ed una \func{select} potrà rilevare la conclusione delle
2121   stesse e ricevere il relativo errore. Si tenga però presente che non si ha
2122   la certezza assoluta che un errore di \errcode{ETIMEDOUT} corrisponda ad una
2123   reale conclusione della connessione, il problema potrebbe essere dovuto ad
2124   un problema di routing che perduri per un tempo maggiore di quello impiegato
2125   nei vari tentativi di ritrasmissione del \textit{keep-alive}. 
2126
2127
2128 \item[\const{SO\_OOBINLINE}] se questa opzione viene abilitata i dati
2129   \textit{out-of-band} vengono inviati direttamente nel flusso di dati del
2130   socket (e sono quindi letti con una normale \func{read}) invece che restare
2131   disponibili solo per l'accesso con l'uso del flag \const{MSG\_OOB} di
2132   \func{recvmsg}. L'argomento è trattato in dettaglio in
2133   sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che
2134   supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad
2135   esempio), ed utilizza per \param{optval} un intero usato come valore logico.
2136
2137
2138 \item[\const{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il
2139   numero minimo di byte che devono essere presenti nel buffer di ricezione
2140   perché il kernel passi i dati all'utente, restituendoli ad una \func{read} o
2141   segnalando ad una \func{select} (vedi sez.~\ref{sec:TCP_sock_select}) che ci
2142   sono dati in ingresso. L'opzione utilizza per \param{optval} un intero che
2143   specifica il numero di byte, ma con Linux questo valore è sempre 1 e non può
2144   essere cambiato; \func{getsockopt} leggerà questo valore mentre
2145   \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. 
2146
2147
2148 \item[\const{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il
2149   numero minimo di byte che devono essere presenti nel buffer di scrittura
2150   perché il kernel li invii al protocollo successivo, consentendo ad una
2151   \func{write} di ritornare o segnalando ad una \func{select} (vedi
2152   sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura.
2153   L'opzione utilizza per \param{optval} un intero che specifica il numero di
2154   byte, come per la precedente \const{SO\_RCVLOWAT} con Linux questo valore è
2155   sempre 1 e non può essere cambiato; \func{getsockopt} leggerà questo valore
2156   mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}.
2157
2158
2159 \item[\const{SO\_RCVTIMEO}] l'opzione permette di impostare un tempo massimo
2160   sulle operazioni di lettura da un socket, e prende per \param{optval} una
2161   struttura di tipo \struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct})
2162   identica a quella usata con \func{select}. Con \func{getsockopt} si può
2163   leggere il valore attuale, mentre con \func{setsockopt} si imposta il tempo
2164   voluto, usando un valore nullo per \struct{timeval} il timeout viene
2165   rimosso. 
2166
2167   Se l'opzione viene attivata tutte le volte che una delle funzioni di lettura
2168   (\func{read}, \func{readv}, \func{recv}, \func{recvfrom} e \func{recvmsg})
2169   si blocca in attesa di dati per un tempo maggiore di quello impostato, essa
2170   ritornerà un valore -1 e la variabile \var{errno} sarà impostata con un
2171   errore di \errcode{EAGAIN} e \errcode{EWOULDBLOCK}, così come sarebbe
2172   avvenuto se si fosse aperto il socket in modalità non bloccante.\footnote{in
2173     teoria, se il numero di byte presenti nel buffer di ricezione fosse
2174     inferiore a quello specificato da \const{SO\_RCVLOWAT}, l'effetto potrebbe
2175     essere semplicemente quello di provocare l'uscita delle funzioni di
2176     lettura restituendo il numero di byte fino ad allora ricevuti; dato che
2177     con Linux questo valore è sempre 1 questo caso non esiste.}
2178
2179   In genere questa opzione non è molto utilizzata se si ha a che fare con la
2180   lettura dei dati, in quanto è sempre possibile usare una \func{select} che
2181   consente di specificare un \textit{timeout}; l'uso di \func{select} non
2182   consente però di impostare il timout per l'uso di \func{connect}, per avere
2183   il quale si può ricorrere a questa opzione. 
2184
2185 % verificare con un programma di test
2186
2187 \item[\const{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo
2188   sulle operazioni di scrittura su un socket, ed usa gli stessi valori di
2189   \const{SO\_RCVTIMEO}.  In questo caso però si avrà un errore di
2190   \errcode{EAGAIN} o \errcode{EWOULDBLOCK} per le funzioni di scrittura
2191   \func{write}, \func{writev}, \func{send}, \func{sendfrom} e \func{sendmsg}
2192   qualora queste restino bloccate per un tempo maggiore di quello specificato. 
2193
2194 \item[\const{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il
2195   comportamento di BSD (in particolare ne riproduce i bug).  Attualmente è una
2196   opzione usata solo per il protocollo UDP e ne è prevista la rimozione in
2197   futuro.  L'opzione utilizza per \param{optval} un intero usato come valore
2198   logico. 
2199
2200   Quando viene abilitata gli errori riportati da messaggi ICMP per un socket
2201   UDP non vengono passati al programma in user space. Con le versioni 2.0.x
2202   del kernel erano anche abilitate altre opzioni per i socket raw, che sono
2203   state rimosse con il passaggio al 2.2; è consigliato correggere i programmi
2204   piuttosto che usare questa funzione. 
2205
2206 \item[\const{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain la
2207   ricezione dei messaggi di controllo di tipo \const{SCM\_CREDENTIALS}. Prende
2208   come \param{optval} un intero usato come valore logico. 
2209
2210 \item[\const{SO\_PEERCRED}] questa opzione restituisce le credenziali del
2211   processo remoto connesso al socket; l'opzione è disponibile solo per socket
2212   unix-domain e può essere usata solo con \func{getsockopt}.  Utilizza per
2213   \param{optval} una apposita struttura \struct{ucred} (vedi
2214   sez.~\ref{sec:unix_socket_xxx}). 
2215
2216 \item[\const{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
2217   socket ad una particolare interfaccia interfaccia, in modo che esso possa
2218   ricevere ed inviare pacchetti solo su quella. L'opzione richiede per
2219   \param{optval} il puntatore ad una stringa contenente il nome
2220   dell'interfaccia (ad esempio \texttt{eth0}); se si utilizza una stringa
2221   nulla o un valore nullo per \param{optlen} si rimuove un precedente
2222   collegamento. 
2223
2224   Il nome della interfaccia deve essere specificato con una stringa terminata
2225   da uno zero e di lunghezza massima pari a \const{IFNAMSIZ}; l'opzione è
2226   effettiva solo per alcuni tipi di socket, ed in particolare per quelli della
2227   famiglia \const{AF\_INET}; non è invece supportata per i \textit{packet
2228     socket} (vedi sez.~\ref{cha:advanced_socket_xxx}). 
2229
2230
2231 \item[\const{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
2232   dei socket; l'opzione utilizza per \param{optval} un intero usato come
2233   valore logico, e può essere utilizzata solo da un processo con i privilegi
2234   di amministratore (in particolare con la \textit{capability}
2235   \const{CAP\_NET\_ADMIN}).  L'opzione necessita inoltre dell'opportuno
2236   supporto nel kernel;\footnote{deve cioè essere definita la macro di
2237     preprocessore \texttt{SOCK\_DEBUGGING} nel file \file{include/net/sock.h}
2238     dei sorgenti del kernel, questo è sempre vero nei kernel delle serie
2239     superiori alla 2.3, per i kernel delle serie precedenti invece è
2240     necessario aggiungere a mano detta definizione; è inoltre possibile
2241     abilitare anche il tracciamento degli stati del TCP definendo la macro
2242     \texttt{STATE\_TRACE} in \file{include/net/tcp.h}.}  quando viene
2243   abilitata una serie di messaggi con le informazioni di debug vengono inviati
2244   direttamente al sistema del kernel log.\footnote{si tenga presente che il
2245     comportamento è diverso da quanto avviene con BSD, dove l'opzione opera
2246     solo sui socket TCP, causando la scrittura di tutti i pacchetti inviati
2247     sulla rete su un buffer circolare che viene letto da un apposito
2248     programma, \cmd{trpt}.} 
2249
2250 \item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
2251   \func{bind} su indirizzi locali che siano già in uso; l'opzione utilizza per
2252   \param{optval} un intero usato come valore logico.  Questa opzione modifica
2253   il comportamento normale dell'interfaccia dei socket che fa fallire
2254   l'esecuzione della funzione \func{bind} con un errore di
2255   \errcode{EADDRINUSE} quando l'indirizzo locale\footnote{più propriamente il
2256     controllo viene eseguito sulla porta.} è già in uso da parte di un altro
2257   socket. 
2258
2259   Come Stevens sottolinea in \cite{UNP1} si distinguono quattro casi per
2260   l'utilizzo di questa opzione; il primo è quello in cui un server è terminato
2261   ma esistono ancora dei processi figli che mantengono attiva almeno una
2262   connessione remota che utilizza l'indirizzo locale; quando si riavvia il
2263   server questo viene bloccato sulla chiamata a \func{bind} dato che la porta
2264   è ancora utilizzata in una connessione esistente.\footnote{questa è una
2265     delle domande più frequenti sui newsgroup dedicati allo sviluppo, in
2266     quanto è piuttosto comune in questa situazione quando si sta sviluppando
2267     un server che si ferma e si riavvia in continuazione.}  Inoltre se si usa
2268   il protocollo TCP questo può avvenire anche dopo che l'ultimo processo
2269   figlio è terminato, dato che la connessione può restare attiva anche dopo la
2270   chiusura del socket mantenendosi nello stato \texttt{TIME\_WAIT}. 
2271
2272   Usando \const{SO\_REUSEADDR} fra la chiamata a \func{socket} e quella a
2273   \func{bind} si consente a quest'ultima di avere comunque successo anche se
2274   la connessione è attiva (o nello stato texttt{TIME\_WAIT}). È bene però
2275   ricordare (si riveda quanto detto in sez.~\ref{sec:TCP_time_wait}) che la
2276   presenza dello stato \texttt{TIME\_WAIT} ha una ragione, ed infatti se si
2277   usa questa opzione esiste sempre una probabilità, anche se estremamente
2278   remota,\footnote{perché ciò avvenga infatti non solo devono coincidere gli
2279     indirizzi IP e le porte degli estremi della nuova connessione, ma anche i
2280     numeri di sequenza dei pacchetti, e questo è estremamente improbabile.}
2281   che eventuali pacchetti rimasti intrappolati in una precedente connessione
2282   possano finire fra quelli di una nuova.
2283
2284   Il secondo caso in cui viene usata questa opzione è quando si ha una
2285   macchina cui sono assegnati diversi numeri IP (o come suol dirsi
2286   \textit{multi-homed}) e si vuole porre in ascolto sulla stessa porta un
2287   programma diverso (o una istanza diversa dello stesso programma) per
2288   indirizzi IP diversi. Si ricordi infatti che è sempre possibile indicare a
2289   \func{bind} di collegarsi solo su di un indirizzo specifico; in tal caso se
2290   un altro programma cerca di riutilizzare la stessa porta (anche specificando
2291   un indirizzo diverso) otterrà un errore a meno di non aver preventivamente
2292   impostato \const{SO\_REUSEADDR}. Usando questa opzione diventa anche
2293   possibile eseguire \func{bind} sull'indirizzo generico, e questo permetterà
2294   il collegamento per tutti gli indirizzi (di quelli presenti) per i quali la
2295   porta risulti libera. Infine si tenga presente che con il protocollo TCP non
2296   è mai possibile far partire server che eseguano \func{bind} sullo stesso
2297   indirizzo e la stessa porta, cioè ottenere quello che viene chiamato un
2298   \textit{completely duplicate binding}.
2299
2300   Il terzo impiego è simile al precedente e prevede l'uso di \func{bind}
2301   all'interno dello stesso programma per associare indirizzi diversi a socket
2302   diversi. Vale in questo caso quanto detto in precedenza, l'unica differenza
2303   è che in questo caso le diverse chiamate a  \func{bind} sono eseguite
2304   all'interno dello stesso programma.
2305
2306
2307 \item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket
2308   su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per
2309   \param{optval} un intero in cui verrà restituto il valore numerico che lo
2310   identifica (ad esempio \const{SOCK\_STREAM}). 
2311
2312 \item[\const{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket
2313   su cui opera è stato posto in modalità di ricezione di eventuali connessioni
2314   con una chiamata a \func{listen}. L'opzione può essere usata soltanto con
2315   \func{getsockopt} e utilizza per \param{optval} un intero in cui viene
2316   restituito 1 se il socket è in ascolto e 0 altrimenti. 
2317
2318 \item[\const{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei
2319   pacchetti del socket, saltando ogni processo relativo all'uso della tabella
2320   di routing del kernel. Prende come \param{optval} un intero usato come
2321   valore logico. 
2322
2323 \item[\const{SO\_BROADCAST}]
2324
2325
2326 \item[\const{SO\_SNDBUF}]
2327
2328
2329 \item[\const{SO\_RCVBUF}]  
2330
2331
2332 \item[\const{SO\_LINGER}]  
2333 \item[\const{SO\_PRIORITY}]
2334
2335 \item[\const{SO\_ERROR}] 
2336
2337 \end{basedescript}
2338
2339
2340
2341
2342 \section{Altre funzioni di controllo}
2343 \label{sec:sock_ctrl_func}
2344
2345 Benché la maggior parte delle caratteristiche dei socket sia gestita
2346 attraverso le due funzioni \func{setsockopt} e \func{getsockopt}, alcune
2347 funzionalità possono essere impostate attraverso quelle che sono le funzioni
2348 classiche per il controllo delle proprietà dei file, cioè \func{fcntl} e
2349 \func{ioctl}. 
2350
2351
2352 \subsection{L'uso di \func{fcntl} per i socket}
2353 \label{sec:sock_fcntl}
2354
2355 Abbiamo già trattato l'uso di \func{fcntl} in sez.~\ref{sec:file_fcntl}, dove
2356 però ne abbiamo descritto le funzionalità nell'ambito della sua applicazione a
2357 file descriptor associati a file normali; tratteremo qui invece il suo uso
2358 specifico quando la si impiega su file descriptor associati a dei socket. 
2359
2360
2361 \subsection{L'uso di \func{ioctl} per i socket}
2362 \label{sec:sock_ioctl}
2363
2364 Come per \func{fcntl} abbiamo trattato l'uso di \func{ioctl} in
2365 sez.~\ref{sec:file_ioctl}, dove ne abbiamo descritto le funzionalità
2366 nell'ambito dell'applicazione su file normali; tratteremo qui il suo uso
2367 specifico quando la si impiega su file descriptor associati a dei socket. 
2368
2369
2370 \subsection{L'uso di \func{sysctl} per le proprietà della rete}
2371 \label{sec:sock_sysctl}
2372
2373 Come ultimo argomento di questa sezione tratteremo l'uso della funzione
2374 \func{sysctl} (che è stata introdotta nelle sue funzionalità generiche in
2375 sez.~\ref{sec:sys_sysctl}) per quanto riguarda le sue capacità di effettuare
2376 impostazioni relative a proprietà generali dei socket (di tutti quelli di un
2377 certo tipo o di tutti quelli che usano un certo protocollo) rispetto alle
2378 funzioni viste finora che consentono di controllare quelle di un singolo
2379 socket. 
2380
2381
2382
2383
2384 %%% Local Variables: 
2385 %%% mode: latex
2386 %%% TeX-master: "gapil"
2387 %%% End: