X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=f4721d2698a67e63a3e66d60f1f9d8fadb947683;hp=4482834d30d9b3b59cbafef3dc19921abf6506f9;hb=f29522b2f901282d5dc4a77b3df813f066597412;hpb=996f31582fc276069a62f707bc5bdb4255342062 diff --git a/system.tex b/system.tex index 4482834..f4721d2 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,19 +943,20 @@ 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} 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 -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 @@ -980,6 +980,67 @@ struct passwd { \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 @@ -995,11 +1056,188 @@ struct group { \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} +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}