X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=3671325d509affd44ee7fdc0fc20537fbc2c8a80;hp=b824ddf87f381cadfff1c75923a0245b99068b4d;hb=5a88be583402d6753af8e1542edd901595898988;hpb=105bd8930572cf5885b4482966754d9af0597874 diff --git a/system.tex b/system.tex index b824ddf..3671325 100644 --- a/system.tex +++ b/system.tex @@ -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)} @@ -902,7 +901,7 @@ nome del filesystem stesso. 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 @@ -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 @@ -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}. -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{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 @@ -1104,9 +1103,162 @@ queste funzioni in \tabref{tab:sys_passwd_func}. \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 +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}