From: Simone Piccardi Date: Sat, 27 Apr 2002 22:06:16 +0000 (+0000) Subject: fatte getpw* e getgr* X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=105bd8930572cf5885b4482966754d9af0597874;ds=sidebyside fatte getpw* e getgr* --- diff --git a/system.tex b/system.tex index 4482834..b824ddf 100644 --- a/system.tex +++ b/system.tex @@ -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}