Utenti e Gruppi
Capitolo 18 File System
18.15 Gli attributi dei files
La possibilit`a di lettura degli attributi di un files `e un’opportunit`a molto importante messa a disposizione dalle librerie al programmatore. La memo-rizzazione di questi attributi avviene per mezzo di una particolare struttura dichiarata in sys/stat.h. vediamola in dettaglio:
18.15.1 La struttura stat
Questa struttura presenta i seguenti campi con relativo significato: • mode t st mode
Specifica tipo di file e permessi secondo le modalit`a che verranno di-scusse in sezioni successive.
• ino t st ino
Specifica il numero seriale del file in modo da distinguerlo da altri files sullo stesso device.
• dev t st dev
Identifica il device che contiene il file. • nlink t st nlink
Numero degli hard links relativi al file. • uid t st uid
User ID del proprietario del file. Se usate sistemi Unix-like dovreste sapere cosa intendiamo.
• gid t st gid
group ID del file. Valgono le stesse osservazioni fatte sopra. • off t st size
Dimensioni del file in bytes. Nel caso di links allora la dimensione si riferisce al file puntato.
• time t st atime
data ed ora dell’ultimo accesso al file. • unsigned long int st atime usec
Da vedere. • time t st mtime
18.15 Gli attributi dei files Imparare il C pag. 173 • unsigned long int st mtime usec
Da vedere. • time t st ctime
Data dell’ultima modifica agli attributi del file. • unsigned long int st ctime usec
Da vedere. • blkcnt t st blocks
Quantit`a di blocchi (512 bytes) occupati dal file su disco. • st blksize
Dimensione ottimale dei blocchi per leggere e scrivere il file.
La struttura prima descritta potrebbe tuttavia essere insufficiente per i LFS (Large File Support), per questo motivo esiste un’apposita estensione di stat chiamata stat64 di cui vi invitiamo ad analizzare il codice. Nella struttura stat avrete certamente potuto notare come vengano utilizzati dei tipi che di dato che non si conoscono, in realt`a si tratta per la maggior parte delle ridefinizione di tipi standard, vediamoli pi´u in dettaglio:
• mode t
Ridefinizione di unsigned int; • ino t
Ridefinizione di unsigned long int; • dev t
Ridefinizione di int; • nlink t
Ridefinizione di unsigned short in; • blkcnt t
Ridefinizione di unsigned long int;
Per poter memorizzare nell’apposita struttura precedentemente descritta gli attributi di un file sono messe a disposizione del programmatore le seguenti funzioni11:
11di cui esistono corrispettive per architetture a 64 bit, si vedano le pagine di manuale relative
174 CAPITOLO 18. FILE SYSTEM
18.15.2 La funzione stat
Function: int stat (const char *FILENAME, struct stat *BUF)
Gli attributi del file FILENAME vengono memorizzati nella struttura puntata da BUF. In caso di successo il valore di ritorno `e 0, -1 altrimenti. La variabile errno assume il valore ENOENT qualora il file non esista. Se il nome del file passato `e un link allora verranno memorizzati gli attributi del file puntato dal link stesso.
18.15.3 La funzione fstat
Function: int fstat (int FILEDES, struct stat *BUF)
Questa funzione `e del tutto equivalente alla precedente ma si differenzia da questa per il fatto che viene passato il file descriptor piuttosto che il nome del file. Qualora tale fd non esista allora la variabile errno assumer`a il valore EBADF
18.15.4 La funzione lstat
Function: int lstat (const char *FILENAME, struct stat *BUF)
Vi sarete certo domandati come fare ad ottenere gli attributi di un link visto che la funzione stat memorizza quelli del file puntato. ebbene questo problema viene risolto mediante la funzione lstat per il resto completamente equivalente all’altra.
18.16 Utilizzare le informazioni
Se le funzioni precedentemente descritte permettevano di memorizzare gli attributi di un file all’interno di usa struttura di tipo stat non fornivano per`o alcuna funzionalit`a per poter interpretare i vari campi che, come abbiamo visto, non sono praticamente altro che numeri. Noi per`o dobbiamo utilizzare queste informazioni e per questo motivo esistono delle Macro, definite in sys/stat.h, che permettono di gestire facilmente le informazioni presenti nei campi della struttura stat:
18.16 Utilizzare le informazioni Imparare il C pag. 175
18.16.1 La macro S ISDIR
Macro: int S ISDIR (mode t M)
Questa macro restituisce un valore diverso da zero qualora il file sia una directory.
18.16.2 La macro
Macro: int S ISCHR (mode t M)
Questa macro ritorna un valore diverso da 0 nel caso in cui il file sia un character device.
18.16.3 La macro S ISBLK
Macro: int S ISBLK (mode t M)
Viene ritornato un valore diverso da zero qualora il file sia un block device.
18.16.4 La macro S ISREG
Macro: int S ISREG (mode t M)
Un valore diverso da zero `e ritornato nel caso in cui il file sia un normale file.
18.16.5 La macro S ISFIFO
Macro: int S ISFIFO (mode t M)
Questa macro restituisce un valore diverso da zero qualora il file sia una PIPE od una FIFO.
18.16.6 La macro S ISLNK
Macro: int S ISLNK (mode t M)
Questa macro restituisce un valore diverso da zero qualora il file in questione sia un soft link.
176 CAPITOLO 18. FILE SYSTEM
18.16.7 La macro S ISSOK
Macro: int S ISSOCK (mode t M)
Un valore diverso da 0 `e restituito qualora il file sia un socket.
Accettano invece un puntatore alla struttura come argomento le seguenti macro:
18.16.8 La macro S TYPEISMQ
Macro: int S TYPEISMQ (struct stat *S)
Questa macro ritorna un valore diverso da zero qualora il file sia una coda di messaggi.
18.16.9 La macro S TYPEISSEM
Macro: int S TYPEISSEM (struct stat *S)
Questa macro ritorna un valore diverso da zero qualora il file sia un semaforo.
18.16.10 La macro S TYPEISSHM
Macro: int S TYPEISSHM (struct stat *S)
Questa macro ritorna un valore diverso da zero qualora il file sia un oggetto a memoria condivisa.
18.17 Questioni di sicurezza
La navigazione all’interno di un filesystem di un sistema unix-like deve sotto-stare a delle regole molto importanti che determinano la sicurezza del sistema e la possibilit`a della multiutenza. Come certo sapete ogni file presente nel file sistema presenta le seguenti caratteristiche:
18.17 Questioni di sicurezza Imparare il C pag. 177 1. Appartiene ad un utente del sistema12.
2. Appartiene ad un gruppo definito nel sistema. 3. Presenta permessi di accesso (in varie modalit`a).
Capirete certamente che queste caratteristiche influenzano notevolmente le fun¡zionalit`a di un programma in quanto determinano cosa effettivamente un programma pu`o fare con un file a partire dai permessi con i quali il program-ma (sarebbe pi`u corretto parlare di “processo”) viene eseguito. Il superuser, naturalmente, come qualsiasi programma che gira con i suoi privilegi pu`o na-turalmente fare ci`o che vuole con ogni file presente sul filesystem, potendone infatti modificare i permessi e/o il proprietario e/o il gruppo di appartenenza. La modifica del proprietario, in C, avviene mediante le seguenti funzioni:
18.17.1 La funzione chown
Function: int chown (const char *FILENAME, uid t OWNER, gid t GROUP)
Questa funzione ha lo stesso nome del comando che utilizzate normalmente nella vostra shell per modificare il proprietario di un file. Essa setta il proprie-tario del file dal nome FILENAME a OWNER ed il suo gruppo di appartenenza a GROUP. Se l’esecuzione della funzione `e portata a termine con successo vie-ne restituito il valore 0, -1 altrimenti. La variabile errno pu`o dunque assumere uno dei seguenti valori:
• EACCES
Il processo non ha i permessi per accedere in una directory componente il path per arrivare al file13.
• ENAMETOOLONG
Il nome del path, o di un componente del path `e troppo lungo. • ENOENT
Il file non esiste. • ENOTDIR
Un file presente nel path come directory in realt`a non `e una directory.
12il superuser deve essere considerato un utente a tutti gli effetti, anche se privilegiato
13Se infatti il file non si trova nella directory di lavoro del processo o si cambia la directory di lavoro oppure si scrive il path, assoluto o relativo, per arrivare al file