Aggiunte e correzioni
[gapil.git] / system.tex
index b824ddf87f381cadfff1c75923a0245b99068b4d..1b67ee48b5c172fcad93dbd3f01c80538437c354 100644 (file)
@@ -529,7 +529,7 @@ In generale si tenga presente che le dimensioni delle stringe di una
 \macro{NULL}; il manuale delle \acr{glibc} indica due diverse dimensioni,
 \macro{\_UTSNAME\_LENGTH} per i campi standard e
 \macro{\_UTSNAME\_DOMAIN\_LENGTH} per quello specifico per il nome di dominio;
-altri sistemi usano nomi diversi come \macro{SYS\_NMLN} or \macro{\_SYS\_NMLN}
+altri sistemi usano nomi diversi come \macro{SYS\_NMLN} o \macro{\_SYS\_NMLN}
 or \macro{UTSLEN} che possono avere valori diversi; nel caso di Linux
 \func{uname} corrisponde in realtà a 3 system call diverse, le prime due usano
 delle lunghezze delle stringhe di 9 e 65 byte; la terza 65, restituisce anche
@@ -602,7 +602,7 @@ Ciascun nodo dell'albero 
 arriva ad identificare un parametro specifico è passato alla funzione
 attraverso l'array \param{name}, di lunghezza \param{nlen}, che contiene la
 sequenza dei vari nodi da attraversare. Ogni parametro ha un valore in un
-formato specifico chee può essere un intero, una stringa o anche una struttura
+formato specifico che può essere un intero, una stringa o anche una struttura
 complessa, per questo motivo il valori vengono passati come puntatori
 \ctyp{void}.
 
@@ -645,7 +645,7 @@ nomi dei file corrispondenti, e questo ha il grande vantaggio di rendere
 accessibili i vari parametri a qualunque comando di shell e di permettere la
 navigazione dell'albero dei valori.
 
-Alcune delle corrispondenze dei file presentin \file{/proc/sys} con i valori
+Alcune delle corrispondenze dei file presenti in \file{/proc/sys} con i valori
 di \func{sysctl} sono riportate nei commenti del codice che può essere trovato
 in \file{linux/sysctl.h},\footnote{indicando un file di definizioni si fa
   riferimento alla directory standard dei file di include, che in ogni
@@ -795,7 +795,6 @@ deve essere effettuato il rimontaggio del filesystem (con le opzioni
 specificate dagli altri bit), anche in questo caso il valore di \param{source}
 viene ignorato.
 
-
 Una volta che non si voglia più utilizzare un certo filesystem è possibile
 \textsl{smontarlo} usando la funzione \func{umount}, il cui prototipo è:
 \begin{prototype}{sys/mount.h}{umount(const char *target)}
@@ -944,7 +943,7 @@ funzioni, \func{getpwuid} e \func{getpwnam}, i cui prototipi sono:
   
   \funcdecl{struct passwd *getpwnam(const char *name)} 
 
-  Restituiscono le informazioni relative alll'utente specificato.
+  Restituiscono le informazioni relative all'utente specificato.
   
   \bodydesc{Le funzioni ritornano il puntatore alla struttura contenente le
     informazioni in caso di successo e \macro{NULL} nel caso non sia stato
@@ -989,17 +988,18 @@ estensione \code{\_r}), i cui prototipi sono:
 \begin{functions}
   \headdecl{pwd.h} 
   
-  \headdecl{sys/types.h} \funcdecl{struct passwd *getpwuid\_r(uid\_t uid,
-    struct passwd *password, char *buffer, size\_t buflen, struct passwd
-    **result)}
+  \headdecl{sys/types.h} 
+  
+  \funcdecl{struct passwd *getpwuid\_r(uid\_t uid, struct passwd *password,
+    char *buffer, size\_t buflen, struct passwd **result)}
   
   \funcdecl{struct passwd *getpwnam\_r(const char *name, struct passwd
     *password, char *buffer, size\_t buflen, struct passwd **result)}
 
-  Restituiscono le informazioni relative alll'utente specificato.
+  Restituiscono le informazioni relative all'utente specificato.
   
   \bodydesc{Le funzioni ritornano 0 in caso di successo e un codice d'errore
-    altriementi, nel qual caso \var{errno} sarà settato opportunente.}
+    altrimenti, nel qual caso \var{errno} sarà settato opportunamente.}
 \end{functions}
 
 In questo caso l'uso è molto più complesso, in quanto bisogna prima allocare
@@ -1034,7 +1034,7 @@ loro prototipi sono:
   Restituiscono le informazioni relative al gruppo specificato.
   
   \bodydesc{Le funzioni ritornano 0 in caso di successo e un codice d'errore
-    altriementi, nel qual caso \var{errno} sarà settato opportunente.}
+    altrimenti, nel qual caso \var{errno} sarà settato opportunamente.}
 \end{functions}
 
 Il comportamento di tutte queste funzioni è assolutamente identico alle
@@ -1070,32 +1070,40 @@ database che sia tenuto su un file che abbia il formato classico di
 \file{/etc/passwd}.
 
 Dato che ormai la gran parte delle distribuzioni di Linux utilizzano PAM, che
-come minimo usa almeno le \textit{shadow password}, con quindi delle modifiche
-rispetto al formato classico di \file{/etc/passwd}, ci limitiamo a citare
-queste funzioni in \tabref{tab:sys_passwd_func}.
-
+come minimo usa almeno le \textit{shadow password}, quindi con delle modifiche
+rispetto al formato classico di \file{/etc/passwd}, le funzioni che danno la
+capacità scrivere delle voci nel database (\func{putpwent} e \func{putgrent})
+non permettono di specificarle in maniera completa. Per questo motivo l'uso di
+queste funzioni è deprecato in favore dell'uso di PAM, per cui ci limitiamo a
+elencarle in \tabref{tab:sys_passwd_func}, rimandando chi fosse interessato
+alle man page e al manuale delle \acr{glibc} per i dettagli del funzionamento.
 
 \begin{table}[htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|l|}
+  \begin{tabular}[c]{|l|p{8cm}|}
     \hline
     \textbf{Funzione} & \textbf{Significato}\\
     \hline
     \hline
-    \func{fgetpwent}   & \\
-    \func{fgetpwent\_r}& \\
-    \func{getpwent}    & \\
-    \func{getpwent\_r} & \\
-    \func{setpwent}    & \\
-    \func{putpwent}    & \\
-    \func{endpwent}    & \\
-    \func{fgetgrent}   & \\
-    \func{fgetgrent\_r}& \\
-    \func{getgrent}    & \\
-    \func{getgrent\_r} & \\
-    \func{setgrent}    & \\
-    \func{endgrent}    & \\
+    \func{fgetpwent}   & Legge una voce dal database utenti da un file 
+                         specificato aprendolo la prima volta.\\
+    \func{fgetpwent\_r}& Come la precedente, ma rientrante.\\
+    \func{getpwent}    & Legge una voce dal database utenti (da 
+                         \file{/etc/passwd}) aprendolo la prima volta.\\
+    \func{getpwent\_r} & Come la precedente, ma rientrante.\\
+    \func{setpwent}    & Ritorna all'inizio del database.\\
+    \func{putpwent}    & Immette una voce nel database utenti.\\
+    \func{endpwent}    & Chiude il database degli utenti.\\
+    \func{fgetgrent}   & Legge una voce dal database dei gruppi da un file 
+                         specificato aprendolo la prima volta.\\
+    \func{fgetgrent\_r}& Come la precedente, ma rientrante.\\
+    \func{getgrent}    & Legge una voce dal database dei gruppi (da 
+                         \file{/etc/passwd}) aprendolo la prima volta.\\
+    \func{getgrent\_r} & Come la precedente, ma rientrante.\\
+    \func{setgrent}    & Immette una voce nel database dei gruppi.\\
+    \func{putgrent}    & Immette una voce nel database dei gruppi.\\
+    \func{endgrent}    & Chiude il database dei gruppi.\\
     \hline
   \end{tabular}
   \caption{Funzioni per la manipolazione dei campi di un file usato come
@@ -1105,7 +1113,129 @@ queste funzioni in \tabref{tab:sys_passwd_func}.
 \end{table}
 
 Un altro insieme di funzioni utili è quello che permette di accedere ai dati
-del database di 
+del database di \textit{accounting} degli utenti, che mantiene la traccia di
+chi si è collegato al sistema e di che è correntemente collegato, insieme alle
+informazioni, per ciascun terminale, di chi ci è collegato, da che ora,
+dell'\acr{uid} della shell di login, ed una serie di altre informazioni
+relativa al sistema come il run-level, l'orario dell'ultimo riavvio, ed altre. 
+
+Le informazioni sono tenute nei due file \file{/var/run/utmp} (per chi sta
+utilizzando il sistema al momento corrente) e \file{/var/log/wtmp} (per la
+storia dei login precedenti). Questi file non devono mai essere letti
+direttamente, ma le informazioni che contengono possono essere ricavate
+attraverso le opportune funzioni di libreria. Queste sono analoghe alle
+precedenti per il database delle password, solo che la struttura del database
+è molto più complessa, dato che contiene vari tipi di informazione.
+
+Le prime tre funzioni, \func{utmpname}, \func{setutent} e \func{endutent},
+servono a aprire e chiudere il database, e a specificare il file su cui esso è
+mantenuto (in caso questo non venga specificato viene usato il valore standard
+\macro{\_PATH\_UTMP} che è definito in \file{paths.h}. Il loro prototipi sono:
+\begin{functions}
+  \headdecl{utmp.h} 
+  
+  \funcdecl{void utmpname(const char *file)} Specifica il file da usare come
+  database di \textit{accounting}.
+  
+  \funcdecl{void setutent(void)} Apre il file del database di
+  \textit{accounting}, posizionandosi al suo inizio.
+  
+  \funcdecl{void endutent(void)} Chiude il file del database di
+  \textit{accounting}.
+  
+  \bodydesc{Le funzioni non ritornano codici di errore.}
+\end{functions}
+
+Una volta aperto il file si può eseguire una scansione leggendo o scrivendo
+una voce con le funzioni \func{getutent}, \func{getutid}, \func{getutline} e 
+\func{pututline}, i cui prototipi sono:
+\begin{functions}
+  \headdecl{utmp.h} 
+
+  \funcdecl{struct utmp *getutent(void)} 
+  Legge una voce dal dalla posizione corrente nel database.
+
+  \funcdecl{struct utmp *getutid(struct utmp *ut)} 
+  Esegue una ricerca dalla posizione corrente sulla base del contenuto di
+  \param{ut}.
+
+  \funcdecl{struct utmp *getutline(struct utmp *ut)} 
+  Ricerca nel database la prima voce corrispondente ad un processo sulla linea
+  di terminale specificata tramite \param{ut}.
+
+  \funcdecl{struct utmp *pututline(struct utmp *ut)} 
+  Scrive una voce nel database.
+
+  \bodydesc{Le funzioni ritornano il puntatore ad una struttura \var{utmp} in
+    caso di successo e \macro{NULL} in caso di errore.}
+\end{functions}
+
+Tutte queste funzioni fanno riferimento ad una struttura di tipo \var{utmp},
+la cui definizione in Linux è riportata in \secref{fig:sys_utmp_struct}. Le
+prime tre funzioni servono per leggere una voce dal database; \func{getutent}
+legge semplicemente la prima voce disponibile; le altre due permettono di
+eseguire una ricerca.
+
+\begin{figure}[!htb]
+  \footnotesize
+  \centering
+  \begin{minipage}[c]{15cm}
+    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+struct utmp
+{
+  short int ut_type;            /* Type of login.  */
+  pid_t ut_pid;                 /* Process ID of login process.  */
+  char ut_line[UT_LINESIZE];    /* Devicename.  */
+  char ut_id[4];                /* Inittab ID.  */
+  char ut_user[UT_NAMESIZE];    /* Username.  */
+  char ut_host[UT_HOSTSIZE];    /* Hostname for remote login.  */
+  struct exit_status ut_exit;   /* Exit status of a process marked
+                                   as DEAD_PROCESS.  */
+  long int ut_session;          /* Session ID, used for windowing.  */
+  struct timeval ut_tv;         /* Time entry was made.  */
+  int32_t ut_addr_v6[4];        /* Internet address of remote host.  */
+  char __unused[20];            /* Reserved for future use.  */
+};
+    \end{lstlisting}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \var{utmp} contenente le informazioni di una voce del
+    database di \textit{accounting}.}
+  \label{fig:sys_utmp_struct}
+\end{figure}
+
+Con \func{getutid} si può cercare la voce relativa ad uno specifico tipo di
+login o di runlevel, a seconda del valore del campo \var{ut\_type}
+dell'argomento \param{ut}; questo può assumere i valori riportati in 
+
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Funzione} & \textbf{Significato}\\
+    \hline
+    \hline
+    \macro{EMPTY}        & Non contiene informazioni valide. \\
+    \macro{RUN_LVL}      & Identica il runlevel del sistema. \\
+    \macro{BOOT_TIME}    & Identifica il tempo di avvio del sistema \\
+    \macro{OLD_TIME}     & Identifica quando è stato modificato l'orogio di
+                           sistema. \\
+    \macro{NEW_TIME}     & Identifica da qaunto è stato modificato il 
+                           sistema. \\
+    \macro{INIT_PROCESS} & Identifica un processo lanciato ad \cmd{init}. \\
+    \macro{LOGIN_PROCESS}& Identifica un processo di login. \\
+    \macro{USER_PROCESS} & Identifica un processo utente. \\
+    \macro{DEAD_PROCESS} & Identifica un processo terminato. \\
+    \macro{ACCOUNTING}   & ??? \\
+    \hline
+  \end{tabular}
+  \caption{Classificazione delle voci del database di accounting a seconda dei
+    possibili valori del campo \var{ut\_type}.} 
+  \label{tab:sys_ut_type}
+\end{table}
+