• Non ci sono risultati.

Lo User Database

Nel documento Linguaggio C: (pagine 170-174)

17.12

Lo User Database

Se il file utmp mantiene il database delle operazioni di login effettuate degli utenti il file /etc/passwd mantiene informazioni riguardanti gli utenti reg- istrati sul sistema. A dispetto del suo nome questo file non contiene 7 le

password di accesso al sistema degli utenti, esse saranno infatti presenti, e criptate, nel file /etc/shadow. Questo escamotage `e stato introdotto per permettere che il file /etc/shadow abbia permessi pi´u restrittivi rispetto al file /etc/passwd alle cui informazioni devono accedere alcuni processi. Le funzioni che verranno descritte in seguito necessitano dell’header pwd.h.

17.12.1

Il tipo di dato: struct passwd

Questa struttura viene utilizzata per effettuare lo storage di ogni entry del database presente in /etc/passwd. Vediamo maggiormente in dettaglio og- nuno dei suoi campi:

• pw name

Puntatore a carattere identificante il login name dell’utente. • pw passwd

Puntatore a carattere identificante la stringa della password di accesso crittata.

• pw uid

UID (dovreste sapere cosa significa). • pw gid

GID. • pw gecos

Puntatore a carattere contenente eventuali informazioni come il nome completo dell’utente ed altre informazioni ad esso relative.

• pw dir

Puntatore a carattere identificante la home dir dell’utente. • pw shell

Puntatore a carattere identificante ls shell dell’utente. Qualora si trat- tasse di un null pointer significherebbe che per l’utente `e stata scelta la shell di default (in genere bash).

17.13

Funzioni importanti

17.13.1

La funzione getpwuid

Function: struct passwd * getpwuid (uid t UID)

Cominciamo la nostra analisi relativa allo User Database con le consuete funzioni di ricerca. Questa funzione restituisce la prima entry del database in cui il campo UID `e uguale all’argomento passato. La struttura in cui viene memorizzata l’informazione `e allocata staticamente, di conseguenza ulteriori chiamate possono sovrascrivere i dati precedentemente allocati. In caso di fallimento (utente non trovato) viene restituito un null pointer.

17.13.2

La funzione getpwuid r

int getpwuid r (uid t UID, struct passwd *RESULT BUF, char *BUFFER, size t BUFLEN, struct passwd **RESULT)

Simile alla precedente, questa funzione elimina il problema dell’allocazione statica della memoria. Le informazioni riguardanti l’entry trovata vengono infatti allocate nella struttura puntata da RESULT BUF. Informazioni ad- dizionali puntate dagli elementi della struttura allocata verranno memorizzati in BUFFER per un dimensione di BUFFLEN. RESULT non `e che un punta- tore al puntatore al risultato dell’allocazione. Qualora l’utente non venisse trovato viene restituito un null pointer. Nel caso in cui BUFFER risulti essere troppo piccolo per contenere le informazioni verr`a ritornato il codice di errore ERANGE e la variabile errno verr`a settata a questo valore.

17.13.3

La funzione getpwnam

Function: struct passwd * getpwnam (const char *NAME)

Questa funzione `e analoga alla prima trattata trattata in questa sezione solo che, questa volta, la ricerca dell’utente viene effettuata in base al suo user name. Nel caso in cui nessuna entry soddisfi la ricerca verr`a restituito un null pointer. Valgono ancora le problematiche relative alla memoria allocata staticamente.

17.13 Funzioni importanti Imparare il C pag. 143

17.13.4

La funzione getpwnam r

Function: int getpwnam r (const char *NAME, struct passwd *RESULT BUF, char *BUFFER, size t BUFLEN, struct passwd **RESULT)

Funzione analoga alla seconda trattata in questa sezione, solo che la ricerca viene effettuata per user name.

17.13.5

La funzione fgetpwent

Function: struct passwd * fgetpwent (FILE *STREAM)

Questa funzione legge l’entry immediatamente file pointer memorizzando il tutto in una apposita struttura allocata staticamente il cui puntatore `e resti- tuito. A differenza dello User Account Database non esiste un file predefinito da aprire e quindi nessuna funzione che lo faccia. Per questo occorre pas- sare il puntatore al file che si `e aperto, purch`e questo abbia almeno una formattazione uguale a quella di /etc/passwd.

17.13.6

La funzione fgtpwent r

Function: int fgetpwent r (FILE *STREAM, struct passwd *RESULT BUF, char *BUFFER, size t BUFLEN, struct passwd **RESULT)

Viene dunque risolto nel modo che ormai dovrebbe esservi consueto il problema dell’allocazione statica della memoria della funzione precedente. Il risultato `e infatti ritornato nella struttura puntata dal secondo argomento. struttura. BUFLEN caratteri di BUFFER sono invece utilizzati per contenere informazioni addizionali. Valgono le considerazioni fatte in precedenza per le funzioni analoghe.

17.13.7

La funzione setpwent

Function: void setpwent (void)

Le funzioni precedenti, dal prototipo piuttosto complesso, permettevano di leggere entry da qualsiasi database avente una formattazione uguale a quel- la del file /etc/passwd. A meno che non stiate scrivendo un’applicazione con

un proprio database degli utenti allora il file a cui dovrete accedere sar`a il normale database degli utenti del vostro sistema. Per questo motivo esistono delle funzioni dal prototipo pi`u semplice utili allo scanning del database di default. La funzione setpwent serve proprio ad inizializzare uno stream, utilizzato dalle funzioni che vedremo in seguito, necessario allo scanning.

17.13.8

La funzione getpwent

Function: struct passwd * getpwent (void)

Questa funzione legge la prossima entry del database (la prima se lo stream `e stato appena inizializzato senza ulteriori chiamate alla funzione). Le in- formazioni relative alla entry letta vengono memorizzate all’interno della struttura restituita ed allocata staticamente. In caso non ci siano pi`u entry disponibili viene restituito un null pointer.

17.13.9

La funzione getpwent r

Function: int getpwent r (struct passwd *RESULT BUF, char *BUFFER, int BUFLEN, struct passwd **RESULT)

Come ormai sarete abituati a pensare questa funzione elimina l’allocazione statica della memoria. Non andremo oltre nella spiegazione e vi invitiamo a leggere la documentazione esistente. Ricordate: la rete `e vostra amica.

17.13.10

La funzione endpwent

Function: void endpwent (void)

Chiude lo stream aperto in precedenza. Ricordate di effettuare la chiamata alla conclusione della scansione.

17.13.11

La funzione putpwent

Function: int putpwent (const struct passwd *P, FILE *STREAM)

Le funzioni viste finora erano volte all’acquisizione delle informazioni. Questa funzione, come potrete intuire, serve invece ad inserire una entry nel database.

17.14 Il Group Database Imparare il C pag. 145

Nel documento Linguaggio C: (pagine 170-174)

Documenti correlati