592440e2f7fe946db15d6005db088721d51f0775
[gapil.git] / filedir.tex
1 \chapter{Files e directories}
2 \label{cha:files_and_dirs}
3
4 In questo capitolo tratteremo in dettaglio le modalità con cui si gestiscono
5 files e directories, ed in particolare esamineremo come è strutturato il
6 sistema base di protezioni e controllo di accesso ai files, e tutta
7 l'interfaccia che permette la manipolazione dei vari attributi di files e
8 directories. Tutto quello che riguarda invece la manipolazione del contenuto
9 dei file è lasciato ai capitoli successivi.
10
11
12 \section{La gestione di file e directory}
13
14 Le prime funzioni che considereremo sono quelle relative alla gestione di file
15 e directory, secondo le caratteristiche standard che essi presentano in un
16 filesystem unix, la cui struttura abbiamo esaminato in precedenza (vedi
17 \secref{sec:fileintr_filesystem}).
18
19 \subsection{Le funzioni \texttt{link} e \texttt{unlink}}
20 \label{sec:fileintr_link}
21
22 Una delle caratteristiche usate quando si opera con i file è quella di poter
23 creare dei nomi fittizi (alias o collegamenti) per potersi riferire allo
24 stesso file accedendovi da directory diverse. Questo è possibile anche in
25 ambiente unix, dove tali collegamenti sono usualmente chiamati \textit{link},
26 ma data la struttura del sistema ci sono due metodi sostanzialmente diversi
27 per fare questa operazione.
28
29 Come si è appena detto l'accesso al contenuto di un file su disco avviene
30 attraverso il suo inode, e il nome che si trova in una directory è solo una
31 etichetta associata ad un puntatore a detto inode.  Questo significa che la
32 realizzazione di un link è immediata in quanto uno stesso file può avere tanti
33 nomi diversi allo stesso tempo, dati da altrettante diverse associazioni allo
34 stesso inode; si noti poi che nessuno di questi nomi viene ad assumere una
35 particolare preferenza rispetto agli altri.
36
37 Per aggiungere un nome ad un inode si utilizza la funzione \texttt{link}; si
38 suole chiamare questo tipo di associazione un collegamento diretto (o
39 \textit{hard link}).  Il prototipo della funzione e le sue caratteristiche
40 principali, come risultano dalla man page, sono le seguenti:
41 \begin{prototype}{unistd.h}
42 {int link(const char * oldpath, const char * newpath)}
43   Crea un nuovo collegamento diretto al file indicato da \texttt{oldpath}
44   dandogli nome \texttt{newpath}.
45   
46   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
47   di errore. La variabile \texttt{errno} viene settata secondo i seguenti
48   codici di errore:
49   \begin{errlist}
50   \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} non sono sullo
51     stesso filesystem.
52   \item \texttt{EPERM} il filesystem che contiene \texttt{oldpath} e
53     \texttt{newpath} non supporta i link diretti o è una directory.
54   \item \texttt{EFAULT} una delle stringhe passate come parametri è fuori
55     dello spazio di indirizzi del processo.
56   \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o
57     per attraversare le directories), vedi \secref{sec:filedir_access_control}
58     per i dettagli.
59   \item \texttt{ENAMETOOLONG} una dei due pathname è troppo lungo.
60   \item \texttt{ENOENT} un componente di \texttt{oldpath} o \texttt{newpath}
61     non esiste o è un link simbolico spezzato.
62   \item \texttt{ENOTDIR} un componente di \texttt{oldpath} o \texttt{newpath}
63     non è una directory.
64   \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
65     completare l'operazione. 
66   \item \texttt{EROFS} la directory su cui si vuole inserire il nuovo link è
67     su un filesystem montato readonly.
68   \item \texttt{EEXIST} un file (o una directory) con quel nome esiste di
69     già.
70   \item \texttt{EMLINK} ci sono troppi link al file \texttt{oldpath} (il
71     numero massimo è specificato dalla variabile \texttt{LINK\_MAX}, vedi
72     \secref{sec:xxx_limits}).
73   \item \texttt{ELOOP} si incontrati troppi link simbolici nella risoluzione
74     di \texttt{oldpath} o \texttt{newpath}.
75   \item \texttt{ENOSPC} la directory in cui si vuole creare il link non ha
76     spazio per ulteriori voci.
77   \item \texttt{EIO} c'è stato un errore di input/output.
78   \end{errlist}
79 \end{prototype}
80
81 La creazione di un nuovo collegamento diretto non copia il contenuto del file,
82 ma si limita ad aumentare di uno il numero di referenze al file aggiungendo il
83 nuovo nome ai precedenti. Si noti che uno stesso file può essere così
84 richiamato in diverse directory.
85  
86 Per quanto dicevamo in \secref{sec:fileintr_filesystem} la creazione del
87 collegamento diretto è possibile solo se entrambi i pathname sono nello stesso
88 filesystem; inoltre il filesystem deve supportare i collegamenti diretti (non è
89 il caso ad esempio del filesystem \texttt{vfat} di windows).
90
91 La funzione opera sui file ordinari, come sugli altri oggetti del filesystem,
92 in alcuni filesystem solo l'amministratore è in grado di creare un
93 collegamento diretto ad un'altra directory, questo lo si fa perché in questo
94 caso è possibile creare dei circoli nel filesystem (vedi
95 \secref{sec:fileintr_symlink}) che molti programmi non sono in grado di
96 gestire e la cui rimozione diventa estremamente complicata (in genere occorre
97 far girare il programma \texttt{fsck} per riparare il filesystem); data la sua
98 pericolosità in generale nei filesystem usati in Linux questa caratteristica è
99 stata disabilitata, e la funzione restituisce l'errore \texttt{EPERM}.
100
101 La rimozione di un file (o più precisamente della voce che lo referenzia) si
102 effettua con la funzione \texttt{unlink}; il suo prototipo è il seguente:
103
104 \begin{prototype}{unistd.h}{int unlink(const char * pathname)}
105   Cancella il nome specificato dal pathname nella relativa directory e
106   decrementa il numero di riferimenti nel relativo inode. Nel caso di link
107   simbolico cancella il link simbolico; nel caso di socket, fifo o file di
108   dispositivo rimuove il nome, ma come per i file i processi che hanno aperto
109   uno di questi oggetti possono continuare ad utilizzarlo.
110   
111   La funzione restituisce zero in caso di successo e -1 per un errore, nel
112   qual caso il file non viene toccato. La variabile \texttt{errno} viene
113   settata secondo i seguenti codici di errore:
114   \begin{errlist}
115   \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o
116     per attraversare le directories), vedi \secref{sec:filedir_access_control}
117     per i dettagli.
118   \item \texttt{EISDIR} \texttt{pathname} si riferisce ad una directory
119     (valore specifico ritornato da linux che non consente l'uso di
120     \texttt{unlink} con le directory, e non conforme allo standard POSIX, che
121     prescrive invece l'uso di \texttt{EPERM} in caso l'operazione non sia
122     consnetita o il processo non abbia privilegi sufficienti).
123   \item \texttt{EFAULT} la stringa
124     passata come parametro è fuori dello spazio di indirizzi del processo.
125   \item \texttt{ENAMETOOLONG} il pathname troppo lungo.
126   \item \texttt{ENOENT} uno dei componenti del pathname non esiste o è un link
127     simbolico spezzato.
128   \item \texttt{ENOTDIR} uno dei componenti del pathname non è una directory.
129   \item \texttt{EISDIR} \texttt{pathname} fa riferimento a una directory.
130   \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
131     completare l'operazione. 
132   \item \texttt{EROFS} \texttt{pathname} è su un filesystem montato in sola
133     lettura.
134   \item \texttt{ELOOP} ci sono troppi link simbolici nella risoluzione del
135     pathname.
136   \item \texttt{EIO} errore di input/output.
137   \end{errlist}
138 \end{prototype}
139
140 Per cancellare una voce in una directory è necessario avere il permesso di
141 scrittura su di essa (dato che si va a rimuovere una voce dal suo contenuto) e
142 il diritto di esecuzione sulla directory che la contiene (torneremo in
143 dettaglio sui permessi e gli attributi fra poco), se inoltre lo
144 \textit{sticky} bit è settato occorrerà anche essere proprietari del file o
145 proprietari della directory (o root, per cui nessuna delle restrizioni è
146 applicata).
147
148 Una delle caratteristiche di queste funzioni è che la creazione/rimozione
149 della nome dalla directory e l'incremento/decremento del numero di riferimenti
150 nell'inode deve essere una operazione atomica (cioè non interrompibile da
151 altri) processi, per questo entrambe queste funzioni sono realizzate tramite
152 una singola system call.
153
154 Si ricordi infine che il file non viene eliminato dal disco fintanto che tutti
155 i riferimenti ad esso sono stati cancellati, solo quando il \textit{link
156   count} mantenuto nell'inode diventa zero lo spazio occupato viene rimosso. A
157 questo però si aggiunge una altra condizione, e cioè che non ci siano processi
158 che abbiano detto file aperto. Come accennato questa proprietà viene spesso
159 usata per essere sicuri di non lasciare file temporanei su disco in caso di
160 crash dei programmi; la tecnica è quella di aprire il file e chiamare
161 \texttt{unlink} subito dopo.
162
163 \subsection{Le funzioni \texttt{remove} e \texttt{rename}}
164 \label{sec:fileintr_remove}
165
166 Al contrario di quanto avviene con altri unix in Linux non è possibile usare
167 \texttt{unlink} sulle directory, per cancellare una directory si può usare la
168 funzione \texttt{rmdir} (vedi \secref{sec:filedir_dir_creat_rem}), oppure la
169 funzione \texttt{remove}. Questa è la funzione prevista dallo standard ANSI C
170 per cancellare un file o una directory (e funziona anche per i sistemi che non
171 supportano i link diretti), che per i file è identica alla \texttt{unlink} e
172 per le directory è identica alla \texttt{rmdir}:
173
174 \begin{prototype}{stdio.h}{int remove(const char *pathname)}
175   Cancella un nome dal filesystem. Usa \texttt{unlink} per i file e
176   \texttt{rmdir} per le directory.
177   
178   La funzione restituisce zero in caso di successo e -1 per un errore, nel
179   qual caso il file non viene toccato. Per i codici di errori vedi quanto
180   riportato nella descrizione di \texttt{unlink} e \texttt{rmdir}.
181 \end{prototype}
182
183 Per cambiare nome ad un file si usa invece la funzione \texttt{rename}, il
184 vantaggio nell'uso di questa funzione al posto della chiamata successiva di
185 \texttt{unlink} e \texttt{link} è che l'operazione è eseguita atomicamente, in
186 questo modo non c'è la possibilità che un processo che cerchi di accedere al
187 nuovo nome dopo che il vecchio è stato cambiato lo trovi mancante.
188
189 \begin{prototype}{stdio.h}
190 {int rename(const char *oldpath, const char *newpath)}
191   Rinomina un file, spostandolo fra directory diverse quando richiesto.
192
193   La funzione restituisce zero in caso di successo e -1 per un errore, nel
194   qual caso il file non viene toccato. La variabile \texttt{errno} viene
195   settata secondo i seguenti codici di errore:
196   \begin{errlist} 
197   \item \texttt{EISDIR} \texttt{newpath} è una directory già esistente mentre
198     \texttt{oldpath} non è una directory. 
199   \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} non sono sullo
200     stesso filesystem. 
201   \item \texttt{ENOTEMPTY} \texttt{newpath} è una directory già esistente e
202     non vuota.
203   \item \texttt{EBUSY} o \texttt{oldpath} o \texttt{newpath} sono in uso da
204     parte di qualche processo (come directory di lavoro o come root) o del
205     sistema (come mount point).
206   \item \texttt{EINVAL} \texttt{newpath} contiene un prefisso di
207     \texttt{oldpath} o più in generale si è cercato di creare una directory
208     come sottodirectory di se stessa.
209   \item \texttt{EMLINK} \texttt{oldpath} ha già il massimo numero di link
210     consentiti o è una directory e la directory che contiene \texttt{newpath}
211     ha già il massimo numero di link. 
212   \item \texttt{ENOTDIR} Uno dei componenti dei pathname non è una directory
213     o\texttt{oldpath} è una directory e \texttt{newpath} esiste e non è una
214     directory.
215   \item \texttt{EFAULT} o \texttt{oldpath} o \texttt{newpath} è fuori dello
216     spazio di indirizzi del processo.
217   \item \texttt{EACCESS} Non c'è il permesso di scrittura per la directory in
218     cui si vuole creare il nuovo link o una delle directory del pathname non
219     consente la ricerca (permesso di esecuzione).
220   \item \texttt{EPERM} le directory contenenti \texttt{oldpath} o
221     \texttt{newpath} hanno lo sticky bit attivo e i permessi del processo non
222     consentono rispettivamente la cancellazione e la creazione del file, o il
223     filesystem non supporta i link.
224   \item \texttt{ENAMETOOLONG} uno dei pathname è troppo lungo.
225   \item \texttt{ENOENT} Uno dei componenti del pathname non esiste o è un link
226     simbolico spezzato.
227   \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
228     completare l'operazione. 
229   \item \texttt{EROFS} I file sono su un filesystem montato in sola lettura.
230   \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione del
231     pathname.
232   \item \texttt{ENOSPC} Il device di destinazione non ha più spazio per la
233     nuova voce. 
234   \end{errlist}    
235 \end{prototype}
236
237 \subsection{I link simbolici}
238 \label{sec:fileintr_symlink}
239
240 Siccome la funzione \texttt{link} crea riferimenti agli inodes, essa può
241 funzionare soltanto per file che risiedono sullo stesso filesystem, dato che
242 in questo caso è garantita l'unicità dell'inode, e solo per un filesystem di
243 tipo unix.  Inoltre in Linux non è consentito eseguire un link diretto ad una
244 directory.
245
246 Per ovviare a queste limitazioni i sistemi unix supportano un'altra forma di
247 link (i cosiddetti \textit{soft link} o \textit{symbolic link}), che sono,
248 come avviene in altri sistemi operativi, dei file che contengono il
249 semplicemente il riferimento ad un altro file (o directory). In questo modo è
250 possibile effettuare link anche attraverso filesystem diversi e a directory, e
251 pure a file che non esistono ancora.
252
253 Il sistema funziona in quanto i link simbolici sono contrassegnati come tali
254 al kernel (analogamente a quanto avviene per le directory) per cui la chiamata
255 ad una \texttt{open} o una \texttt{stat} su un link simbolico comporta la
256 lettura del contenuto del medesimo e l'applicazione della funzione al file
257 specificato da quest'ultimo. Invece altre funzioni come quelle per cancellare
258 o rinominare i file operano direttamente sul link simbolico (per l'elenco vedi
259 \ntab). Inoltre esistono funzioni apposite, come la \texttt{readlink} e la
260 \texttt{lstat} per accedere alle informazioni del link invece che a quelle del
261 file a cui esso fa riferimento.
262
263 Le funzioni per operare sui link simbolici sono le seguenti, esse sono tutte
264 dichiarate nell'header file \texttt{unistd.h}.
265
266 \begin{prototype}{unistd.h}
267 {int symlink(const char * oldname, const char * newname)}
268   Crea un nuovo link simbolico al file indicato da \texttt{oldname} dandogli
269   nome \texttt{newname}.
270   
271   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
272   di errore. La variabile \texttt{errno} viene settata secondo i codici di
273   errore standard di accesso ai files (trattati in dettaglio in
274   \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
275   \begin{errlist}
276   \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
277     già.
278   \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
279     su un filesystem montato readonly.
280   \item \texttt{ENOSPC} La directory o il filesystem in cui si vuole creare il
281     link è piena e non c'è ulteriore spazio disponibile.
282   \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione di
283     \texttt{oldname} o di \texttt{newname}.
284   \end{errlist}
285 \end{prototype}
286
287 Dato che la funzione \texttt{open} segue i link simbolici, è necessaria usare
288 un'altra funzione quando si vuole leggere il contenuto di un link simbolico,
289 questa funzione è la:
290
291 \begin{prototype}{unistd.h}
292 {int readlink(const char * path, char * buff, size\_t size)} 
293   Legge il contenuto del link simbolico indicato da \texttt{path} nel buffer
294   \texttt{buff} di dimensione \texttt{size}. Non chiude la stringa con un
295   carattere nullo e la tronca a \texttt{size} nel caso il buffer sia troppo
296   piccolo per contenerla.
297   
298   La funzione restituisce il numero di caratteri letti dentro \texttt{buff} o
299   -1 per un errore, in caso di errore. La variabile \texttt{errno} viene
300   settata secondo i codici di errore:
301   \begin{errlist}
302   \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
303     già.
304   \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
305     su un filesystem montato readonly.
306   \item \texttt{ENOSPC} La directory o il filesystem in cui si vuole creare il
307     link è piena e non c'è ulteriore spazio disponibile.
308   \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione di
309     \texttt{oldname} o di \texttt{newname}.
310   \end{errlist}
311 \end{prototype}
312
313 In \ntab\ si è riportato un elenco dei comportamenti delle varie funzioni che
314 operano sui file rispetto ai link simbolici; specificando quali seguono il
315 link simbolico e quali possono operare direttamente sul suo contenuto.
316 \begin{table}[htb]
317   \centering
318   \footnotesize
319   \begin{tabular}[c]{|l|c|c|}
320     \hline
321     Funzione & Segue il link & Non segue il link \\
322     \hline 
323     \hline 
324     \func{access}   & $\bullet$ &           \\
325     \func{chdir}    & $\bullet$ &           \\
326     \func{chmod}    & $\bullet$ &           \\
327     \func{chown}    &           & $\bullet$ \\
328     \func{creat}    & $\bullet$ &           \\
329     \func{exec}     & $\bullet$ &           \\
330     \func{lchown}   & $\bullet$ & $\bullet$ \\
331     \func{link}     &           &           \\
332     \func{lstat}    &           & $\bullet$ \\
333     \func{mkdir}    & $\bullet$ &           \\
334     \func{mkfifo}   & $\bullet$ &           \\
335     \func{mknod}    & $\bullet$ &           \\
336     \func{open}     & $\bullet$ &           \\
337     \func{opendir}  & $\bullet$ &           \\
338     \func{pathconf} & $\bullet$ &           \\
339     \func{readlink} &           & $\bullet$ \\
340     \func{remove}   &           & $\bullet$ \\
341     \func{rename}   &           & $\bullet$ \\
342     \func{stat}     & $\bullet$ &           \\
343     \func{truncate} & $\bullet$ &           \\
344     \func{unlink}   &           & $\bullet$ \\
345     \hline 
346   \end{tabular}
347   \caption{Uso dei link simbolici da parte di alcune funzioni.}
348   \label{tab:filedir_symb_effect}
349 \end{table}
350 si noti che non si è specificato il comportamento delle funzioni che operano
351 con i file descriptor, in quanto la gestione del link simbolico viene in
352 genere effttuata dalla funzione che restituisce il file descriptor
353 (normalmente la \func{open}).
354
355 \begin{figure}[htb]
356   \centering
357   \includegraphics[width=5cm]{img/link_loop.eps}
358   \caption{Esempio di loop nel filesystem creato con un link simbolico.}
359   \label{fig:filedir_link_loop}
360 \end{figure}
361
362 Un caso comune che si può avere con i link simbolici è la creazione dei
363 cosiddetti \textit{loop}. La situazione è illustrata in \curfig, che riporta
364 la struttura della directory \file{/boot}. Come si vede si è creato al suo
365 interno un link simbolico che punta di nuovo a \file{/boot}\footnote{Questo
366   tipo di loop è stato effettuato per poter permettere a \cmd{grub} (un
367   bootloader estremamente avanzato in grado di accedere direttamente
368   attraverso vari filesystem al file da lanciare come sistema operativo) di
369   vedere i file in questa directory, che è montata su una partizione separata
370   (e che grub vedrebbe come radice), con lo stesso path con cui verrebbero
371   visti dal sistema operativo.}. 
372
373 Questo può causare problemi per tutti quei programmi che effettuassero uno
374 scan di una directory senza tener conto dei link simbolici, in quel caso
375 infatti il loop nella directory 
376
377 Un secondo punto da tenere presente è che un link simbolico può essere fatto
378 anche ad un file che non esiste; ad esempio possiamo creare un file temporaneo
379 nella nostra directory con un link del tipo:
380 \begin{verbatim}
381 $ln -s /tmp/tmp_file temporaneo
382 \end{verbatim}%$
383 ma anche se \file{/tmp/tmp\_file} non esiste. Aprendo in scrittura
384 \file{temporaneo} questo verrà scritto; ma se cercassimo di accederlo in sola
385 lettura (ad esempio con \cmd{cat}) otterremmo:
386 \begin{verbatim}
387 $ cat prova 
388 cat: prova: No such file or directory
389 \end{verbatim}%$
390 con un errore che sembra sbagliato, dato \cmd{ls} ci mostrerebbe l'esistenza
391 di \file{temporaneo}.
392
393
394 \subsection{Le funzioni \texttt{mkdir} e \texttt{rmdir}} 
395 \label{sec:filedir_dir_creat_rem}
396
397 Per creare una nuova directory si può usare la seguente funzione, omonima
398 dell'analogo comando di shell \texttt{mkdir}; per accedere ai tipi usati
399 programma deve includere il file \texttt{sys/types.h}.
400
401 \begin{prototype}{sys/stat.h}
402 {int mkdir (const char * dirname, mode\_t mode)}
403   Questa funzione crea una nuova directory vuota con il nome indicato da
404   \texttt{dirname}, assegnandole i permessi indicati da \texttt{mode}. Il nome
405   può essere indicato con il pathname assoluto o relativo.
406   
407   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
408   di errore \texttt{errno} viene settata secondo i codici di errore standard
409   di accesso ai files (trattati in dettaglio in
410   \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
411   \begin{errlist}
412   \item \texttt{EACCESS} 
413     Non c'è il permesso di scrittura per la directory in cui si vuole inserire
414     la nuova directory.
415   \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di già. 
416   \item \texttt{EMLINK} La directory in cui si vuole creare la nuova directory
417     contiene troppi file. Sotto Linux questo normalmente non avviene perché il
418     filesystem standard consente la creazione di un numero di file maggiore di
419     quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che
420     fare anche con filesystem di altri sistemi questo errore può presentarsi.
421   \item \texttt{ENOSPC} Non c'è abbastanza spazio sul file system per creare
422     la nuova directory.
423   \item \texttt{EROFS} La directory su cui si vuole inserire la nuova
424     directory è su un filesystem montato readonly.
425   \end{errlist}
426 \end{prototype}
427  
428
429 \subsection{Accesso alle directory}
430 \label{sec:filedir_dir_read}
431
432 Benché le directory siano oggetti del filesystem come tutti gli altri non ha
433 ovviamente senso aprirle come fossero dei file di dati. Può però essere utile
434 poterne leggere il contenuto ad esempio per fare la lista dei file che esse
435 contengono o ricerche sui medesimi.
436
437 Per accedere al contenuto delle directory si usano i cosiddetti
438 \textit{directory streams} (chiamati così per l'analogia con i file stream);
439 la funzione \texttt{opendir} apre uno di questi stream e la funzione
440 \texttt{readdir} legge il contenuto della directory, i cui elementi sono le
441 \textit{directory entries} (da distinguersi da quelle della cache di cui
442 parlavamo in \secref{sec:fileintr_vfs}) in una opportuna struttura
443 \texttt{struct dirent}.
444
445
446 \subsection{La directory di lavoro}
447 \label{sec:filedir_work_dir}
448
449 A ciascun processo è associato ad una directory nel filesystem che è chiamata
450 directory corrente o directory di lavoro (\textit{current working directory})
451 che è quella a cui si fa riferimento quando un filename è espresso in forma
452 relativa (relativa appunto a questa directory).
453
454 Quando un utente effettua il login questa directory viene settata alla
455 cosiddetta \textit{home directory} del suo account, il comando \texttt{cd}
456 della shell consente di cambiarla a piacere, spostandosi da una directory ad
457 un'altra.  Siccome la directory corrente resta la stessa quando viene creato
458 un processo figlio, la directory corrente della shell diventa anche la
459 directory corrente di qualunque comando da essa lanciato.
460
461 Le funzioni qui descritte servono esaminare e cambiare la directory di lavoro
462 corrente. 
463
464 \begin{prototype}{unistd.h}{char * getcwd (char * buffer, size\_t size)}
465   Restituisce il filename completo della directory di lavoro corrente nella
466   stringa puntata da \texttt{buffer}, che deve essere precedentemente
467   allocata, per una dimensione massima di \texttt{size}. Si può anche
468   specificare un puntatore nullo come \textit{buffer}, nel qual caso la
469   stringa sarà allocata automaticamente per una dimensione pari a
470   \texttt{size} qualora questa sia diversa da zero, o della lunghezza esatta
471   del pathname altrimenti. In questo caso si deve ricordare di disallocare la
472   stringa una volta cessato il suo utilizzo.
473   
474   La funzione restituisce il puntatore \texttt{buffer} se riesce,
475   \texttt{NULL} se fallisce, in quest'ultimo caso la variabile
476   \texttt{errno} è settata con i seguenti codici di errore:
477   \begin{errlist}
478   \item \texttt{EINVAL} L'argomento \texttt{size} è zero e \texttt{buffer} non
479     è nullo.
480   \item \texttt{ERANGE} L'argomento \texttt{size} è più piccolo della
481     lunghezza del pathname. 
482   \item \texttt{EACCESS} Manca il permesso di lettura o di ricerca su uno dei
483     componenti del pathname (cioè su una delle directory superiori alla
484     corrente).
485   \end{errlist}
486 \end{prototype}
487
488 Di questa funzione esiste una versione \texttt{char * getwd(char * buffer)}
489 fatta per compatibilità all'indietro con BSD, che non consente di specificare
490 la dimensione del buffer; esso deve essere allocato in precedenza ed avere una
491 dimensione superiore a \texttt{PATH\_MAX} (di solito 256 bytes, vedi
492 \secref{sec:xxx_limits}; il problema è che in Linux non esiste una dimensione
493 superiore per un pathname, per cui non è detto che il buffer sia sufficiente a
494 contenere il nome del file, e questa è la ragione principale per cui questa
495 funzione è deprecata.
496
497 Una seconda funzione simile è \texttt{char * get\_current\_dir\_name(void)}
498 che è sostanzialmente equivalente ad una \texttt{getcwd(NULL, 0)}, con la sola
499 differenza che essa ritorna il valore della variabile di ambiente
500 \texttt{PWD}, che essendo costruita dalla shell può contenere anche dei
501 riferimenti simbolici.
502
503 Come già detto in unix anche le directory sono file, è possibile pertanto
504 riferirsi ad esse tramite il file descriptor dell'interfaccia a basso livello,
505 e non solo tramite il filename; per questo motivo ci sono due diverse funzioni
506 per cambiare directory di lavoro.
507
508 \begin{prototype}{unistd.h}{int chdir (const char * pathname)}
509   Come dice il nome (che significa \textit{change directory}) questa funzione
510   serve a cambiare la directory di lavoro a quella specificata dal pathname
511   contenuto nella stringa \texttt{pathname}.
512 \end{prototype}
513   
514 \begin{prototype}{unistd.h}{int fchdir (int filedes)} 
515   Analoga alla precedente, ma usa un file descriptor invece del pathname.
516
517   Entrambe le funzioni restituiscono zero in caso di successo e -1 per un
518   errore, in caso di errore \texttt{errno} viene settata secondo i codici di
519   errore standard di accesso ai files (trattati in dettaglio in
520   \secref{sec:filedir_access_control}) ai quali si aggiunge il codice
521   \texttt{ENOTDIR} nel caso il \texttt{filename} indichi un file che non sia
522   una directory.
523 \end{prototype}
524
525
526 \section{La manipolazione delle caratteristiche dei files}
527 \label{sec:filedir_infos}
528
529 Come spiegato in \secref{sec:fileintr_filesystem} tutte le informazioni
530 generali relative alle caratteristiche di ciascun file sono mantenute
531 nell'inode. Vedremo in questa sezione come sia possibile accedervi usando la
532 funzione \texttt{stat} ed esamineremo alcune funzioni utilizzabili per
533 manipolare una parte di questa informazione. Tutto quello che invece riguarda
534 il meccanismo di controllo di accesso ad i file e le relative funzioni di
535 manipolazione sarà invece esaminanto in \secref{sec:filedir_access_control}.
536
537
538 \subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}}
539 \label{sec:filedir_stat}
540
541 La lettura delle informazioni relative ai file è fatta attraverso la famiglia
542 delle funzioni \func{stat}, che è la funzione che il comando \cmd{ls} usa
543 per poter stampare tutti i dati dei files. I prototipi di queste funzioni sono
544 i seguenti:
545 \begin{functions}
546   \headdecl{sys/types.h} 
547   \headdecl{sys/stat.h} 
548   \headdecl{unistd.h}
549
550   \funcdecl{int stat(const char *file\_name, struct stat *buf)} Legge le
551   informazione del file specificato da \var{file\_name} e le inserisce in
552   \var{buf}.
553   
554   \funcdecl{int lstat(const char *file\_name, struct stat *buf)} Identica a
555   \func{stat} eccetto che se il \var{file\_name} è un link simbolico vengono
556   lette le informazioni relativa ad esso e non al file a cui fa riferimento.
557   
558   \funcdecl{int fstat(int filedes, struct stat *buf)} Identica a \func{stat}
559   eccetto che si usa con un file aperto, specificato tramite il suo file
560   descriptor \var{filedes}.
561   
562   Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
563   caso di errore \texttt{errno} viene settato ai valori:
564   \begin{errlist}
565   \item \texttt{EACCESS} non c'è il permesso di accedere al file.
566   \item \texttt{ENOTDIR} una componente del pathname non è una directory.
567   \item \texttt{EMLOOP} ci sono troppi link simbolici nel pathname.
568   \item \texttt{EFAULT} i puntatori usati sono fuori dallo spazio di indirizzi
569     del processo.
570   \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
571     completare l'operazione. 
572   \item \texttt{ENAMETOOLONG} il filename è troppo lungo.
573   \end{errlist}
574 \end{functions}
575
576 La struttura \texttt{stat} è definita nell'header \texttt{sys/stat.h} e in
577 generale dipende dall'implementazione, la versione usata da Linux è mostrata
578 in \nfig, così come riportata dalla man page (in realtà la definizione
579 effettivamente usata nel kernel dipende dall'architettura e ha altri campi
580 riservati per estensioni come tempi più precisi, o per il padding dei campi).
581
582 \begin{figure}[!htb]
583   \footnotesize
584   \centering
585   \begin{minipage}[c]{15cm}
586     \begin{lstlisting}[]{}
587 struct stat {
588     dev_t         st_dev;      /* device */
589     ino_t         st_ino;      /* inode */
590     mode_t        st_mode;     /* protection */
591     nlink_t       st_nlink;    /* number of hard links */
592     uid_t         st_uid;      /* user ID of owner */
593     gid_t         st_gid;      /* group ID of owner */
594     dev_t         st_rdev;     /* device type (if inode device) */
595     off_t         st_size;     /* total size, in bytes */
596     unsigned long st_blksize;  /* blocksize for filesystem I/O */
597     unsigned long st_blocks;   /* number of blocks allocated */
598     time_t        st_atime;    /* time of last access */
599     time_t        st_mtime;    /* time of last modification */
600     time_t        st_ctime;    /* time of last change */
601 };
602     \end{lstlisting}
603   \end{minipage} 
604   \normalsize 
605   \caption{La struttura \texttt{stat} per la lettura delle informazioni dei 
606     file}
607   \label{fig:filedir_stat_struct}
608 \end{figure}
609
610 Si noti come i vari membri della struttura siano specificati come tipi nativi
611 del sistema (di quelli definiti in \tabref{tab:xxx_sys_types}, e dichiarati in
612 \texttt{sys/types.h}). 
613
614
615 \subsection{I tipi di file}
616 \label{sec:filedir_file_types}
617
618 Come riportato in \tabref{tab:fileintr_file_types} in Linux oltre ai file e
619 alle directory esistono vari altri oggetti che possono stare su un filesystem;
620 il tipo di file è ritornato dalla \texttt{stat} nel campo \texttt{st\_mode}.
621
622 Dato che il valore numerico può variare a seconda delle implementazioni lo
623 standard POSIX definisce un insieme di macro per verificare il tipo di files,
624 queste venfono usate anche da Linux che supporta pure le estensioni per link
625 simbolici e socket definite da BDS, l'elenco è riportato in \ntab:
626 \begin{table}[htb]
627   \centering
628   \footnotesize
629   \begin{tabular}[c]{|l|l|}
630     \hline
631     Macro & Tipo del file \\
632     \hline
633     \hline
634     \macro{S\_ISREG(m)}  & file normale \\
635     \macro{S\_ISDIR(m)}  & directory \\
636     \macro{S\_ISCHR(m)}  & device a caraetteri \\
637     \macro{S\_ISBLK(m)}  & device a blocchi\\
638     \macro{S\_ISFIFO(m)} & fifo \\
639     \macro{S\_ISLNK(m)}  & link simbolico \\
640     \macro{S\_ISSOCK(m)} & socket \\
641     \hline    
642   \end{tabular}
643   \caption{Macro per i tipi di file (definite in \texttt{sys/stat.h})}
644   \label{tab:filedir_file_type_macro}
645 \end{table}
646
647 Oltre a queste macro è possibile usare direttamente il valore di
648 \var{st\_mode} per ricavare il significato dei vari bit in esso memorizzati,
649 per questo sempre in \texttt{sys/stat.h} sono definiti i flag riportati in
650 \ntab:
651 \begin{table}[htb]
652   \centering
653   \footnotesize
654   \begin{tabular}[c]{|l|c|l|}
655     \hline
656     Flag & Valore & Significato \\
657     \hline
658     \hline
659     \macro{S\_IFMT}   &  0170000 & bitmask for the file type bitfields \\
660     \macro{S\_IFSOCK} &  0140000 & socket        \\
661     \macro{S\_IFLNK}  &  0120000 & symbolic link \\
662     \macro{S\_IFREG}  &  0100000 & regular file  \\ 
663     \macro{S\_IFBLK}  &  0060000 & block device  \\
664     \macro{S\_IFDIR}  &  0040000 & directory     \\ 
665     \macro{S\_IFCHR}  &  0020000 & character device         \\
666     \macro{S\_IFIFO}  &  0010000 & fifo                     \\
667     \macro{S\_ISUID}  &  0004000 & set UID bit              \\
668     \macro{S\_ISGID}  &  0002000 & set GID bit (see below)  \\
669     \macro{S\_ISVTX}  &  0001000 & sticky bit (see below)   \\
670     \macro{S\_IRWXU}  &  00700   & mask for file owner permissions \\
671     \macro{S\_IRUSR}  &  00400   & owner has read permission       \\
672     \macro{S\_IWUSR}  &  00200   & owner has write permission      \\
673     \macro{S\_IXUSR}  &  00100   & owner has execute permission    \\
674     \macro{S\_IRWXG}  &  00070   & mask for group permissions      \\
675     \macro{S\_IRGRP}  &  00040   & group has read permission       \\
676     \macro{S\_IWGRP}  &  00020   & group has write permission      \\
677     \macro{S\_IXGRP}  &  00010   & group has execute permission    \\
678     \macro{S\_IRWXO}  &  00007   & mask for permissions for others (not in
679     group) \\
680     \macro{S\_IROTH}  &  00004   & others have read permission     \\
681     \macro{S\_IWOTH}  &  00002   & others have write permisson     \\
682     \macro{S\_IXOTH}  &  00001   & others have execute permission  \\
683     \hline    
684   \end{tabular}
685   \caption{Flag per il campo \var{st\_mode} (definite in 
686     \texttt{sys/stat.h})}
687   \label{tab:filedir_file_mode_flags}
688 \end{table}
689
690 Il primo valore definisce la maschera dei bit usati nei quali viene
691 memorizzato il tipo di files, mentre gli altri possono essere usati per
692 effettuare delle selezioni sul tipo di file voluto, combinando opportunamente
693 i vari flag; ad esempio se si volesse controllare se un file è una directory o
694 un file ordinario si potrebbe definire la condizione:
695 \begin{lstlisting}{}
696 #define IS_FILE_DIR(x) ( ((x) & S_IFMT) & (S_IFDIR | S_IFREG) )
697 \end{lstlisting}
698 in cui prima si estraggono da \var{st\_mode} i bit relativi al tipo di file e
699 poi si effettua il confronto con la combinazione di tipi scelta.
700
701 \subsection{La dimensione dei file}
702 \label{sec:filedir_file_size}
703
704 Il membro \var{st\_size} contiene la dimensione del file in bytes (se il file
705 è un file normale, nel caso di un link simbolico al dimensione è quella del
706 pathname che contiene). 
707
708 Il campo \var{st\_blocks} definisce la lunghezza del file in blocchi di 512
709 bytes. Il campo \var{st\_blksize} infine definisce la dimensione preferita per
710 i trasferimenti sui file (che è la dimensione usata anche dalle librerie del C
711 per l'interfaccia degli stream); scrivere sul file a blocchi di dati di
712 dimensione inferiore sarebbe inefficiente.
713
714 Si tenga conto che lunghezza del file riportata in \var{st\_size} non è detto
715 che corrisponda all'occupazione dello spazio su disco per via della possibile
716 esistenza dei cosiddetti \textsl{buchi} (detti normalmente \textit{holes}) che
717 si formano tutte le volte che si va a scrivere su un file dopo aver eseguito
718 una \func{seek} (vedi \secref{sec:fileunix_lseek}) oltre la sua conclusione
719 corrente.
720
721 In tal caso si avranno differenti risultati a seconda del modi in cui si
722 calcola la lunghezza del file, ad esempio il comando \cmd{du}, (che riporta il
723 numero di blocchi occupati) potrà dare una dimensione inferiore, mentre se si
724 legge dal file (ad esempio usando \cmd{wc -c}), dato che in tal caso per le
725 parti non scritte vengono restituiti degli zeri, si avrà lo stesso risultato
726 di \cmd{ls}.
727
728 Se è sempre possibile allargare un file scrivendoci sopra od usando la
729 funzione \func{seek} per spostarsi oltre la sua fine. Esistono però anche casi
730 in cui si può avere bisogno di effettuare un troncamento scartando i dati al
731 di là della dimensione scelta come nuova fine del file.
732
733 Un file può essere troncato a zero aprendolo con il flag \macro{O\_TRUNC}, ma
734 questo è un caso particolare; per qualunque altra dimensione si possono usare
735 le due funzioni:
736 \begin{functions}
737   \headdecl{unistd.h} \funcdecl{int truncate(const char *file\_name, off\_t
738     length)} Fa si che la dimensione del file \var{file\_name} sia troncata ad
739     un valore massimo specificato da \var{lenght}. 
740   
741   \funcdecl{int ftruncate(int fd, off\_t length))} Identica a \func{truncate}
742   eccetto che si usa con un file aperto, specificato tramite il suo file
743   descriptor \var{fd}, 
744   
745   Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
746   caso di errore \texttt{errno} viene settato ai valori:
747   \begin{errlist}
748   \item \texttt{EACCESS} non c'è il permesso di accedere al file.
749   \item \texttt{ENOTDIR} una componente del pathname non è una directory.
750   \item \texttt{EMLOOP} ci sono troppi link simbolici nel pathname.
751   \item \texttt{EFAULT} i puntatori usati sono fuori dallo spazio di indirizzi
752     del processo.
753   \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a
754     completare l'operazione. 
755   \item \texttt{ENOENT} il file non esiste. 
756   \item \texttt{ENAMETOOLONG} il filename è troppo lungo.
757   \end{errlist}
758 \end{functions}
759
760 Se il file è più lungo della lunghezza specificata i dati in eccesso saranno
761 perduti; il comportamento in caso di lunghezza inferiore non è specificato e
762 dipende dall'implementazione: il file può essere lasciato invariato o esteso
763 fino alla lunghezza scelta; in quest'ultimo caso lo spazio viene riempito con
764 zeri (e in genere si ha la creazione di un hole nel file).
765
766 \subsection{I tempi dei file}
767 \label{sec:filedir_file_times}
768
769 Il sistema mantiene per ciascun file tre tempi. Questi sono registrati
770 nell'inode insieme agli altri attibuti del file e possono essere letti tramite
771 la funzione \func{stat}, che li restituisce attraverso tre campi della
772 struttura in \figref{fig:filedir_stat_struct}. Il significato di detti tempi e
773 dei relativi campi è riportato nello schema in \ntab:
774
775 \begin{table}[htb]
776   \centering
777   \begin{tabular}[c]{|c|l|l|c|}
778     \var{st\_atime}& ultimo accesso ai dati del file &\func{read}& \cmd{-u}\\ 
779     \var{st\_mtime}& ultima modifica ai dati del file &\func{write}& default\\ 
780     \var{st\_ctime}& ultima modifica ai dati dell'inode&\func{chmod}, 
781     \func{utime} & \cmd{-c} \\ 
782   \end{tabular}
783   \caption{I tre tempi associati a ciascun file}
784   \label{tab:filedir_file_times}
785 \end{table}
786
787 Il primo punto da tenere presente è la differenza fra il cosiddetto tempo di
788 modifica (il \textit{modification time} \var{st\_mtime}) e il tempo di
789 cambiamento di stato (il \textit{chage time} \var{st\_ctime}). Il primo
790 infatti fa riferimento ad una modifica del contenuto di un file, mentre il
791 secondo ad una modifica dell'inode; siccome esistono molte operazioni (come la
792 funzione \func{link} e molte altre che vedremo in seguito) che modificano solo
793 le informazioni contenute nell'inode senza toccare il file, diventa necessario
794 l'utilizzo di un altro tempo.
795
796 Il sistema non tiene conto dell'ultimo accesso all'inode, pertanto funzioni
797 come \func{access} o \func{stat} non hanno alcuna influenza sui tre tempi. Il
798 tempo di ultimo accesso viene di solito usato per cancellare i file che non
799 servono più dopo un certo lasso di tempo (ad esempio \cmd{leafnode} cancella i
800 vecchi articoli sulla base di questo tempo).  
801
802 Il tempo di ultima modifica invece viene usato da \cmd{make} per decidere
803 quali file necessitano di essere ricompilati o (talvolta insieme anche al
804 tempo di cambiamento di stato) per decidere quali file devono essere
805 archiviati per il backup. Il comando \cmd{ls} (quando usato con le opzioni
806 \cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema riportato
807 nell'ultima colonna di \curtab.
808
809 L'effetto delle varie funzioni di manipolazione dei file sui tempi è
810 illustrato in \ntab. Si sono riportati gli effetti sia per il file a cui si fa
811 riferimento, sia per la directory che lo contiene; questi ultimi possono
812 essere capiti se si tiene conto di quanto già detto, e cioè che anche le
813 directory sono files, che il sistema tratta in maniera del tutto analoga agli
814 altri. 
815
816 Per questo motivo tutte le volte che compiremo una operazione su un file che
817 comporta una modifica della sua directory entry, andremo anche a scrivere
818 sulla directory che lo contiene cambiandone il tempo di modifica. Un esempio
819 di questo può essere la cancellazione di un file, mentre leggere o scrivere o
820 cambiarne i permessi ha effetti solo sui tempi del file.
821
822 \begin{table}[htb]
823   \centering
824   \footnotesize
825   \begin{tabular}[c]{|l|c|c|c|c|c|c|l|}
826     \hline
827     Funzione & \multicolumn{3}{c}{File o directory} 
828     &\multicolumn{3}{c}{Directory genitrice} &Note \\
829     Funzione & \multicolumn{3}{c}{di riferimento} & 
830     \multicolumn{3}{c}{del riferimento} \\
831     \hline
832     \hline
833     \func{chmod}, \func{fchmod} 
834     &         &         &$\bullet$&         &         &         & \\
835     \func{chown}, \func{fchown} 
836     &         &         &$\bullet$&         &         &         & \\
837     \func{creat}  
838     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$&  con 
839     \macro{O\_CREATE} \\    \func{creat}  
840     &         &$\bullet$&$\bullet$&         &$\bullet$&$\bullet$&   
841     con \macro{O\_TRUNC} \\    \func{exec}  
842     &$\bullet$&         &         &         &         &         & \\
843     \func{lchown}  
844     &         &         &$\bullet$&         &         &         & \\
845     \func{link}
846     &         &         &$\bullet$&         &$\bullet$&$\bullet$& \\
847     \func{mkdir}
848     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$& \\
849     \func{mkfifo}
850     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$& \\
851     \func{open}
852     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$& con 
853     \macro{O\_CREATE} \\    \func{open}
854     &         &$\bullet$&$\bullet$&         &         &         & con 
855     \macro{O\_TRUNC}  \\    \func{pipe}
856     &$\bullet$&$\bullet$&$\bullet$&         &         &         & \\
857     \func{read}
858     &$\bullet$&         &         &         &         &         & \\
859     \func{remove}
860     &         &         &$\bullet$&         &$\bullet$&$\bullet$& using 
861     \func{unlink}\\    \func{remove}
862     &         &         &         &         &$\bullet$&$\bullet$& using 
863     \func{rmdir}\\ \func{rename}
864     &         &         &$\bullet$&         &$\bullet$&$\bullet$& per entrambi
865     gli argomenti\\ \func{rmdir}
866     &         &         &         &         &$\bullet$&$\bullet$& \\ 
867     \func{truncate}, \func{ftruncate}
868     &         &$\bullet$&$\bullet$&         &         &         & \\ 
869     \func{unlink}
870     &         &         &$\bullet$&         &$\bullet$&$\bullet$& \\ 
871     \func{utime}
872     &$\bullet$&$\bullet$&$\bullet$&         &         &         & \\ 
873     \func{write}
874     &         &$\bullet$&$\bullet$&         &         &         & \\ 
875     \hline
876   \end{tabular}
877   \caption{Effetti delle varie funzioni su tempi di ultimo accesso 
878     \textsl{(a)}, ultima modifica \textsl{(m)}  e ultimo cambiamento
879     \textsl{(c)}}
880   \label{tab:filedir_times_effects}  
881 \end{table}
882
883 Si noti infine come \var{st\_ctime} non abbia nulla a che fare con il tempo di
884 creazione del file usato da molti altri sistemi operativi, che in unix non
885 esiste.
886
887
888 \subsection{La funzione \texttt{utime}}
889 \label{sec:filedir_utime}
890
891 I tempi di ultimo accesso e modifica possono essere cambiati usando la
892 funzione \func{utime}, il cui prototipo è:
893
894 \begin{prototype}{utime.h}
895 {int utime(const char * filename, struct utimbuf *times)} 
896
897 Cambia i tempi di ultimo accesso e modifica dell'inode specificato da
898 \var{filename} secondo i campi \var{actime} e \var{modtime} di \var{times}. Se
899 questa è \macro{NULL} allora viene usato il tempo corrente.
900
901 La funzione restituisce zero in caso di successo e -1 in caso di errore, nel
902 qual caso \var{errno} è settata opportunamente.
903 \begin{errlist}
904 \item \texttt{EACCESS} non si ha il permesso di scrittura sul file.
905 \item \texttt{ENOENT} \var{filename} non esiste.
906 \end{errlist}
907 \end{prototype}
908  
909 La struttura \var{utimebuf} usata da \func{utime} è definita come:
910 \begin{lstlisting}{}
911 struct utimbuf {
912         time_t actime;  /* access time */
913         time_t modtime; /* modification time */
914 };
915 \end{lstlisting}
916
917 L'effetto della funzione e i privilegi necessari per eseguirla dipendono da
918 cosa è l'argomento \var{times}; se è \textit{NULL} la funzione setta il tempo
919 corrente e basta l'accesso in scrittura al file; se invece si è specificato un
920 valore la funzione avrà successo solo se si è proprietari del file (o si hanno
921 i privilegi di amministratore).
922
923 Si tenga presente che non è comunque possibile specificare il tempo di
924 cambiamento di stato del file, che viene comunque cambiato dal kernel anche
925 alla chiamata di \func{utime}; questo serve acnhe come misura di sicurezza per
926 evitare che si possa modificare un file nascondendo completamente le proprie
927 tracce.  In realtà la cosa resta possibile, se si è in grado di accedere al
928 device, scrivendo direttamente sul disco senza passare attraverso il
929 filesystem, ma ovviamente è molto più complicato da realizzare.
930
931
932
933 \section{Il controllo di accesso ai file}
934 \label{sec:filedir_access_control}
935
936 In unix è implementata da qualunque filesystem standard una forma elementare
937 (ma adatta alla maggior parte delle esigenze) di controllo di accesso ai
938 files. Torneremo sull'argomento in dettaglio più avanti (vedi
939 \secref{sec:filedir_access_control}), qui ci limitiamo ad una introduzione dei
940 concetti essenziali.
941
942 Si tenga conto poi che quanto diremo è vero solo per filesystem di tipo Unix,
943 e non è detto che sia applicabile (ed infatti non è vero per il filesystem di
944 Windows) a un filesystem qualunque. Esistono inoltre estensioni che permettono
945 di implementare le ACL (\textit{Access Control List}) che sono un meccanismo
946 di controllo di accesso molto più sofisticato.
947
948 Ad ogni file Unix associa sempre l'utente che ne è proprietario (il cosiddetto
949 \textit{owner}) e il gruppo di appartenenza, secondo il meccanismo degli uid e
950 gid accennato in \secref{sec:intro_multiuser}, e un insieme di permessi che
951 sono divisi in tre classi, e cioè attribuiti rispettivamente al proprietario,
952 a qualunque utente faccia parte del gruppo cui appartiene il file, e a tutti
953 gli altri utenti.
954
955 I permessi sono espressi da un insieme di 12 bit: di questi i nove meno
956 significativi sono usati a gruppi di tre per indicare i permessi base di
957 lettura, scrittura ed esecuzione (indicati rispettivamente con le lettere
958 \textit{w}, \textit{r} \textit{x}) applicabili rispettivamente al
959 proprietario, al gruppo, a tutti (una descrizione più dettagliata dei vari
960 permessi associati ai file è riportata in \secref{sec:filedir_suid_sgid}).  I
961 restanti tre bit sono usati per indicare alcune caratteristiche più complesse
962 (\textit{suid}, \textit{sgid}, e \textit{sticky}) su cui pure torneremo in
963 seguito (vedi \secref{sec:filedir_suid_sgid} e \secref{sec:filedir_sticky}).
964
965 Tutte queste informazioni sono tenute per ciascun file nell'inode. Quando un
966 processo cerca l'accesso al file esso controlla i propri uid e gid
967 confrontandoli con quelli del file e se l'operazione richiesta è compatibile
968 con i permessi associati al file essa viene eseguita, altrimenti viene
969 bloccata ed è restituito un errore di \texttt{EPERM}. Questo procedimento non
970 viene eseguito per l'amministratore di sistema (il cui uid è zero) il quale ha
971 pertanto accesso senza restrizione a qualunque file del sistema.
972
973 % In realtà il procedimento è più complesso di quanto descritto in maniera
974 % elementare qui; inoltre ad un processo sono associati diversi identificatori,
975 % torneremo su questo in maggiori dettagli in seguito in \secref{sec:proc_perms}.
976
977
978
979 \subsection{I flag \texttt{suid} e \texttt{sgid}}
980 \label{sec:filedir_suid_sgid}
981
982
983
984
985
986
987 \subsection{La titolarità di nuovi files e directory}
988 \label{sec:filedir_ownership}
989
990 \subsection{La funzione \texttt{access}}
991 \label{sec:filedir_access}
992
993 \subsection{La funzione \texttt{umask}}
994 \label{sec:filedir_umask}
995
996 \subsection{Le funzioni \texttt{chmod} e \texttt{fchmod}}
997 \label{sec:filedir_chmod}
998
999 \subsection{Il flag \texttt{sticky}}
1000 \label{sec:filedir_sticky}
1001
1002 \subsection{Le funzioni \texttt{chown}, \texttt{fchown} e \texttt{lchown}}
1003 \label{sec:filedir_chown}
1004
1005
1006
1007
1008 %La struttura fondamentale che contiene i dati essenziali relativi ai file è il
1009 %cosiddetto \textit{inode}; questo conterrà informazioni come il
1010 %tipo di file (file di dispositivo, directory, file di dati, per un elenco
1011 %completo vedi \ntab), i permessi (vedi \secref{sec:file_perms}), le date (vedi
1012 %\secref{sec:file_times}).
1013