• Non ci sono risultati.

Gli attributi dei files

Nel documento Imparare il C una guida per Linux (pagine 195-200)

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

Nel documento Imparare il C una guida per Linux (pagine 195-200)

Documenti correlati