Aggiornamento copyright, trattazione degli shared subtree per mount e
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 15 Jan 2012 22:25:24 +0000 (22:25 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 15 Jan 2012 22:25:24 +0000 (22:25 +0000)
scritto programma di esempio di mount (ma soprattutto di esempio per
l'uso di strtok e di bsearch...)

33 files changed:
build.tex
errors.tex
fileadv.tex
filedir.tex
filestd.tex
fileunix.tex
gapil.tex
intro.tex
ipc.tex
listati/ForkTest.c [deleted file]
listati/fork_test.c [new file with mode: 0644]
macro.tex
netlayer.tex
network.tex
othersock.tex
preambolo.tex
pref.tex
process.tex
prochand.tex
ringraziamenti.tex
session.tex
signal.tex
sockadv.tex
sockctrl.tex
socket.tex
sources/ForkTest.c [deleted file]
sources/Makefile
sources/fork_test.c [new file with mode: 0644]
sources/mymount.c [new file with mode: 0644]
system.tex
tcpsock.tex
thread.tex
trasplayer.tex

index 5b5d460..2716a18 100644 (file)
--- a/build.tex
+++ b/build.tex
@@ -1,6 +1,6 @@
 %% build.tex
 %%
-%% Copyright (C) 1999-2011 Simone Piccardi.  Permission is granted to copy,
+%% Copyright (C) 1999-2012 Simone Piccardi.  Permission is granted to copy,
 %% distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 16babfd..4aa369a 100644 (file)
@@ -1,6 +1,6 @@
 %% errors.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -32,265 +32,267 @@ ottenere dei messaggi di errore più espliciti.
 \section{Gli errori dei file}
 \label{sec:err_file_errors}
 
-In questa sezione sono raccolti i codici restituiti dalle funzioni di libreria
+In questa sezione sono raccolti i codici restituiti dalle \textit{system call}
 attinenti ad errori che riguardano operazioni specifiche relative alla
 gestione dei file.
 
-\begin{description}
-\item \errcode{EPERM} \textit{Operation not permitted}. L'operazione non è
+\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
+\item[\errcode{EPERM} \textit{Operation not permitted}.] L'operazione non è
   permessa: solo il proprietario del file o un processo con sufficienti
   privilegi può eseguire l'operazione.
-\item \errcode{ENOENT} \textit{No such file or directory}. Il file indicato
+\item[\errcode{ENOENT} \textit{No such file or directory}.] Il file indicato
   dal \itindex{pathname} \textit{pathname} non esiste: o una delle componenti
   non esiste o il \textit{pathname} contiene un link simbolico spezzato.
   Errore tipico di un riferimento ad un file che si suppone erroneamente
   essere esistente.
-\item \errcode{EIO} \textit{Input/output error}. Errore di input/output: usato
-  per riportare errori hardware in lettura/scrittura su un dispositivo.
-\item \errcode{ENXIO} \textit{No such device or address}. Dispositivo
+\item[\errcode{EIO} \textit{Input/output error}.] Errore di input/output:
+  usato per riportare errori hardware in lettura/scrittura su un dispositivo.
+\item[\errcode{ENXIO} \textit{No such device or address}.] Dispositivo
   inesistente: il sistema ha tentato di usare un dispositivo attraverso il
   file specificato, ma non lo ha trovato. Può significare che il file di
   dispositivo non è corretto, che il modulo relativo non è stato caricato nel
   kernel, o che il dispositivo è fisicamente assente o non funzionante.
-\item \errcode{ENOEXEC} \textit{Invalid executable file format}. Il file non ha
-  un formato eseguibile, è un errore riscontrato dalle funzioni \func{exec}.
-\item \errcode{EBADF} \textit{Bad file descriptor}. File descriptor non valido:
-  si è usato un file descriptor inesistente, o aperto in sola lettura per
-  scrivere, o viceversa, o si è cercato di eseguire un'operazione non
+\item[\errcode{ENOEXEC} \textit{Invalid executable file format}.] Il file non
+  ha un formato eseguibile, è un errore riscontrato dalle funzioni
+  \func{exec}.
+\item[\errcode{EBADF} \textit{Bad file descriptor}.] File descriptor non
+  valido: si è usato un file descriptor inesistente, o aperto in sola lettura
+  per scrivere, o viceversa, o si è cercato di eseguire un'operazione non
   consentita per quel tipo di file descriptor.
-\item \errcode{EACCES} \textit{Permission denied}. Permesso negato; l'accesso
+\item[\errcode{EACCES} \textit{Permission denied}.] Permesso negato; l'accesso
   al file o alla directory non è consentito: i permessi del file o della
   directory non consentono l'operazione richiesta.
-\item \errcode{ELOOP} \textit{Too many symbolic links encountered}. Ci sono
+\item[\errcode{ELOOP} \textit{Too many symbolic links encountered}.] Ci sono
   troppi link simbolici nella risoluzione di un
-  \itindex{pathname}\textit{pathname}.
-\item \errcode{ENAMETOOLONG} \textit{File name too long}. Si è indicato un
+  \itindex{pathname} \textit{pathname}.
+\item[\errcode{ENAMETOOLONG} \textit{File name too long}.] Si è indicato un
   \itindex{pathname} \textit{pathname} troppo lungo per un file o una
   directory.
-\item \errcode{ENOTBLK} \textit{Block device required}. Si è specificato un
+\item[\errcode{ENOTBLK} \textit{Block device required}.] Si è specificato un
   file che non è un \textit{block device} in un contesto in cui era necessario
   specificare un \textit{block device} (ad esempio si è tentato di montare un
   file ordinario).
-\item \errcode{EEXIST} \textit{File exists}. Si è specificato un file esistente
-  in un contesto in cui ha senso solo specificare un nuovo file.
-\item \errcode{EBUSY} \textit{Resource busy}. Una risorsa di sistema che non
+\item[\errcode{EEXIST} \textit{File exists}.] Si è specificato un file
+  esistente in un contesto in cui ha senso solo specificare un nuovo file.
+\item[\errcode{EBUSY} \textit{Resource busy}.] Una risorsa di sistema che non
   può essere condivisa è occupata. Ad esempio si è tentato di cancellare la
   directory su cui si è montato un filesystem.
-\item \errcode{EXDEV} \textit{Cross-device link}. Si è tentato di creare un
+\item[\errcode{EXDEV} \textit{Cross-device link}.] Si è tentato di creare un
   link diretto che attraversa due filesystem differenti.
-\item \errcode{ENODEV} \textit{No such device}. Si è indicato un tipo di device
-  sbagliato ad una funzione che ne richiede uno specifico.
-\item \errcode{ENOTDIR} \textit{Not a directory}. Si è specificato un file che
-  non è una directory in una operazione che richiede una directory.
-\item \errcode{EISDIR} \textit{Is a directory}. Il file specificato è una
+\item[\errcode{ENODEV} \textit{No such device}.] Si è indicato un tipo di
+  device sbagliato ad una funzione che ne richiede uno specifico.
+\item[\errcode{ENOTDIR} \textit{Not a directory}.] Si è specificato un file
+  che non è una directory in una operazione che richiede una directory.
+\item[\errcode{EISDIR} \textit{Is a directory}.] Il file specificato è una
   directory; non può essere aperto in scrittura, né si possono creare o
   rimuovere link diretti ad essa.
-\item \errcode{EMFILE} \textit{Too many open files}. Il processo corrente ha
+\item[\errcode{EMFILE} \textit{Too many open files}.] Il processo corrente ha
   troppi file aperti e non può aprirne altri. Anche i descrittori duplicati ed
   i socket vengono tenuti in conto.\footnote{il numero massimo di file aperti
     è controllabile dal sistema; in Linux si può impostare usando il comando
     \cmd{ulimit}, esso è in genere indicato dalla costante \const{OPEN\_MAX},
     vedi sez.~\ref{sec:sys_limits}.}
-\item \errcode{ENFILE} \textit{File table overflow}. Il sistema ha troppi file
-  aperti in contemporanea. Si tenga presente che anche i socket contano come
-  file. Questa è una condizione temporanea, ed è molto difficile che si
+\item[\errcode{ENFILE} \textit{File table overflow}.] Il sistema ha troppi
+  file aperti in contemporanea. Si tenga presente che anche i socket contano
+  come file. Questa è una condizione temporanea, ed è molto difficile che si
   verifichi nei sistemi moderni.
-\item \errcode{ENOTTY} \textit{Not a terminal}. Si è tentata una operazione di
-  controllo relativa ad un terminale su un file che non lo è.
-\item \errcode{ETXTBSY} \textit{Text file busy}. Si è cercato di eseguire un
+\item[\errcode{ENOTTY} \textit{Not a terminal}.] Si è tentata una operazione
+  di controllo relativa ad un terminale su un file che non lo è.
+\item[\errcode{ETXTBSY} \textit{Text file busy}.] Si è cercato di eseguire un
   file che è aperto in scrittura, o di scrivere su un file che è in
   esecuzione.
-\item \errcode{EFBIG} \textit{File too big}. Si è ecceduto il limite imposto
+\item[\errcode{EFBIG} \textit{File too big}.] Si è ecceduto il limite imposto
   dal sistema sulla dimensione massima che un file può avere.
-\item \errcode{ENOSPC} \textit{No space left on device}. La directory in cui si
-  vuole creare il link non ha spazio per ulteriori voci, o si è cercato di
+\item[\errcode{ENOSPC} \textit{No space left on device}.] La directory in cui
+  si vuole creare il link non ha spazio per ulteriori voci, o si è cercato di
   scrivere o di creare un nuovo file su un dispositivo che è già pieno.
-\item \errcode{ESPIPE} \textit{Invalid seek operation}. Si cercato di eseguire
+\item[\errcode{ESPIPE} \textit{Invalid seek operation}.] Si cercato di eseguire
   una \func{seek} su un file che non supporta questa operazione (ad esempio su
   una pipe). 
-\item \errcode{EROFS} \textit{Read-only file system}.  Si è cercato di
+\item[\errcode{EROFS} \textit{Read-only file system}.]  Si è cercato di
   eseguire una operazione di scrittura su un file o una directory che risiede
   su un filesystem montato un sola lettura.
-\item \errcode{EMLINK} \textit{Too many links}. Ci sono già troppi link al
+\item[\errcode{EMLINK} \textit{Too many links}]. Ci sono già troppi link al
   file (il numero massimo è specificato dalla variabile \const{LINK\_MAX},
   vedi sez.~\ref{sec:sys_limits}).
-\item \errcode{EPIPE} \textit{Broken pipe}. Non c'è un processo che stia
+\item[\errcode{EPIPE} \textit{Broken pipe}.] Non c'è un processo che stia
   leggendo l'altro capo della pipe. Ogni funzione che restituisce questo
   errore genera anche un segnale \signal{SIGPIPE}, la cui azione predefinita è
   terminare il programma; pertanto non si potrà vedere questo errore fintanto
   che \signal{SIGPIPE} non viene gestito o bloccato.
-\item \errcode{ENOTEMPTY} \textit{Directory not empty}. La directory non è
+\item[\errcode{ENOTEMPTY} \textit{Directory not empty}.] La directory non è
   vuota quando l'operazione richiede che lo sia. È l'errore tipico che si ha
   quando si cerca di cancellare una directory contenente dei file.
-\item \errcode{EUSERS} \textit{Too many users}. Troppi utenti, il sistema delle
+\item[\errcode{EUSERS} \textit{Too many users}.] Troppi utenti, il sistema delle
   quote rileva troppi utenti nel sistema.
-\item \errcode{EDQUOT} \textit{Quota exceeded}. Si è ecceduta la quota di disco
+\item[\errcode{EDQUOT} \textit{Quota exceeded}.] Si è ecceduta la quota di disco
   dell'utente.
-\item \errcode{ESTALE} \textit{Stale NFS file handle}. Indica un problema
+\item[\errcode{ESTALE} \textit{Stale NFS file handle}.] Indica un problema
   interno a NFS causato da cambiamenti del filesystem del sistema remoto. Per
   recuperare questa condizione in genere è necessario smontare e rimontare il
   filesystem NFS.
-\item \errcode{EREMOTE} \textit{Object is remote}. Si è fatto un tentativo di
+\item[\errcode{EREMOTE} \textit{Object is remote}.] Si è fatto un tentativo di
   montare via NFS un filesystem remoto con un nome  che già specifica un
   filesystem montato via NFS. 
-\item \errcode{ENOLCK} \textit{No locks available}. È usato dalle utilità per
+\item[\errcode{ENOLCK} \textit{No locks available}.] È usato dalle utilità per
   la gestione del file locking; non viene generato da un sistema GNU, ma può
   risultare da un'operazione su un server NFS di un altro sistema.
-\item \errcode{EFTYPE} \textit{Inappropriate file type or format}. Il file è
+\item[\errcode{EFTYPE} \textit{Inappropriate file type or format}.] Il file è
   di tipo sbagliato rispetto all'operazione richiesta o un file di dati ha un
   formato sbagliato. Alcuni sistemi restituiscono questo errore quando si
   cerca di impostare lo \itindex{sticky~bit} \textit{sticky bit} su un file che
   non è una directory.
-\end{description}
-
+\end{basedescript}
 
 \section{Gli errori dei processi}
 \label{sec:err_proc_errors}
 
-In questa sezione sono raccolti i codici restituiti dalle funzioni di libreria
+In questa sezione sono raccolti i codici restituiti dalle \textit{system call}
 attinenti ad errori che riguardano operazioni specifiche relative alla
 gestione dei processi.
 
-\begin{description}
-\item \errcode{ESRCH} \textit{No process matches the specified process ID}.
+\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
+\item[\errcode{ESRCH} \textit{No process matches the specified process ID}.]
   Non esiste un processo o un \itindex{process~group} \textit{process group}
   corrispondenti al valore dell'identificativo specificato.
-\item \errcode{E2BIG} \textit{Argument list too long}. La lista degli
+\item[\errcode{E2BIG} \textit{Argument list too long}.] La lista degli
   argomenti passati è troppo lunga: è una condizione prevista da POSIX quando
   la lista degli argomenti passata ad una delle funzioni \func{exec} occupa
-  troppa memoria, non può mai accadere in GNU/Linux.
-\item \errcode{ECHILD} \textit{There are no child processes}. Non esistono
+  troppa memoria.
+\item[\errcode{ECHILD} \textit{There are no child processes}.] Non esistono
   processi figli di cui attendere la terminazione. Viene rilevato dalle
   funzioni \func{wait} e \func{waitpid} (vedi sez.~\ref{sec:proc_wait}).
-\item \errcode{EPROCLIM} \textit{Too many processes}.  Il limite dell'utente
+\item[\errcode{EPROCLIM} \textit{Too many processes}.]  Il limite dell'utente
   per nuovi processi (vedi sez.~\ref{sec:sys_resource_limit}) sarà ecceduto
   alla prossima \func{fork}; è un codice di errore di BSD, che non viene
   utilizzato al momento su Linux. 
-\end{description}
+\end{basedescript}
 
 
 \section{Gli errori di rete}
 \label{sec:err_network}
 
-In questa sezione sono raccolti i codici restituiti dalle funzioni di libreria
+In questa sezione sono raccolti i codici restituiti dalle \textit{system call}
 attinenti ad errori che riguardano operazioni specifiche relative alla
 gestione dei socket e delle connessioni di rete.
 
-
-\begin{description}
-\item \errcode{ENOTSOCK} \textit{Socket operation on non-socket}. Si è tentata
-  un'operazione su un file descriptor che non è un socket quando invece era
-  richiesto un socket.
-\item \errcode{EMSGSIZE} \textit{Message too long}. Le dimensioni di un
+\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
+\item[\errcode{ENOTSOCK} \textit{Socket operation on non-socket}.] Si è
+  tentata un'operazione su un file descriptor che non è un socket quando
+  invece era richiesto un socket.
+\item[\errcode{EMSGSIZE} \textit{Message too long}.] Le dimensioni di un
   messaggio inviato su un socket sono eccedono la massima lunghezza supportata.
-\item \errcode{EPROTOTYPE} \textit{Protocol wrong type for socket}. Protocollo
-  sbagliato per il socket. Il socket usato non supporta il protocollo di
-  comunicazione richiesto. 
-\item \errcode{ENOPROTOOPT} \textit{Protocol not available}. Protocollo non
+\item[\errcode{EPROTOTYPE} \textit{Protocol wrong type for socket}.]
+  Protocollo sbagliato per il socket. Il socket usato non supporta il
+  protocollo di comunicazione richiesto.
+\item[\errcode{ENOPROTOOPT} \textit{Protocol not available}.] Protocollo non
   disponibile. Si è richiesta un'opzione per il socket non disponibile con il
   protocollo usato.
-\item \errcode{EPROTONOSUPPORT} \textit{Protocol not supported}. Protocollo non
-  supportato. Il tipo di socket non supporta il protocollo richiesto (un
+\item[\errcode{EPROTONOSUPPORT} \textit{Protocol not supported}.] Protocollo
+  non supportato. Il tipo di socket non supporta il protocollo richiesto (un
   probabile errore nella specificazione del protocollo).
-\item \errcode{ESOCKTNOSUPPORT} \textit{Socket type not supported}. Socket non
-  supportato. Il tipo di socket scelto non è supportato.
-\item \errcode{EOPNOTSUPP} \textit{Operation not supported on transport
-    endpoint}. L'operazione richiesta non è supportata. Alcune funzioni non
+\item[\errcode{ESOCKTNOSUPPORT} \textit{Socket type not supported}.] Socket
+  non supportato. Il tipo di socket scelto non è supportato.
+\item[\errcode{EOPNOTSUPP} \textit{Operation not supported on transport
+    endpoint}.] L'operazione richiesta non è supportata. Alcune funzioni non
   hanno senso per tutti i tipi di socket, ed altre non sono implementate per
   tutti i protocolli di trasmissione. Questo errore quando un socket non
   supporta una particolare operazione, e costituisce una indicazione generica
   che il server non sa cosa fare per la chiamata effettuata.
-\item \errcode{EPFNOSUPPORT} \textit{Protocol family not supported}. Famiglia
+\item[\errcode{EPFNOSUPPORT} \textit{Protocol family not supported}.] Famiglia
   di protocolli non supportata. La famiglia di protocolli richiesta non è
   supportata.
-\item \errcode{EAFNOSUPPORT} \textit{Address family not supported by protocol}.
-  Famiglia di indirizzi non supportata. La famiglia di indirizzi richiesta non
-  è supportata, o è inconsistente con il protocollo usato dal socket.
-\item \errcode{EADDRINUSE} \textit{Address already in use}. L'indirizzo del
+\item[\errcode{EAFNOSUPPORT} \textit{Address family not supported by
+    protocol}.]  Famiglia di indirizzi non supportata. La famiglia di
+  indirizzi richiesta non è supportata, o è inconsistente con il protocollo
+  usato dal socket.
+\item[\errcode{EADDRINUSE} \textit{Address already in use}.] L'indirizzo del
   socket richiesto è già utilizzato (ad esempio si è eseguita \func{bind}
   su una porta già in uso).
-\item \errcode{EADDRNOTAVAIL} \textit{Cannot assign requested
-    address}.  L'indirizzo richiesto non è disponibile (ad esempio si
+\item[\errcode{EADDRNOTAVAIL} \textit{Cannot assign requested
+    address}.]  L'indirizzo richiesto non è disponibile (ad esempio si
   è cercato di dare al socket un nome che non corrisponde al nome
   della stazione locale), o l'interfaccia richiesta non esiste.
-\item \errcode{ENETDOWN} \textit{Network is down}. L'operazione sul socket è
+\item[\errcode{ENETDOWN} \textit{Network is down}.] L'operazione sul socket è
   fallita perché la rete è sconnessa.
-\item \errcode{ENETUNREACH} \textit{Network is unreachable}. L'operazione è
+\item[\errcode{ENETUNREACH} \textit{Network is unreachable}.] L'operazione è
   fallita perché l'indirizzo richiesto è irraggiungibile (ad esempio la
   sottorete della stazione remota è irraggiungibile).
-\item \errcode{ENETRESET} \textit{Network dropped connection because of reset}.
-  Una connessione è stata cancellata perché l'host remoto è caduto.
-\item \errcode{ECONNABORTED} \textit{Software caused connection abort}. Una
+\item[\errcode{ENETRESET} \textit{Network dropped connection because of
+    reset}.]  Una connessione è stata cancellata perché l'host remoto è
+  caduto.
+\item[\errcode{ECONNABORTED} \textit{Software caused connection abort}.] Una
   connessione è stata abortita localmente. 
-\item \errcode{ECONNRESET} \textit{Connection reset by peer}. Una connessione è
-  stata chiusa per ragioni fuori dal controllo dell'host locale, come il
+\item[\errcode{ECONNRESET} \textit{Connection reset by peer}.] Una connessione
+  è stata chiusa per ragioni fuori dal controllo dell'host locale, come il
   riavvio di una macchina remota o un qualche errore non recuperabile sul
   protocollo.
-\item \errcode{ENOBUFS} \textit{No buffer space available}. Tutti i buffer per
+\item[\errcode{ENOBUFS} \textit{No buffer space available}.] Tutti i buffer per
   le operazioni di I/O del kernel sono occupati. In generale questo errore è
   sinonimo di \errcode{ENOMEM}, ma attiene alle funzioni di input/output. In
   caso di operazioni sulla rete si può ottenere questo errore invece
   dell'altro.
-\item \errcode{EISCONN} \textit{Transport endpoint is already connected}. Si è
-  tentato di connettere un socket che è già connesso.
-\item \errcode{ENOTCONN} \textit{Transport endpoint is not connected}. Il
+\item[\errcode{EISCONN} \textit{Transport endpoint is already connected}.] Si
+  è tentato di connettere un socket che è già connesso.
+\item[\errcode{ENOTCONN} \textit{Transport endpoint is not connected}.] Il
   socket non è connesso a niente. Si ottiene questo errore quando si cerca di
   trasmettere dati su un socket senza avere specificato in precedenza la loro
   destinazione. Nel caso di socket senza connessione (ad esempio socket UDP)
   l'errore che si ottiene è \errcode{EDESTADDRREQ}.
-\item \errcode{EDESTADDRREQ} \textit{Destination address required}. Non c'è un
-  indirizzo di destinazione predefinito per il socket. Si ottiene questo
+\item[\errcode{EDESTADDRREQ} \textit{Destination address required}.] Non c'è
+  un indirizzo di destinazione predefinito per il socket. Si ottiene questo
   errore mandando dato su un socket senza connessione senza averne prima
   specificato una destinazione.
-\item \errcode{ESHUTDOWN} \textit{Cannot send after transport endpoint
-    shutdown}. Il socket su cui si cerca di inviare dei dati ha avuto uno
+\item[\errcode{ESHUTDOWN} \textit{Cannot send after transport endpoint
+    shutdown}.] Il socket su cui si cerca di inviare dei dati ha avuto uno
   shutdown.
-\item \errcode{ETOOMANYREFS} \textit{Too many references: cannot splice}. La
+\item[\errcode{ETOOMANYREFS} \textit{Too many references: cannot splice}.] La
   \acr{glibc} dice ???
-\item \errcode{ETIMEDOUT} \textit{Connection timed out}. Un'operazione sul
+\item[\errcode{ETIMEDOUT} \textit{Connection timed out}.] Un'operazione sul
   socket non ha avuto risposta entro il periodo di timeout.
-\item \errcode{ECONNREFUSED} \textit{Connection refused}. Un host remoto ha
+\item[\errcode{ECONNREFUSED} \textit{Connection refused}.] Un host remoto ha
   rifiutato la connessione (in genere dipende dal fatto che non c'è un server
   per soddisfare il servizio richiesto).  
-\item \errcode{EHOSTDOWN} \textit{Host is down}. L'host remoto di una
+\item[\errcode{EHOSTDOWN} \textit{Host is down}.] L'host remoto di una
   connessione è giù.
-\item \errcode{EHOSTUNREACH} \textit{No route to host}.  L'host remoto di una
+\item[\errcode{EHOSTUNREACH} \textit{No route to host}.]  L'host remoto di una
   connessione non è raggiungibile.
-\end{description}
+\end{basedescript}
+
 
 \section{Errori generici}
 
-In questa sezione sono raccolti i codici restituiti dalle funzioni di libreria
+In questa sezione sono raccolti i codici restituiti dalle \textit{system call}
 attinenti ad errori generici, si trovano qui tutti i codici di errore non
 specificati nelle sezioni precedenti.
 
-\begin{description}
-\item \errcode{EINTR} \textit{Interrupted function call}. Una funzione di
+\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
+\item[\errcode{EINTR} \textit{Interrupted function call}.] Una funzione di
   libreria è stata interrotta. In genere questo avviene causa di un segnale
   asincrono al processo che impedisce la conclusione della chiamata, la
   funzione ritorna con questo errore una volta che si sia correttamente
   eseguito il gestore del segnale. In questo caso è necessario ripetere la
   chiamata alla funzione.
-\item \errcode{ENOMEM} \textit{No memory available}. Il kernel non è in grado
+\item[\errcode{ENOMEM} \textit{No memory available}.] Il kernel non è in grado
   di allocare ulteriore memoria per completare l'operazione richiesta.
-\item \errcode{EDEADLK} \textit{Deadlock avoided}. L'allocazione di una
+\item[\errcode{EDEADLK} \textit{Deadlock avoided}.] L'allocazione di una
   risorsa avrebbe causato un \itindex{deadlock} \textit{deadlock}. Non sempre
   il sistema è in grado di riconoscere queste situazioni, nel qual caso si
   avrebbe il blocco.
-\item \errcode{EFAULT} \textit{Bad address}. Una stringa passata come
+\item[\errcode{EFAULT} \textit{Bad address}.] Una stringa passata come
   argomento è fuori dello spazio di indirizzi del processo, in genere questa
   situazione provoca direttamente l'emissione di un segnale di
   \itindex{segment~violation} \textit{segment violation} (\signal{SIGSEGV}).
-\item \errcode{EINVAL} \textit{Invalid argument}. Errore utilizzato per
+\item[\errcode{EINVAL} \textit{Invalid argument}.] Errore utilizzato per
   segnalare vari tipi di problemi dovuti all'aver passato un argomento
   sbagliato ad una funzione di libreria.
-\item \errcode{EDOM} \textit{Domain error}. È usato dalle funzioni matematiche
+\item[\errcode{EDOM} \textit{Domain error}.] È usato dalle funzioni matematiche
   quando il valore di un argomento è al di fuori dell'intervallo in cui esse
   sono definite.
-\item \errcode{ERANGE} \textit{Range error}. È usato dalle funzioni
+\item[\errcode{ERANGE} \textit{Range error}.] È usato dalle funzioni
   matematiche quando il risultato dell'operazione non è rappresentabile nel
   valore di ritorno a causa di un overflow o di un underflow.
-\item \errcode{EAGAIN} \textit{Resource temporarily unavailable}. La funzione è
+\item[\errcode{EAGAIN} \textit{Resource temporarily unavailable}.] La funzione è
   fallita ma potrebbe funzionare se la chiamata fosse ripetuta. Questo errore
   accade in due tipologie di situazioni:
   \begin{itemize}
@@ -308,12 +310,12 @@ specificati nelle sezioni precedenti.
     carenza è spesso indice di qualcosa che non va nel sistema, è pertanto
     opportuno segnalare esplicitamente questo tipo di errori.
   \end{itemize}
-\item \errcode{EWOULDBLOCK} \textit{Operation would block}. Indica che
+\item[\errcode{EWOULDBLOCK} \textit{Operation would block}.] Indica che
   l'operazione richiesta si bloccherebbe, ad esempio se si apre un file in
   modalità non bloccante, una \func{read} restituirebbe questo errore per
   indicare che non ci sono dati; in Linux è identico a \errcode{EAGAIN}, ma in
   altri sistemi può essere specificato un valore diverso.
-\item \errcode{EINPROGRESS} \textit{Operation now in progress}. Operazione in
+\item[\errcode{EINPROGRESS} \textit{Operation now in progress}.] Operazione in
   corso. Un'operazione che non può essere completata immediatamente è stata
   avviata su un oggetto posto in modalità non-bloccante. Questo errore viene
   riportato per operazioni che si dovrebbero sempre bloccare (come per una
@@ -321,103 +323,103 @@ specificati nelle sezioni precedenti.
   l'errore indica che l'operazione è stata avviata correttamente e occorrerà
   del tempo perché si possa completare. La ripetizione della chiamata darebbe
   luogo ad un errore \errcode{EALREADY}.
-\item \errcode{EALREADY} \textit{Operation already in progress}. L'operazione è
+\item[\errcode{EALREADY} \textit{Operation already in progress}.] L'operazione è
   già in corso. Si è tentata un'operazione già in corso su un oggetto posto in
   modalità non-bloccante.
-\item \errcode{ENOSYS} \textit{Function not implemented}. Indica che la
+\item[\errcode{ENOSYS} \textit{Function not implemented}.] Indica che la
   funzione non è supportata o nelle librerie del C o nel kernel. Può dipendere
   sia dalla mancanza di una implementazione, che dal fatto che non si è
   abilitato l'opportuno supporto nel kernel; nel caso di Linux questo può
   voler dire anche che un modulo necessario non è stato caricato nel sistema.
-\item \errcode{ENOTSUP} \textit{Not supported}. Una funzione ritorna questo
+\item[\errcode{ENOTSUP} \textit{Not supported}.] Una funzione ritorna questo
   errore quando gli argomenti sono validi ma l'operazione richiesta non è
   supportata. Questo significa che la funzione non implementa quel particolare
   comando o opzione o che, in caso di oggetti specifici (file descriptor o
   altro) non è in grado di supportare i parametri richiesti.
-\item \errcode{EILSEQ} \textit{Illegal byte sequence}. Nella decodifica di un
+\item[\errcode{EILSEQ} \textit{Illegal byte sequence}.] Nella decodifica di un
   carattere esteso si è avuta una sequenza errata o incompleta o si è
   specificato un valore non valido.
-\end{description}
+\end{basedescript}
 
-\begin{description}
 
+\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
 % definiti nel manuale delle glibc ma inesistenti in linux/errno.h
-%\item \errcode{EBADRPC} \textit{}. 
-%\item \errcode{ERPCMISMATCH} \textit{}. 
-%\item \errcode{EPROGUNAVAIL} \textit{}. 
-%\item \errcode{EPROGMISMATCH} \textit{}. 
-%\item \errcode{EPROCUNAVAIL} \textit{}. 
-%\item \errcode{EAUTH} \textit{}. 
-%\item \errcode{ENEEDAUTH} \textit{}. 
-%\item \errcode{EBACKGROUND} \textit{}. 
-%\item \errcode{EDIED} \textit{}. 
+%\item[\errcode{EBADRPC} \textit{}.] 
+%\item[\errcode{ERPCMISMATCH} \textit{}.] 
+%\item[\errcode{EPROGUNAVAIL} \textit{}.] 
+%\item[\errcode{EPROGMISMATCH} \textit{}.] 
+%\item[\errcode{EPROCUNAVAIL} \textit{}.] 
+%\item[\errcode{EAUTH} \textit{}.] 
+%\item[\errcode{ENEEDAUTH} \textit{}.] 
+%\item[\errcode{EBACKGROUND} \textit{}.] 
+%\item[\errcode{EDIED} \textit{}.] 
 % questi sembrano scherzi, sempre dal manuale delle glibc...
-%\item \errcode{ED} \textit{}. 
-%\item \errcode{EGREGIOUS} \textit{}. 
-%\item \errcode{EIEIO} \textit{}. 
-%\item \errcode{EGRATUITOUS} \textit{} roba di Hurd, pare. 
+%\item[\errcode{ED} \textit{}.] 
+%\item[\errcode{EGREGIOUS} \textit{}.] 
+%\item[\errcode{EIEIO} \textit{}.] 
+%\item[\errcode{EGRATUITOUS} \textit{} roba di Hurd, pare. 
 
 
-\item \errcode{EBADMSG} \textit{Not a data message}. Definito da POSIX come
+\item[\errcode{EBADMSG} \textit{Not a data message}.] Definito da POSIX come
 errore che arriva ad una funzione di lettura che opera su uno stream. Non
 essendo gli stream definiti su Linux il kernel non genera mai questo tipo di
 messaggio. 
 
-\item \errcode{EMULTIHOP} \textit{Multihop attempted}. Definito da POSIX come
+\item[\errcode{EMULTIHOP} \textit{Multihop attempted}.] Definito da POSIX come
   errore dovuto all'accesso a file remoti attraverso più macchine, quando ciò
   non è consentito. Non viene mai generato su Linux.
 
-\item \errcode{EIDRM} \textit{Identifier removed}. Indica che l'oggetto del
+\item[\errcode{EIDRM} \textit{Identifier removed}.] Indica che l'oggetto del
   \textit{SysV IPC} a cui si fa riferimento è stato cancellato.
 
-\item \errcode{ENODATA} \textit{No data available}. Viene indicato da POSIX
+\item[\errcode{ENODATA} \textit{No data available}.] Viene indicato da POSIX
   come restituito da una \func{read} eseguita su un file descriptor in
   modalità non bloccante quando non ci sono dati. In realtà in questo caso su
   Linux viene utilizzato \errcode{EAGAIN}. Lo stesso valore valore però viene
   usato come sinonimo di \errcode{ENOATTR}. 
 
-\item \errcode{ENOATTR} \textit{No such attribute}. È un codice di errore
+\item[\errcode{ENOATTR} \textit{No such attribute}.] È un codice di errore
   specifico di Linux utilizzato dalle funzioni per la gestione degli attributi
   estesi dei file (vedi sez.~\ref{sec:file_xattr}) quando il nome
   dell'attributo richiesto non viene trovato.
 
-\item \errcode{ENOLINK} \textit{Link has been severed}. È un errore il cui
+\item[\errcode{ENOLINK} \textit{Link has been severed}.] È un errore il cui
   valore è indicato come \textsl{riservato} nelle \textit{Single Unix
     Specification}. Dovrebbe indicare l'impossibilità di accedere ad un file a
   causa di un errore sul collegamento di rete, ma non ci sono indicazioni
   precise del suo utilizzo. Per quanto riguarda Linux viene riportato nei
   sorgenti del kernel in alcune operazioni relative ad operazioni di rete. 
 
-\item \errcode{ENOMSG} \textit{No message of desired type}. Indica che in una
+\item[\errcode{ENOMSG} \textit{No message of desired type}.] Indica che in una
   coda di messaggi del \textit{SysV IPC} non è presente nessun messaggio del
   tipo desiderato.
 
-\item \errcode{ENOSR} \textit{Out of streams resources}. Errore relativo agli
+\item[\errcode{ENOSR} \textit{Out of streams resources}.] Errore relativo agli
   \textit{STREAMS}, che indica l'assenza di risorse sufficienti a completare
   l'operazione richiesta. Quella degli \textit{STREAMS}\footnote{che non vanno
     confusi con gli \textit{stream} di cap.~\ref{cha:files_std_interface}.}  è
   interfaccia di programmazione originaria di System V, che non è implementata
   da Linux, per cui questo errore non viene utilizzato.
 
-\item \errcode{ENOSTR} \textit{Device not a stream}. Altro errore relativo
+\item[\errcode{ENOSTR} \textit{Device not a stream}.] Altro errore relativo
   agli \textit{STREAMS}, anch'esso non utilizzato da Linux.
 
-\item \errcode{EOVERFLOW} \textit{Value too large for defined data type}. Si è
+\item[\errcode{EOVERFLOW} \textit{Value too large for defined data type}.] Si è
   chiesta la lettura di un dato dal \textit{SysV IPC} con \const{IPC\_STAT} ma
   il valore eccede la dimensione usata nel buffer di lettura.
 
-\item \errcode{EPROTO} \textit{Protocol error}. Indica che c'è stato un errore
+\item[\errcode{EPROTO} \textit{Protocol error}.] Indica che c'è stato un errore
   nel protocollo di rete usato dal socket; viene usato come errore generico
   dall'interfaccia degli \textit{STREAMS} quando non si è in grado di
   specificare un altro codice di errore che esprima più accuratamente la
   situazione.
 
-\item \errcode{ETIME} \textit{Timer expired}. Indica che è avvenuto un timeout
+\item[\errcode{ETIME} \textit{Timer expired}.] Indica che è avvenuto un timeout
   nell'accesso ad una risorsa (ad esempio un semaforo). Compare nei sorgenti
   del kernel (in particolare per le funzioni relativa al bus USB) come
   indicazione di una mancata risposta di un dispositivo, con una descrizione
   alternativa di \textit{Device did not respond}.
-\end{description}
+\end{basedescript}
 
 
 
@@ -430,45 +432,45 @@ messaggio.
 % TODO verificare i dettagli degli errori del kernel, eventualmente cassare.
 
 % \begin{description}
-% \item \errcode{ERESTART} \textit{Interrupted system call should be restarted}. 
-% \item \errcode{ECHRNG} \textit{Channel number out of range}. 
-% \item \errcode{EL2NSYNC} \textit{Level 2 not synchronized}. 
-% \item \errcode{EL3HLT} \textit{Level 3 halted}. 
-% \item \errcode{EL3RST} \textit{Level 3 reset}. 
-% \item \errcode{ELNRNG} \textit{Link number out of range}. 
-% \item \errcode{EUNATCH} \textit{Protocol driver not attached}. 
-% \item \errcode{ENOCSI} \textit{No CSI structure available}. 
-% \item \errcode{EL2HLT} \textit{Level 2 halted}. 
-% \item \errcode{EBADE} \textit{Invalid exchange}. 
-% \item \errcode{EBADR} \textit{Invalid request descriptor}. 
-% \item \errcode{EXFULL} \textit{Exchange full}. 
-% \item \errcode{ENOANO} \textit{No anode}. 
-% \item \errcode{EBADRQC} \textit{Invalid request code}. 
-% \item \errcode{EBADSLT} \textit{Invalid slot}. 
-% \item \errcode{EDEADLOCK} Identico a \errcode{EDEADLK}. 
-% \item \errcode{EBFONT} \textit{Bad font file format}. 
-% \item \errcode{ENONET} \textit{Machine is not on the network}. 
-% \item \errcode{ENOPKG} \textit{Package not installed}. 
-% \item \errcode{EADV} \textit{Advertise error}. 
-% \item \errcode{ESRMNT} \textit{Srmount error}. 
-% \item \errcode{ECOMM} \textit{Communication error on send}. 
-% \item \errcode{EDOTDOT} \textit{RFS specific error}. 
-% \item \errcode{ENOTUNIQ} \textit{Name not unique on network}. 
-% \item \errcode{EBADFD} \textit{File descriptor in bad state}. 
-% \item \errcode{EREMCHG} \textit{Remote address changed}. 
-% \item \errcode{ELIBACC} \textit{Can not access a needed shared library}. 
-% \item \errcode{ELIBBAD} \textit{Accessing a corrupted shared library}. 
-% \item \errcode{ELIBSCN} \textit{.lib section in a.out corrupted}. 
-% \item \errcode{ELIBMAX} \textit{Attempting to link in too many shared
-%     libraries}.
-% \item \errcode{ELIBEXEC} \textit{Cannot exec a shared library directly}. 
-% \item \errcode{ESTRPIPE} \textit{Streams pipe error}. 
-% \item \errcode{EUCLEAN} \textit{Structure needs cleaning}. 
-% \item \errcode{ENAVAIL} \textit{No XENIX semaphores available}. 
-% \item \errcode{EISNAM} \textit{Is a named type file}. 
-% \item \errcode{EREMOTEIO} \textit{Remote I/O error}. 
-% \item \errcode{ENOMEDIUM} \textit{No medium found}. 
-% \item \errcode{EMEDIUMTYPE} \textit{Wrong medium type}. 
+% \item[\errcode{ERESTART} \textit{Interrupted system call should be restarted}.] 
+% \item[\errcode{ECHRNG} \textit{Channel number out of range}.] 
+% \item[\errcode{EL2NSYNC} \textit{Level 2 not synchronized}.] 
+% \item[\errcode{EL3HLT} \textit{Level 3 halted}.] 
+% \item[\errcode{EL3RST} \textit{Level 3 reset}.] 
+% \item[\errcode{ELNRNG} \textit{Link number out of range}.] 
+% \item[\errcode{EUNATCH} \textit{Protocol driver not attached}.] 
+% \item[\errcode{ENOCSI} \textit{No CSI structure available}.] 
+% \item[\errcode{EL2HLT} \textit{Level 2 halted}.] 
+% \item[\errcode{EBADE} \textit{Invalid exchange}.] 
+% \item[\errcode{EBADR} \textit{Invalid request descriptor}.] 
+% \item[\errcode{EXFULL} \textit{Exchange full}.] 
+% \item[\errcode{ENOANO} \textit{No anode}.] 
+% \item[\errcode{EBADRQC} \textit{Invalid request code}.] 
+% \item[\errcode{EBADSLT} \textit{Invalid slot}.] 
+% \item[\errcode{EDEADLOCK} Identico a \errcode{EDEADLK}.] 
+% \item[\errcode{EBFONT} \textit{Bad font file format}.] 
+% \item[\errcode{ENONET} \textit{Machine is not on the network}.] 
+% \item[\errcode{ENOPKG} \textit{Package not installed}.] 
+% \item[\errcode{EADV} \textit{Advertise error}.] 
+% \item[\errcode{ESRMNT} \textit{Srmount error}.] 
+% \item[\errcode{ECOMM} \textit{Communication error on send}.] 
+% \item[\errcode{EDOTDOT} \textit{RFS specific error}.] 
+% \item[\errcode{ENOTUNIQ} \textit{Name not unique on network}.] 
+% \item[\errcode{EBADFD} \textit{File descriptor in bad state}.] 
+% \item[\errcode{EREMCHG} \textit{Remote address changed}.] 
+% \item[\errcode{ELIBACC} \textit{Can not access a needed shared library}.] 
+% \item[\errcode{ELIBBAD} \textit{Accessing a corrupted shared library}.] 
+% \item[\errcode{ELIBSCN} \textit{.lib section in a.out corrupted}.] 
+% \item[\errcode{ELIBMAX} \textit{Attempting to link in too many shared
+%     libraries}.]
+% \item[\errcode{ELIBEXEC} \textit{Cannot exec a shared library directly}.] 
+% \item[\errcode{ESTRPIPE} \textit{Streams pipe error}.] 
+% \item[\errcode{EUCLEAN} \textit{Structure needs cleaning}.] 
+% \item[\errcode{ENAVAIL} \textit{No XENIX semaphores available}.] 
+% \item[\errcode{EISNAM} \textit{Is a named type file}.] 
+% \item[\errcode{EREMOTEIO} \textit{Remote I/O error}.] 
+% \item[\errcode{ENOMEDIUM} \textit{No medium found}.] 
+% \item[\errcode{EMEDIUMTYPE} \textit{Wrong medium type}.] 
 % \end{description}
 
 
index 02f0b9f..ade65bc 100644 (file)
@@ -1,6 +1,6 @@
 %% fileadv.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -4654,8 +4654,7 @@ significativi delle prestazioni rispetto all'uso in sequenza di \func{read} e
 che anzi in certi casi si potevano avere anche dei peggioramenti.  Questo ha
 portato, per i kernel della serie 2.6,\footnote{per alcune motivazioni di
   questa scelta si può fare riferimento a quanto illustrato da Linus Torvalds
-  in \href{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html}
-  {\textsf{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html}}.}
+  in \url{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html}.}
 alla decisione di consentire l'uso della funzione soltanto quando il file da
 cui si legge supporta le operazioni di \textit{memory mapping} (vale a dire
 non è un socket) e quello su cui si scrive è un socket; in tutti gli altri
@@ -4694,18 +4693,18 @@ Il concetto che sta dietro a \func{splice} invece è diverso,\footnote{in
   scopi da \func{sendfile}, quello che rende \func{splice} davvero diversa è
   stata la reinterpretazione che ne è stata fatta nell'implementazione su
   Linux realizzata da Jens Anxboe, concetti che sono esposti sinteticamente
-  dallo stesso Linus Torvalds in \href{http://kerneltrap.org/node/6505}
-  {\textsf{http://kerneltrap.org/node/6505}}.} si tratta semplicemente di una
-funzione che consente di fare in maniera del tutto generica delle operazioni
-di trasferimento di dati fra un file e un buffer gestito interamente in kernel
-space. In questo caso il cuore della funzione (e delle affini \func{vmsplice}
-e \func{tee}, che tratteremo più avanti) è appunto l'uso di un buffer in
-kernel space, e questo è anche quello che ne ha semplificato l'adozione,
-perché l'infrastruttura per la gestione di un tale buffer è presente fin dagli
-albori di Unix per la realizzazione delle \textit{pipe} (vedi
-sez.~\ref{sec:ipc_unix}). Dal punto di vista concettuale allora \func{splice}
-non è altro che una diversa interfaccia (rispetto alle \textit{pipe}) con cui
-utilizzare in user space l'oggetto ``\textsl{buffer in kernel space}''.
+  dallo stesso Linus Torvalds in \url{http://kerneltrap.org/node/6505}.} si
+tratta semplicemente di una funzione che consente di fare in maniera del tutto
+generica delle operazioni di trasferimento di dati fra un file e un buffer
+gestito interamente in kernel space. In questo caso il cuore della funzione (e
+delle affini \func{vmsplice} e \func{tee}, che tratteremo più avanti) è
+appunto l'uso di un buffer in kernel space, e questo è anche quello che ne ha
+semplificato l'adozione, perché l'infrastruttura per la gestione di un tale
+buffer è presente fin dagli albori di Unix per la realizzazione delle
+\textit{pipe} (vedi sez.~\ref{sec:ipc_unix}). Dal punto di vista concettuale
+allora \func{splice} non è altro che una diversa interfaccia (rispetto alle
+\textit{pipe}) con cui utilizzare in user space l'oggetto ``\textsl{buffer in
+  kernel space}''.
 
 Così se per una \textit{pipe} o una \textit{fifo} il buffer viene utilizzato
 come area di memoria (vedi fig.~\ref{fig:ipc_pipe_singular}) dove appoggiare i
@@ -5090,12 +5089,12 @@ di dati in realtà nella implementazione di queste system call non è affatto
 detto che i dati vengono effettivamente spostati o copiati, il kernel infatti
 realizza le \textit{pipe} come un insieme di puntatori\footnote{per essere
   precisi si tratta di un semplice buffer circolare, un buon articolo sul tema
-  si trova su \href{http://lwn.net/Articles/118750/}
-  {\textsf{http://lwn.net/Articles/118750/}}.}  alle pagine di memoria interna
-che contengono i dati, per questo una volta che i dati sono presenti nella
-memoria del kernel tutto quello che viene fatto è creare i suddetti puntatori
-ed aumentare il numero di referenze; questo significa che anche con \func{tee}
-non viene mai copiato nessun byte, vengono semplicemente copiati i puntatori.
+  si trova su \url{http://lwn.net/Articles/118750/}.}  alle pagine di memoria
+interna che contengono i dati, per questo una volta che i dati sono presenti
+nella memoria del kernel tutto quello che viene fatto è creare i suddetti
+puntatori ed aumentare il numero di referenze; questo significa che anche con
+\func{tee} non viene mai copiato nessun byte, vengono semplicemente copiati i
+puntatori.
 
 % TODO?? dal 2.6.25 splice ha ottenuto il supporto per la ricezione su rete
 
index d9c98d8..73cc8e6 100644 (file)
@@ -1,6 +1,6 @@
 %% filedir.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -647,7 +647,12 @@ il cui prototipo è:\footnote{la funzione è una versione specifica di Linux che
     \itindex{mount~point} \textit{mount point} o di spostarlo
     quando \param{target} non è un \itindex{mount~point} \textit{mount point}
     o è la radice.
-  \item[\errcode{EMFILE}] la tabella dei device \textit{dummy} è piena.
+  \item[\errcode{ELOOP}] si è cercato di spostare un \itindex{mount~point}
+    \textit{mount point} su una sottodirectory di \param{source} o si sono
+    incontrati troppi link simolici nella risoluzione di un nome.
+  \item[\errcode{EMFILE}] in caso di filesystem virtuale, la tabella dei
+    dispositivi fittizi (chiamati \textit{dummy} nella documentazione inglese)
+    è piena.
   \item[\errcode{ENODEV}] il tipo \param{filesystemtype} non esiste o non è
     configurato nel kernel.
   \item[\errcode{ENOTBLK}] non si è usato un \textit{block device} per
@@ -656,9 +661,8 @@ il cui prototipo è:\footnote{la funzione è una versione specifica di Linux che
     dispositivo \param{source} è sbagliato.
   \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore.
   \end{errlist} 
-  ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{ENOMEM},
-  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR} nel loro
-  significato generico.}
+  ed inoltre \errval{EFAULT}, \errval{ENOMEM}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOTDIR} nel loro significato generico.}
 \end{funcproto}
 
 La funzione monta sulla directory indicata da \param{target}, detta
@@ -804,10 +808,10 @@ identificati dalle costanti riportate nell'elenco seguente:
     \texttt{ioctl} (vedi sez.~\ref{sec:file_ioctl}).}
 
   Questo consente di ridurre al minimo il rischio di perdita dei dati delle
-  directory in caso di crollo improvviso del sistema, al costo di una perdita
-  di prestazioni dato che le funzioni di scrittura relative ad operazioni
-  sulle directory non saranno più bufferizzate e si bloccheranno fino
-  all'arrivo dei dati sul disco prima che un programma possa proseguire.
+  directory in caso di crollo improvviso del sistema, al costo di una certa
+  perdita di prestazioni dato che le funzioni di scrittura relative ad
+  operazioni sulle directory non saranno più bufferizzate e si bloccheranno
+  fino all'arrivo dei dati sul disco prima che un programma possa proseguire.
 
 \item[\const{MS\_MANDLOCK}] Consente l'uso del \textit{mandatory locking}
   \itindex{mandatory~locking} (vedi sez.~\ref{sec:file_mand_locking}) sui file
@@ -894,7 +898,22 @@ identificati dalle costanti riportate nell'elenco seguente:
   dell'amministratore o di un altro utente, che gli consentirebbe di eseguirlo
   per conto di quest'ultimo.
 
-\item[\const{MS\_PRIVATE}] (non documentato).
+\item[\const{MS\_PRIVATE}] Marca un \textit{mount point} come privato. Si
+  tratta di una delle nuove opzioni (insieme a \const{MS\_SHARED},
+  \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti parte
+  dell'infrastruttura degli \itindex{shared~subtree} \textit{shared subtree}
+  introdotta a partire dal kernel 2.6.15, che estendono le funzionalità dei
+  \itindex{bind~mount} \textit{bind mount}. In questo caso
+  \param{target} dovrà fare riferimento al \textit{mount point} che si intende
+  marcare, e tutti gli altri argomenti verranno ignorati.
+
+  Di default, finché non lo si marca altrimenti con una delle altre opzioni
+  dell'interfaccia \itindex{shared~subtree} \textit{shared subtree}, ogni
+  \textit{mount point} è privato. Ogni \textit{bind mount} ottenuto da un
+  \textit{mount point} di tipo \textit{private} si comporta come descritto
+  nella trattazione di \const{MS\_BIND}. Si usa questo flag principalmente per
+  revocare gli effetti delle altre opzioni e riportare il comportamento a
+  quello ordinario.
 
 \item[\const{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura,
   non sarà possibile nessuna modifica ai suoi contenuti. Viene usato tutte le
@@ -903,7 +922,35 @@ identificati dalle costanti riportate nell'elenco seguente:
   corrotto). All'avvio di default il kernel monta la radice in questa
   modalità.
 
-\item[\const{MS\_RELATIME}] .
+\item[\const{MS\_REC}] Applica ricorsivamente a tutti i \textit{mount point}
+  presenti al di sotto del \textit{mount point} indicato gli effetti della
+  opzione degli \itindex{shared~subtree} \textit{shared subtree}
+  associata. Anche questo caso l'argomento \param{target} deve fare
+  riferimento ad un \textit{mount point} e tutti gli altri argomenti sono
+  ignorati, ed il flag deve essere indicato assieme ad una fra
+  \const{MS\_PRIVATE}, \const{MS\_SHARED}, \const{MS\_SLAVE} e
+  \const{MS\_UNBINDABLE}.
+
+\item[\const{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli
+  \textit{access time} sul filesystem soltanto quando questo risulti
+  antecendente il valore corrente del \textit{modification time} o del
+  \textit{change time} (per i tempi dei file si veda
+  sez.~\ref{sec:file_file_times}). L'opzione è disponibile a partire dal
+  kernel 2.6.20, mentre dal 2.6.30 questo è diventato il comportamento di
+  default del sistema, che può essere riportato a quello tradizionale con
+  l'uso di \const{MS\_STRICTATIME}. Sempre dal 2.6.30 il comportamento è stato
+  anche modificato e l'\textit{access time} viene comunque aggiornato se è più
+  vecchio di un giorno.
+
+  L'opzione consente di evitare i problemi di prestazioni relativi
+  all'aggiornamento dell'\textit{access time} senza avere impatti negativi
+  riguardo le funzionalità, il comportamento adottato infatti consente di
+  rendere evidente che vi è stato un accesso dopo la scrittura, ed evitando al
+  contempo ulteriori operazioni su disco negli accessi successivi. In questo
+  modo l'informazione relativa al fatto che un file sia stato letto resta
+  disponibile, ed i programmi che ne fanno uso continuano a funzionare. Con
+  l'introduzione di questo comportamento l'uso delle alternative
+  \const{MS\_NOATIME} e \const{MS\_NODIRATIME} è sostanzialmente inutile.
 
 \item[\const{MS\_REMOUNT}] Consente di rimontare un filesystem già montato
   cambiandone le opzioni di montaggio in maniera atomica. In questo modo si
@@ -920,33 +967,97 @@ identificati dalle costanti riportate nell'elenco seguente:
   \const{MS\_NOATIME} e \const{MS\_NODIRATIME}, ed infine prima del kernel
   2.4.10 anche \const{MS\_NODEV}, \const{MS\_NOEXEC} e \const{MS\_NOSUID}.
 
-\item[\const{MS\_SHARE}] Shared mount (non documentato).
-
-\item[\const{MS\_SILENT}] .
-
-\item[\const{MS\_SLAVE}] Slave mount (non documentato).
-
-\item[\const{MS\_STRICTATIME}] .
+\item[\const{MS\_SHARED}] Marca un \textit{mount point} come \textit{shared
+    mount}.  Si tratta di una delle nuove opzioni (insieme a
+  \const{MS\_PRIVATE}, \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti
+  parte dell'infrastruttura degli \itindex{shared~subtree} \textit{shared
+    subtree} introdotta a partire dal kernel 2.6.15, che estendono le
+  funzionalità dei \itindex{bind~mount} \textit{bind mount}.  In questo caso
+  \param{target} dovrà fare riferimento al \textit{mount point} che si intende
+  marcare, e tutti gli altri argomenti verranno ignorati.
+
+  Lo scopo dell'opzione è ottenere che tutti i successivi \textit{bind mount}
+  effettuati da un \textit{mount point} marcato da essa siano di tipo
+  \textit{shared}, cioè ``\textsl{condividano}'' con l'originale e fra di loro
+  ogni ulteriore operazione di montaggio o smontaggio che avviene su una
+  directory al di sotto di uno qualunque di essi. Le operazioni di montaggio e
+  smontaggio cioè vengono ``\textsl{propagate}'' a tutti i \textit{mount
+    point} della stessa condivisione, e la sezione di albero di file vista al
+  di sotto di ciascuno di essi sarà sempre identica.
+
+\item[\const{MS\_SILENT}] Richiede la soppressione di alcuni messaggi di
+  avvertimento nei log del kernel (vedi sez.~\ref{sec:sess_daemon}). L'opzione
+  è presente a partire dal kernel 2.6.17 e sostituisce, utilizzando un nome
+  non fuorviante, la precedente \const{MS\_VERBOSE}, introdotta nel kernel
+  2.6.12, che aveva lo stesso effetto.
+
+\item[\const{MS\_SLAVE}] Marca un \textit{mount point} come \textit{slave
+    mount}. Si tratta di una delle nuove opzioni (insieme a
+  \const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_UNBINDABLE}) facenti
+  parte dell'infrastruttura degli \itindex{shared~subtree} \textit{shared
+    subtree} introdotta a partire dal kernel 2.6.15, che estendono le
+  funzionalità dei \itindex{bind~mount} \textit{bind mount}.  In questo caso
+  \param{target} dovrà fare riferimento al \textit{mount point} che si intende
+  marcare, e tutti gli altri argomenti verranno ignorati.
+
+  Lo scopo dell'opzione è ottenere che tutti i successivi \textit{bind mount}
+  effettuati da un \textit{mount point} marcato da essa siano di tipo
+  \textit{slave}, cioè ``\textsl{condividano}'' ogni ulteriore operazione di
+  montaggio o smontaggio che avviene su una directory al di sotto del
+  \textit{mount point} originale.  Le operazioni di montaggio e smontaggio in
+  questo caso vengono ``\textsl{propagate}'' soltanto dal \textit{mount point}
+  originale (detto anche \textit{master}) verso gli \textit{slave}, mentre
+  essi potranno eseguire al loro interno ulteriori montaggi che non saranno
+  propagati né negli altri né nel \textit{mount point} originale. 
+
+\item[\const{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per
+  cui l'\textit{access time} viene aggiornato ad ogni accesso al
+  file. L'opzione è disponibile solo a partire dal kernel 2.6.30 quando il
+  comportamento di default del kernel è diventato quello fornito da
+  \const{MS\_RELATIME}.
+
+\item[\const{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona richiedendo che
+  ogni modifica al contenuto del filesystem venga immediatamente registrata su
+  disco. Lo stesso comportamento può essere ottenuto con il flag
+  \const{O\_SYNC} di \func{open} (vedi sez.~\ref{sec:file_open}).
+
+  Questa opzione consente di ridurre al minimo il rischio di perdita dei dati
+  in caso di crollo improvviso del sistema, al costo di una pesante perdita di
+  prestazioni dato che tutte le funzioni di scrittura non saranno più
+  bufferizzate e si bloccheranno fino all'arrivo dei dati sul disco. Per un
+  compromesso in cui questo comportamento avviene solo per le directory, ed ha
+  quindi una incidenza nettamente minore, si può usare \const{MS\_DIRSYNC}.
+
+\item[\const{MS\_UNBINDABLE}] Marca un \textit{mount point} come
+  \textit{unbindable mount}. Si tratta di una delle nuove opzioni (insieme a
+  \const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_SLAVE}) facenti parte
+  dell'infrastruttura degli \itindex{shared~subtree} \textit{shared subtree}
+  introdotta a partire dal kernel 2.6.15, che estendono le funzionalità dei
+  \itindex{bind~mount} \textit{bind mount}.  In questo caso
+  \param{target} dovrà fare riferimento al \textit{mount point} che si intende
+  marcare, e tutti gli altri argomenti verranno ignorati.
+
+  Un \textit{mount point} marcato in questo modo disabilità la capacità di
+  eseguire dei \itindex{bind~mount} \textit{bind mount}. Si comporta cioè come
+  allo stesso modo di un \textit{mount point} ordinario di tipo
+  \textit{private} con in più la restrizione che nessuna sua sottodirectory
+  (anche se relativa ad un ulteriore montaggio) possa essere utilizzata per un
+  come sorgente di un \itindex{bind~mount} \textit{bind mount}.
 
-\item[\const{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona.
-
-\item[\const{MS\_UNBINDABLE}]  (non documentato).
+\end{basedescript}
 
-% TODO aggiornare con i nuovi flag di man mount
-% per \const{MS\_SLAVE},\const{MS\_SHARE}, \const{MS\_PRIVATE},
-% \const{MS\_UNBINDABLE} dal 2.6.15 vedi shared subtrees,
-% http://lwn.net/Articles/159077/ e
-% Documentation/filesystems/sharedsubtree.txt
 
-% TODO: non documentati ma presenti in sys/mount.h:
-%       MS_REC
-%       MS_POSIXACL
-%       MS_KERNMOUNT
-%       MS_I_VERSION
-%       MS_ACTIVE
-%       MS_NOUSER
+% NOTE per \const{MS\_SLAVE},\const{MS\_SHARE}, \const{MS\_PRIVATE} e
+% \const{MS\_UNBINDABLE} dal 2.6.15 vedi shared subtrees, in particolare
+%  * http://lwn.net/Articles/159077/ e
+%  * Documentation/filesystems/sharedsubtree.txt
 
-\end{basedescript}
+% TODO: (bassa priorità) non documentati ma presenti in sys/mount.h:
+%       * MS_POSIXACL
+%       * MS_KERNMOUNT
+%       * MS_I_VERSION
+%       * MS_ACTIVE
+%       * MS_NOUSER
 
 La funzione \func{mount} può essere utilizzata anche per effettuare il
 \textsl{rimontaggio} di un filesystem, cosa che permette di cambiarne al volo
@@ -2929,6 +3040,8 @@ accesso in lettura sui dati bufferizzati. Questo comporta un ovvio costo sia
 in termini di prestazioni, che di consumo di risorse come la batteria per i
 portatili, o cicli di riscrittura per i dischi su memorie riscrivibili.
 
+% TODO aggiustare per il contenuto duplicato con le analoghe MS_*
+
 Per questo motivo, onde evitare di mantenere una informazione che nella
 maggior parte dei casi non interessa, è sempre stato possibile disabilitare
 l'aggiornamento del tempo di ultimo accesso con l'opzione di montaggio
index 8645c5d..bfad103 100644 (file)
@@ -1,6 +1,6 @@
 %% filestd.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 50c3008..9b8be61 100644 (file)
@@ -1,6 +1,6 @@
 %% fileunix.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 378cc51..a7a25a9 100644 (file)
--- a/gapil.tex
+++ b/gapil.tex
@@ -1,6 +1,6 @@
 %% gapil.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -192,9 +192,9 @@ hyperfootnotes=false]{hyperref}
 
 \part{Appendici}
 \label{part:appendici}
+\include{errors}
 \include{netlayer}
 \include{trasplayer}
-\include{errors}
 \include{build}
 \include{ringraziamenti}
 \include{fdl}
index 2a34ea7..6d91ca0 100644 (file)
--- a/intro.tex
+++ b/intro.tex
@@ -1,6 +1,6 @@
 %% intro.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
diff --git a/ipc.tex b/ipc.tex
index ae0cdb7..9a2002c 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -1,6 +1,6 @@
 %% ipc.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -3334,8 +3334,7 @@ del processo che esegue la creazione.
 Le code di messaggi POSIX sono supportate da Linux a partire dalla versione
 2.6.6-rc1 del kernel,\footnote{l'implementazione è dovuta a Michal Wronski e
   Krzysztof Benedyczak, e le relative informazioni si possono trovare su
-  \href{http://www.geocities.com/wronski12/posix_ipc/index.html}
-  {\textsf{http://www.geocities.com/wronski12/posix\_ipc/index.html}}.} In
+  \url{http://www.geocities.com/wronski12/posix_ipc/index.html}.} In
 generale, come le corrispettive del SysV IPC, le code di messaggi sono poco
 usate, dato che i socket, nei casi in cui sono sufficienti, sono più comodi, e
 che in casi più complessi la comunicazione può essere gestita direttamente con
diff --git a/listati/ForkTest.c b/listati/ForkTest.c
deleted file mode 100644 (file)
index 3ca965f..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#include <errno.h>       /* error definitions and routines */ 
-#include <stdlib.h>      /* C standard library */
-#include <unistd.h>      /* unix standard library */
-#include <stdio.h>       /* standard I/O library */
-#include <string.h>      /* string functions */
-
-/* Help printing routine */
-void usage(void);
-
-int main(int argc, char *argv[])
-{
-/* 
- * Variables definition  
- */
-    int nchild, i;
-    pid_t pid;
-    int wait_child  = 0;
-    int wait_parent = 0;
-    int wait_end    = 0;
-    ...        /* handling options */
-    nchild = atoi(argv[optind]);
-    printf("Test for forking %d child\n", nchild);
-    /* loop to fork children */
-    for (i=0; i<nchild; i++) {
-        if ( (pid = fork()) < 0) { 
-            /* on error exit */ 
-            printf("Error on %d child creation, %s\n", i+1, strerror(errno));
-            exit(-1); 
-        }
-        if (pid == 0) {   /* child */
-            printf("Child %d successfully executing\n", ++i);
-            if (wait_child) sleep(wait_child);
-            printf("Child %d, parent %d, exiting\n", i, getppid());
-            exit(0);
-        } else {          /* parent */
-            printf("Spawned %d child, pid %d \n", i+1, pid);
-            if (wait_parent) sleep(wait_parent);
-            printf("Go to next child \n");
-        }
-    }
-    /* normal exit */
-    if (wait_end) sleep(wait_end);
-    return 0;
-}
diff --git a/listati/fork_test.c b/listati/fork_test.c
new file mode 100644 (file)
index 0000000..3ca965f
--- /dev/null
@@ -0,0 +1,44 @@
+#include <errno.h>       /* error definitions and routines */ 
+#include <stdlib.h>      /* C standard library */
+#include <unistd.h>      /* unix standard library */
+#include <stdio.h>       /* standard I/O library */
+#include <string.h>      /* string functions */
+
+/* Help printing routine */
+void usage(void);
+
+int main(int argc, char *argv[])
+{
+/* 
+ * Variables definition  
+ */
+    int nchild, i;
+    pid_t pid;
+    int wait_child  = 0;
+    int wait_parent = 0;
+    int wait_end    = 0;
+    ...        /* handling options */
+    nchild = atoi(argv[optind]);
+    printf("Test for forking %d child\n", nchild);
+    /* loop to fork children */
+    for (i=0; i<nchild; i++) {
+        if ( (pid = fork()) < 0) { 
+            /* on error exit */ 
+            printf("Error on %d child creation, %s\n", i+1, strerror(errno));
+            exit(-1); 
+        }
+        if (pid == 0) {   /* child */
+            printf("Child %d successfully executing\n", ++i);
+            if (wait_child) sleep(wait_child);
+            printf("Child %d, parent %d, exiting\n", i, getppid());
+            exit(0);
+        } else {          /* parent */
+            printf("Spawned %d child, pid %d \n", i+1, pid);
+            if (wait_parent) sleep(wait_parent);
+            printf("Go to next child \n");
+        }
+    }
+    /* normal exit */
+    if (wait_end) sleep(wait_end);
+    return 0;
+}
index b557308..0138e51 100644 (file)
--- a/macro.tex
+++ b/macro.tex
@@ -1,6 +1,6 @@
 %% macro.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 532f7c7..bbe39e4 100644 (file)
@@ -1,6 +1,6 @@
 %% netlayer.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 2e322c4..1452d1b 100644 (file)
@@ -1,6 +1,6 @@
 %% network.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index cd70d82..45e20c3 100644 (file)
@@ -1,6 +1,6 @@
 %% othersock.tex
 %%
-%% Copyright (C) 2004-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 6afe1b8..3cd5863 100644 (file)
@@ -1,6 +1,6 @@
 %% preambolo.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 91c6536..9884894 100644 (file)
--- a/pref.tex
+++ b/pref.tex
@@ -1,6 +1,6 @@
 %% pref.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 1194700..db45209 100644 (file)
@@ -1,6 +1,6 @@
 %% process.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -1075,11 +1075,10 @@ funzioni di libreria una propria versione (che può essere più o meno
 specializzata per il debugging). Esistono varie librerie che forniscono dei
 sostituti opportuni delle funzioni di allocazione in grado, senza neanche
 ricompilare il programma,\footnote{esempi sono \textit{Dmalloc}
-  \href{http://dmalloc.com/}{\textsf{http://dmalloc.com/}} di Gray Watson ed
-  \textit{Electric Fence} di Bruce Perens.} di eseguire diagnostiche anche
-molto complesse riguardo l'allocazione della memoria. Vedremo alcune delle
-funzionalità di ausilio presenti nella \acr{glibc} in
-sez.~\ref{sec:proc_memory_adv_management}.
+  \url{http://dmalloc.com/} di Gray Watson ed \textit{Electric Fence} di Bruce
+  Perens.} di eseguire diagnostiche anche molto complesse riguardo
+l'allocazione della memoria. Vedremo alcune delle funzionalità di ausilio
+presenti nella \acr{glibc} in sez.~\ref{sec:proc_memory_adv_management}.
 
 Una possibile alternativa all'uso di \func{malloc}, per evitare di soffrire
 dei problemi di \itindex{memory~leak} \textit{memory leak} descritti in
@@ -1832,7 +1831,7 @@ inoltre inizializza alcune \index{variabili!globali} variabili globali:
 \end{itemize*}
 
 In fig.~\ref{fig:proc_options_code} si è mostrata la sezione del programma
-\file{ForkTest.c}, che useremo nel prossimo capitolo per effettuare dei test
+\file{fork\_test.c}, che useremo nel prossimo capitolo per effettuare dei test
 sulla creazione dei processi, deputata alla decodifica delle opzioni a riga di
 comando da esso supportate.
 
index 87daec1..7ac714c 100644 (file)
@@ -1,6 +1,6 @@
 %% prochand.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -232,7 +232,7 @@ identificativi possono essere ottenuti usando le due funzioni \funcd{getpid} e
 \end{funcproto}
 
 \noindent esempi dell'uso di queste funzioni sono riportati in
-fig.~\ref{fig:proc_fork_code}, nel programma \file{ForkTest.c}.
+fig.~\ref{fig:proc_fork_code}, nel programma \file{fork\_test.c}.
 
 Il fatto che il \ids{PID} sia un numero univoco per il sistema lo rende un
 candidato per generare ulteriori indicatori associati al processo di cui
@@ -370,10 +370,11 @@ del nuovo programma.
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
-  \includecodesample{listati/ForkTest.c}
+  \includecodesample{listati/fork_test.c}
   \end{minipage}
   \normalsize
-  \caption{Esempio di codice per la creazione di nuovi processi.}
+  \caption{Esempio di codice per la creazione di nuovi processi (da
+    \file{fork\_test.c}).}
   \label{fig:proc_fork_code}
 \end{figure}
 
@@ -384,7 +385,7 @@ specificato da linea di comando, e prende anche alcune opzioni per indicare
 degli eventuali tempi di attesa in secondi (eseguiti tramite la funzione
 \func{sleep}) per il padre ed il figlio (con \cmd{forktest -h} si ottiene la
 descrizione delle opzioni). Il codice completo, compresa la parte che gestisce
-le opzioni a riga di comando, è disponibile nel file \file{ForkTest.c},
+le opzioni a riga di comando, è disponibile nel file \file{fork\_test.c},
 distribuito insieme agli altri sorgenti degli esempi su
 \url{http://gapil.truelite.it/gapil_source.tgz}.
 
@@ -4290,7 +4291,7 @@ aggiungendo il suffisso \code{\_r} al nome della versione normale.
 % LocalWords:  nell'header scheduler system interrupt timer HZ asm Hertz clock
 % LocalWords:  l'alpha tick fork wait waitpid exit exec image glibc int pgid ps
 % LocalWords:  sid thread Ingo Molnar ppid getpid getppid sys unistd LD threads
-% LocalWords:  void ForkTest tempnam pathname sibling cap errno EAGAIN ENOMEM
+% LocalWords:  void tempnam pathname sibling cap errno EAGAIN ENOMEM
 % LocalWords:  stack read only copy write tab client spawn forktest sleep PATH
 % LocalWords:  source LIBRARY scheduling race condition printf descriptor dup
 % LocalWords:  close group session tms lock vfork execve BSD stream main abort
index 1bf951f..308e915 100644 (file)
@@ -1,6 +1,6 @@
 %% ringraziamenti.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -36,8 +36,7 @@ presente la prima versione della Guida, ed il relativo spazio web, e Truelite
 Srl, l'azienda che ho fondato e di cui sono responsabile tecnico, che fornisce
 il nuovo repository SVN, tutto quanto è necessario alla pubblicazione della
 guida ed il sistema di tracciamento dei sorgenti su
-\href{http://gapil.truelite.it/sources}
-{\textsf{http://gapil.truelite.it/sources}}.
+\url{http://gapil.truelite.it/sources}.
 
 
 % LocalWords:  GaPiL Masini calling convention Maischberger HTML Group FLUG CVS
index eb7809e..365749c 100644 (file)
@@ -1,6 +1,6 @@
 %% session.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 7ebe8b7..ef80f95 100644 (file)
@@ -1,6 +1,6 @@
 %% signal.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -352,10 +352,10 @@ cui viene salvata un'immagine della memoria del processo (il cosiddetto
 per esaminare lo stato dello \itindex{stack} \textit{stack} e delle variabili
 al momento della ricezione del segnale.
 
-\begin{table}[htb]
+\begin{table}[!htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|c|c|p{8cm}|}
+  \begin{tabular}[c]{|l|c|c|l|}
     \hline
     \textbf{Segnale} &\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
     \hline
index 36eba10..95a6f3a 100644 (file)
@@ -1,6 +1,6 @@
 %% sockadv.tex
 %%
-%% Copyright (C) 2004-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 57d568b..0601ad8 100644 (file)
@@ -1,6 +1,6 @@
 %% sockctrl.tex
 %%
-%% Copyright (C) 2004-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
@@ -3451,29 +3451,21 @@ quantità di dettagli è fornita nel seguente elenco:
       \hline
       reno& -- &Algoritmo tradizionale, usato in caso di assenza degli altri.\\
       \texttt{bic}     &\texttt{TCP\_CONG\_BIC}     & 
-      \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}
-      {\textsf{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+      \url{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}.\\
       \texttt{cubic}   &\texttt{TCP\_CONG\_CUBIC}     & 
-      \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}
-      {\textsf{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+      \url{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}.\\
       \texttt{highspeed}&\texttt{TCP\_CONG\_HSTCP}  & 
-      \href{http://www.icir.org/floyd/hstcp.html}
-      {\textsf{http://www.icir.org/floyd/hstcp.html}}.\\
+      \url{http://www.icir.org/floyd/hstcp.html}.\\
       \texttt{htcp}    &\texttt{TCP\_CONG\_HTCP}    & 
-      \href{http://www.hamilton.ie/net/htcp/}
-      {\textsf{http://www.hamilton.ie/net/htcp/}}.\\
+      \url{http://www.hamilton.ie/net/htcp/}.\\
       \texttt{hybla}   &\texttt{TCP\_CONG\_HYBLA}   &       
-      \href{http://www.danielinux.net/projects.html}
-      {\textsf{http://www.danielinux.net/projects.html}}.\\
+      \url{http://www.danielinux.net/projects.html}.\\
       \texttt{scalable}&\texttt{TCP\_CONG\_SCALABLE}&  
-      \href{http://www.deneholme.net/tom/scalable/}
-      {\textsf{http://www.deneholme.net/tom/scalable/}}.\\
+      \url{http://www.deneholme.net/tom/scalable/}.\\
       \texttt{vegas}   &\texttt{TCP\_CONG\_VEGAS}   &  
-      \href{http://www.cs.arizona.edu/protocols/}
-      {\textsf{http://www.cs.arizona.edu/protocols/}}.\\
+      \url{http://www.cs.arizona.edu/protocols/}.\\
       \texttt{westwood}&\texttt{TCP\_CONG\_WESTWOOD}& 
-      \href{http://www.cs.ucla.edu/NRL/hpi/tcpw/}
-      {\textsf{http://www.cs.ucla.edu/NRL/hpi/tcpw/}}.\\
+      \url{http://www.cs.ucla.edu/NRL/hpi/tcpw/}.\\
 %      \texttt{}&\texttt{}& .\\
       \hline
     \end{tabular}
index ce9db0a..dfcfd32 100644 (file)
@@ -1,6 +1,6 @@
 %% socket.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -624,9 +624,8 @@ implementare dei protocolli in user space, agendo direttamente sul livello
 fisico. In genere comunque si preferisce usare la libreria
 \file{pcap},\footnote{la libreria è mantenuta insieme al comando
   \cmd{tcpdump}, informazioni e documentazione si possono trovare sul sito del
-  progetto \href{http://www.tcpdump.org/}{\textsf{http://www.tcpdump.org/}}.}
-che assicura la portabilità su altre piattaforme, anche se con funzionalità
-ridotte.
+  progetto \url{http://www.tcpdump.org/}.}  che assicura la portabilità su
+altre piattaforme, anche se con funzionalità ridotte.
 
 Questi socket possono essere di tipo \const{SOCK\_RAW} o \const{SOCK\_DGRAM}.
 Con socket di tipo \const{SOCK\_RAW} si può operare sul livello di
diff --git a/sources/ForkTest.c b/sources/ForkTest.c
deleted file mode 100644 (file)
index 1965ec8..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/* ForkTest.c
- * 
- * Copyright (C) 2001 Simone Piccardi
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-/****************************************************************
- *
- * Program ForkTest.c: 
- * Program to test process creation
- *
- * Author: Simone Piccardi
- * Sep. 2001
- *
- * Usage: forktest -h give all info's
- *
- ****************************************************************/
-/* 
- * Include needed headers
- */
-#include <errno.h>       /* error definitions and routines */ 
-#include <stdlib.h>      /* C standard library */
-#include <unistd.h>      /* unix standard library */
-#include <stdio.h>      /* standard I/O library */
-#include <string.h>      /* C strings library */
-
-#include "Gapil.h"
-#include "macros.h"
-
-/* Help printing routine */
-void usage(void);
-
-int main(int argc, char *argv[])
-{
-/* 
- * Variables definition  
- */
-    int nchild, i;
-    pid_t pid;
-    int wait_child  = 0;
-    int wait_parent = 0;
-    int wait_end    = 0;
-    /*
-     * Input section: decode command line parameters 
-     * Use getopt function
-     */
-    opterr = 0;         /* don't want writing to stderr */
-    while ( (i = getopt(argc, argv, "hsp:c:e:")) != -1) {
-       switch (i) {
-       /* 
-        * Handling options 
-        */ 
-       case 'h':   /* help option */
-           printf("Wrong -h option use\n");
-           usage();
-           return -1;
-           break;
-       case 'c':   /* take wait time for childen */
-           wait_child = strtol(optarg, NULL, 10);    /* convert input */
-           break;
-       case 'p':   /* take wait time for childen */
-           wait_parent = strtol(optarg, NULL, 10);   /* convert input */
-           break;
-       case 'e':   /* take wait before parent exit */
-           wait_end = strtol(optarg, NULL, 10);      /* convert input */
-           break;
-       case 's':
-           Signal(SIGCHLD, HandSigCHLD);
-           break;
-       case '?':   /* unrecognized options */
-           printf("Unrecognized options -%c\n",optopt);
-           usage();
-       default:    /* should not reached */
-           usage();
-       }
-    }
-    /* ***********************************************************
-     * 
-     *          Options processing completed
-     *
-     *               Main code beginning
-     * 
-     * ***********************************************************/
-    /* There must be remaing parameters */
-    if (optind == argc) {
-       usage();
-    }
-    nchild = atoi(argv[optind]);
-    printf("Process %d: forking %d child\n", getpid(), nchild);
-    /* loop to fork children */
-    for (i=0; i<nchild; i++) {
-       if ( (pid = fork()) < 0) { 
-           /* on error exit */ 
-           printf("Error on %d child creation, %s\n", i+1, strerror(errno));
-           exit(-1); 
-       }
-       if (pid == 0) {   /* child */
-           printf("Child %d successfully executing\n", ++i);
-           if (wait_child) sleep(wait_child);
-           printf("Child %d, parent %d, exiting\n", i, getppid());
-           exit(0);
-       } else {          /* parent */
-           printf("Spawned %d child, pid %d \n", i+1, pid);
-           if (wait_parent) sleep(wait_parent);
-           printf("Go to next child \n");
-       }
-    }
-    /* normal exit */
-    if (wait_end) sleep(wait_end);
-    return 0;
-}
-/*
- * routine to print usage info and exit
- */
-void usage(void) {
-    printf("Program forktest: fork a given number of child \n");
-    printf("Usage:\n");
-    printf("  forktest [-h] [-p sec] [-c sec] [-e sec] child to fork \n");
-    printf("  -h          print this help\n");
-    printf("  -s          install signal handler\n");
-    printf("  -p sec       wait sec seconds before next fork\n");
-    printf("  -c sec       wait sec seconds before child termination\n");
-    printf("  -e sec       wait sec seconds before parent return\n");
-    
-    exit(1);
-}
index e3089fa..0691479 100644 (file)
@@ -70,7 +70,7 @@ testfopen: test_fopen.c
 testren: TestRen.c
        $(CC) $(CFLAGJ) $^ -o $@
 
-forktest: ForkTest.c 
+forktest: fork_test.c 
        $(CC) $(CFLAGJ) $^ -o $@
 
 errcode: ErrCode.c 
diff --git a/sources/fork_test.c b/sources/fork_test.c
new file mode 100644 (file)
index 0000000..1965ec8
--- /dev/null
@@ -0,0 +1,138 @@
+/* ForkTest.c
+ * 
+ * Copyright (C) 2001 Simone Piccardi
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/****************************************************************
+ *
+ * Program ForkTest.c: 
+ * Program to test process creation
+ *
+ * Author: Simone Piccardi
+ * Sep. 2001
+ *
+ * Usage: forktest -h give all info's
+ *
+ ****************************************************************/
+/* 
+ * Include needed headers
+ */
+#include <errno.h>       /* error definitions and routines */ 
+#include <stdlib.h>      /* C standard library */
+#include <unistd.h>      /* unix standard library */
+#include <stdio.h>      /* standard I/O library */
+#include <string.h>      /* C strings library */
+
+#include "Gapil.h"
+#include "macros.h"
+
+/* Help printing routine */
+void usage(void);
+
+int main(int argc, char *argv[])
+{
+/* 
+ * Variables definition  
+ */
+    int nchild, i;
+    pid_t pid;
+    int wait_child  = 0;
+    int wait_parent = 0;
+    int wait_end    = 0;
+    /*
+     * Input section: decode command line parameters 
+     * Use getopt function
+     */
+    opterr = 0;         /* don't want writing to stderr */
+    while ( (i = getopt(argc, argv, "hsp:c:e:")) != -1) {
+       switch (i) {
+       /* 
+        * Handling options 
+        */ 
+       case 'h':   /* help option */
+           printf("Wrong -h option use\n");
+           usage();
+           return -1;
+           break;
+       case 'c':   /* take wait time for childen */
+           wait_child = strtol(optarg, NULL, 10);    /* convert input */
+           break;
+       case 'p':   /* take wait time for childen */
+           wait_parent = strtol(optarg, NULL, 10);   /* convert input */
+           break;
+       case 'e':   /* take wait before parent exit */
+           wait_end = strtol(optarg, NULL, 10);      /* convert input */
+           break;
+       case 's':
+           Signal(SIGCHLD, HandSigCHLD);
+           break;
+       case '?':   /* unrecognized options */
+           printf("Unrecognized options -%c\n",optopt);
+           usage();
+       default:    /* should not reached */
+           usage();
+       }
+    }
+    /* ***********************************************************
+     * 
+     *          Options processing completed
+     *
+     *               Main code beginning
+     * 
+     * ***********************************************************/
+    /* There must be remaing parameters */
+    if (optind == argc) {
+       usage();
+    }
+    nchild = atoi(argv[optind]);
+    printf("Process %d: forking %d child\n", getpid(), nchild);
+    /* loop to fork children */
+    for (i=0; i<nchild; i++) {
+       if ( (pid = fork()) < 0) { 
+           /* on error exit */ 
+           printf("Error on %d child creation, %s\n", i+1, strerror(errno));
+           exit(-1); 
+       }
+       if (pid == 0) {   /* child */
+           printf("Child %d successfully executing\n", ++i);
+           if (wait_child) sleep(wait_child);
+           printf("Child %d, parent %d, exiting\n", i, getppid());
+           exit(0);
+       } else {          /* parent */
+           printf("Spawned %d child, pid %d \n", i+1, pid);
+           if (wait_parent) sleep(wait_parent);
+           printf("Go to next child \n");
+       }
+    }
+    /* normal exit */
+    if (wait_end) sleep(wait_end);
+    return 0;
+}
+/*
+ * routine to print usage info and exit
+ */
+void usage(void) {
+    printf("Program forktest: fork a given number of child \n");
+    printf("Usage:\n");
+    printf("  forktest [-h] [-p sec] [-c sec] [-e sec] child to fork \n");
+    printf("  -h          print this help\n");
+    printf("  -s          install signal handler\n");
+    printf("  -p sec       wait sec seconds before next fork\n");
+    printf("  -c sec       wait sec seconds before child termination\n");
+    printf("  -e sec       wait sec seconds before parent return\n");
+    
+    exit(1);
+}
diff --git a/sources/mymount.c b/sources/mymount.c
new file mode 100644 (file)
index 0000000..9c8da0d
--- /dev/null
@@ -0,0 +1,215 @@
+/* mymount.c
+ * 
+ * Copyright (C) 2012 Simone Piccardi
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*****************************************************************************
+ *
+ * File mymount.c: An example for mount function
+ *
+ * Author: S. Piccardi Aug. 2011
+ *
+ *****************************************************************************/
+#include <sys/types.h>   /* primitive system data types */
+#include <sys/stat.h>    /* file characteristics constants and functions */
+#include <stdlib.h>      /* C standard library */
+#include <stdio.h>       /* standard I/O library */
+#include <unistd.h>      /* unix standard library */
+#include <string.h>
+#include <sys/mount.h>
+
+#ifdef DEBUG                     /* done only on debugging */
+#define debug printf
+#else
+#define debug(fmt, arg...)
+#endif /* DEBUG */
+
+
+/* Adding undefined flags in glibc headers */ 
+
+#ifndef MS_DIRSYNC      
+#define MS_DIRSYNC 128
+#endif
+#ifndef MS_BIND         
+#define MS_BIND 4096
+#endif
+#ifndef MS_MOVE         
+#define MS_MOVE 8192
+#endif
+#ifndef MS_REC          
+#define MS_REC 16384
+#endif
+#ifndef MS_SILENT         
+#define MS_SILENT 32768
+#endif
+#ifndef MS_UNBINDABLE   
+#define MS_UNBINDABLE (1<<17) 
+#endif
+#ifndef MS_PRIVATE     
+#define MS_PRIVATE (1<<18)
+#endif
+#ifndef MS_SLAVE         
+#define MS_SLAVE (1<<19) 
+#endif
+#ifndef MS_SHARED       
+#define MS_SHARED (1<<20)
+#endif
+#ifndef MS_RELATIME       
+#define MS_RELATIME (1<<21)
+#endif
+#ifndef MS_STRICTATIME       
+#define MS_STRICTATIME (1<<24)
+#endif
+
+
+/*
+ * Program mymount
+ */
+/* Help printing routine */
+void usage(void);
+
+struct ms_flag {
+    const char *name;
+    int flag;
+};
+
+/* compare funtion */
+int ms_flag_cmp(const void *c1, const void *c2) 
+{
+    struct ms_flag *v1 = (struct ms_flag *) c1;
+    struct ms_flag *v2 = (struct ms_flag *) c2;
+    return strcmp(v1->name, v2->name);
+}
+
+
+
+int main(int argc, char *argv[]) 
+{
+/* 
+ * Variables definition
+ */
+    int i, flags=0;
+    char * mountflags=NULL, *data=NULL, *filesystemtype=NULL;
+    char *token;
+    struct ms_flag ms_values[]=
+       {
+           {"bind", MS_BIND},
+           {"dirsync",MS_DIRSYNC},
+           {"mandlock",MS_MANDLOCK},
+           {"move",MS_MOVE},
+           {"noatime",MS_NOATIME},
+           {"nodev",MS_NODEV},
+           {"nodiratime",MS_NODIRATIME},
+           {"noexec",MS_NOEXEC},
+           {"nosuid",MS_NOSUID},
+           {"private",MS_PRIVATE},
+           {"rdonly",MS_RDONLY},
+           {"rec",MS_REC},
+           {"relatime",MS_RELATIME},
+           {"remount",MS_REMOUNT},
+           {"share",MS_SHARED},
+           {"silent",MS_SILENT},
+           {"slave",MS_SLAVE},
+           {"strictatime",MS_STRICTATIME},
+           {"synchronous",MS_SYNCHRONOUS},
+           {"unbindable",MS_UNBINDABLE}
+       };
+    struct ms_flag key, *result;
+    int ms_count = sizeof(ms_values)/sizeof(struct ms_flag);
+
+    /*
+     * Input section: decode command line parameters 
+     * Use getopt function
+     */
+    opterr = 0;         /* don't want writing to stderr */
+    while ( (i = getopt(argc, argv, "d:f:t:h")) != -1) {
+       switch (i) {
+       /* 
+        * Handling options 
+        */ 
+       case 'h':                                  /* help option */
+           printf("Wrong -h option use\n");
+           usage();
+           return -1;
+           break;
+        case 'd':                                  /* options data */
+            data = optarg;
+           debug("passed option data: %s\n", data);
+            break;
+        case 't':                                  /* options data */
+            filesystemtype = optarg;
+           debug("passed filesystem type: %s\n", filesystemtype);
+            break;
+        case 'f':                                  /* options data */ 
+            mountflags = optarg;
+           debug("passed mount flags: %s\n", mountflags);
+           break;
+       case '?':                                  /* unrecognized options */
+           printf("Unrecognized options -%c\n",optopt);
+           usage();
+       default:                                   /* should not reached */
+           usage();
+       }
+    }
+    /* ***********************************************************
+     * 
+     *          Options processing completed
+     *
+     *               Main code beginning
+     * 
+     * ***********************************************************/
+    if ((argc - optind) != 2) {   /* There must be 0 remaing arguments */
+       printf("Wrong number of arguments %d\n", argc - optind);
+        usage();
+    }
+    debug("source %s, target %s\n",argv[optind], argv[optind+1]);
+    
+//    printf("\n",);
+
+    if ( token = strtok(mountflags, ",") ) {
+        do {
+           key.name = token;
+           result = bsearch(&key, ms_values, ms_count, sizeof(struct ms_flag),
+                            ms_flag_cmp);
+           if (result) {
+               debug("found option: %s\n",result->name);
+               flags |= result->flag;
+           } else {
+               printf("unknown flag: %s\n", key.name);
+               exit(EXIT_FAILURE);
+           }
+       } while (token=strtok(NULL,","));
+    }
+    debug("flags value %X\n", flags);
+    if (mount(argv[optind], argv[optind + 1], filesystemtype, flags, data) == -1) {
+       perror("Mount call failed");
+       exit(EXIT_FAILURE);
+    }
+    exit(EXIT_SUCCESS);
+}
+/*
+ * routine to print usage info and exit
+ */
+void usage(void) {
+    printf("Program mymount:  \n");
+    printf("Usage:\n");
+    printf("mymount [-h] [-d opt1[,...]] [-t type] [-f fl1[,...]] source target\n");
+    printf("  -h          print this help\n");
+    printf("  -d options  comma separated options data string\n");
+    printf("  -t fstype   filesystemtype string\n");
+    printf("  -f flags     comma separated mount flags string\n");
+    exit(1);
+}
index 9330f4f..1b4a1b0 100644 (file)
@@ -1,6 +1,6 @@
 %% system.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 1fab77a..6b28862 100644 (file)
@@ -1,6 +1,6 @@
 %% tcpsock.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -477,11 +477,10 @@ dall'\href{http://www.ietf.org/rfc/rfc1700.txt}{RFC~1700} che contiene
 l'elenco delle porte assegnate dalla IANA (la \textit{Internet Assigned Number
   Authority}) ma l'elenco viene costantemente aggiornato e pubblicato su
 internet (una versione aggiornata si può trovare all'indirizzo
-\href{http://www.iana.org/assignments/port-numbers}
-{\textsf{http://www.iana.org/assignments/port-numbers}}); inoltre in un
-sistema unix-like un analogo elenco viene mantenuto nel file
-\conffile{/etc/services}, con la corrispondenza fra i vari numeri di porta ed
-il nome simbolico del servizio.  I numeri sono divisi in tre intervalli:
+\url{http://www.iana.org/assignments/port-numbers}); inoltre in un sistema
+unix-like un analogo elenco viene mantenuto nel file \conffile{/etc/services},
+con la corrispondenza fra i vari numeri di porta ed il nome simbolico del
+servizio.  I numeri sono divisi in tre intervalli:
 
 \begin{enumerate*}
 \item \textsl{le porte note}. I numeri da 0 a 1023. Queste sono controllate e
index b39dec1..cb0117a 100644 (file)
@@ -1,6 +1,6 @@
 %% thread.tex
 %%
-%% Copyright (C) 2007-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2007-2012 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 3f50a17..dff2819 100644 (file)
@@ -1,6 +1,6 @@
 %% tcpprot.tex
 %%
-%% Copyright (C) 2002-2011 Simone Piccardi.  Permission is granted to copy,
+%% Copyright (C) 2002-2012 Simone Piccardi.  Permission is granted to copy,
 %% distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",