Correzioni ortografiche
[gapil.git] / system.tex
index 4482834d30d9b3b59cbafef3dc19921abf6506f9..f4721d2698a67e63a3e66d60f1f9d8fadb947683 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)}
@@ -944,19 +943,20 @@ 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
   
   \bodydesc{Le funzioni ritornano il puntatore alla struttura contenente le
-    informazioni in caso di successo e \macro{NULL} in caso di errore, nel
-    qual caso \var{errno} viene settata ad \macro{ENOMEM}.}
+    informazioni in caso di successo e \macro{NULL} nel caso non sia stato
+    trovato nessun utente corrispondente a quanto specificato.}
 \end{functions}
 
 Le due funzioni forniscono le informazioni memorizzate nel database degli
 utenti (che nelle versioni più recenti possono essere ottenute attraverso PAM)
 relative all'utente specificato attraverso il suo \acr{uid} o il nome di
 \end{functions}
 
 Le due funzioni forniscono le informazioni memorizzate nel database degli
 utenti (che nelle versioni più recenti possono essere ottenute attraverso PAM)
 relative all'utente specificato attraverso il suo \acr{uid} o il nome di
-login, restituendo un puntatore ad una struttura di tipo \type{passwd}, (la
-cui definizione è riportata in \figref{fig:sys_passwd_struct}), allocata
-staticamente.
+login. Entrambe le funzioni restituiscono un puntatore ad una struttura di
+tipo \type{passwd} la cui definizione (anch'essa eseguita in \file{pwd.h}) è
+riportata in \figref{fig:sys_passwd_struct}, dove è pure brevemente illustrato
+il significato dei vari campi. 
 
 \begin{figure}[!htb]
   \footnotesize
 
 \begin{figure}[!htb]
   \footnotesize
@@ -980,6 +980,67 @@ struct passwd {
   \label{fig:sys_passwd_struct}
 \end{figure}
 
   \label{fig:sys_passwd_struct}
 \end{figure}
 
+La struttura usata da entrambe le funzioni è allocata staticamente, per questo
+motivo viene sovrascritta ad ogni nuova invocazione, così come le stringhe a
+cui essa fa riferimento. Ovviamente queste funzioni non sono rientranti, ne
+esistono quindi anche due versioni alternative (denotate dalla solita
+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)}
+  
+  \funcdecl{struct passwd *getpwnam\_r(const char *name, struct passwd
+    *password, char *buffer, size\_t buflen, struct passwd **result)}
+
+  Restituiscono le informazioni relative all'utente specificato.
+  
+  \bodydesc{Le funzioni ritornano 0 in caso di successo e un codice d'errore
+    altrimenti, nel qual caso \var{errno} sarà settato opportunamente.}
+\end{functions}
+
+In questo caso l'uso è molto più complesso, in quanto bisogna prima allocare
+la memoria necessaria a contenere le informazioni. In particolare i valori
+della struttura \var{passwd} saranno restituiti all'indirizzo \param{password}
+mentre la memoria allocata all'indirizzo \param{buffer}, per un massimo di
+\param{buflen} byte, sarà utilizzata per contenere le stringhe puntate dai
+campi di \param{password}; infine all'indirizzo puntato da \param{result}
+viene restituito il puntatore ai dati ottenuti, cioè \param{buffer} nel caso
+l'utente esista, o \macro{NULL} altrimenti.  Qualora i dati non possano essere
+contenuti in \param{buflen} byte la funzione fallirà restituendo
+\macro{ERANGE} (e \param{result} sarà comunque settato a \macro{NULL}).
+
+Del tutto analoghe alle precedenti sono le funzioni \func{getgrnam} e
+\func{getgrgid} (e le relative analoghe rientranti con la stessa estensione
+\code{\_r}) che permettono di leggere le informazioni relative ai gruppi, i
+loro prototipi sono:
+\begin{functions}
+  \headdecl{grp.h} 
+  \headdecl{sys/types.h} 
+
+  \funcdecl{struct group *getgrgid(gid\_t gid)} 
+  
+  \funcdecl{struct group *getgrnam(const char *name)} 
+  
+  \funcdecl{struct group *getpwuid\_r(gid\_t gid, struct group *password,
+    char *buffer, size\_t buflen, struct group **result)}
+  
+  \funcdecl{struct group *getpwnam\_r(const char *name, struct group
+    *password, char *buffer, size\_t buflen, struct group **result)}
+
+  Restituiscono le informazioni relative al gruppo specificato.
+  
+  \bodydesc{Le funzioni ritornano 0 in caso di successo e un codice d'errore
+    altrimenti, nel qual caso \var{errno} sarà settato opportunamente.}
+\end{functions}
+
+Il comportamento di tutte queste funzioni è assolutamente identico alle
+precedenti che leggono le informazioni sugli utenti, l'unica differenza è che
+in questo caso le informazioni vengono restituite in una struttura di tipo
+\type{group}, la cui definizione è riportata in \figref{fig:sys_group_struct}.
 
 \begin{figure}[!htb]
   \footnotesize
 
 \begin{figure}[!htb]
   \footnotesize
@@ -995,11 +1056,188 @@ struct group {
     \end{lstlisting}
   \end{minipage} 
   \normalsize 
     \end{lstlisting}
   \end{minipage} 
   \normalsize 
-  \caption{La struttura \var{passwd} contenente le informazioni relative ad un
-    utente del sistema.}
-  \label{fig:sys_passwd_struct}
+  \caption{La struttura \var{group} contenente le informazioni relative ad un
+    gruppo del sistema.}
+  \label{fig:sys_group_struct}
 \end{figure}
 
 \end{figure}
 
+Le funzioni viste finora sono in grado di leggere le informazioni sia dal file
+delle password in \file{/etc/passwd} che con qualunque altro metodo sia stato
+utilizzato per mantenere il database degli utenti. Non permettono però di
+settare direttamente le password; questo è possibile con un'altra interfaccia
+al database degli utenti, derivata da SVID, che però funziona soltanto con un
+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}, 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|p{8cm}|}
+    \hline
+    \textbf{Funzione} & \textbf{Significato}\\
+    \hline
+    \hline
+    \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
+    database di utenti e gruppi nel formato di \file{/etc/passwd} e
+    \file{/etc/groups}.} 
+  \label{tab:sys_passwd_func}
+\end{table}
+
+Un altro insieme di funzioni utili è quello che permette di accedere ai dati
+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}
+
+
+
 
 \section{Limitazione ed uso delle risorse}
 \label{sec:sys_res_limits}
 
 \section{Limitazione ed uso delle risorse}
 \label{sec:sys_res_limits}