+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. 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
+ \centering
+ \begin{minipage}[c]{15cm}
+ \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+struct passwd {
+ char *pw_name; /* user name */
+ char *pw_passwd; /* user password */
+ uid_t pw_uid; /* user id */
+ gid_t pw_gid; /* group id */
+ char *pw_gecos; /* real name */
+ char *pw_dir; /* home directory */
+ char *pw_shell; /* shell program */
+};
+ \end{lstlisting}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \var{passwd} contenente le informazioni relative ad un
+ utente del sistema.}
+ \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
+ \centering
+ \begin{minipage}[c]{15cm}
+ \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+struct group {
+ char *gr_name; /* group name */
+ char *gr_passwd; /* group password */
+ gid_t gr_gid; /* group id */
+ char **gr_mem; /* group members */
+};
+ \end{lstlisting}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \var{group} contenente le informazioni relative ad un
+ gruppo del sistema.}
+ \label{fig:sys_group_struct}
+\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}.
+
+\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}
+
+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
+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.