Modifiche rimaste indietro.
[gapil.git] / sockctrl.tex
index f371f92dfc39e017dea8faba069a4b291552137b..d49586f78cdceeecf95c6df3ce3bb84d533b8310 100644 (file)
@@ -87,9 +87,9 @@ dominio, e prevedeva solo l'utilizzo del DNS e del file statico
 
 Per questo aspetto il file di configurazione principale del sistema è
 \conffile{/etc/resolv.conf} che contiene in sostanza l'elenco degli indirizzi
-IP dei server DNS da contattare; a questo si affianca il file
-\conffile{/etc/host.conf} il cui scopo principale è indicare l'ordine in cui
-eseguire la risoluzione dei nomi (se usare prima i valori di
+IP dei server DNS da contattare; a questo si affiancava (fino alle \acr{glibc}
+2.4) il file \conffile{/etc/host.conf} il cui scopo principale era indicare
+l'ordine in cui eseguire la risoluzione dei nomi (se usare prima i valori di
 \conffile{/etc/hosts} o quelli del DNS). Tralasciamo i dettagli relativi alle
 varie direttive che possono essere usate in questi file, che si trovano nelle
 rispettive pagine di manuale.
@@ -182,6 +182,9 @@ per ciascuna di queste classi, che viene inizia col nome di
 tab.~\ref{tab:sys_NSS_classes} seguito da un carattere ``\texttt{:}'' e
 prosegue con la lista dei \textsl{servizi} su cui le relative informazioni
 sono raggiungibili, scritti nell'ordine in cui si vuole siano interrogati.
+Pertanto nelle versioni recenti delle librerie è questo file e non
+\conffile{/etc/host.conf}  a indicare l'ordine con cui si esegue la
+risoluzione dei nomi.
 
 Ogni servizio è specificato a sua volta da un nome, come \texttt{file},
 \texttt{dns}, \texttt{db}, ecc.  che identifica la libreria dinamica che
@@ -202,7 +205,7 @@ sezioni successive.
 \itindend{Name~Service~Switch~(NSS)}
 
 
-\subsection{Le funzioni di interrogazione del \textit{resolver}}
+\subsection{Le funzioni di interrogazione del DNS}
 \label{sec:sock_resolver_functions}
 
 Prima di trattare le funzioni usate normalmente nella risoluzione dei nomi a
@@ -251,9 +254,8 @@ informazione che un server DNS fornisce normalmente.
 L'esistenza di vari tipi di informazioni è un altro dei motivi per cui il
 \textit{resolver} prevede, oltre a quelle relative alla semplice risoluzione
 dei nomi, un insieme di funzioni specifiche dedicate all'interrogazione di un
-server DNS, tutte nella forma \texttt{res\_}\textsl{\texttt{nome}}.
-Tradizionalmente la prima di queste funzioni è \funcd{res\_init}, il cui
-prototipo è:
+server DNS, tutte nella forma \texttt{res\_}\textsl{\texttt{nome}}. La prima
+di queste funzioni è \funcd{res\_init}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{netinet/in.h} 
@@ -266,40 +268,41 @@ prototipo è:
 }
 \end{funcproto}
 
-
-La funzione legge il contenuto dei file di configurazione (i già citati
-\file{resolv.conf} e \file{host.conf}) per impostare il dominio di default,
-gli indirizzi dei server DNS da contattare e l'ordine delle ricerche; se non
-sono specificati server verrà utilizzato l'indirizzo locale, e se non è
-definito un dominio di default sarà usato quello associato con l'indirizzo
-locale (ma questo può essere sovrascritto con l'uso della variabile di
-ambiente \envvar{LOCALDOMAIN}). In genere non è necessario eseguire questa
-funzione direttamente in quanto viene automaticamente chiamata la prima volta
-che si esegue una delle altre.
+La funzione legge il contenuto dei file di configurazione per impostare il
+dominio di default, gli indirizzi dei server DNS da contattare e l'ordine
+delle ricerche; se non sono specificati server verrà utilizzato l'indirizzo
+locale, e se non è definito un dominio di default sarà usato quello associato
+con l'indirizzo locale (ma questo può essere sovrascritto con l'uso della
+variabile di ambiente \envvar{LOCALDOMAIN}). In genere non è necessario
+eseguire questa funzione esplicitamente, in quanto viene automaticamente
+chiamata la prima volta che si esegue una qualunque delle altre.
 
 Le impostazioni e lo stato del \textit{resolver} inizializzati da
 \func{res\_init} vengono mantenuti in una serie di variabili raggruppate nei
-campi di una apposita struttura \var{\_res} usata da tutte queste
-funzioni. Essa viene definita in \headfiled{resolv.h} ed è utilizzata
-internamente alle funzioni essendo definita come variabile globale; questo
-consente anche di accedervi direttamente all'interno di un qualunque
-programma, una volta che la sia opportunamente dichiarata come:
+campi di una apposita struttura. Questa struttura viene definita in
+\headfiled{resolv.h} e mantenuta nella variabile globale \var{\_res}, che
+viene utilizzata internamente da tutte le funzioni dell'interfaccia. Questo
+consente anche di accedere direttamente al contenuto della variabile
+all'interno di un qualunque programma, una volta che la sia opportunamente
+dichiarata con:
 \includecodesnip{listati/resolv_option.c}
 
-Dato che l'uso di una variabile globale rende tutte le funzioni classiche non
-rientranti, con l'uscita di BIND 8.2 è stata introdotta una nuova interfaccia
-in cui tutte le nuove funzioni (il cui nome è ottenuto apponendo una
-``\texttt{n}'' al nome di quella tradizionale nella forma
-\texttt{res\_n\textsl{nome}}). Tutte le nuove funzioni prendono un primo
-argomento aggiuntivo, \param{statep}, che punti ad una struttura dello stesso
-tipo, che verrà usato per mantenere lo stato del \textit{resolver} e potrà
-essere usata senza problemi anche con programmi \textit{multithread}.  Anche
-in questo caso per poterlo utilizzare occorrerà una opportuna dichiarazione
-del tipo di dato con:
+Dato che l'uso di una variabile globale rende tutte le funzioni
+dell'interfaccia classica non rientranti, queste sono state deprecate in
+favore di una nuova interfaccia in cui esse sono state sostituite da
+altrettante nuove funzioni, il cui nome è ottenuto apponendo una
+``\texttt{n}'' al nome di quella tradizionale (cioè nella forma
+\texttt{res\_n\textsl{nome}}). Tutte le nuove funzioni sono identiche alle
+precedenti, ma hanno un primo argomento aggiuntivo, \param{statep}, puntatore
+ad una struttura dello stesso tipo di \var{\_res}. Questo consente di usare
+una variabile locale per mantenere lo stato del \textit{resolver}, rendendo le
+nuove funzioni rientranti.  In questo caso per poter utilizzare il nuovo
+argomento occorrerà una opportuna dichiarazione del relativo tipo di dato con:
 \includecodesnip{listati/resolv_newoption.c}
-e la nuova funzione che utilizzata per inizializzare il \textit{resolver} (che
-come la precedente viene chiamata automaticamente dalle altre funzioni) è
-\funcd{res\_ninit} il cui prototipo è:
+
+Così la nuova funzione utilizzata per inizializzare il \textit{resolver} (che
+come la precedente viene chiamata automaticamente da tutte altre funzioni) è
+\funcd{res\_ninit}, ed il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{netinet/in.h} 
@@ -313,12 +316,14 @@ come la precedente viene chiamata automaticamente dalle altre funzioni) è
 \end{funcproto}
 
 Indipendentemente da quale versione delle funzioni si usino, tutti i campi
-della struttura sono ad uso interno, e vengono usualmente inizializzate da
-\func{res\_init} o \func{res\_ninit} in base al contenuto dei file di
-configurazione e ad una serie di valori di default. L'unico campo che può
-essere utile modificare è \var{\_res.options}, una maschera binaria che
-contiene una serie di bit di opzione che permettono di controllare il
-comportamento del \textit{resolver}.
+della struttura (\var{\_res} o la variabile puntata da \param{statep}) sono ad
+uso interno, e vengono usualmente inizializzate da \func{res\_init} o
+\func{res\_ninit} in base al contenuto dei file di configurazione e ad una
+serie di valori di default. L'unico campo che può essere utile modificare è
+\var{\_res.options} (o l'equivalente della variabile puntata
+da\param{statep}), una maschera binaria che contiene una serie di bit che
+esprimono le opzioni che permettono di controllare il comportamento del
+\textit{resolver}.
 
 \begin{table}[htb]
   \centering
@@ -334,8 +339,7 @@ comportamento del \textit{resolver}.
     \constd{RES\_AAONLY}     & Accetta solo risposte autoritative.\\
     \constd{RES\_USEVC}      & Usa connessioni TCP per contattare i server 
                                invece che l'usuale UDP.\\
-    \constd{RES\_PRIMARY}    & Interroga soltanto server DNS primari.
-    \\
+    \constd{RES\_PRIMARY}    & Interroga soltanto server DNS primari.\\
     \constd{RES\_IGNTC}      & Ignora gli errori di troncamento, non ritenta la
                                richiesta con una connessione TCP.\\
     \constd{RES\_RECURSE}    & Imposta il bit che indica che si desidera
@@ -345,7 +349,7 @@ comportamento del \textit{resolver}.
                                contengono cioè un ``\texttt{.}'').\\
     \constd{RES\_STAYOPEN}   & Usato con \const{RES\_USEVC} per mantenere
                                aperte le connessioni TCP fra interrogazioni
-                               diverse. \\
+                               diverse.\\
     \constd{RES\_DNSRCH}     & Se attivo \func{res\_search} esegue le ricerche
                                di nomi di macchine nel dominio corrente o nei
                                domini ad esso sovrastanti.\\
@@ -373,9 +377,9 @@ comportamento del \textit{resolver}.
 
 Per utilizzare questa funzionalità per modificare le impostazioni direttamente
 da programma occorrerà impostare un opportuno valore per questo campo ed
-invocare esplicitamente \func{res\_init}, dopo di che le altre funzioni
-prenderanno le nuove impostazioni. Le costanti che definiscono i vari bit di
-questo campo, ed il relativo significato sono illustrate in
+invocare esplicitamente \func{res\_init} o \func{res\_ninit}, dopo di che le
+altre funzioni prenderanno le nuove impostazioni. Le costanti che definiscono
+i vari bit di questo campo, ed il relativo significato sono illustrate in
 tab.~\ref{tab:resolver_option}; trattandosi di una maschera binaria un valore
 deve essere espresso con un opportuno OR aritmetico di dette costanti; ad
 esempio il valore di default delle opzioni, espresso dalla costante
@@ -466,8 +470,8 @@ Le classi di indirizzi supportate da un server DNS sono tre, ma di queste in
 pratica oggi viene utilizzata soltanto quella degli indirizzi internet; le
 costanti che identificano dette classi, da usare come valore per l'argomento
 \param{class} delle precedenti funzioni, sono riportate in
-tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe
-  \constd{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta.}
+tab.~\ref{tab:DNS_address_class} (esisteva in realtà anche una classe
+\constd{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta).
 
 \begin{table}[htb]
   \centering
@@ -493,7 +497,7 @@ tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe
 Come accennato le tipologie di dati che sono mantenibili su un server DNS sono
 diverse, ed a ciascuna di essa corrisponde un diverso tipo di \textit{resource
   record}. L'elenco delle costanti, ripreso dai file di dichiarazione
-  \headfiled{arpa/nameser.h} e \headfiled{arpa/nameser\_compat.h}, che
+\headfiled{arpa/nameser.h} e \headfiled{arpa/nameser\_compat.h}, che
 definiscono i valori che si possono usare per l'argomento \param{type} per
 specificare il tipo di \textit{resource record} da richiedere è riportato in
 tab.~\ref{tab:DNS_record_type}; le costanti (tolto il \texttt{T\_} iniziale)
@@ -504,7 +508,7 @@ BIND,\footnote{BIND, acronimo di \textit{Berkley Internet Name Domain}, è una
   (cioè i suoi \textit{resource record} vengono mantenuti in quelli che sono
   usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo di dominio
   è identificato da un nome che è appunto identico a quello delle costanti di
-  tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.}  e che
+  tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.} e che
 normalmente sono anche usati come nomi per indicare i record.
 
 \begin{table}[!htb]
@@ -594,7 +598,7 @@ indicarli si è usata la notazione dei file di zona di BIND):
 
 Come accennato in caso di successo le due funzioni di richiesta restituiscono
 il risultato della interrogazione al server, in caso di insuccesso l'errore
-invece viene segnalato da un valore di ritorno pari a -1, ma in questo caso,
+invece viene segnalato da un valore di ritorno pari a $-1$, ma in questo caso,
 non può essere utilizzata la variabile \var{errno} per riportare un codice di
 errore, in quanto questo viene impostato per ciascuna delle chiamate al
 sistema utilizzate dalle funzioni del \textit{resolver}, non avrà alcun
@@ -612,7 +616,7 @@ tab.~\ref{tab:h_errno_values}.
 \begin{table}[!htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|p{11cm}|}
+  \begin{tabular}[c]{|l|p{9cm}|}
     \hline
     \textbf{Costante} & \textbf{Significato} \\
     \hline
@@ -635,45 +639,34 @@ tab.~\ref{tab:h_errno_values}.
   \label{tab:h_errno_values}
 \end{table}
 
-Insieme alla nuova variabile vengono definite anche due nuove funzioni per
+Insieme alla nuova variabile vengono definite anche delle nuove funzioni per
 stampare l'errore a video, analoghe a quelle di sez.~\ref{sec:sys_strerror}
 per \var{errno}, ma che usano il valore di \var{h\_errno}; la prima è
 \funcd{herror} ed il suo prototipo è:
 
-
-\begin{funcproto}{
+{\centering
+\vspace{3pt}
+\begin{funcbox}{
 \fhead{netdb.h}
 \fdecl{void herror(const char *string)}
 \fdesc{Stampa un errore di risoluzione.} 
 }
+\end{funcbox}}
 
-{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
-  caso \var{errno} assumerà uno dei valori: 
-  \begin{errlist}
-  \end{errlist}
-  ed inoltre 
- nel loro significato generico.}
-\end{funcproto}
-
-
-
-\begin{functions}
-\headdecl{
-\funcdecl{
-
-.
-\end{functions}
-
-La funzione è l'analoga di \func{perror} e stampa sullo standard error un
+La funzione è l'analoga di \func{perror} e stampa sullo \textit{standard error} un
 messaggio di errore corrispondente al valore corrente di \var{h\_errno}, a cui
 viene anteposta la stringa \param{string} passata come argomento.  La seconda
 funzione è \funcd{hstrerror} ed il suo prototipo è:
-\begin{functions}
-\headdecl{netdb.h}
-\funcdecl{const char *hstrerror(int err)}
 
-Restituisce una stringa corrispondente ad un errore di risoluzione.
-\end{functions}
+{\centering
+\vspace{3pt}
+\begin{funcbox}{
+\fhead{netdb.h}
+\fdecl{const char *hstrerror(int err)}
+\fdesc{Restituisce una stringa corrispondente ad un errore di risoluzione.}
+}
+\end{funcbox}}
+
 \noindent che, come  l'analoga \func{strerror}, restituisce una stringa con un
 messaggio di errore già formattato, corrispondente al codice passato come
 argomento (che si presume sia dato da \var{h\_errno}).
@@ -681,23 +674,30 @@ argomento (che si presume sia dato da \var{h\_errno}).
 \itindend{resolver}
 
 
-\subsection{La risoluzione dei nomi a dominio}
+\subsection{La vecchia interfaccia per la risoluzione dei nomi a dominio}
 \label{sec:sock_name_services}
 
 La principale funzionalità del \textit{resolver} resta quella di risolvere i
 nomi a dominio in indirizzi IP, per cui non ci dedicheremo oltre alle funzioni
-di richiesta generica ed esamineremo invece le funzioni a questo dedicate. La
-prima funzione è \funcd{gethostbyname} il cui scopo è ottenere l'indirizzo di
-una stazione noto il suo nome a dominio, il suo prototipo è:
-\begin{prototype}{netdb.h}
-{struct hostent *gethostbyname(const char *name)}
+per effetture delle richieste generiche al DNS ed esamineremo invece le
+funzioni del \textit{resolver} dedicate specificamente a questo. Tratteremo in
+questa sezione l'interfaccia tradizionale, che ormai è deprecata, mentre
+vedremo nella sezione seguente la nuova interfaccia.
 
-Determina l'indirizzo associato al nome a dominio \param{name}.
+La prima funzione dell'interfaccia tradizionale è \funcd{gethostbyname} il cui
+scopo è ottenere l'indirizzo di una stazione noto il suo nome a dominio, il
+suo prototipo è:
+
+\begin{funcproto}{
+\fhead{netdb.h}
+\fdecl{struct hostent *gethostbyname(const char *name)}
+\fdesc{Determina l'indirizzo associato ad un nome a dominio.} 
+}
 
-\bodydesc{La funzione restituisce in caso di successo il puntatore ad una
+{La funzione ritorna il puntatore ad una
   struttura di tipo \struct{hostent} contenente i dati associati al nome a
-  dominio, o un puntatore nullo in caso di errore.}
-\end{prototype}
+  dominio in caso di successo o un puntatore nullo per un errore.}
+\end{funcproto}
 
 La funzione prende come argomento una stringa \param{name} contenente il nome
 a dominio che si vuole risolvere, in caso di successo i dati ad esso relativi
@@ -744,35 +744,36 @@ si limiterà a copiare la stringa nel campo \var{h\_name} ed a creare la
 corrispondente struttura \var{in\_addr} da indirizzare con
 \code{h\_addr\_list[0]}.
 
-Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi
-IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
-l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi
-chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per
-modificare le opzioni del \textit{resolver}; dato che questo non è molto
-comodo è stata definita\footnote{questa è una estensione fornita dalle
-  \acr{glibc}, disponibile anche in altri sistemi unix-like.}  un'altra
-funzione, \funcd{gethostbyname2}, il cui prototipo è:
-\begin{functions}
-  \headdecl{netdb.h} 
-  \headdecl{sys/socket.h}
-  \funcdecl{struct hostent *gethostbyname2(const char *name, int af)}
-
-Determina l'indirizzo di tipo \param{af} associato al nome a dominio
-\param{name}.
-
-\bodydesc{La funzione restituisce in caso di successo il puntatore ad una
+Con l'uso di \func{gethostbyname} si ottengono solo gli indirizzi IPv4, se si
+vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare l'opzione
+\const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi chiamare
+\func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per modificare
+le opzioni del \textit{resolver}; dato che questo non è molto comodo è stata
+definita (è una estensione fornita dalle \acr{glibc}, disponibile anche in
+altri sistemi unix-like) un'altra funzione, \funcd{gethostbyname2}, il cui
+prototipo è:
+
+\begin{funcproto}{
+\fhead{netdb.h}
+\fhead{sys/socket.h}
+\fdecl{struct hostent *gethostbyname2(const char *name, int af)}
+\fdesc{Determina l'indirizzo del tipo scelto associato ad un nome a dominio.} 
+}
+
+{La funzione ritorna il puntatore ad una
   struttura di tipo \struct{hostent} contenente i dati associati al nome a
-  dominio, o un puntatore nullo in caso di errore.}
-\end{functions}
+  dominio in caso di successo e  un puntatore nullo per un errore.}
+\end{funcproto}
 
 In questo caso la funzione prende un secondo argomento \param{af} che indica
-(i soli valori consentiti sono \const{AF\_INET} o \const{AF\_INET6}, per
-questo è necessario l'uso di \headfile{sys/socket.h}) la famiglia di indirizzi
-che dovrà essere utilizzata nei risultati restituiti dalla funzione. Per tutto
-il resto la funzione è identica a \func{gethostbyname}, ed identici sono i
-suoi risultati.
+quale famiglia di indirizzi è quella che dovrà essere utilizzata per
+selezionare i risultati restituiti dalla funzione; i soli valori consentiti
+sono \const{AF\_INET} o \const{AF\_INET6} per indicare rispettivamente IPv4 e
+IPv6 (per questo è necessario l'uso di \headfile{sys/socket.h}). Per tutto il
+resto la funzione è identica a \func{gethostbyname}, ed identici sono i suoi
+risultati.
 
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
     \includecodesample{listati/mygethost.c}
@@ -802,11 +803,10 @@ con lo stampare il nome canonico, dopo di che (\texttt{\small 26--30}) si
 stampano eventuali altri nomi. Per questo prima (\texttt{\small 26}) si prende
 il puntatore alla cima della lista che contiene i nomi e poi (\texttt{\small
   27--30}) si esegue un ciclo che sarà ripetuto fin tanto che nella lista si
-troveranno dei puntatori validi\footnote{si ricordi che la lista viene
-  terminata da un puntatore nullo.} per le stringhe dei nomi; prima
-(\texttt{\small 28}) si stamperà la stringa e poi (\texttt{\small 29}) si
-provvederà ad incrementare il puntatore per passare al successivo elemento
-della lista.
+troveranno dei puntatori validi per le stringhe dei nomi (si ricordi che la
+lista viene terminata da un puntatore nullo); prima (\texttt{\small 28}) si
+stamperà la stringa e poi (\texttt{\small 29}) si provvederà ad incrementare
+il puntatore per passare al successivo elemento della lista.
 
 Una volta stampati i nomi si passerà a stampare gli indirizzi, il primo passo
 (\texttt{\small 31--38}) è allora quello di riconoscere il tipo di indirizzo
@@ -835,42 +835,47 @@ ci sono precauzioni particolari da prendere.\footnote{volendo essere pignoli
   avuto un errore con \func{gethostbyname}, ma si ricordi che la sicurezza non
   è mai troppa.}
 
-Le funzioni illustrate finora hanno un difetto: utilizzando una area di
-memoria interna per allocare i contenuti della struttura \struct{hostent} non
-possono essere rientranti. Questo comporta anche che in due successive
-chiamate i dati potranno essere sovrascritti. Si tenga presente poi che
-copiare il contenuto della sola struttura non è sufficiente per salvare tutti
-i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
-essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
-una chiamata, occorrerà eseguire quella che si chiama una \itindex{deep~copy}
-\textit{deep copy}.\footnote{si chiama così quella tecnica per cui, quando si
-  deve copiare il contenuto di una struttura complessa (con puntatori che
-  puntano ad altri dati, che a loro volta possono essere puntatori ad altri
-  dati) si deve copiare non solo il contenuto della struttura, ma eseguire una
-  scansione per risolvere anche tutti i puntatori contenuti in essa (e così
-  via se vi sono altre sotto-strutture con altri puntatori) e copiare anche i
-  dati da questi referenziati.}
+Le funzioni illustrate finora hanno un difetto: utilizzano tutte una area di
+memoria interna per allocare i contenuti della struttura \struct{hostent} e
+per questo non possono essere rientranti. L'uso della memoria interna inoltre
+comporta anche che in due successive chiamate i dati potranno essere
+sovrascritti.
+
+Si tenga presente poi che copiare il contenuto della sola struttura non è
+sufficiente per salvare tutti i dati, in quanto questa contiene puntatori ad
+altri dati, che pure possono essere sovrascritti; per questo motivo, se si
+vuole salvare il risultato di una chiamata, occorrerà eseguire quella che si
+chiama una \itindex{deep~copy} \textit{deep copy}.\footnote{si chiama così
+  quella tecnica per cui, quando si deve copiare il contenuto di una struttura
+  complessa (con puntatori che puntano ad altri dati, che a loro volta possono
+  essere puntatori ad altri dati) si deve copiare non solo il contenuto della
+  struttura, ma eseguire una scansione per risolvere anche tutti i puntatori
+  contenuti in essa (e così via se vi sono altre sotto-strutture con altri
+  puntatori) e copiare anche i dati da questi referenziati.}
 
 Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
 versioni rientranti delle precedenti funzioni, al solito queste sono
 caratterizzate dall'avere un suffisso \texttt{\_r}, pertanto avremo le due
 funzioni \funcd{gethostbyname\_r} e \funcd{gethostbyname2\_r} i cui prototipi
 sono:
-\begin{functions}
-  \headdecl{netdb.h} 
-  \headdecl{sys/socket.h}
-  \funcdecl{int gethostbyname\_r(const char *name, struct hostent *ret, 
-    char *buf, size\_t buflen, struct hostent **result, int *h\_errnop)}
-  \funcdecl{int gethostbyname2\_r(const char *name, int af,
-         struct hostent *ret, char *buf, size\_t buflen, 
-         struct hostent **result, int *h\_errnop)}
-  
-  Versioni rientranti delle funzioni \func{gethostbyname} e
-  \func{gethostbyname2}. 
-       
-  \bodydesc{Le funzioni restituiscono 0 in caso di successo ed un valore
-    negativo in caso di errore.}
-\end{functions}
+
+\begin{funcproto}{
+\fhead{netdb.h}
+\fhead{sys/socket.h}
+\fdecl{int gethostbyname\_r(const char *name, struct hostent *ret, 
+    char *buf, size\_t buflen,\\
+\phantom{int gethostbyname\_r(}struct hostent **result, int *h\_errnop)}
+\fdecl{int gethostbyname2\_r(const char *name, int af,
+         struct hostent *ret, char *buf,\\
+\phantom{int gethostbyname2\_r(}size\_t buflen, struct hostent **result, int *h\_errnop)}
+
+\fdesc{Versioni rientranti delle funzioni \func{gethostbyname} e
+  \func{gethostbyname2}.} 
+}
+
+{Le funzioni ritornano $0$ in caso di successo ed un valore diverso da zero per
+  un errore.}
+\end{funcproto}
 
 Gli argomenti \param{name} (e \param{af} per \func{gethostbyname2\_r}) hanno
 lo stesso significato visto in precedenza. Tutti gli altri argomenti hanno lo
@@ -890,7 +895,7 @@ con \param{h\_errnop} e quello su cui dovrà salvare il puntatore che si userà
 per accedere i dati con \param{result}.
 
 In caso di successo entrambe le funzioni restituiscono un valore nullo,
-altrimenti restituiscono un codice di errore negativo e all'indirizzo puntato
+altrimenti restituiscono un valore non nulla e all'indirizzo puntato
 da \param{result} sarà salvato un puntatore nullo, mentre a quello puntato da
 \param{h\_errnop} sarà salvato il valore del codice di errore, dato che per
 essere rientrante la funzione non può la variabile globale \var{h\_errno}. In
@@ -903,64 +908,62 @@ con un buffer di dimensione maggiore.
 Una delle caratteristiche delle interrogazioni al servizio DNS è che queste
 sono normalmente eseguite con il protocollo UDP, ci sono casi in cui si
 preferisce che vengano usate connessioni permanenti con il protocollo TCP. Per
-ottenere questo\footnote{si potrebbero impostare direttamente le opzioni di
-  \var{\_\_res.options}, ma queste funzioni permettono di semplificare la
-  procedura.} sono previste delle funzioni apposite; la prima è
-\funcd{sethostent}, il cui prototipo è:
-\begin{prototype}{netdb.h}
-{void sethostent(int stayopen)}
-
-Richiede l'uso di connessioni per le interrogazioni ad un server DNS.
+ottenere questo sono previste delle funzioni apposite (si potrebbero impostare
+direttamente le opzioni di \var{\_\_res.options}, ma queste funzioni
+permettono di semplificare la procedura); la prime sono \funcd{sethostent} e
+\func{endhostent}, il cui prototipo è:
 
-\bodydesc{La funzione non restituisce nulla.}
-\end{prototype}
-
-La funzione permette di richiedere l'uso di connessioni TCP per la richiesta
-dei dati, e che queste restino aperte per successive richieste. Il valore
-dell'argomento \param{stayopen} indica se attivare questa funzionalità, un
-valore pari a 1 (o diverso da zero), che indica una condizione vera in C,
-attiva la funzionalità.  Come si attiva l'uso delle connessioni TCP lo si può
-disattivare con la funzione \funcd{endhostent}; il suo prototipo è:
-\begin{prototype}{netdb.h}
-{void endhostent(void)}
-
-Disattiva l'uso di connessioni per le interrogazioni ad un server DNS.
+\begin{funcproto}{
+\fhead{netdb.h}
+\fdecl{void sethostent(int stayopen)}
+\fdesc{Richiede l'uso di connessioni TCP per le interrogazioni ad un server DNS.} 
+\fdecl{void endhostent(void)}
+\fdesc{Disattiva l'uso di connessioni TCP per le interrogazioni ad un server DNS.} 
+}
 
-\bodydesc{La funzione non restituisce nulla.}
-\end{prototype}
-\noindent e come si può vedere la funzione è estremamente semplice, non
-richiedendo nessun argomento.
+{Le funzioni non restituiscono nulla, e non danno errori.}
+\end{funcproto}
 
-% TODO manca gethostent (e gethostent_r) e altro ? (vedi man page)
+La funzione \func{sethostent} permette di richiedere l'uso di connessioni TCP
+per la richiesta dei dati, e che queste restino aperte per successive
+richieste; il valore dell'argomento \param{stayopen} indica se attivare questa
+funzionalità, un valore diverso da zero, che indica una condizione vera in C,
+attiva la funzionalità.  Per disattivare l'uso delle connessioni TCP si può
+invece usare \func{endhostent}, e come si vede la funzione è estremamente
+semplice, non richiedendo nessun argomento.
 
 Infine si può richiedere la risoluzione inversa di un indirizzo IP od IPv6,
 per ottenerne il nome a dominio ad esso associato, per fare questo si può
 usare la funzione \funcd{gethostbyaddr}, il cui prototipo è:
-\begin{functions}
-  \headdecl{netdb.h} 
-  \headdecl{sys/socket.h} 
-  \funcdecl{struct hostent *gethostbyaddr(const char *addr, int len, int type)}
 
-  Richiede la risoluzione inversa di un indirizzo IP.
-       
-  \bodydesc{La funzione restituisce l'indirizzo ad una struttura
-    \struct{hostent} in caso di successo ed \val{NULL} in caso di errore.}
-\end{functions}
+\begin{funcproto}{
+\fhead{netdb.h}
+\fhead{sys/socket.h} 
+\fdecl{struct hostent *gethostbyaddr(const char *addr, int len, int type)}
+\fdesc{Richiede la risoluzione inversa di un indirizzo IP.} 
+}
+
+{La funzione ritorna l'indirizzo ad una struttura \struct{hostent} in caso di
+  successo e \val{NULL} per un errore.}
+\end{funcproto}
 
 In questo caso l'argomento \param{addr} dovrà essere il puntatore ad una
 appropriata struttura contenente il valore dell'indirizzo IP (o IPv6) che si
 vuole risolvere. L'uso del tipo \texttt{char *} per questo argomento è
-storico, il dato dovrà essere fornito in una struttura
-\struct{in\_addr}\footnote{si ricordi che, come illustrato in
-  fig.~\ref{fig:sock_sa_ipv4_struct}, questo in realtà corrisponde ad un
-  numero intero, da esprimere comunque in \textit{network order}, non
-  altrettanto avviene però per \struct{in6\_addr}, pertanto è sempre opportuno
-  inizializzare questi indirizzi con \func{inet\_pton} (vedi
-  sez.~\ref{sec:sock_conv_func_gen}).}  per un indirizzo IPv4 ed una struttura
-\struct{in6\_addr} per un indirizzo IPv6, mentre in \param{len} se ne dovrà
-specificare la dimensione (rispettivamente 4 o 16), infine l'argomento
-\param{type} indica il tipo di indirizzo e dovrà essere o \const{AF\_INET} o
-\const{AF\_INET6}.
+storico, il dato dovrà essere fornito in una struttura \struct{in\_addr} per
+un indirizzo IPv4 ed una struttura \struct{in6\_addr} per un indirizzo IPv6.
+
+Si ricordi inoltre, come illustrato in fig.~\ref{fig:sock_sa_ipv4_struct}, che
+mentre \struct{in\_addr} corrisponde in realtà ad un oridinario numero intero
+a 32 bit  (da esprimere comunque in \textit{network order}) non altrettanto
+avviene per \struct{in6\_addr}, pertanto è sempre opportuno inizializzare
+questi indirizzi con \func{inet\_pton} (vedi
+sez.~\ref{sec:sock_conv_func_gen}).
+
+Nell'argomento \param{len} se ne dovrà poi specificare la dimensione
+(rispettivamente 4 o 16), infine l'argomento
+\param{type} deve indicare il tipo di indirizzo, e dovrà essere o
+\const{AF\_INET} o \const{AF\_INET6}.
 
 La funzione restituisce, in caso di successo, un puntatore ad una struttura
 \struct{hostent}, solo che in questo caso la ricerca viene eseguita
@@ -968,36 +971,97 @@ richiedendo al DNS un record di tipo \texttt{PTR} corrispondente all'indirizzo
 specificato. In caso di errore al solito viene usata la variabile
 \var{h\_errno} per restituire un opportuno codice. In questo caso l'unico
 campo del risultato che interessa è \var{h\_name} che conterrà il nome a
-dominio, la funziona comunque inizializza anche il primo campo della lista
+dominio, la funzione comunque inizializza anche il primo campo della lista
 \var{h\_addr\_list} col valore dell'indirizzo passato come argomento.
 
-Per risolvere il problema dell'uso da parte delle due funzioni
-\func{gethostbyname} e \func{gethostbyaddr} di memoria statica che può essere
-sovrascritta fra due chiamate successive, e per avere sempre la possibilità di
-indicare esplicitamente il tipo di indirizzi voluto (cosa che non è possibile
-con \func{gethostbyname}), vennero introdotte due nuove funzioni di
-risoluzione,\footnote{le funzioni sono presenti nelle \acr{glibc} versione
+Dato che \func{gethostbyaddr} usa un buffer statico, anche di questa funzione
+esiste una versione rientrante \funcd{gethostbyaddr\_r} fornita come
+estensione dalle \acr{glibc}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{netdb.h}
+\fhead{sys/socket.h} 
+\fdecl{struct hostent *gethostbyaddr\_r(const void *addr, socklen\_t len, int type,\\
+\phantom{struct hostent *gethostbyaddr\_r(}struct hostent *ret, char *buf, size\_t buflen,\\
+\phantom{struct hostent *gethostbyaddr\_r(}struct hostent **result, int *h\_errnop);}
+\fdesc{Richiede la risoluzione inversa di un indirizzo IP.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e un valore non nullo per un errore.}
+\end{funcproto}
+
+La funzione prende per gli argomenti \param{addr}, \param{len} e \param{type}
+gli stessi valori di \func{gethostbyaddr} con lo stesso significato, gli
+argomenti successivi vengono utilizzati per restituire i dati, sono identici a
+quelli già illustrati in per \func{gethostbyname\_r} e
+\func{gethostbyname2\_r} e devono essere usati allo stesso modo.
+
+Infine lo standard POSIX prevede la presenza della funzione
+\funcd{gethostent}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{netdb.h}
+\fdecl{struct hostent *gethostent(void)}
+\fdesc{Ottiene la voce successiva nel database dei nomi a dominio.} 
+}
+
+{La funzione ritorna l'indirizzo ad una struttura \struct{hostent} in caso di
+  successo e \val{NULL} per un errore.}
+\end{funcproto}
+
+La funzione dovrebbe ritornare (come puntatore alla solita struttura
+\struct{hostent} allocata internamente) la voce successiva nel database dei
+nomi a dominio, ma questo ha un significato soltato quando è relativo alla
+lettura dei dati da un file come \conffile{/etc/hosts} e non per i risultati
+del DNS. Nel caso della \acr{glibc} questa viene usata allora solo per la
+lettura delle voci presenti in quest'ultimo, come avviene anche in altri
+sistemi unix-like, ed inoltre ignora le voci relative ad indirizzi IPv6.
+
+Della stessa funzione le \acr{glibc} forniscono anche una versione rientrante
+\funcd{gethostent\_r}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{netdb.h}
+\fdecl{struct hostent *gethostent\_r(struct hostent *ret, char *buf, size\_t buflen,\\
+\phantom{struct hostent *gethostent\_r(}struct hostent **result, int *h\_errnop);}
+\fdesc{Ottiene la voce successiva nel database dei nomi a dominio.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e un valore non nullo per un errore.}
+\end{funcproto}
+
+La funzione ha lo stesso effetto di \func{gethostent}; gli argomenti servono a
+restituire i risultati in maniera rientrante e vanno usati secondo le modalità
+già illustrate per \func{gethostbyname\_r} e \func{gethostbyname2\_r}.
+
+Dati i limiti delle funzioni \func{gethostbyname} e \func{gethostbyaddr} con
+l'uso di memoria statica che può essere sovrascritta fra due chiamate
+successive, e per avere sempre la possibilità di indicare esplicitamente il
+tipo di indirizzi voluto (cosa che non è possibile con \func{gethostbyname}),
+è stata successivamente proposta,
+nell'\href{http://www.ietf.org/rfc/rfc2553.txt}{RFC~2553} un diversa
+interfaccia con l'introduzione due nuove funzioni di
+risoluzione,\footnote{dette funzioni sono presenti nelle \acr{glibc} versione
   2.1.96, ma essendo considerate deprecate (vedi
   sez.~\ref{sec:sock_advanced_name_services}) sono state rimosse nelle
   versioni successive.} \funcd{getipnodebyname} e \funcd{getipnodebyaddr}, i
 cui prototipi sono:
-\begin{functions}
-  \headdecl{netdb.h} 
-  \headdecl{sys/types.h} 
-  \headdecl{sys/socket.h} 
 
-  \funcdecl{struct hostent *getipnodebyname(const char *name, int af, int
+\begin{funcproto}{
+\fhead{netdb.h}
+\fhead{sys/types.h}
+\fhead{sys/socket.h}
+\fdecl{struct hostent *getipnodebyname(const char *name, int af, int
     flags, int *error\_num)} 
-
-  \funcdecl{struct hostent *getipnodebyaddr(const void *addr, size\_t len,
+\fdesc{Richiede la risoluzione di un nome a dominio.} 
+\fdecl{struct hostent *getipnodebyaddr(const void *addr, size\_t len,
     int af, int *error\_num)}
+\fdesc{Richiede la risoluzione inversa di un indirizzo IP.} 
+}
 
-  Richiedono rispettivamente la risoluzione e la risoluzione inversa di un
-  indirizzo IP.
-       
-  \bodydesc{Entrambe le funzioni restituiscono l'indirizzo ad una struttura
-    \struct{hostent} in caso di successo ed \val{NULL} in caso di errore.}
-\end{functions}
+{Le funzioni ritornano l'indirizzo ad una struttura \struct{hostent} in caso
+  di successo e \val{NULL} per un errore.}
+\end{funcproto}
 
 Entrambe le funzioni supportano esplicitamente la scelta di una famiglia di
 indirizzi con l'argomento \param{af} (che può assumere i valori
@@ -1053,31 +1117,31 @@ e \func{gethostbyaddr}.  L'uso di una allocazione dinamica però comporta anche
 la necessità di disallocare esplicitamente la memoria occupata dai risultati
 una volta che questi non siano più necessari; a tale scopo viene fornita la
 funzione \funcd{freehostent}, il cui prototipo è:
-\begin{functions}
-  \headdecl{netdb.h} 
-  \headdecl{sys/types.h} 
-  \headdecl{sys/socket.h} 
 
-  \funcdecl{void freehostent(struct hostent *ip)} 
+\begin{funcproto}{
+\fhead{netdb.h}
+\fhead{sys/types.h}
+\fhead{sys/socket.h}
+\fdecl{void freehostent(struct hostent *ip)}
+\fdesc{Disalloca una struttura \var{hostent}.} 
+}
 
-  Disalloca una struttura \var{hostent}.
-       
-  \bodydesc{La funzione non ritorna nulla.}
-\end{functions}
+{La funzione non ritorna nulla, e non da errori.}
+\end{funcproto}
 
 La funzione permette di disallocare una struttura \var{hostent}
 precedentemente allocata in una chiamata di \func{getipnodebyname} o
 \func{getipnodebyaddr}, e prende come argomento l'indirizzo restituito da una
-di queste funzioni. 
+di queste funzioni.
 
 Infine per concludere la nostra panoramica sulle funzioni di risoluzione dei
 nomi dobbiamo citare le funzioni che permettono di interrogare gli altri
 servizi di risoluzione dei nomi illustrati in sez.~\ref{sec:sock_resolver}; in
 generale infatti ci sono una serie di funzioni nella forma
-\texttt{getXXXbyname} e \texttt{getXXXbyaddr} (dove \texttt{XXX} indica il
-servizio) per ciascuna delle informazioni di rete mantenute dal \textit{Name
-  Service Switch} che permettono rispettivamente di trovare una corrispondenza
-cercando per nome o per numero.
+\texttt{get\textsl{XXX}byname} e \texttt{get\textsl{XXX}byaddr} (dove
+\texttt{\textsl{XXX}} indica il servizio) per ciascuna delle informazioni di
+rete mantenute dal \textit{Name Service Switch} che permettono rispettivamente
+di trovare una corrispondenza cercando per nome o per numero.
 
 L'elenco di queste funzioni è riportato nelle colonne finali di
 tab.~\ref{tab:name_resolution_functions}, dove le si sono suddivise rispetto
@@ -1126,27 +1190,30 @@ ecc.) da associare alle rispettive porte. Le due funzioni da utilizzare per
 questo sono \funcd{getservbyname} e \funcd{getservbyport}, che permettono
 rispettivamente di ottenere il numero di porta associato ad un servizio dato
 il nome e viceversa; i loro prototipi sono:
-\begin{functions}
-  \headdecl{netdb.h} 
-  \funcdecl{struct servent *getservbyname(const char *name, const char *proto)}
-  \funcdecl{struct servent *getservbyport(int port, const char *proto)} 
 
-  Risolvono il nome di un servizio nel rispettivo numero di porta e viceversa.
-       
-  \bodydesc{Ritornano il puntatore ad una struttura \struct{servent} con i
-    risultati in caso di successo, o \val{NULL} in caso di errore.}
-\end{functions}
+
+
+\begin{funcproto}{
+\fhead{netdb.h} 
+\fdecl{struct servent *getservbyname(const char *name, const char *proto)}
+\fdecl{struct servent *getservbyport(int port, const char *proto)} 
+\fdesc{Risolvono il nome di un servizio nel rispettivo numero di porta e viceversa.} 
+}
+
+{Le funzioni ritornano il puntatore ad una struttura \struct{servent} con i
+    risultati in caso di successo e \val{NULL} per un errore.}
+\end{funcproto}
 
 Entrambe le funzioni prendono come ultimo argomento una stringa \param{proto}
-che indica il protocollo per il quale si intende effettuare la
-ricerca,\footnote{le informazioni mantenute in \conffile{/etc/services}
-  infatti sono relative sia alle porte usate su UDP che su TCP, occorre quindi
-  specificare a quale dei due protocolli si fa riferimento.} che nel caso si
-IP può avere come valori possibili solo \texttt{udp} o
-\texttt{tcp};\footnote{in teoria si potrebbe avere un qualunque protocollo fra
-  quelli citati in \conffile{/etc/protocols}, posto che lo stesso supporti il
-  concetto di \textsl{porta}, in pratica questi due sono gli unici presenti.}
-se si specifica un puntatore nullo la ricerca sarà eseguita su un protocollo
+che indica il protocollo per il quale si intende effettuare la ricerca (le
+informazioni mantenute in \conffile{/etc/services} infatti sono relative sia
+alle porte usate su UDP che su TCP, occorre quindi specificare a quale dei due
+protocolli si fa riferimento) che nel caso di IP può avere come valori
+possibili solo \texttt{udp} o \texttt{tcp};\footnote{in teoria si potrebbe
+  avere un qualunque protocollo fra quelli citati in
+  \conffile{/etc/protocols}, posto che lo stesso supporti il concetto di
+  \textsl{porta}, in pratica questi due sono gli unici presenti.}  se si
+specifica un puntatore nullo la ricerca sarà eseguita su un protocollo
 qualsiasi.
 
 Il primo argomento è il nome del servizio per \func{getservbyname},
@@ -1193,22 +1260,21 @@ tab.~\ref{tab:sys_passwd_func} per le informazioni relative ai dati degli
 utenti e dei gruppi. Nel caso specifico dei servizi avremo allora le tre
 funzioni \funcd{setservent}, \funcd{getservent} e \funcd{endservent} i cui
 prototipi sono:
-\begin{functions}
-  \headdecl{netdb.h} 
-  \funcdecl{void setservent(int stayopen)} 
-  Apre il file \conffile{/etc/services} e si posiziona al suo inizio.
-
-  \funcdecl{struct servent *getservent(void)}
-  Legge la voce successiva nel file \conffile{/etc/services}.      
 
-  \funcdecl{void endservent(void)} 
-  Chiude il file \conffile{/etc/services}.
+\begin{funcproto}{
+\fhead{netdb.h} 
+\fdecl{struct servent *getservent(void)}
+\fdesc{Legge la voce successiva nel file \conffile{/etc/services}.} 
+\fdecl{void setservent(int stayopen)} 
+\fdesc{Apre il file \conffile{/etc/services} e si posiziona al suo inizio.} 
+\fdecl{void endservent(void)}
+\fdesc{Chiude il file \conffile{/etc/services}.} 
+}
 
-  \bodydesc{Le due funzioni \func{setservent} e \func{endservent} non
-    restituiscono nulla, \func{getservent} restituisce il puntatore ad una
-    struttura \struct{servent} in caso di successo e \val{NULL} in caso di
-    errore o fine del file.}
-\end{functions}
+{Le due funzioni \func{setservent} e \func{endservent} non ritornano nulla,
+  \func{getservent} restituisce il puntatore ad una struttura \struct{servent}
+  in caso di successo e \val{NULL} per un errore o fine del file.}
+\end{funcproto}
 
 La prima funzione, \func{getservent}, legge una singola voce a partire dalla
 posizione corrente in \conffile{/etc/services}, pertanto si può eseguire una
@@ -1217,22 +1283,7 @@ aperto provvede automaticamente ad aprirlo, nel qual caso leggerà la prima
 voce. La seconda funzione, \func{setservent}, permette di aprire il file
 \conffile{/etc/services} per una successiva lettura, ma se il file è già stato
 aperto riporta la posizione di lettura alla prima voce del file, in questo
-modo si può far ricominciare da capo una lettura sequenziale. L'argomento
-\param{stayopen}, se diverso da zero, fa sì che il file resti aperto anche fra
-diverse chiamate a \func{getservbyname} e \func{getservbyport}.\footnote{di
-  default dopo una chiamata a queste funzioni il file viene chiuso, cosicché
-  una successiva chiamata a \func{getservent} riparte dall'inizio.}  La terza
-funzione, \func{endservent}, provvede semplicemente a chiudere il file.
-
-Queste tre funzioni per la lettura sequenziale di nuovo sono presenti per
-ciascuno dei vari tipi di informazione relative alle reti di
-tab.~\ref{tab:name_resolution_functions}; questo significa che esistono
-altrettante funzioni nella forma \texttt{setXXXent}, \texttt{getXXXent} e
-\texttt{endXXXent}, analoghe alle precedenti per la risoluzione dei servizi,
-che abbiamo riportato in tab.~\ref{tab:name_sequential_read}.  Essendo, a
-parte il tipo di informazione che viene trattato, sostanzialmente identiche
-nel funzionamento e di scarso utilizzo, non staremo a trattarle una per una,
-rimandando alle rispettive pagine di manuale.
+modo si può far ricominciare da capo una lettura sequenziale. 
 
 \begin{table}[!htb]
   \centering
@@ -1253,8 +1304,22 @@ rimandando alle rispettive pagine di manuale.
   \label{tab:name_sequential_read}
 \end{table}
 
+L'argomento \param{stayopen} di \func{setservent}, se diverso da zero, fa sì
+che il file resti aperto anche fra diverse chiamate a \func{getservbyname} e
+\func{getservbyport}; di default dopo una chiamata a queste funzioni il file
+viene chiuso, cosicché una successiva chiamata a \func{getservent} riparte
+dall'inizio.  La terza funzione, \func{endservent}, provvede semplicemente a
+chiudere il file.
 
-
+Queste tre funzioni per la lettura sequenziale di nuovo sono presenti per
+ciascuno dei vari tipi di informazione relative alle reti di
+tab.~\ref{tab:name_resolution_functions}; questo significa che esistono
+altrettante funzioni nella forma \texttt{setXXXent}, \texttt{getXXXent} e
+\texttt{endXXXent}, analoghe alle precedenti per la risoluzione dei servizi,
+che abbiamo riportato in tab.~\ref{tab:name_sequential_read}.  Essendo, a
+parte il tipo di informazione che viene trattato, sostanzialmente identiche
+nel funzionamento e di scarso utilizzo, non staremo a trattarle una per una,
+rimandando alle rispettive pagine di manuale.
 
 
 \subsection{Le funzioni avanzate per la risoluzione dei nomi}
@@ -1265,10 +1330,10 @@ risoluzione di nomi ed indirizzi IP, ma abbiamo già visto come esse soffrano
 di vari inconvenienti come il fatto che usano informazioni statiche, e non
 prevedono la possibilità di avere diverse classi di indirizzi. Anche se sono
 state create delle estensioni o metodi diversi che permettono di risolvere
-alcuni di questi inconvenienti,\footnote{rimane ad esempio il problema
-  generico che si deve sapere in anticipo quale tipo di indirizzi IP (IPv4 o
-  IPv6) corrispondono ad un certo nome a dominio.}  comunque esse non
-forniscono una interfaccia sufficientemente generica.
+alcuni di questi inconvenienti, comunque esse non forniscono una interfaccia
+sufficientemente generica.\footnote{rimane ad esempio il problema generico che
+  si deve sapere in anticipo quale tipo di indirizzi IP (IPv4 o IPv6)
+  corrispondono ad un certo nome a dominio.}
 
 Inoltre in genere quando si ha a che fare con i socket non esiste soltanto il
 problema della risoluzione del nome che identifica la macchina, ma anche
@@ -1278,26 +1343,27 @@ funzioni \func{gethostbyaddr}, \func{gethostbyname}, \var{getipnodebyname} e
 \var{getipnodebyaddr} ed è stata introdotta una interfaccia completamente
 nuova.
 
-La prima funzione di questa interfaccia è \funcd{getaddrinfo},\footnote{la
-  funzione è definita, insieme a \func{getnameinfo} che vedremo più avanti,
-  nell'\href{http://www.ietf.org/rfc/rfc2553.txt}{RFC~2553}.} che combina le
+La prima funzione di questa interfaccia è \funcd{getaddrinfo}, che combina le
 funzionalità delle precedenti \func{getipnodebyname}, \func{getipnodebyaddr},
 \func{getservbyname} e \func{getservbyport}, consentendo di ottenere
 contemporaneamente sia la risoluzione di un indirizzo simbolico che del nome
-di un servizio; il suo prototipo è:
-\begin{functions}
-  \headdecl{netdb.h} 
-  \headdecl{sys/socket.h} 
-  \headdecl{netdb.h} 
+di un servizio; la funzione è stata introdotta, insieme a \func{getnameinfo}
+che vedremo più avanti,
+nell'\href{http://www.ietf.org/rfc/rfc2553.txt}{RFC~2553} ed il suo prototipo è:
 
-  \funcdecl{int getaddrinfo(const char *node, const char *service, const
-    struct addrinfo *hints, struct addrinfo **res)}
 
-  Esegue una risoluzione di un nome a dominio e di un nome di servizio.
+\begin{funcproto}{
+\fhead{netdb.h}
+\fhead{sys/socket.h} 
+\fdecl{int getaddrinfo(const char *node, const char *service, const
+    struct addrinfo *hints, \\
+\phantom{int getaddrinfo(}struct addrinfo **res)}
+\fdesc{Esegue una risoluzione di un nome a dominio e di un nome di servizio.} 
+}
 
-  \bodydesc{La funzione restituisce 0 in caso di successo o un codice di
-    errore diverso da zero in caso di fallimento.}
-\end{functions}
+{La funzione ritorna $0$ in caso di successo e un codice di errore diverso da
+  zero per un errore.}
+\end{funcproto}
 
 La funzione prende come primo argomento il nome della macchina che si vuole
 risolvere, specificato tramite la stringa \param{node}. Questo argomento,
@@ -1328,7 +1394,7 @@ puntatore iniziale ad una \textit{linked list} di strutture di tipo
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{0.80\textwidth}
+  \begin{minipage}[c]{0.90\textwidth}
     \includestruct{listati/addrinfo.h}
   \end{minipage}
   \caption{La struttura \structd{addrinfo} usata nella nuova interfaccia POSIX
@@ -1340,7 +1406,7 @@ Come illustrato la struttura \struct{addrinfo}, la cui definizione è riportata
 in fig.~\ref{fig:sock_addrinfo_struct}, viene usata sia in ingresso, per
 passare dei valori di controllo alla funzione, che in uscita, per ricevere i
 risultati. La definizione è ripresa direttamente dal file \headfiled{netdb.h}
-in questa struttura viene dichiarata, la pagina di manuale riporta
+in cui questa struttura viene dichiarata, la pagina di manuale riporta
 \type{size\_t} come tipo di dato per il campo \var{ai\_addrlen}, qui viene
 usata quanto previsto dallo standard POSIX, in cui viene utilizzato
 \type{socklen\_t}; i due tipi di dati sono comunque equivalenti.
@@ -1354,14 +1420,14 @@ usati per impostare una selezione (impostandone il valore nella struttura
 puntata da \param{hints}), mentre in uscita indicano il tipo di risultato
 contenuto nella struttura.
 
-Tutti i campi seguenti vengono usati soltanto in uscita; il campo
-\var{ai\_addrlen} indica la dimensione della struttura degli indirizzi
-ottenuta come risultato, il cui contenuto sarà memorizzato nella struttura
-\struct{sockaddr} posta all'indirizzo puntato dal campo \var{ai\_addr}. Il
-campo \var{ai\_canonname} è un puntatore alla stringa contenente il nome
-canonico della macchina, ed infine, quando la funzione restituisce più di un
-risultato, \var{ai\_next} è un puntatore alla successiva struttura
-\struct{addrinfo} della lista.
+Tutti i campi seguenti vengono usati soltanto in uscita e devono essere nulli
+o \val{NULL} in ingresso; il campo \var{ai\_addrlen} indica la dimensione
+della struttura degli indirizzi ottenuta come risultato, il cui contenuto sarà
+memorizzato nella struttura \struct{sockaddr} posta all'indirizzo puntato dal
+campo \var{ai\_addr}. Il campo \var{ai\_canonname} è un puntatore alla stringa
+contenente il nome canonico della macchina, ed infine, quando la funzione
+restituisce più di un risultato, \var{ai\_next} è un puntatore alla successiva
+struttura \struct{addrinfo} della lista.
 
 Ovviamente non è necessario dare dei suggerimenti in ingresso, ed usando
 \val{NULL} come valore per l'argomento \param{hints} si possono compiere
@@ -1373,9 +1439,9 @@ quale siano stati opportunamente impostati i valori dei campi
 I due campi \var{ai\_family} e \var{ai\_socktype} prendono gli stessi valori
 degli analoghi argomenti della funzione \func{socket}; in particolare per
 \var{ai\_family} si possono usare i valori di tab.~\ref{tab:net_pf_names} ma
-sono presi in considerazione solo \const{PF\_INET} e \const{PF\_INET6}, mentre
+sono presi in considerazione solo \const{AF\_INET} e \const{AF\_INET6}, mentre
 se non si vuole specificare nessuna famiglia di indirizzi si può usare il
-valore \const{PF\_UNSPEC}.  Allo stesso modo per \var{ai\_socktype} si possono
+valore \const{AF\_UNSPEC}.  Allo stesso modo per \var{ai\_socktype} si possono
 usare i valori illustrati in sez.~\ref{sec:sock_type} per indicare per quale
 tipo di socket si vuole risolvere il servizio indicato, anche se i soli
 significativi sono \const{SOCK\_STREAM} e \const{SOCK\_DGRAM}; in questo caso,
@@ -1392,22 +1458,15 @@ nella selezione.
 \begin{table}[!htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|p{10cm}|}
+  \begin{tabular}[c]{|l|p{8cm}|}
     \hline
     \textbf{Costante} & \textbf{Significato} \\
     \hline
     \hline
-    \constd{AI\_PASSIVE}    & Viene utilizzato per ottenere un indirizzo in
-                              formato adatto per una successiva chiamata a
-                              \func{bind}. Se specificato quando si è usato 
-                              \val{NULL} come valore per \param{node} gli
-                              indirizzi restituiti saranno inizializzati al
-                              valore generico (\const{INADDR\_ANY} per IPv4 e
-                              \const{IN6ADDR\_ANY\_INIT} per IPv6), altrimenti
-                              verrà usato l'indirizzo dell'interfaccia di
-                              \textit{loopback}. Se invece non è impostato gli
-                              indirizzi verranno restituiti in formato adatto ad
-                              una chiamata a \func{connect} o \func{sendto}.\\
+    \const{AI\_ADDRCONFIG} & Stesso significato dell'analoga di
+                             tab.~\ref{tab:sock_getipnodebyname_flags}.\\ 
+    \const{AI\_ALL}        & Stesso significato dell'analoga di
+                             tab.~\ref{tab:sock_getipnodebyname_flags}.\\ 
     \constd{AI\_CANONNAME}  & Richiede la restituzione del nome canonico della
                               macchina, che verrà salvato in una stringa il cui
                               indirizzo sarà restituito nel campo
@@ -1422,12 +1481,35 @@ nella selezione.
                               tab.~\ref{tab:addrinfo_error_code}), in questo
                               modo si evita ogni chiamata alle funzioni di
                               risoluzione.\\ 
+    \constd{AI\_NUMERICSERVICE}& Analogo di \const{AI\_NUMERICHOST} per la
+                                 risoluzione di un servizio, con 
+                                 \param{service} che deve essere espresso in forma
+                                 numerica.\\ 
+    \constd{AI\_PASSIVE}    & Viene utilizzato per ottenere un indirizzo in
+                              formato adatto per una successiva chiamata a
+                              \func{bind}. Se specificato quando si è usato 
+                              \val{NULL} come valore per \param{node} gli
+                              indirizzi restituiti saranno inizializzati al
+                              valore generico (\const{INADDR\_ANY} per IPv4 e
+                              \const{IN6ADDR\_ANY\_INIT} per IPv6), altrimenti
+                              verrà usato l'indirizzo dell'interfaccia di
+                              \textit{loopback}. Se invece non è impostato gli
+                              indirizzi verranno restituiti in formato adatto ad
+                              una chiamata a \func{connect} o \func{sendto}.\\
     \const{AI\_V4MAPPED}   & Stesso significato dell'analoga di
-                              tab.~\ref{tab:sock_getipnodebyname_flags}.\\  
-    \const{AI\_ALL}        & Stesso significato dell'analoga di
-                              tab.~\ref{tab:sock_getipnodebyname_flags}.\\ 
-    \const{AI\_ADDRCONFIG} & Stesso significato dell'analoga di
-                              tab.~\ref{tab:sock_getipnodebyname_flags}.\\ 
+                             tab.~\ref{tab:sock_getipnodebyname_flags}.\\  
+    \hline
+    \const{AI\_CANONIDN}   & Se il nome canonico richiesto con
+                             \const{AI\_CANONNAME} è codificato con questo
+                             flag la codifica viene convertita in forma
+                             leggibile nella localizzazione corrente.\\ 
+    \const{AI\_IDN}        & Se specificato il nome viene convertito, se
+                             necessario, nella codifica IDN, usando la
+                             localizzazione corrente.\\ 
+    \const{AI\_IDN\_ALLOW\_UNASSIGNED} & attiva il controllo 
+                                         \texttt{IDNA\_ALLOW\_UNASSIGNED}.\\ 
+    \const{AI\_AI\_IDN\_USE\_STD3\_ASCII\_RULES} & attiva il controllo
+                                            \texttt{IDNA\_USE\_STD3\_ASCII\_RULES}\\ 
     \hline
   \end{tabular}
   \caption{Costanti associate ai bit del campo \var{ai\_flags} della struttura 
@@ -1435,14 +1517,30 @@ nella selezione.
   \label{tab:ai_flags_values}
 \end{table}
 
-
-Infine l'ultimo campo è \var{ai\_flags}; che deve essere impostato come una
-maschera binaria; i bit di questa variabile infatti vengono usati per dare
-delle indicazioni sul tipo di risoluzione voluta, ed hanno valori analoghi a
-quelli visti in sez.~\ref{sec:sock_name_services} per \func{getipnodebyname};
-il valore di \var{ai\_flags} può essere impostata con un OR aritmetico delle
-costanti di tab.~\ref{tab:ai_flags_values}, ciascuna delle quali identifica un
-bit della maschera.
+% TODO mettere riferimento a IDNA_ALLOW_UNASSIGNED e IDNA_USE_STD3_ASCII_RULES
+
+Infine gli ultimi dettagli si controllano con il campo \var{ai\_flags}; che
+deve essere impostato come una maschera binaria; i bit di questa variabile
+infatti vengono usati per dare delle indicazioni sul tipo di risoluzione
+voluta, ed hanno valori analoghi a quelli visti in
+sez.~\ref{sec:sock_name_services} per \func{getipnodebyname}; il valore di
+\var{ai\_flags} può essere impostata con un OR aritmetico delle costanti di
+tab.~\ref{tab:ai_flags_values}, ciascuna delle quali identifica un bit della
+maschera. 
+
+Nella seconda parte della tabella si sono riportati i valori delle costanti
+aggiunte a partire dalle \acr{glibc} 2.3.4 per gestire la
+internazionalizazione dei nomi a dominio (IDN o \textit{Internationalized
+  Domain Names}) secondo quanto specificato
+nell'\href{http://www.ietf.org/rfc/rfc3490.txt}{RFC~3490} (potendo cioè usare
+codifiche di caratteri che consentono l'espressione di nomi a dominio in
+qualunque lingua).
+
+Come accennato passando un valore \val{NULL} per l'argomento \param{hints} si
+effettua una risuluzione generica, equivalente ad aver impostato un valore
+nullo per \var{ai\_family} e \var{ai\_socktype}, un valore \const{AF\_UNSPEC}
+per \var{ai\_family} e il valore \code{(AI\_V4MAPPED|AI\_ADDRCONFIG)} per
+\var{ai\_flags}. 
 
 La funzione restituisce un valore nullo in caso di successo, o un codice in
 caso di errore. I valori usati come codice di errore sono riportati in
@@ -1460,11 +1558,21 @@ corrispondente è riportato tramite \var{errno}.
     \textbf{Costante} & \textbf{Significato} \\
     \hline
     \hline
+    \constd{EAI\_ADDRFAMILY}& La richiesta non ha nessun indirizzo di rete
+                              per la famiglia di indirizzi specificata. \\
+    \constd{EAI\_AGAIN}   & Il DNS ha restituito un errore di risoluzione  
+                            temporaneo, si può ritentare in seguito. \\
+    \constd{EAI\_BADFLAGS}& Il campo \var{ai\_flags} contiene dei valori non
+                            validi per i flag o si è richiesto
+                            \const{AI\_CANONNAME} con \param{name} nullo. \\
+    \constd{EAI\_FAIL}    & Il DNS ha restituito un errore di risoluzione  
+                            permanente. \\
     \constd{EAI\_FAMILY}  & La famiglia di indirizzi richiesta non è
                             supportata. \\ 
-    \constd{EAI\_SOCKTYPE}& Il tipo di socket richiesto non è supportato. \\
-    \constd{EAI\_BADFLAGS}& Il campo \var{ai\_flags} contiene dei valori non
-                            validi. \\
+    \constd{EAI\_MEMORY}  & È stato impossibile allocare la memoria necessaria
+                            alle operazioni. \\
+    \constd{EAI\_NODATA}  & La macchina specificata esiste, ma non ha nessun
+                            indirizzo di rete definito. \\
     \constd{EAI\_NONAME}  & Il nome a dominio o il servizio non sono noti,
                             viene usato questo errore anche quando si specifica
                             il valore \val{NULL} per entrambi gli argomenti
@@ -1472,16 +1580,7 @@ corrispondente è riportato tramite \var{errno}.
     \constd{EAI\_SERVICE} & Il servizio richiesto non è disponibile per il tipo
                             di socket richiesto, anche se può esistere per
                             altri tipi di socket. \\
-    \constd{EAI\_ADDRFAMILY}& La rete richiesta non ha nessun indirizzo di rete
-                              per la famiglia di indirizzi specificata. \\
-    \constd{EAI\_NODATA}  & La macchina specificata esiste, ma non ha nessun
-                            indirizzo di rete definito. \\
-    \constd{EAI\_MEMORY}  & È stato impossibile allocare la memoria necessaria
-                            alle operazioni. \\
-    \constd{EAI\_FAIL}    & Il DNS ha restituito un errore di risoluzione  
-                            permanente. \\
-    \constd{EAI\_AGAIN}   & Il DNS ha restituito un errore di risoluzione  
-                            temporaneo, si può ritentare in seguito. \\
+    \constd{EAI\_SOCKTYPE}& Il tipo di socket richiesto non è supportato. \\
     \constd{EAI\_SYSTEM}  & C'è stato un errore di sistema, si può controllare
                             \var{errno} per i dettagli. \\
 %    \hline
@@ -1499,35 +1598,36 @@ corrispondente è riportato tramite \var{errno}.
 \end{table}
 
 Come per i codici di errore di \func{gethostbyname} anche in questo caso è
-fornita una apposita funzione, analoga di \func{strerror}, che consente di
-utilizzarli direttamente per stampare a video un messaggio esplicativo; la
-funzione è \funcd{gai\_strerror} ed il suo prototipo è:
-\begin{functions}
-  \headdecl{netdb.h} 
-
-  \funcdecl{const char *gai\_strerror(int errcode)}
+fornita una apposita funzione, simile a \func{strerror}, che consente di
+utilizzare direttamente il codice restituito dalla funzione per stampare a
+video un messaggio esplicativo; la funzione è \funcd{gai\_strerror} ed il suo
+prototipo è:
 
-  Fornisce il messaggio corrispondente ad un errore di \func{getaddrinfo}.
+\begin{funcproto}{
+\fhead{netdb.h} 
+\fdecl{const char *gai\_strerror(int errcode)}
+\fdesc{Fornisce il messaggio corrispondente ad un errore di \func{getaddrinfo}.} 
+}
 
-  \bodydesc{La funzione restituisce il puntatore alla stringa contenente il
-    messaggio di errore.}
-\end{functions}
+{La funzione ritorna il puntatore alla stringa contenente il messaggio di
+  errore.}
+\end{funcproto}
 
 La funzione restituisce un puntatore alla stringa contenente il messaggio
 corrispondente dal codice di errore \param{errcode} ottenuto come valore di
 ritorno di \func{getaddrinfo}.  La stringa è allocata staticamente, ma essendo
-costante, ed accessibile in sola lettura, questo non comporta nessun problema
-di rientranza della funzione.
+costante ed accessibile in sola lettura, la funzione è rientrante.
 
 Dato che ad un certo nome a dominio possono corrispondere più indirizzi IP
 (sia IPv4 che IPv6), e che un certo servizio può essere fornito su protocolli
 e tipi di socket diversi, in generale, a meno di non aver eseguito una
 selezione specifica attraverso l'uso di \param{hints}, si otterrà una diversa
-struttura \struct{addrinfo} per ciascuna possibilità.  Ad esempio se si
-richiede la risoluzione del servizio \textit{echo} per l'indirizzo
-\texttt{www.truelite.it}, e si imposta \const{AI\_CANONNAME} per avere anche
-la risoluzione del nome canonico, si avrà come risposta della funzione la
-lista illustrata in fig.~\ref{fig:sock_addrinfo_list}.
+struttura \struct{addrinfo} per ciascuna possibilità.  
+
+Ad esempio se si richiede la risoluzione del servizio \textit{echo} per
+l'indirizzo \texttt{www.truelite.it}, e si imposta \const{AI\_CANONNAME} per
+avere anche la risoluzione del nome canonico, si avrà come risposta della
+funzione la lista illustrata in fig.~\ref{fig:sock_addrinfo_list}.
 
 \begin{figure}[!htb]
   \centering
@@ -1545,7 +1645,7 @@ gestita l'eventuale inizializzazione dell'argomento \var{hints} per
 restringere le ricerche su protocolli, tipi di socket o famiglie di indirizzi,
 è disponibile nel file \texttt{mygetaddr.c} dei sorgenti allegati alla guida.
 
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
     \includecodesample{listati/mygetaddr.c}
@@ -1574,8 +1674,8 @@ puntatore valido. La selezione principale è fatta sul campo \var{ai\_family},
 che stabilisce a quale famiglia di indirizzi fa riferimento la struttura in
 esame. Le possibilità sono due, un indirizzo IPv4 o IPv6, se nessuna delle due
 si verifica si provvede (\texttt{\small 27--30}) a stampare un messaggio di
-errore ed uscire.\footnote{questa eventualità non dovrebbe mai verificarsi,
-  almeno fintanto che la funzione \func{getaddrinfo} lavora correttamente.}
+errore ed uscire (questa eventualità non dovrebbe comunque mai verificarsi,
+almeno fintanto che la funzione \func{getaddrinfo} lavora correttamente).
 
 Per ciascuno delle due possibili famiglie di indirizzi si estraggono le
 informazioni che poi verranno stampate alla fine del ciclo (\texttt{\small
@@ -1598,7 +1698,7 @@ puntatore al campo contenente l'indirizzo IP nella struttura puntata dal campo
   sono presenti direttamente i valori finali, per l'uso con \func{inet\_ntop}
   occorre comunque passare un puntatore agli stessi (ed il costrutto
   \code{\&addr6->sin6\_addr} è corretto in quanto l'operatore \texttt{->} ha
-  on questo caso precedenza su \texttt{\&}).}
+  in questo caso precedenza su \texttt{\&}).}
 
 Una volta estratte dalla struttura \struct{addrinfo} tutte le informazioni
 relative alla risoluzione richiesta e stampati i relativi valori, l'ultimo
@@ -1614,8 +1714,8 @@ nello stesso ordine in cui vengono inviati dal server DNS. In particolare
 nulla garantisce che vengano forniti prima i dati relativi ai servizi di un
 determinato protocollo o tipo di socket, se ne sono presenti di diversi.  Se
 allora utilizziamo il nostro programma potremo verificare il risultato:
-\begin{Verbatim}
-[piccardi@gont sources]$ ./mygetaddr -c  gapil.truelite.it echo
+\begin{Console}
+[piccardi@gont sources]$ \textbf{./mygetaddr -c  gapil.truelite.it echo}
 Canonical name sources2.truelite.it
 IPv4 address:
         Indirizzo 62.48.34.25
@@ -1625,28 +1725,30 @@ IPv4 address:
         Indirizzo 62.48.34.25
         Protocollo 17
         Porta 7
-\end{Verbatim}
+\end{Console}
 %$
 
 Una volta estratti i risultati dalla \textit{linked list} puntata
 da \param{res} se questa non viene più utilizzata si dovrà avere cura di
 disallocare opportunamente tutta la memoria, per questo viene fornita
 l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è:
-\begin{functions}
-  \headdecl{netdb.h} 
 
-  \funcdecl{void freeaddrinfo(struct addrinfo *res)}
 
-  Libera la memoria allocata da una precedente chiamata a \func{getaddrinfo}.
+\begin{funcproto}{
+\fhead{netdb.h}
+\fdecl{void freeaddrinfo(struct addrinfo *res)}
+\fdesc{Libera la memoria allocata da una precedente chiamata a \func{getaddrinfo}.} 
+}
 
-  \bodydesc{La funzione non restituisce nessun codice di errore.}
-\end{functions}
+{La funzione non restituisce nessun codice di errore.}
+\end{funcproto}
 
 La funzione prende come unico argomento il puntatore \param{res}, ottenuto da
 una precedente chiamata a \func{getaddrinfo}, e scandisce la lista delle
 strutture per liberare tutta la memoria allocata. Dato che la funzione non ha
 valori di ritorno deve essere posta molta cura nel passare un valore valido
-per \param{res}.
+per \param{res} ed usare un indirizzo non valido o già liberato può avere
+conseguenze non prevedibili.
 
 Si tenga presente infine che se si copiano i risultati da una delle strutture
 \struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre
@@ -1660,19 +1762,20 @@ eseguire la risoluzione inversa e determinare nomi di servizi e di dominio
 dati i rispettivi valori numerici. La funzione che sostituisce le varie
 \func{gethostbyname}, \func{getipnodebyname} e \func{getservbyname} è
 \funcd{getnameinfo}, ed il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/socket.h}
-  \headdecl{netdb.h}
 
-  \funcdecl{int getnameinfo(const struct sockaddr *sa, socklen\_t salen, char
-    *host, size\_t hostlen, char *serv, size\_t servlen, int flags)}
-
-  Risolve il contenuto di una struttura degli indirizzi in maniera
-  indipendente dal protocollo.
+\begin{funcproto}{
+\fhead{netdb.h}
+\fhead{sys/socket.h}
+\fdecl{int getnameinfo(const struct sockaddr *sa, socklen\_t salen, \\
+\phantom{int getnameinfo(}char *host, size\_t hostlen, char *serv, size\_t
+servlen, int flags)} 
+\fdesc{Effettua una risoluzione di un indirizzo di rete in maniera
+  indipendente dal protocollo.} 
+}
 
-  \bodydesc{La funzione restituisce 0 in caso di successo e un codice di
-    errore diverso da zero altrimenti.}
-\end{functions}
+{La funzione ritorna $0$ in caso di successo e un codice di errore diverso da
+  zero per un errore.}
+\end{funcproto}
 
 La principale caratteristica di \func{getnameinfo} è che la funzione è in
 grado di eseguire una risoluzione inversa in maniera indipendente dal
@@ -1684,36 +1787,47 @@ IPv6, la cui dimensione deve comunque essere specificata con l'argomento
 I risultati della funzione saranno restituiti nelle due stringhe puntate da
 \param{host} e \param{serv}, che dovranno essere state precedentemente
 allocate per una lunghezza massima che deve essere specificata con gli altri
-due argomenti \param{hostlen} e \param{servlen}. Si può, quando non si è
-interessati ad uno dei due, passare il valore \val{NULL} come argomento,
-così che la corrispondente informazione non verrà richiesta. Infine l'ultimo
+due argomenti \param{hostlen} e \param{servlen}. Quando non si è
+interessati ad uno dei due, si può passare il valore \val{NULL} come argomento,
+così che la corrispondente informazione non venga richiesta. Infine l'ultimo
 argomento \param{flags} è una maschera binaria i cui bit consentono di
 impostare le modalità con cui viene eseguita la ricerca, e deve essere
 specificato attraverso l'OR aritmetico dei valori illustrati in
-tab.~\ref{tab:getnameinfo_flags}.
+tab.~\ref{tab:getnameinfo_flags}, nella seconda parte della tabella si sono
+aggiunti i valori introdotto con le \acr{glibc} 2.3.4 per gestire la
+internazionalizzione dei nomi a dominio.
 
 \begin{table}[!htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|p{10cm}|}
+  \begin{tabular}[c]{|l|p{8cm}|}
     \hline
     \textbf{Costante} & \textbf{Significato} \\
     \hline
     \hline
+    \constd{NI\_DGRAM}      & Richiede che venga restituito il nome del
+                              servizio su UDP invece che quello su TCP per quei
+                              pichi servizi (porte 512-214) che soni diversi
+                              nei due protocolli.\\
     \constd{NI\_NOFQDN}     & Richiede che venga restituita solo il nome della
                               macchina all'interno del dominio al posto del
                               nome completo (FQDN).\\
+    \constd{NI\_NAMEREQD}   & Richiede la restituzione di un errore se il nome
+                              non può essere risolto.\\
     \constd{NI\_NUMERICHOST}& Richiede che venga restituita la forma numerica
                               dell'indirizzo (questo succede sempre se il nome
                               non può essere ottenuto).\\ 
-    \constd{NI\_NAMEREQD}   & Richiede la restituzione di un errore se il nome
-                              non può essere risolto.\\
     \constd{NI\_NUMERICSERV}& Richiede che il servizio venga restituito in
-                              forma numerica (attraverso il numero di porta).\\
-    \constd{NI\_DGRAM}      & Richiede che venga restituito il nome del
-                              servizio su UDP invece che quello su TCP per quei
-                              pichi servizi (porte 512-214) che soni diversi
-                              nei due protocolli.\\
+                              forma numerica (attraverso il numero di
+                              porta).\\
+    \hline
+    \const{NI\_IDN}        & Se specificato il nome restituito viene convertito usando la
+                             localizzazione corrente, se necessario, nella
+                             codifica IDN.\\ 
+    \const{NI\_IDN\_ALLOW\_UNASSIGNED} & attiva il controllo 
+                                       \texttt{IDNA\_ALLOW\_UNASSIGNED}.\\ 
+    \const{NI\_AI\_IDN\_USE\_STD3\_ASCII\_RULES} & attiva il controllo
+                                       \texttt{IDNA\_USE\_STD3\_ASCII\_RULES}\\ 
     \hline
   \end{tabular}
   \caption{Costanti associate ai bit dell'argomento \param{flags} della  
@@ -1749,7 +1863,7 @@ fig.~\ref{fig:sockconn_code}, il codice completo è nel file \file{SockUtil.c}
 dei sorgenti allegati alla guida, che contiene varie funzioni di utilità per
 l'uso dei socket.
 
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
     \includecodesample{listati/sockconn.c}
@@ -1765,38 +1879,42 @@ cui sarà effettuata la risoluzione; seguono il protocollo da usare (da
 specificare con il valore numerico di \conffile{/etc/protocols}) ed il tipo di
 socket (al solito specificato con i valori illustrati in
 sez.~\ref{sec:sock_type}).  La funzione ritorna il valore del file descriptor
-associato al socket (un numero positivo) in caso di successo, o -1 in caso di
-errore; per risolvere il problema di non poter passare indietro i valori di
-ritorno di \func{getaddrinfo} contenenti i relativi codici di
-errore\footnote{non si può avere nessuna certezza che detti valori siano
-  negativi, è questo è invece necessario per evitare ogni possibile ambiguità
-  nei confronti del valore di ritorno in caso di successo.} si sono stampati i
-messaggi d'errore direttamente nella funzione.
-
-Una volta definite le variabili necessarie (\texttt{\small 3--5}) la funzione
+associato al socket (un numero positivo) in caso di successo, o $-1$ in caso
+di errore.
+
+Per risolvere il problema di non poter passare indietro i valori di ritorno di
+\func{getaddrinfo} contenenti i relativi codici di errore si sono stampati i
+messaggi d'errore direttamente nella funzione; infatti non si può avere
+nessuna certezza che detti valori siano negativi e per cui stampare subito
+l'errore diventa necessario per evitare ogni possibile ambiguità nei confronti
+del valore di ritorno in caso di successo.
+
+Una volta definite le variabili occorrenti (\texttt{\small 3--5}) la funzione
 prima (\texttt{\small 6}) azzera il contenuto della struttura \var{hint} e poi
 provvede (\texttt{\small 7--9}) ad inizializzarne i valori necessari per la
 chiamata (\texttt{\small 10}) a \func{getaddrinfo}. Di quest'ultima si
-controlla (\texttt{\small 12--16}) il codice di ritorno, in modo da stampare un
-avviso di errore, azzerare \var{errno} ed uscire in caso di errore.  Dato che
-ad una macchina possono corrispondere più indirizzi IP, e di tipo diverso (sia
-IPv4 che IPv6), mentre il servizio può essere in ascolto soltanto su uno solo
-di questi, si provvede a tentare la connessione per ciascun indirizzo
-restituito all'interno di un ciclo (\texttt{\small 18--40}) di scansione della
-lista restituita da \func{getaddrinfo}, ma prima (\texttt{\small 17}) si salva
-il valore del puntatore per poterlo riutilizzare alla fine per disallocare la
-lista.
+controlla (\texttt{\small 12--16}) il codice di ritorno, in modo da stampare
+un avviso di errore, azzerare \var{errno} ed uscire in caso di errore.  
+
+Dato che ad una macchina possono corrispondere più indirizzi IP, e di tipo
+diverso (sia IPv4 che IPv6), mentre il servizio può essere in ascolto soltanto
+su uno solo di questi, si provvede a tentare la connessione per ciascun
+indirizzo restituito all'interno di un ciclo (\texttt{\small 18--40}) di
+scansione della lista restituita da \func{getaddrinfo}, ma prima
+(\texttt{\small 17}) si salva il valore del puntatore per poterlo riutilizzare
+alla fine per disallocare la lista.
 
 Il ciclo viene ripetuto (\texttt{\small 18}) fintanto che si hanno indirizzi
 validi, ed inizia (\texttt{\small 19}) con l'apertura del socket; se questa
 fallisce si controlla (\texttt{\small 20}) se sono disponibili altri
 indirizzi, nel qual caso si passa al successivo (\texttt{\small 21}) e si
 riprende (\texttt{\small 22}) il ciclo da capo; se non ve ne sono si stampa
-l'errore ritornando immediatamente (\texttt{\small 24--27}). Quando la
-creazione del socket ha avuto successo si procede (\texttt{\small 29})
-direttamente con la connessione, di nuovo in caso di fallimento viene ripetuto
-(\texttt{\small 30--38}) il controllo se vi sono o no altri indirizzi da
-provare nella stessa modalità fatta in precedenza, aggiungendovi però in
+l'errore ritornando immediatamente (\texttt{\small 24--27}). 
+
+Quando la creazione del socket ha avuto successo si procede (\texttt{\small
+  29}) direttamente con la connessione, di nuovo in caso di fallimento viene
+ripetuto (\texttt{\small 30--38}) il controllo se vi sono o no altri indirizzi
+da provare nella stessa modalità fatta in precedenza, aggiungendovi però in
 entrambi i casi (\texttt{\small 32} e (\texttt{\small 36}) la chiusura del
 socket precedentemente aperto, che non è più utilizzabile.
 
@@ -1810,16 +1928,6 @@ ritornata contiene indirizzi IPv6 o IPv4, in quanto si fa uso direttamente dei
 dati relativi alle strutture degli indirizzi di \struct{addrinfo} che sono
 opachi rispetto all'uso della funzione \func{connect}.
 
-\begin{figure}[!htbp]
-  \footnotesize \centering
-  \begin{minipage}[c]{\codesamplewidth}
-    \includecodesample{listati/TCP_echo_fifth.c}
-  \end{minipage}
-  \normalsize
-  \caption{Il nuovo codice per la connessione del client \textit{echo}.}
-  \label{fig:TCP_echo_fifth}
-\end{figure}
-
 Per usare questa funzione possiamo allora modificare ulteriormente il nostro
 programma client per il servizio \textit{echo}; in questo caso rispetto al
 codice usato finora per collegarsi (vedi fig.~\ref{fig:TCP_echo_client_1})
@@ -1831,7 +1939,25 @@ codice completo è nel file \file{TCP\_echo\_fifth.c} dei sorgenti allegati)
 consente di utilizzare come argomento del programma un nome a dominio al posto
 dell'indirizzo numerico, e può utilizzare sia indirizzi IPv4 che IPv6.
 
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{\codesamplewidth}
+    \includecodesample{listati/TCP_echo_fifth.c}
+  \end{minipage}
+  \normalsize
+  \caption{Il nuovo codice per la connessione del client \textit{echo}.}
+  \label{fig:TCP_echo_fifth}
+\end{figure}
+
+La seconda funzione di ausilio che abbiamo creato è \texttt{sockbind}, il cui
+corpo principale è riportato in fig.~\ref{fig:sockbind_code} (al solito il
+sorgente completo è nel file \file{sockbind.c} dei sorgenti allegati alla
+guida). Come si può notare la funzione è del tutto analoga alla precedente
+\texttt{sockconn}, e prende gli stessi argomenti, però invece di eseguire una
+connessione con \func{connect} si limita a chiamare \func{bind} per collegare
+il socket ad una porta.
+
+\begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
     \includecodesample{listati/sockbind.c}
@@ -1841,14 +1967,6 @@ dell'indirizzo numerico, e può utilizzare sia indirizzi IPv4 che IPv6.
   \label{fig:sockbind_code}
 \end{figure}
 
-La seconda funzione di ausilio è \texttt{sockbind}, il cui corpo principale è
-riportato in fig.~\ref{fig:sockbind_code} (al solito il sorgente completo è
-nel file \file{sockbind.c} dei sorgenti allegati alla guida). Come si può
-notare la funzione è del tutto analoga alla precedente \texttt{sockconn}, e
-prende gli stessi argomenti, però invece di eseguire una connessione con
-\func{connect} si limita a chiamare \func{bind} per collegare il socket ad una
-porta.
-
 Dato che la funzione è pensata per essere utilizzata da un server ci si può
 chiedere a quale scopo mantenere l'argomento \param{host} quando l'indirizzo
 di questo è usualmente noto. Si ricordi però quanto detto in
@@ -1873,11 +1991,11 @@ identici, solo che si è sostituita (\texttt{\small 31}) la chiamata a
 (\texttt{\small 43--44}) della funzione è identica.
 
 Si noti come anche in questo caso si siano inserite le stampe degli errori
-sullo standard error, nonostante la funzione possa essere invocata da un
-demone. Nel nostro caso questo non è un problema in quanto se la funzione non
-ha successo il programma deve uscire immediatamente prima di essere posto in
-background, e può quindi scrivere gli errori direttamente sullo standard
-error.
+sullo \textit{standard error}, nonostante la funzione possa essere invocata da
+un demone. Nel nostro caso questo non è un problema in quanto se la funzione
+non ha successo il programma deve uscire immediatamente prima di essere posto
+in background, e può quindi scrivere gli errori direttamente sullo
+\textit{standard error}.
 
 \begin{figure}[!htbp]
   \footnotesize \centering
@@ -1898,38 +2016,45 @@ che si cura anche della eventuale risoluzione di un indirizzo specifico sul
 quale si voglia far ascoltare il server.
 
 
-
 \section{Le opzioni dei socket}
 \label{sec:sock_options}
 
 Benché dal punto di vista del loro uso come canali di trasmissione di dati i
-socket siano trattati allo stesso modo dei file, ed acceduti tramite i file
-descriptor, la normale interfaccia usata per la gestione dei file non è
-sufficiente a poterne controllare tutte le caratteristiche, che variano tra
-l'altro a seconda del loro tipo (e della relativa forma di comunicazione
-sottostante). In questa sezione vedremo allora quali sono le funzioni dedicate
-alla gestione delle caratteristiche specifiche dei vari tipi di socket, le
-cosiddette \textit{socket options}.
-
-
-\subsection{Le funzioni \func{setsockopt} e \func{getsockopt}}
+socket vengano trattati allo stesso modo dei file, acceduti tramite i file
+descriptor, e gestiti con le ordinarie funzioni di lettura e scrittura dei
+file, l'interfaccia standard usata per la gestione dei file generici non è
+comunque sufficiente a controllare la moltitudine di caratteristiche
+specifiche che li contraddistinguono, considerato tra l'altro che queste
+possono essere completamente diverse fra loro a seconda del tipo di socket e
+della relativa forma di comunicazione sottostante.
+
+In questa sezione vedremo allora quali sono le funzioni dedicate alla gestione
+delle caratteristiche specifiche dei vari tipi di socket, che vengono
+raggruppate sotto il nome generico di ``\textit{socket options}'', ma
+soprattutto analizzaremo quali sono queste opzioni e quali caretteristiche e
+comportamenti dei socket permettono di controllare.
+
+
+\subsection{Le funzioni di gestione delle opzioni dei socket}
 \label{sec:sock_setsockopt}
 
-Le varie caratteristiche dei socket possono essere gestite attraverso l'uso di
-due funzioni generiche che permettono rispettivamente di impostarle e di
-recuperarne il valore corrente. La prima di queste due funzioni, quella usata
-per impostare le \textit{socket options}, è \funcd{setsockopt}, ed il suo
-prototipo è:
-\begin{functions}
-  \headdecl{sys/socket.h}
-  \headdecl{sys/types.h}
+La modalità principale con cui si possono gestire le caratteristiche dei
+socket (ne vedremo delle ulteriori nelle prossime sezioni) è quella che passa
+attraverso l'uso di due funzioni di sistema generiche che permettono
+rispettivamente di impostarle e di recuperarne il valore corrente. La prima di
+queste due funzioni, quella usata per impostare le \textit{socket options}, è
+\funcd{setsockopt}, ed il suo prototipo è:
 
-  \funcdecl{int setsockopt(int sock, int level, int optname, const void
+\begin{funcproto}{
+\fhead{sys/socket.h}
+\fhead{sys/types.h}
+\fdecl{int setsockopt(int sock, int level, int optname, const void
     *optval, socklen\_t optlen)}
-  Imposta le opzioni di un socket.
+\fdesc{Imposta le opzioni di un socket.} 
+}
 
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-    errore, nel qual caso \var{errno} assumerà i valori:
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EBADF}]  il file descriptor \param{sock} non è valido.
   \item[\errcode{EFAULT}] l'indirizzo \param{optval} non è valido.
@@ -1940,8 +2065,7 @@ prototipo è:
     un socket.
   \end{errlist}
 }
-\end{functions}
-
+\end{funcproto}
 
 Il primo argomento della funzione, \param{sock}, indica il socket su cui si
 intende operare; per indicare l'opzione da impostare si devono usare i due
@@ -1963,22 +2087,6 @@ dal socket.  Infine \param{level} prevede anche il valore speciale
 \const{SOL\_SOCKET} usato per le opzioni generiche che sono disponibili per
 qualunque tipo di socket.
 
-I valori usati per \param{level}, corrispondenti ad un dato protocollo usato
-da un socket, sono quelli corrispondenti al valore numerico che identifica il
-suddetto protocollo in \conffile{/etc/protocols}; dato che la leggibilità di un
-programma non trarrebbe certo beneficio dall'uso diretto dei valori numerici,
-più comunemente si indica il protocollo tramite le apposite costanti
-\texttt{SOL\_*} riportate in tab.~\ref{tab:sock_option_levels}, dove si sono
-riassunti i valori che possono essere usati per l'argomento
-\param{level}.\footnote{la notazione in questo caso è, purtroppo, abbastanza
-  confusa: infatti in Linux il valore si può impostare sia usando le costanti
-  \texttt{SOL\_*}, che le analoghe \texttt{IPPROTO\_*} (citate anche da
-  Stevens in \cite{UNP1}); entrambe hanno gli stessi valori che sono
-  equivalenti ai numeri di protocollo di \conffile{/etc/protocols}, con una
-  eccezione specifica, che è quella del protocollo ICMP, per la quale non
-  esista una costante, il che è comprensibile dato che il suo valore, 1, è
-  quello che viene assegnato a \const{SOL\_SOCKET}.}
-
 \begin{table}[!htb]
   \centering
   \footnotesize
@@ -1999,10 +2107,27 @@ riassunti i valori che possono essere usati per l'argomento
   \label{tab:sock_option_levels}
 \end{table}
 
-Il quarto argomento, \param{optval} è un puntatore ad una zona di memoria che
-contiene i dati che specificano il valore dell'opzione che si vuole passare al
-socket, mentre l'ultimo argomento \param{optlen},\footnote{questo argomento è
-  in realtà sempre di tipo \ctyp{int}, come era nelle \acr{libc4} e
+I valori usati per \param{level}, corrispondenti ad un dato protocollo usato
+da un socket, sono quelli corrispondenti al valore numerico che identifica il
+suddetto protocollo in \conffile{/etc/protocols}; dato che la leggibilità di un
+programma non trarrebbe certo beneficio dall'uso diretto dei valori numerici,
+più comunemente si indica il protocollo tramite le apposite costanti
+\texttt{SOL\_*} riportate in tab.~\ref{tab:sock_option_levels}, dove si sono
+riassunti i valori che possono essere usati per l'argomento
+\param{level}. 
+
+La notazione in questo caso è, purtroppo, abbastanza confusa: infatti in Linux
+il valore si può impostare sia usando le costanti \texttt{SOL\_*}, che le
+analoghe \texttt{IPPROTO\_*} (citate anche da Stevens in \cite{UNP1});
+entrambe hanno gli stessi valori che sono equivalenti ai numeri di protocollo
+di \conffile{/etc/protocols}, con una eccezione specifica, che è quella del
+protocollo ICMP, per la quale non esiste una costante, il che è comprensibile
+dato che il suo valore, 1, è quello che viene assegnato a \const{SOL\_SOCKET}.
+
+Il quarto argomento, \param{optval} è un puntatore ad una zona di memoria che
+contiene i dati che specificano il valore dell'opzione che si vuole passare al
+socket, mentre l'ultimo argomento \param{optlen},\footnote{questo argomento è
+  in realtà sempre di tipo \ctyp{int}, come era nelle \acr{libc4} e
   \acr{libc5}; l'uso di \type{socklen\_t} è stato introdotto da POSIX (valgono
   le stesse considerazioni per l'uso di questo tipo di dato fatte in
   sez.~\ref{sec:TCP_func_accept}) ed adottato dalle \acr{glibc}.} è la
@@ -2022,15 +2147,18 @@ di opzioni però usano dei tipi di dati peculiari, è questo il motivo per cui
 La seconda funzione usata per controllare le proprietà dei socket è
 \funcd{getsockopt}, che serve a leggere i valori delle opzioni dei socket ed a
 farsi restituire i dati relativi al loro funzionamento; il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/socket.h}
-  \headdecl{sys/types.h}
 
-  \funcdecl{int getsockopt(int s, int level, int optname, void *optval,
-    socklen\_t *optlen)} Legge le opzioni di un socket.
 
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-    errore, nel qual caso \var{errno} assumerà i valori:
+\begin{funcproto}{
+\fhead{sys/socket.h}
+\fhead{sys/types.h}
+\fdecl{int getsockopt(int s, int level, int optname, void *optval,
+    socklen\_t *optlen)}
+\fdesc{Legge le opzioni di un socket.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EBADF}] il file descriptor \param{sock} non è valido.
   \item[\errcode{EFAULT}] l'indirizzo \param{optval} o quello di
@@ -2041,7 +2169,7 @@ farsi restituire i dati relativi al loro funzionamento; il suo prototipo è:
     un socket.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 I primi tre argomenti sono identici ed hanno lo stesso significato di quelli
 di \func{setsockopt}, anche se non è detto che tutte le opzioni siano definite
@@ -2078,48 +2206,62 @@ tab.~\ref{tab:sock_opt_socklevel}.
                     \textbf{Descrizione}\\
     \hline
     \hline
+    \const{SO\_ACCEPTCONN}&$\bullet$&        &         &\texttt{int}& 
+                          Indica se il socket è in ascolto.\\
+    \const{SO\_BINDTODEVICE}&$\bullet$&$\bullet$&         &\texttt{char *}& 
+                          Lega il socket ad un dispositivo.\\
+    \const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          Attiva o disattiva il \textit{broadcast}.\\ 
+    \const{SO\_BSDCOMPAT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          Abilita la compatibilità con BSD.\\
+    \const{SO\_DEBUG}    &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          Abilita il debugging sul socket.\\
+    \const{SO\_DOMAIN}   &$\bullet$&         &         &\texttt{int}& 
+                          Legge il tipo di socket.\\
+    \const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          Non invia attraverso un gateway.\\
+    \const{SO\_ERROR}    &$\bullet$&         &         &\texttt{int}& 
+                          Riceve e cancella gli errori pendenti.\\
     \const{SO\_KEEPALIVE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
                           Controlla l'attività della connessione.\\
+    \const{SO\_LINGER}   &$\bullet$&$\bullet$&         &\texttt{linger}&
+                          Indugia nella chiusura con dati da spedire.\\
+    \const{SO\_MARK}     &$\bullet$&$\bullet$&         &\texttt{int}&
+                          Imposta un ``\textit{firewall mark}'' sul socket.\\
     \const{SO\_OOBINLINE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
                           Lascia in linea i dati \textit{out-of-band}.\\
-    \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Basso livello sul buffer di ricezione.\\
-    \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$&         &\texttt{int}&
-                          Basso livello sul buffer di trasmissione.\\
-    \const{SO\_RCVTIMEO} &$\bullet$&$\bullet$&         &\texttt{timeval}& 
-                          Timeout in ricezione.\\
-    \const{SO\_SNDTIMEO} &$\bullet$&$\bullet$&         &\texttt{timeval}& 
-                          Timeout in trasmissione.\\
-    \const{SO\_BSDCOMPAT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Abilita la compatibilità con BSD.\\
     \const{SO\_PASSCRED} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
                           Abilita la ricezione di credenziali.\\
     \const{SO\_PEERCRED} &$\bullet$&         &         &\texttt{ucred}& 
                           Restituisce le credenziali del processo remoto.\\
-    \const{SO\_BINDTODEVICE}&$\bullet$&$\bullet$&         &\texttt{char *}& 
-                          Lega il socket ad un dispositivo.\\
-    \const{SO\_DEBUG}    &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Abilita il debugging sul socket.\\
+    \const{SO\_PRIORITY} &$\bullet$&$\bullet$&         &\texttt{int}& 
+                          Imposta la priorità del socket.\\
+    \const{SO\_PROTOCOL} &$\bullet$&         &         &\texttt{int}& 
+                          Ottiene il protocollo usato dal socket.\\
+    \const{SO\_RCVBUF}   &$\bullet$&$\bullet$&         &\texttt{int}& 
+                          Imposta dimensione del buffer di ricezione.\\
+    \const{SO\_RCVBUFFORCE}&$\bullet$&$\bullet$&         &\texttt{int}& 
+                          Forza dimensione del buffer di ricezione.\\
+    \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          Basso livello sul buffer di ricezione.\\
+    \const{SO\_RCVTIMEO} &$\bullet$&$\bullet$&         &\texttt{timeval}& 
+                          Timeout in ricezione.\\
     \const{SO\_REUSEADDR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
                           Consente il riutilizzo di un indirizzo locale.\\
-    \const{SO\_TYPE}     &$\bullet$&         &         &\texttt{int}& 
-                          Restituisce il tipo di socket.\\
-    \const{SO\_ACCEPTCONN}&$\bullet$&        &         &\texttt{int}& 
-                          Indica se il socket è in ascolto.\\
-    \const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Non invia attraverso un gateway.\\
-    \const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Attiva o disattiva il \textit{broadcast}.\\ 
+    \const{SO\_REUSEPORT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          Consente il riutilizzo di una porta.\\
     \const{SO\_SNDBUF}   &$\bullet$&$\bullet$&         &\texttt{int}& 
                           Imposta dimensione del buffer di trasmissione.\\
-    \const{SO\_RCVBUF}   &$\bullet$&$\bullet$&         &\texttt{int}& 
-                          Imposta dimensione del buffer di ricezione.\\
-    \const{SO\_LINGER}   &$\bullet$&$\bullet$&         &\texttt{linger}&
-                          Indugia nella chiusura con dati da spedire.\\
-    \const{SO\_PRIORITY} &$\bullet$&$\bullet$&         &\texttt{int}& 
-                          Imposta la priorità del socket.\\
-    \const{SO\_ERROR}    &$\bullet$&         &         &\texttt{int}& 
-                          Riceve e cancella gli errori pendenti.\\
+    \const{SO\_SNDBUFFORCE}&$\bullet$&$\bullet$&         &\texttt{int}& 
+                          Forza dimensione del buffer di trasmissione.\\
+    \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$&         &\texttt{int}&
+                          Basso livello sul buffer di trasmissione.\\
+    \const{SO\_SNDTIMEO} &$\bullet$&$\bullet$&         &\texttt{timeval}& 
+                          Timeout in trasmissione.\\
+    \const{SO\_TIMESTAMP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+                          Abilita/disabilita la ricezione dei \textit{timestamp}.\\
+    \const{SO\_TYPE}     &$\bullet$&         &         &\texttt{int}& 
+                          Restituisce il tipo di socket.\\
    \hline
   \end{tabular}
   \caption{Le opzioni disponibili al livello \const{SOL\_SOCKET}.} 
@@ -2130,11 +2272,22 @@ tab.~\ref{tab:sock_opt_socklevel}.
 % vedi http://lwn.net/Articles/625224/
 % TODO aggiungere e documentare SO_INCOMING_CPU, introdotta con il kernel 3.19,
 % vedi https://lwn.net/Articles/626150/
+% TODO documentare SO_PEEK_OFF
+% TODO documentare SO_RXQ_OVFL
+% TODO documentare SO_BUSYPOLL
+
+
+% TODO documentare SO_MARK, cercare esempi e verificare il tipo di valore passato
+% TODO documentare SO_PROTOCOL
+% TODO documentare SO_REUSEPORT
+% TODO documentare SO_TIMESTAMP
+% TODO documentare SO_SNDBUFFORCE/SO_RCVBUFFORCE
+
 
 La tabella elenca le costanti che identificano le singole opzioni da usare
 come valore per \param{optname}; le due colonne seguenti indicano per quali
 delle due funzioni (\func{getsockopt} o \func{setsockopt}) l'opzione è
-disponibile, mentre la colonna successiva indica, quando di ha a che fare con
+disponibile, mentre la colonna successiva indica, quando si ha a che fare con
 un valore di \param{optval} intero, se l'opzione è da considerare un numero o
 un valore logico. Si è inoltre riportato sulla quinta colonna il tipo di dato
 usato per \param{optval} ed una breve descrizione del significato delle
@@ -2149,6 +2302,76 @@ soltanto un elenco più dettagliato della breve descrizione di
 tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
 
+\item[\constd{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket
+  su cui opera è stato posto in modalità di ricezione di eventuali connessioni
+  con una chiamata a \func{listen}. L'opzione può essere usata soltanto con
+  \func{getsockopt} e utilizza per \param{optval} un intero in cui viene
+  restituito 1 se il socket è in ascolto e 0 altrimenti. 
+
+\item[\constd{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
+  socket ad una particolare interfaccia, in modo che esso possa ricevere ed
+  inviare pacchetti solo su quella. L'opzione richiede per \param{optval} il
+  puntatore ad una stringa contenente il nome dell'interfaccia (ad esempio
+  \texttt{eth0}); utilizzando una stringa nulla o un valore nullo per
+  \param{optlen} si può rimuovere un precedente collegamento.
+
+  Il nome della interfaccia deve essere specificato con una stringa terminata
+  da uno zero e di lunghezza massima pari a \constd{IFNAMSIZ}; l'opzione è
+  effettiva solo per alcuni tipi di socket, ed in particolare per quelli della
+  famiglia \const{AF\_INET}; non è invece supportata per i \textit{packet
+    socket} (vedi sez.~\ref{sec:socket_raw}). 
+
+\item[\constd{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast};
+  quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i
+  pacchetti inviati all'indirizzo di \textit{broadcast}, e potranno scrivere
+  pacchetti su tale indirizzo.  Prende per \param{optval} un intero usato come
+  valore logico. L'opzione non ha effetti su un socket di tipo
+  \const{SOCK\_STREAM}.
+
+\item[\constd{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il
+  comportamento di BSD (in particolare ne riproduce i bug).  Attualmente è una
+  opzione usata solo per il protocollo UDP e ne è prevista la rimozione in
+  futuro.  L'opzione utilizza per \param{optval} un intero usato come valore
+  logico. 
+
+  Quando viene abilitata gli errori riportati da messaggi ICMP per un socket
+  UDP non vengono passati al programma in user space. Con le versioni 2.0.x
+  del kernel erano anche abilitate altre opzioni per i socket raw, che sono
+  state rimosse con il passaggio al 2.2; è consigliato correggere i programmi
+  piuttosto che usare questa funzione. 
+
+\item[\constd{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
+  dei socket; l'opzione utilizza per \param{optval} un intero usato come
+  valore logico, e può essere utilizzata solo da un processo con i privilegi
+  di amministratore (in particolare con la \textit{capability}
+  \const{CAP\_NET\_ADMIN}).  L'opzione necessita inoltre dell'opportuno
+  supporto nel kernel;\footnote{deve cioè essere definita la macro di
+    preprocessore \macrod{SOCK\_DEBUGGING} nel file \file{include/net/sock.h}
+    dei sorgenti del kernel, questo è sempre vero nei kernel delle serie
+    superiori alla 2.3, per i kernel delle serie precedenti invece è
+    necessario aggiungere a mano detta definizione; è inoltre possibile
+    abilitare anche il tracciamento degli stati del TCP definendo la macro
+    \macrod{STATE\_TRACE} in \file{include/net/tcp.h}.}  quando viene
+  abilitata una serie di messaggi con le informazioni di debug vengono inviati
+  direttamente al sistema del kernel log.\footnote{si tenga presente che il
+    comportamento è diverso da quanto avviene con BSD, dove l'opzione opera
+    solo sui socket TCP, causando la scrittura di tutti i pacchetti inviati
+    sulla rete su un buffer circolare che viene letto da un apposito
+    programma, \cmd{trpt}.}
+
+\item[\constd{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei
+  pacchetti del socket, saltando ogni processo relativo all'uso della tabella
+  di routing del kernel. Prende per \param{optval} un intero usato come valore
+  logico.
+
+\item[\constd{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
+  può essere utilizzata soltanto con \func{getsockopt} e prende per
+  \param{optval} un valore intero, nel quale viene restituito il codice di
+  errore, e la condizione di errore sul socket viene cancellata. Viene
+  usualmente utilizzata per ricevere il codice di errore, come accennato in
+  sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una
+  \func{select} che ritorna a causa dello stesso.
+
 \item[\const{SO\_KEEPALIVE}] questa opzione abilita un meccanismo di verifica
   della persistenza di una connessione associata al socket (ed è pertanto
   effettiva solo sui socket che supportano le connessioni, ed è usata
@@ -2156,6 +2379,15 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   usato come valore logico. Maggiori dettagli sul suo funzionamento sono
   forniti in sez.~\ref{sec:sock_options_main}.
 
+\item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene
+  chiuso un socket quando si utilizza un protocollo che supporta le
+  connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e
+  modifica il comportamento delle funzioni \func{close} e \func{shutdown}.
+  L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo
+  \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in
+  fig.~\ref{fig:sock_linger_struct}.  Maggiori dettagli sul suo funzionamento
+  sono forniti in sez.~\ref{sec:sock_options_main}.
+
 \item[\constd{SO\_OOBINLINE}] se questa opzione viene abilitata i dati
   \textit{out-of-band} vengono inviati direttamente nel flusso di dati del
   socket (e sono quindi letti con una normale \func{read}) invece che restare
@@ -2165,6 +2397,30 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad
   esempio), ed utilizza per \param{optval} un intero usato come valore logico.
 
+\item[\constd{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain
+  (vedi sez.~\ref{sec:unix_socket}) la ricezione dei messaggi di controllo di
+  tipo \const{SCM\_CREDENTIALS}. Prende come \param{optval} un intero usato
+  come valore logico.
+
+\item[\constd{SO\_PEERCRED}] questa opzione restituisce le credenziali del
+  processo remoto connesso al socket; l'opzione è disponibile solo per socket
+  unix-domain e può essere usata solo con \func{getsockopt}.  Utilizza per
+  \param{optval} una apposita struttura \struct{ucred} (vedi
+  sez.~\ref{sec:unix_socket}). 
+
+\item[\constd{SO\_PRIORITY}] questa opzione permette di impostare le priorità
+  per tutti i pacchetti che sono inviati sul socket, prende per \param{optval}
+  un valore intero. Con questa opzione il kernel usa il valore per ordinare le
+  priorità sulle code di rete,\footnote{questo richiede che sia abilitato il
+    sistema di \textit{Quality of Service} disponibile con le opzioni di
+    routing avanzato.} i pacchetti con priorità più alta vengono processati
+  per primi, in modalità che dipendono dalla disciplina di gestione della
+  coda. Nel caso di protocollo IP questa opzione permette anche di impostare i
+  valori del campo \textit{type of service} (noto come TOS, vedi
+  sez.~\ref{sec:IP_header}) per i pacchetti uscenti. Per impostare una
+  priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i
+  privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}.
+
 \item[\constd{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il
   numero minimo di byte che devono essere presenti nel buffer di ricezione
   perché il kernel passi i dati all'utente, restituendoli ad una \func{read} o
@@ -2174,16 +2430,6 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   essere cambiato; \func{getsockopt} leggerà questo valore mentre
   \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. 
 
-\item[\constd{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il
-  numero minimo di byte che devono essere presenti nel buffer di trasmissione
-  perché il kernel li invii al protocollo successivo, consentendo ad una
-  \func{write} di ritornare o segnalando ad una \func{select} (vedi
-  sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura.
-  L'opzione utilizza per \param{optval} un intero che specifica il numero di
-  byte, come per la precedente \const{SO\_RCVLOWAT} con Linux questo valore è
-  sempre 1 e non può essere cambiato; \func{getsockopt} leggerà questo valore
-  mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}.
-
 \item[\constd{SO\_RCVTIMEO}] l'opzione permette di impostare un tempo massimo
   sulle operazioni di lettura da un socket, e prende per \param{optval} una
   struttura di tipo \struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct})
@@ -2210,70 +2456,6 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   consente però di impostare il timeout per l'uso di \func{connect}, per avere
   il quale si può ricorrere a questa opzione. 
 
-% TODO verificare il timeout con un programma di test
-
-\item[\constd{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo
-  sulle operazioni di scrittura su un socket, ed usa gli stessi valori di
-  \const{SO\_RCVTIMEO}.  In questo caso però si avrà un errore di
-  \errcode{EAGAIN} o \errcode{EWOULDBLOCK} per le funzioni di scrittura
-  \func{write}, \func{writev}, \func{send}, \func{sendto} e \func{sendmsg}
-  qualora queste restino bloccate per un tempo maggiore di quello specificato. 
-
-\item[\constd{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il
-  comportamento di BSD (in particolare ne riproduce i bug).  Attualmente è una
-  opzione usata solo per il protocollo UDP e ne è prevista la rimozione in
-  futuro.  L'opzione utilizza per \param{optval} un intero usato come valore
-  logico. 
-
-  Quando viene abilitata gli errori riportati da messaggi ICMP per un socket
-  UDP non vengono passati al programma in user space. Con le versioni 2.0.x
-  del kernel erano anche abilitate altre opzioni per i socket raw, che sono
-  state rimosse con il passaggio al 2.2; è consigliato correggere i programmi
-  piuttosto che usare questa funzione. 
-
-\item[\constd{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain
-  (vedi sez.~\ref{sec:unix_socket}) la ricezione dei messaggi di controllo di
-  tipo \const{SCM\_CREDENTIALS}. Prende come \param{optval} un intero usato
-  come valore logico.
-
-\item[\constd{SO\_PEERCRED}] questa opzione restituisce le credenziali del
-  processo remoto connesso al socket; l'opzione è disponibile solo per socket
-  unix-domain e può essere usata solo con \func{getsockopt}.  Utilizza per
-  \param{optval} una apposita struttura \struct{ucred} (vedi
-  sez.~\ref{sec:unix_socket}). 
-
-\item[\constd{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
-  socket ad una particolare interfaccia, in modo che esso possa ricevere ed
-  inviare pacchetti solo su quella. L'opzione richiede per \param{optval} il
-  puntatore ad una stringa contenente il nome dell'interfaccia (ad esempio
-  \texttt{eth0}); utilizzando una stringa nulla o un valore nullo per
-  \param{optlen} si può rimuovere un precedente collegamento.
-
-  Il nome della interfaccia deve essere specificato con una stringa terminata
-  da uno zero e di lunghezza massima pari a \constd{IFNAMSIZ}; l'opzione è
-  effettiva solo per alcuni tipi di socket, ed in particolare per quelli della
-  famiglia \const{AF\_INET}; non è invece supportata per i \textit{packet
-    socket} (vedi sez.~\ref{sec:socket_raw}). 
-
-\item[\constd{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
-  dei socket; l'opzione utilizza per \param{optval} un intero usato come
-  valore logico, e può essere utilizzata solo da un processo con i privilegi
-  di amministratore (in particolare con la \textit{capability}
-  \const{CAP\_NET\_ADMIN}).  L'opzione necessita inoltre dell'opportuno
-  supporto nel kernel;\footnote{deve cioè essere definita la macro di
-    preprocessore \macrod{SOCK\_DEBUGGING} nel file \file{include/net/sock.h}
-    dei sorgenti del kernel, questo è sempre vero nei kernel delle serie
-    superiori alla 2.3, per i kernel delle serie precedenti invece è
-    necessario aggiungere a mano detta definizione; è inoltre possibile
-    abilitare anche il tracciamento degli stati del TCP definendo la macro
-    \macrod{STATE\_TRACE} in \file{include/net/tcp.h}.}  quando viene
-  abilitata una serie di messaggi con le informazioni di debug vengono inviati
-  direttamente al sistema del kernel log.\footnote{si tenga presente che il
-    comportamento è diverso da quanto avviene con BSD, dove l'opzione opera
-    solo sui socket TCP, causando la scrittura di tutti i pacchetti inviati
-    sulla rete su un buffer circolare che viene letto da un apposito
-    programma, \cmd{trpt}.}
-
 \item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
   \func{bind} su indirizzi locali che siano già in uso da altri socket;
   l'opzione utilizza per \param{optval} un intero usato come valore logico.
@@ -2284,28 +2466,24 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   socket.  Maggiori dettagli sul suo funzionamento sono forniti in
   sez.~\ref{sec:sock_options_main}.
 
-\item[\constd{SO\_TYPE}] questa opzione permette di leggere il tipo di socket
-  su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per
-  \param{optval} un intero in cui verrà restituito il valore numerico che lo
-  identifica (ad esempio \const{SOCK\_STREAM}). 
-
-\item[\constd{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket
-  su cui opera è stato posto in modalità di ricezione di eventuali connessioni
-  con una chiamata a \func{listen}. L'opzione può essere usata soltanto con
-  \func{getsockopt} e utilizza per \param{optval} un intero in cui viene
-  restituito 1 se il socket è in ascolto e 0 altrimenti. 
+\item[\constd{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il
+  numero minimo di byte che devono essere presenti nel buffer di trasmissione
+  perché il kernel li invii al protocollo successivo, consentendo ad una
+  \func{write} di ritornare o segnalando ad una \func{select} (vedi
+  sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura.
+  L'opzione utilizza per \param{optval} un intero che specifica il numero di
+  byte, come per la precedente \const{SO\_RCVLOWAT} con Linux questo valore è
+  sempre 1 e non può essere cambiato; \func{getsockopt} leggerà questo valore
+  mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}.
 
-\item[\constd{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei
-  pacchetti del socket, saltando ogni processo relativo all'uso della tabella
-  di routing del kernel. Prende per \param{optval} un intero usato come valore
-  logico.
+% TODO verificare il timeout con un programma di test
 
-\item[\constd{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast};
-  quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i
-  pacchetti inviati all'indirizzo di \textit{broadcast}, e potranno scrivere
-  pacchetti su tale indirizzo.  Prende per \param{optval} un intero usato come
-  valore logico. L'opzione non ha effetti su un socket di tipo
-  \const{SOCK\_STREAM}.
+\item[\constd{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo
+  sulle operazioni di scrittura su un socket, ed usa gli stessi valori di
+  \const{SO\_RCVTIMEO}.  In questo caso però si avrà un errore di
+  \errcode{EAGAIN} o \errcode{EWOULDBLOCK} per le funzioni di scrittura
+  \func{write}, \func{writev}, \func{send}, \func{sendto} e \func{sendmsg}
+  qualora queste restino bloccate per un tempo maggiore di quello specificato. 
 
 \item[\constd{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di
   trasmissione del socket. Prende per \param{optval} un intero indicante il
@@ -2338,36 +2516,6 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   essere effettive, devono essere impostate prima della chiamata alle funzioni
   \func{listen} o \func{connect}.
 
-\item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene
-  chiuso un socket quando si utilizza un protocollo che supporta le
-  connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e
-  modifica il comportamento delle funzioni \func{close} e \func{shutdown}.
-  L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo
-  \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in
-  fig.~\ref{fig:sock_linger_struct}.  Maggiori dettagli sul suo funzionamento
-  sono forniti in sez.~\ref{sec:sock_options_main}.
-
-\item[\constd{SO\_PRIORITY}] questa opzione permette di impostare le priorità
-  per tutti i pacchetti che sono inviati sul socket, prende per \param{optval}
-  un valore intero. Con questa opzione il kernel usa il valore per ordinare le
-  priorità sulle code di rete,\footnote{questo richiede che sia abilitato il
-    sistema di \textit{Quality of Service} disponibile con le opzioni di
-    routing avanzato.} i pacchetti con priorità più alta vengono processati
-  per primi, in modalità che dipendono dalla disciplina di gestione della
-  coda. Nel caso di protocollo IP questa opzione permette anche di impostare i
-  valori del campo \textit{type of service} (noto come TOS, vedi
-  sez.~\ref{sec:IP_header}) per i pacchetti uscenti. Per impostare una
-  priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i
-  privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}.
-
-\item[\constd{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
-  può essere utilizzata soltanto con \func{getsockopt} e prende per
-  \param{optval} un valore intero, nel quale viene restituito il codice di
-  errore, e la condizione di errore sul socket viene cancellata. Viene
-  usualmente utilizzata per ricevere il codice di errore, come accennato in
-  sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una
-  \func{select} che ritorna a causa dello stesso.
-
 \item[\constd{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un
   socket un filtro di pacchetti che consente di selezionare quali pacchetti,
   fra tutti quelli ricevuti, verranno letti. Viene usato principalmente con i
@@ -2375,6 +2523,12 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   implementare programmi di cattura dei pacchetti, torneremo su questo in
   sez.~\ref{sec:packet_socket}.
 
+\item[\constd{SO\_TYPE}] questa opzione permette di leggere il tipo di socket
+  su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per
+  \param{optval} un intero in cui verrà restituito il valore numerico che lo
+  identifica (ad esempio \const{SOCK\_STREAM}). 
+
+
 \item[\constd{SO\_DETACH\_FILTER}] consente di distaccare un filtro
   precedentemente aggiunto ad un socket.