fatte getpw* e getgr*
authorSimone Piccardi <piccardi@gnulinux.it>
Sat, 27 Apr 2002 22:06:16 +0000 (22:06 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sat, 27 Apr 2002 22:06:16 +0000 (22:06 +0000)
system.tex

index 4482834..b824ddf 100644 (file)
@@ -947,16 +947,17 @@ funzioni, \func{getpwuid} e \func{getpwnam}, i cui prototipi sono:
   Restituiscono le informazioni relative alll'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 +981,66 @@ 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 alll'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.}
+\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
+    altriementi, nel qual caso \var{errno} sarà settato opportunente.}
+\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,58 @@ 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}, 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|}
+    \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}    & \\
+    \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 
+
+
 
 \section{Limitazione ed uso delle risorse}
 \label{sec:sys_res_limits}