Modifiche per le tabelle e un po' di cose sull'accounting
[gapil.git] / system.tex
index b824ddf87f381cadfff1c75923a0245b99068b4d..3671325d509affd44ee7fdc0fc20537fbc2c8a80 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;
 \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
 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
 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}.
 
 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.
 
 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
 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.
 
 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)}
 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)}
@@ -902,7 +901,7 @@ nome del filesystem stesso.
 
 
 Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due
 
 
 Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due
-file standard \file{/etc/fstab} e \file{/etc/mtab}, che convenzionalmente sono
+pfile standard \file{/etc/fstab} e \file{/etc/mtab}, che convenzionalmente sono
 usati in quasi tutti i sistemi unix per mantenere rispettivamente le
 informazioni riguardo ai filesystem da montare e a quelli correntemente
 montati. Le funzioni servono a leggere il contenuto di questi file in
 usati in quasi tutti i sistemi unix per mantenere rispettivamente le
 informazioni riguardo ai filesystem da montare e a quelli correntemente
 montati. Le funzioni servono a leggere il contenuto di questi file in
@@ -944,7 +943,7 @@ funzioni, \func{getpwuid} e \func{getpwnam}, i cui prototipi sono:
   
   \funcdecl{struct passwd *getpwnam(const char *name)} 
 
   
   \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
   
   \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} 
   
 \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)}
 
   
   \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
   
   \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
 \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
   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
 \end{functions}
 
 Il comportamento di tutte queste funzioni è assolutamente identico alle
@@ -1069,33 +1069,32 @@ al database degli utenti, derivata da SVID, che per
 database che sia tenuto su un file che abbia il formato classico di
 \file{/etc/passwd}.
 
 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}.
-
-
 \begin{table}[htb]
   \footnotesize
   \centering
 \begin{table}[htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|l|}
+  \begin{tabular}[c]{|l|p{8cm}|}
     \hline
     \textbf{Funzione} & \textbf{Significato}\\
     \hline
     \hline
     \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
     \hline
   \end{tabular}
   \caption{Funzioni per la manipolazione dei campi di un file usato come
@@ -1104,9 +1103,162 @@ queste funzioni in \tabref{tab:sys_passwd_func}.
   \label{tab:sys_passwd_func}
 \end{table}
 
   \label{tab:sys_passwd_func}
 \end{table}
 
+Dato che ormai la gran parte delle distribuzioni di Linux utilizzano PAM, che
+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.
+
+
+
+\subsection{Il database di accounting}
+\label{sec:sys_accounting}
+
 Un altro insieme di funzioni utili è quello che permette di accedere ai dati
 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 vengono mantenute nei due file \file{/var/run/utmp} e
+\file{/var/log/wtmp}. Quando un utente si collega viene aggiunta una voce a
+\file{/var/run/utmp}; la voce vi resta fino al logout, quando viene cancellata
+e spostata in \file{/var/log/wtmp}.
+
+In questo modo il primo file viene utilizzato per registrare sta utilizzando
+il sistema al momento corrente, mentre il secondo mantiene la storia delle
+attività degli utenti. A quest'ultimo vengono anche aggiunte delle voci
+speciali per tenere conto dei cambiamenti di runlevel, del riavvio della
+macchina, e di altri eventi di sistema.
+
+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)} 
+  Ricerca una voce sul database in base al 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 una voce specifica, a seconda del valore del
+campo \var{ut\_type} dell'argomento \param{ut}.  Questo può assumere i valori
+riportati in \tabref{tab:sys_ut_type}, quando assume i valori
+\macro{RUN\_LVL}, \macro{BOOT\_TIME}, \macro{OLD\_TIME}, \macro{NEW\_TIME},
+verrà restituito la prima voce che corrisponde al tipo determinato; quando
+invece assume i valori \macro{INIT\_PROCESS}, \macro{LOGIN\_PROCESS},
+\macro{USER\_PROCESS} o \macro{DEAD\_PROCESS} verrà restiuita la prima voce
+corripondente al valore del campo \var{ut\_id} specificato in \param{ut}.
+
+\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'orologio di
+                            sistema. \\
+    \macro{NEW\_TIME}     & Identifica da quanto è stato modificato il 
+                            sistema. \\
+    \macro{INIT\_PROCESS} & Identifica un processo lanciato da \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}
 
 
+Infine \func{getutline} esegue la ricerca sulle voci che hanno \var{ut\_type}
+uguale a \macro{LOGIN\_PROCESS} o \macro{USER\_PROCESS}, restituendo la prima
+che corrisponde al valore di \var{ut\_line}. Lo stesso criterio di ricerca è
+usato da \func{pututline} per trovare uno spazio dove inserire la voce
+specificata, qualora non sia trovata la voce viene aggiunta in coda al
+database.
 
 
 \section{Limitazione ed uso delle risorse}
 
 
 \section{Limitazione ed uso delle risorse}