X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=1b67ee48b5c172fcad93dbd3f01c80538437c354;hp=b824ddf87f381cadfff1c75923a0245b99068b4d;hb=f841512e0852f0162daeeacc3050d426158a14ee;hpb=105bd8930572cf5885b4482966754d9af0597874 diff --git a/system.tex b/system.tex index b824ddf..1b67ee4 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)} @@ -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} +