Revisione di buona parte di filedir.tex
[gapil.git] / filedir.tex
1 \chapter{File e directory}
2 \label{cha:files_and_dirs}
3
4 In questo capitolo tratteremo in dettaglio le modalità con cui si gestiscono
5 file e directory, iniziando dalle funzioni di libreria che si usano per
6 copiarli, spostarli e cambiarne i nomi. Esamineremo poi l'interfaccia che
7 permette la manipolazione dei vari attributi di file e directory ed alla
8 finefaremo una trattazione dettagliata su come è strutturato il sistema base
9 di protezioni e controllo di accesso ai file e sulle funzioni che ne
10 permettono la gestione. Tutto quello che riguarda invece la manipolazione del
11 contenuto dei file è lasciato ai capitoli successivi.
12
13
14
15 \section{La manipolazione di file e directory}
16
17 Come già accennato in \secref{sec:file_filesystem} in un sistema unix-like la
18 gestione dei file ha delle caratteristiche specifiche che derivano
19 direttamente dall'architettura del sistema; in questa sezione esamineremo le
20 funzioni usate per manipolazione nel filesytem di file e directory, per la
21 creazione di link simbolici e diretti, per la gestione e la lettura delle
22 directory; mettendo in evidenza le conseguenze della struttura standard della
23 gestione dei file in un sistema unix-like, già accennate al capitolo
24 precedente.
25
26
27 \subsection{Le funzioni \func{link} e \func{unlink}}
28 \label{sec:file_link}
29
30 Una caratteristica comune a diversi sistemi operativi è quella di poter creare
31 dei nomi fittizi (come gli alias del MacOS o i collegamenti di Windows) che
32 permettono di fare riferiremento allo stesso file, chiamandolo con nomi
33 diversi o accedendovi da directory diverse.
34
35 Questo è possibile anche in ambiente unix, dove tali collegamenti sono
36 usualmente chiamati \textit{link}, ma data la struttura del sistema di
37 gestione dei file (ed in particolare quanto trattato in
38 \secref{sec:file_architecture}) ci sono due metodi sostanzialmente diversi per
39 fare questa operazione.
40
41 Come spiegato in \secref{sec:file_filesystem} l'accesso al contenuto di
42 un file su disco avviene attraverso il suo inode, e il nome che si trova in
43 una directory è solo una etichetta associata ad un puntatore a che fa
44 riferimento al suddetto inode.
45
46
47 Questo significa che la realizzazione di un link è immediata in quanto uno
48 stesso file può avere tanti nomi diversi allo stesso tempo, dati da
49 altrettante diverse associazioni allo stesso inode; si noti poi che nessuno di
50 questi nomi viene ad assumere una particolare preferenza rispetto agli altri.
51
52 Per aggiungere un nome ad un inode si utilizza la funzione \func{link}; si
53 suole chiamare questo tipo di associazione un collegamento diretto (o
54 \textit{hard link}).  Il prototipo della funzione e le sue caratteristiche
55 principali, come risultano dalla man page, sono le seguenti:
56 \begin{prototype}{unistd.h}
57 {int link(const char * oldpath, const char * newpath)}
58   Crea un nuovo collegamento diretto al file indicato da \var{oldpath}
59   dandogli nome \var{newpath}.
60   
61   La funzione restituisce zero in caso di successo e -1 in caso di errore. La
62   variabile \var{errno} viene settata opportunamente, i principali codici di
63   errore sono:
64   \begin{errlist}
65   \item \macro{EXDEV} \var{oldpath} e \var{newpath} non sono sullo
66     stesso filesystem.
67   \item \macro{EPERM} il filesystem che contiene \var{oldpath} e
68     \macro{newpath} non supporta i link diretti o è una directory.
69   \item \macro{EEXIST} un file (o una directory) con quel nome esiste di
70     già.
71   \item \macro{EMLINK} ci sono troppi link al file \var{oldpath} (il
72     numero massimo è specificato dalla variabile \macro{LINK\_MAX}, vedi
73     \secref{sec:xxx_limits}).
74   \end{errlist}
75   ed inoltre \macro{EACCES}, \macro{ENAMETOOLONG}, \macro{ENOTDIR},
76   \macro{EFAULT}, \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP},
77   \macro{ENOSPC}, \macro{EIO}.
78 \end{prototype}
79
80 La creazione di un nuovo collegamento diretto non copia il contenuto del file,
81 ma si limita a creare una voce nella directory specificata con \var{newpath} e
82 ad aumentare di uno il numero di referenze al file (riportato nel campo
83 \var{st\_nlink} della struttura \var{stat}, vedi \secref{sec:file_stat})
84 aggiungendo il nuovo nome ai precedenti. Si noti che uno stesso file può
85 essere così chiamato con vari nomi in diverse directory.
86  
87 Per quanto dicevamo in \secref{sec:file_filesystem} la creazione di un
88 collegamento diretto è possibile solo se entrambi i pathname sono nello stesso
89 filesystem; inoltre il filesystem deve supportare i collegamenti diretti (il
90 mneccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di
91 Windows). 
92
93 La funzione inoltre opera sia sui file ordinari che sugli altri oggetti del
94 filesystem, con l'eccezione delle directory. In alcuni sistemi solo
95 l'amministratore è in grado di creare un collegamento diretto ad un'altra
96 directory, questo viene fatto perché con una tale operazione è possibile
97 creare dei circoli nel filesystem (vedi l'esempio mostrato in
98 \secref{sec:file_symlink}, dove riprenderemo il discorso) che molti programmi
99 non sono in grado di gestire e la cui rimozione diventerebbe estremamente
100 complicata (in genere occorre far girare il programma \cmd{fsck} per riparare
101 il filesystem). 
102
103 Data la pericolosità di questa operazione e la disponibilità dei link
104 simbolici che possono fornire la stessa funzionalità senza questi problemi,
105 nei filesystem usati in Linux questa caratteristica è stata completamente
106 disabilitata, e al tentativo di creare un link diretto ad una directory la
107 funzione restituisce l'errore \macro{EPERM}.
108
109 La rimozione di un file (o più precisamente della voce che lo referenzia
110 all'interno di una directory) si effettua con la funzione \func{unlink}; il
111 suo prototipo è il seguente:
112
113 \begin{prototype}{unistd.h}{int unlink(const char * pathname)}
114   Cancella il nome specificato dal pathname nella relativa directory e
115   decrementa il numero di riferimenti nel relativo inode. Nel caso di link
116   simbolico cancella il link simbolico; nel caso di socket, fifo o file di
117   dispositivo rimuove il nome, ma come per i file i processi che hanno aperto
118   uno di questi oggetti possono continuare ad utilizzarlo.
119   
120   La funzione restituisce zero in caso di successo e -1 per un errore, nel
121   qual caso il file non viene toccato. La variabile \var{errno} viene
122   settata secondo i seguenti codici di errore:
123   \begin{errlist}
124   \item \macro{EISDIR} \var{pathname} si riferisce ad una directory
125     (valore specifico ritornato da Linux che non consente l'uso di
126     \var{unlink} con le directory, e non conforme allo standard POSIX, che
127     prescrive invece l'uso di \macro{EPERM} in caso l'operazione non sia
128     consentita o il processo non abbia privilegi sufficienti).
129   \item \macro{EROFS} \var{pathname} è su un filesystem montato in sola
130   lettura.
131   \item \macro{EISDIR} \var{pathname} fa riferimento a una directory.
132   \end{errlist}
133   ed inoltre: \macro{EACCES}, \macro{EFAULT}, \macro{ENOENT}, \macro{ENOTDIR},
134   \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP}, \macro{EIO}.
135
136 \end{prototype}
137
138 Per cancellare una voce in una directory è necessario avere il permesso di
139 scrittura su di essa (dato che si va a rimuovere una voce dal suo contenuto) e
140 il diritto di esecuzione sulla directory che la contiene (torneremo in
141 dettaglio sui permessi e gli attributi in \secref{sec:file_access_control}),
142 se inoltre lo \textit{sticky} bit è settato occorrerà anche essere proprietari
143 del file o proprietari della directory (o root, per cui nessuna delle
144 restrizioni è applicata).
145
146 Una delle caratteristiche di queste funzioni è che la creazione/rimozione
147 della nome dalla directory e l'incremento/decremento del numero di riferimenti
148 nell'inode deve essere una operazione atomica (cioè non interrompibile da
149 altri processi), per questo entrambe queste funzioni sono realizzate tramite
150 una singola system call.
151
152 Si ricordi infine che il file non viene eliminato dal disco fintanto che tutti
153 i riferimenti ad esso sono stati cancellati, solo quando il \textit{link
154   count} mantenuto nell'inode diventa zero lo spazio occupato viene rimosso. A
155 questo però si aggiunge una altra condizione, e cioè che non ci siano processi
156 che abbiano detto file aperto.  
157
158 Questa proprietà viene spesso usata per essere sicuri di non lasciare file
159 temporanei su disco in caso di crash dei programmi; la tecnica è quella di
160 aprire il file e chiamare \func{unlink} subito dopo, in questo modo il
161 contenuto del file è sempre disponibile all'interno del processo attraverso il
162 suo file descriptor (vedi \secref{sec:file_fd}) fintanto che il processo non
163 chiude il file, ma non ne resta traccia in nessuna directory, e lo spazio
164 occupato su disco viene immediatamente rilasciato alla conclusione del
165 processo (quando tutti i file vengono chiusi).
166
167
168 \subsection{Le funzioni \func{remove} e \func{rename}}
169 \label{sec:file_remove}
170
171 Al contrario di quanto avviene con altri unix in Linux non è possibile usare
172 \func{unlink} sulle directory, per cancellare una directory si può usare la
173 funzione \func{rmdir} (vedi \secref{sec:file_dir_creat_rem}), oppure la
174 funzione \func{remove}. Questa è la funzione prevista dallo standard ANSI C
175 per cancellare un file o una directory (e funziona anche per i sistemi che non
176 supportano i link diretti), che per i file è identica alla \func{unlink} e per
177 le directory è identica alla \func{rmdir}:
178
179 \begin{prototype}{stdio.h}{int remove(const char *pathname)}
180   Cancella un nome dal filesystem. Usa \func{unlink} per i file e
181   \func{rmdir} per le directory.
182   
183   La funzione restituisce zero in caso di successo e -1 per un errore, nel
184   qual caso il file non viene toccato. Per i codici di errori vedi quanto
185   riportato nelle descrizioni di \func{unlink} e \func{rmdir}.
186 \end{prototype}
187
188 Per cambiare nome ad un file (o a una directory) si usa invece la funzione
189 \func{rename}\footnote{la funzione è definita dallo standard ANSI C solo per i
190   file, POSIX estende la funzione anche alle directory}, il cui prototipo è:
191
192 \begin{prototype}{stdio.h}
193 {int rename(const char *oldpath, const char *newpath)}
194   Rinomina un file, spostandolo fra directory diverse quando richiesto.
195   
196   La funzione restituisce zero in caso di successo e -1 per un errore, nel
197   qual caso il file non viene toccato. La variabile \var{errno} viene settata
198   secondo i seguenti codici di errore:
199   \begin{errlist} 
200   \item \macro{EISDIR} \var{newpath} è una directory mentre \var{oldpath} non
201     è una directory.
202   \item \macro{EXDEV} \var{oldpath} e \var{newpath} non sono sullo stesso
203     filesystem.
204   \item \macro{ENOTEMPTY} \var{newpath} è una directory già esistente e non
205     vuota.
206   \item \macro{EBUSY} o \var{oldpath} o \var{newpath} sono in uso da parte di
207     qualche processo (come directory di lavoro o come root) o del sistema
208     (come mount point).
209   \item \macro{EINVAL} \var{newpath} contiene un prefisso di \var{oldpath} o
210     più in generale si è cercato di creare una directory come sottodirectory
211     di se stessa.
212   \item \macro{EMLINK} \var{oldpath} ha già il massimo numero di link
213     consentiti o è una directory e la directory che contiene \var{newpath} ha
214     già il massimo numero di link.
215   \item \macro{ENOTDIR} Uno dei componenti dei pathname non è una directory o
216     \var{oldpath} è una directory e \var{newpath} esiste e non è una
217     directory.
218   \item \macro{EPERM} le directory contenenti \var{oldpath} o \var{newpath}
219     hanno lo sticky bit attivo e i permessi del processo non consentono
220     rispettivamente la cancellazione e la creazione del file, o il filesystem
221     non supporta i link.
222   \end{errlist} 
223   ed inoltre \macro{EACCESS}, \macro{ENOENT}, \macro{ENOMEM}, \macro{EROFS},
224   \macro{ELOOP} e \macro{ENOSPC}.
225 \end{prototype}
226
227
228 il vantaggio nell'uso
229 di questa funzione al posto della chiamata successiva di \func{link} e
230 \func{unlink} è che l'operazione è eseguita atomicamente, e non c'è un momento
231 in cui il file su disco presenta ad un altro processo un diverso numero di
232 collegamenti diretti. Inoltre in questo modo non c'è modo che il nuovo nome
233 esista senza essere connesso all'inode; se si ha un crollo del sistema durante
234 l'esecuzione può essere possibile che entrambi i nomi esistano, ma il nuovo
235 nome quando esiste, è sempre connesso al file.
236
237
238 L'effetto è diverso a seconda che si voglia spostare un file o una directory;
239 se ci riferisce a un file allora \var{newpath} deve essere una di
240
241
242 \subsection{I link simbolici}
243 \label{sec:file_symlink}
244
245 Siccome la funzione \func{link} crea riferimenti agli inodes, essa può
246 funzionare soltanto per file che risiedono sullo stesso filesystem, dato che
247 in questo caso è garantita l'unicità dell'inode, e solo per un filesystem di
248 tipo unix.  Inoltre in Linux non è consentito eseguire un link diretto ad una
249 directory.
250
251 Per ovviare a queste limitazioni i sistemi unix supportano un'altra forma di
252 link (i cosiddetti \textit{soft link} o \textit{symbolic link}), che sono,
253 come avviene in altri sistemi operativi, dei file che contengono il
254 semplicemente il riferimento ad un altro file (o directory). In questo modo è
255 possibile effettuare link anche attraverso filesystem diversi e a directory, e
256 pure a file che non esistono ancora.
257
258 Il sistema funziona in quanto i link simbolici sono contrassegnati come tali
259 al kernel (analogamente a quanto avviene per le directory) per cui la chiamata
260 ad una \var{open} o una \var{stat} su un link simbolico comporta la lettura
261 del contenuto del medesimo e l'applicazione della funzione al file specificato
262 da quest'ultimo. Invece altre funzioni come quelle per cancellare o rinominare
263 i file operano direttamente sul link simbolico (per l'elenco vedi \ntab).
264 Inoltre esistono funzioni apposite, come la \func{readlink} e la \func{lstat}
265 per accedere alle informazioni del link invece che a quelle del file a cui
266 esso fa riferimento.
267
268 Le funzioni per operare sui link simbolici sono le seguenti, esse sono tutte
269 dichiarate nell'header file \file{unistd.h}.
270
271 \begin{prototype}{unistd.h}
272 {int symlink(const char * oldname, const char * newname)}
273   Crea un nuovo link simbolico al file indicato da \var{oldname} dandogli
274   nome \func{newname}.
275   
276   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
277   di errore. La variabile \var{errno} viene settata secondo i codici di
278   errore standard di accesso ai file (trattati in dettaglio in
279   \secref{sec:file_access_control}) ai quali si aggiungono i seguenti:
280   \begin{errlist}
281   \item \macro{EEXIST} Un file (o una directory) con quel nome esiste di
282     già.
283   \item \macro{EROFS} La directory su cui si vuole inserire il nuovo link è
284     su un filesystem montato in sola lettura.
285   \item \macro{ENOSPC} La directory o il filesystem in cui si vuole creare il
286     link è piena e non c'è ulteriore spazio disponibile.
287   \item \macro{ELOOP} Ci sono troppi link simbolici nella risoluzione di
288     \var{oldname} o di \var{newname}.
289   \end{errlist}
290 \end{prototype}
291
292 Dato che la funzione \func{open} segue i link simbolici, è necessaria usare
293 un'altra funzione quando si vuole leggere il contenuto di un link simbolico,
294 questa funzione è la:
295
296 \begin{prototype}{unistd.h}
297 {int readlink(const char * path, char * buff, size\_t size)} 
298   Legge il contenuto del link simbolico indicato da \var{path} nel buffer
299   \var{buff} di dimensione \var{size}. Non chiude la stringa con un
300   carattere nullo e la tronca a \var{size} nel caso il buffer sia troppo
301   piccolo per contenerla.
302   
303   La funzione restituisce il numero di caratteri letti dentro \var{buff} o
304   -1 per un errore, in caso di errore. La variabile \var{errno} viene
305   settata secondo i codici di errore:
306   \begin{errlist}
307   \item \macro{EEXIST} Un file (o una directory) con quel nome esiste di
308     già.
309   \item \macro{EROFS} La directory su cui si vuole inserire il nuovo link è
310     su un filesystem montato in sola lettura.
311   \item \macro{ENOSPC} La directory o il filesystem in cui si vuole creare il
312     link è piena e non c'è ulteriore spazio disponibile.
313   \end{errlist}
314 \end{prototype}
315
316 In \ntab\ si è riportato un elenco dei comportamenti delle varie funzioni che
317 operano sui file rispetto ai link simbolici; specificando quali seguono il
318 link simbolico e quali possono operare direttamente sul suo contenuto.
319 \begin{table}[htb]
320   \centering
321   \footnotesize
322   \begin{tabular}[c]{|l|c|c|}
323     \hline
324     \textbf{Funzione} & \textbf{Segue il link} & \textbf{Non segue il link} \\
325     \hline 
326     \hline 
327     \func{access}   & $\bullet$ &           \\
328     \func{chdir}    & $\bullet$ &           \\
329     \func{chmod}    & $\bullet$ &           \\
330     \func{chown}    &           & $\bullet$ \\
331     \func{creat}    & $\bullet$ &           \\
332     \func{exec}     & $\bullet$ &           \\
333     \func{lchown}   & $\bullet$ & $\bullet$ \\
334     \func{link}     &           &           \\
335     \func{lstat}    &           & $\bullet$ \\
336     \func{mkdir}    & $\bullet$ &           \\
337     \func{mkfifo}   & $\bullet$ &           \\
338     \func{mknod}    & $\bullet$ &           \\
339     \func{open}     & $\bullet$ &           \\
340     \func{opendir}  & $\bullet$ &           \\
341     \func{pathconf} & $\bullet$ &           \\
342     \func{readlink} &           & $\bullet$ \\
343     \func{remove}   &           & $\bullet$ \\
344     \func{rename}   &           & $\bullet$ \\
345     \func{stat}     & $\bullet$ &           \\
346     \func{truncate} & $\bullet$ &           \\
347     \func{unlink}   &           & $\bullet$ \\
348     \hline 
349   \end{tabular}
350   \caption{Uso dei link simbolici da parte di alcune funzioni.}
351   \label{tab:file_symb_effect}
352 \end{table}
353 si noti che non si è specificato il comportamento delle funzioni che operano
354 con i file descriptor, in quanto la gestione del link simbolico viene in
355 genere effettuata dalla funzione che restituisce il file descriptor
356 (normalmente la \func{open}).
357
358 \begin{figure}[htb]
359   \centering
360   \includegraphics[width=5cm]{img/link_loop.eps}
361   \caption{Esempio di loop nel filesystem creato con un link simbolico.}
362   \label{fig:file_link_loop}
363 \end{figure}
364
365 Un caso comune che si può avere con i link simbolici è la creazione dei
366 cosiddetti \textit{loop}. La situazione è illustrata in \curfig, che riporta
367 la struttura della directory \file{/boot}. Come si vede si è creato al suo
368 interno un link simbolico che punta di nuovo a \file{/boot}\footnote{Questo
369   tipo di loop è stato effettuato per poter permettere a \cmd{grub} (un
370   bootloader estremamente avanzato in grado di accedere direttamente
371   attraverso vari filesystem al file da lanciare come sistema operativo) di
372   vedere i file in questa directory, che è montata su una partizione separata
373   (e che grub vedrebbe come radice), con lo stesso path con cui verrebbero
374   visti dal sistema operativo.}. 
375
376 Questo può causare problemi per tutti quei programmi che effettuano la
377 scansione di una directory senza tener conto dei link simbolici, ad esempio se
378 lanciassimo un comando del tipo \cmd{grep -r linux *}, il loop nella directory
379 porterebbe il comando ad esaminare \file{/boot}, \file/{boot/boot},
380 \file/{boot/boot/boot} e così via, fino a generare un errore (che poi è
381 \macro{ELOOP}) quando viene superato il numero massimo di link simbolici
382 consentiti (uno dei limiti del sistema, posto proprio per poter uscire da
383 questo tipo di situazione).
384
385 Un secondo punto da tenere presente è che un link simbolico può essere fatto
386 anche ad un file che non esiste; ad esempio possiamo creare un file temporaneo
387 nella nostra directory con un link del tipo:
388 \begin{verbatim}
389 $ ln -s /tmp/tmp_file temporaneo
390 \end{verbatim}%$
391 ma anche se \file{/tmp/tmp\_file} non esiste (quello che viene chiamato un
392 \textit{dangling link}, letteralemnte \textsl{link ciondolante}). Aprendo in
393 scrittura \file{temporaneo} questo verrà scritto; ma se cercassimo di
394 accederlo in sola lettura (ad esempio con \cmd{cat}) otterremmo:
395 \begin{verbatim}
396 $ cat temporaneo
397 cat: temporaneo: No such file or directory
398 \end{verbatim}%$
399 con un errore che può sembrare sbagliato, dato \cmd{ls} ci mostrerebbe
400 l'esistenza di \file{temporaneo}.
401
402
403 \subsection{Le funzioni \func{mkdir} e \func{rmdir}} 
404 \label{sec:file_dir_creat_rem}
405
406 Queste due funzioni servono per creare e cancellare delle directory e sono
407 omonime degli analoghi comandi di shell.  Per poter accedere ai tipi usati
408 da queste funzioni si deve includere il file \file{sys/types.h}, il
409 protoripo della prima è:
410
411 \begin{prototype}{sys/stat.h}
412   {int mkdir (const char * dirname, mode\_t mode)} 
413   Crea una nuova directory vuota con il nome indicato da \var{dirname},
414   assegnandole i permessi indicati da \var{mode}. Il nome può essere indicato
415   con il pathname assoluto o relativo.
416   
417   La funzione restituisce zero in caso di successo e -1 per un errore, nel
418   qual caso \var{errno} assumerà i valori:
419   \begin{errlist}
420   \item \macro{EEXIST} Un file (o una directory) con quel nome esiste di già. 
421   \item \macro{EACCESS} 
422     Non c'è il permesso di scrittura per la directory in cui si vuole inserire
423     la nuova directory.
424   \item \macro{EMLINK} La directory in cui si vuole creare la nuova directory
425     contiene troppi file. Sotto Linux questo normalmente non avviene perché il
426     filesystem standard consente la creazione di un numero di file maggiore di
427     quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che
428     fare anche con filesystem di altri sistemi questo errore può presentarsi.
429   \item \macro{ENOSPC} Non c'è abbastanza spazio sul file system per creare
430     la nuova directory o si è esaurita la quota disco dell'utente.
431   \end{errlist}
432   ed inoltre anche \macro{EPERM}, \macro{EFAULT}, \macro{ENAMETOOLONG},
433   \macro{ENOENT}, \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP},
434   \macro{EROFS}.
435 \end{prototype}
436  
437
438
439 \begin{prototype}{sys/stat.h}
440   {int rmdir (const char * dirname)} 
441   Cancella la directory \var{dirname}, che deve essere vuota.  Il nome può
442   essere indicato con il pathname assoluto o relativo.
443   
444   La funzione restituisce zero in caso di successo e -1 per un errore, nel
445   qual caso \var{errno} assumerà i valori:
446   \begin{errlist}
447   \item \macro{EPERM} Il filesystem non supporta la cancellazione di
448     directory, oppure la directory che contiene \var{dirname} ha lo sticky bit
449     settato e l'\textit{effective user id} del processo non corrisponde al
450     proprietario della directory. 
451   \item \macro{EACCESS} Non c'è il permesso di scrittura per la directory che
452     contiene la directory che si vuole cancellare, o non c'è il permesso di
453     attraversare (esecuzione) una delle directory specificate in
454     \var{dirname}.
455   \item \macro{EBUSY} La directory specificata è la directory di lavoro o la
456     radice di qualche processo.
457   \item \macro{ENOTEMPTY} La directory non è vuota.
458   \end{errlist}
459   ed inoltre anche \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT},
460   \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP}, \macro{EROFS}.
461 \end{prototype}
462  
463
464
465 \subsection{Accesso alle directory}
466 \label{sec:file_dir_read}
467
468 Benché le directory siano oggetti del filesystem come tutti gli altri non ha
469 ovviamente senso aprirle come fossero dei file di dati. Può però essere utile
470 poterne leggere il contenuto ad esempio per fare la lista dei file che esse
471 contengono o ricerche sui medesimi.
472
473 Per accedere al contenuto delle directory si usano i cosiddetti
474 \textit{directory streams} (chiamati così per l'analogia con i file stream);
475 la funzione \func{opendir} apre uno di questi stream e la funzione
476 \func{readdir} legge il contenuto della directory, i cui elementi sono le
477 \textit{directory entry} (da distinguersi da quelle della cache di cui
478 parlavamo in \secref{sec:file_vfs}) in una opportuna struttura
479 \var{struct dirent}.
480
481 (NdA Il resto va scritto!!! É noioso e lo farò più avanti).
482
483
484
485 \subsection{La directory di lavoro}
486 \label{sec:file_work_dir}
487
488 A ciascun processo è associato ad una directory nel filesystem che è chiamata
489 directory corrente o directory di lavoro (\textit{current working directory})
490 che è quella a cui si fa riferimento quando un filename è espresso in forma
491 relativa (relativa appunto a questa directory).
492
493 Quando un utente effettua il login questa directory viene settata alla
494 cosiddetta \textit{home directory} del suo account, il comando \cmd{cd}
495 della shell consente di cambiarla a piacere, spostandosi da una directory ad
496 un'altra.  Siccome la directory corrente resta la stessa quando viene creato
497 un processo figlio, la directory corrente della shell diventa anche la
498 directory corrente di qualunque comando da essa lanciato.
499
500 Le funzioni qui descritte servono esaminare e cambiare la directory di lavoro
501 corrente. 
502
503 \begin{prototype}{unistd.h}{char * getcwd (char * buffer, size\_t size)}
504   Restituisce il filename completo della directory di lavoro corrente nella
505   stringa puntata da \var{buffer}, che deve essere precedentemente
506   allocata, per una dimensione massima di \var{size}. Si può anche
507   specificare un puntatore nullo come \var{buffer}, nel qual caso la
508   stringa sarà allocata automaticamente per una dimensione pari a
509   \var{size} qualora questa sia diversa da zero, o della lunghezza esatta
510   del pathname altrimenti. In questo caso si deve ricordare di disallocare la
511   stringa una volta cessato il suo utilizzo.
512   
513   La funzione restituisce il puntatore \var{buffer} se riesce,
514   \macro{NULL} se fallisce, in quest'ultimo caso la variabile
515   \var{errno} è settata con i seguenti codici di errore:
516   \begin{errlist}
517   \item \macro{EINVAL} L'argomento \var{size} è zero e \var{buffer} non
518     è nullo.
519   \item \macro{ERANGE} L'argomento \var{size} è più piccolo della
520     lunghezza del pathname. 
521   \item \macro{EACCESS} Manca il permesso di lettura o di ricerca su uno dei
522     componenti del pathname (cioè su una delle directory superiori alla
523     corrente).
524   \end{errlist}
525 \end{prototype}
526
527 Di questa funzione esiste una versione \func{char * getwd(char * buffer)}
528 fatta per compatibilità all'indietro con BSD, che non consente di specificare
529 la dimensione del buffer; esso deve essere allocato in precedenza ed avere una
530 dimensione superiore a \macro{PATH\_MAX} (di solito 256 byte, vedi
531 \secref{sec:xxx_limits}); il problema è che in Linux non esiste una dimensione
532 superiore per un pathname, per cui non è detto che il buffer sia sufficiente a
533 contenere il nome del file, e questa è la ragione principale per cui questa
534 funzione è deprecata.
535
536 Una seconda funzione simile è \func{char * get\_current\_dir\_name(void)}
537 che è sostanzialmente equivalente ad una \func{getcwd(NULL, 0)}, con la sola
538 differenza che essa ritorna il valore della variabile di ambiente
539 \macro{PWD}, che essendo costruita dalla shell può contenere anche dei
540 riferimenti simbolici.
541
542 Come già detto in unix anche le directory sono file, è possibile pertanto
543 riferirsi ad esse tramite il file descriptor dell'interfaccia a basso livello,
544 e non solo tramite il filename; per questo motivo ci sono due diverse funzioni
545 per cambiare directory di lavoro.
546
547 \begin{prototype}{unistd.h}{int chdir (const char * pathname)}
548   Come dice il nome (che significa \textit{change directory}) questa funzione
549   serve a cambiare la directory di lavoro a quella specificata dal pathname
550   contenuto nella stringa \texttt{pathname}.
551 \end{prototype}
552   
553 \begin{prototype}{unistd.h}{int fchdir (int filedes)} 
554   Analoga alla precedente, ma usa un file descriptor invece del pathname.
555   
556   Entrambe le funzioni restituiscono zero in caso di successo e -1 per un
557   errore, in caso di errore \var{errno} viene settata secondo i codici di
558   errore standard di accesso ai file (trattati in dettaglio in
559   \secref{sec:file_access_control}) ai quali si aggiunge il codice
560   \macro{ENOTDIR} nel caso il \var{filename} indichi un file che non sia una
561   directory.
562 \end{prototype}
563
564
565
566 \section{La manipolazione delle caratteristiche dei files}
567 \label{sec:file_infos}
568
569 Come spiegato in \secref{sec:file_filesystem} tutte le informazioni
570 generali relative alle caratteristiche di ciascun file, a partire dalle
571 informazioni relative al controllo di accesso, sono mantenute nell'inode.
572
573 Vedremo in questa sezione come sia possibile leggere tutte queste informazioni
574 usando la funzione \func{stat}, che permette l'accesso a tutti i dati
575 memorizzati nell'inode; esamineremo poi le varie funzioni usate per manipolare
576 tutte queste informazioni (eccetto quelle che riguardano la gestione del
577 controllo di accesso, trattate in in \secref{sec:file_access_control}).
578
579
580 \subsection{Le funzioni \func{stat}, \func{fstat} e \func{lstat}}
581 \label{sec:file_stat}
582
583 La lettura delle informazioni relative ai file è fatta attraverso la famiglia
584 delle funzioni \func{stat}; questa è la funzione che ad esempio usa il comando
585 \cmd{ls} per poter ottenere e mostrare tutti i dati dei files. I prototipi di
586 queste funzioni sono i seguenti:
587 \begin{functions}
588   \headdecl{sys/types.h} 
589   \headdecl{sys/stat.h} 
590   \headdecl{unistd.h}
591
592   \funcdecl{int stat(const char *file\_name, struct stat *buf)} Legge le
593   informazione del file specificato da \var{file\_name} e le inserisce in
594   \var{buf}.
595   
596   \funcdecl{int lstat(const char *file\_name, struct stat *buf)} Identica a
597   \func{stat} eccetto che se il \var{file\_name} è un link simbolico vengono
598   lette le informazioni relativa ad esso e non al file a cui fa riferimento.
599   
600   \funcdecl{int fstat(int filedes, struct stat *buf)} Identica a \func{stat}
601   eccetto che si usa con un file aperto, specificato tramite il suo file
602   descriptor \var{filedes}.
603   
604   Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
605   caso di errore \var{errno} può assumere uno dei valori: \macro{EBADF},
606   \macro{ENOENT}, \macro{ENOTDIR}, \macro{ELOOP}, \macro{EFAULT},
607   \macro{EACCESS}, \macro{ENOMEM}, \macro{ENAMETOOLONG}.
608 \end{functions}
609
610 La struttura \var{stat} è definita nell'header \file{sys/stat.h} e in
611 generale dipende dall'implementazione, la versione usata da Linux è mostrata
612 in \nfig, così come riportata dalla man page (in realtà la definizione
613 effettivamente usata nel kernel dipende dall'architettura e ha altri campi
614 riservati per estensioni come tempi più precisi, o per il padding dei campi).
615
616 \begin{figure}[!htb]
617   \footnotesize
618   \centering
619   \begin{minipage}[c]{15cm}
620     \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
621 struct stat {
622     dev_t         st_dev;      /* device */
623     ino_t         st_ino;      /* inode */
624     mode_t        st_mode;     /* protection */
625     nlink_t       st_nlink;    /* number of hard links */
626     uid_t         st_uid;      /* user ID of owner */
627     gid_t         st_gid;      /* group ID of owner */
628     dev_t         st_rdev;     /* device type (if inode device) */
629     off_t         st_size;     /* total size, in bytes */
630     unsigned long st_blksize;  /* blocksize for filesystem I/O */
631     unsigned long st_blocks;   /* number of blocks allocated */
632     time_t        st_atime;    /* time of last access */
633     time_t        st_mtime;    /* time of last modification */
634     time_t        st_ctime;    /* time of last change */
635 };
636     \end{lstlisting}
637   \end{minipage} 
638   \normalsize 
639   \caption{La struttura \texttt{stat} per la lettura delle informazioni dei 
640     file}
641   \label{fig:file_stat_struct}
642 \end{figure}
643
644 Si noti come i vari membri della struttura siano specificati come tipi nativi
645 del sistema (di quelli definiti in \tabref{tab:xxx_sys_types}, e dichiarati in
646 \file{sys/types.h}). 
647
648
649 \subsection{I tipi di file}
650 \label{sec:file_types}
651
652 Come riportato in \tabref{tab:file_file_types} in Linux oltre ai file e
653 alle directory esistono vari altri oggetti che possono stare su un filesystem;
654 il tipo di file è ritornato dalla \func{stat} nel campo \var{st\_mode}
655 (che è quello che contiene anche le informazioni relative ai permessi).
656
657 Dato che il valore numerico può variare a seconda delle implementazioni, lo
658 standard POSIX definisce un insieme di macro per verificare il tipo di files,
659 queste vengono usate anche da Linux che supporta pure le estensioni per link
660 simbolici e socket definite da BSD, l'elenco completo di tutte le macro è
661 riportato in \ntab.
662 \begin{table}[htb]
663   \centering
664   \footnotesize
665   \begin{tabular}[c]{|l|l|}
666     \hline
667     \textbf{Macro} & \textbf{Tipo del file} \\
668     \hline
669     \hline
670     \macro{S\_ISREG(m)}  & file regolare \\
671     \macro{S\_ISDIR(m)}  & directory \\
672     \macro{S\_ISCHR(m)}  & device a caratteri \\
673     \macro{S\_ISBLK(m)}  & device a blocchi\\
674     \macro{S\_ISFIFO(m)} & fifo \\
675     \macro{S\_ISLNK(m)}  & link simbolico \\
676     \macro{S\_ISSOCK(m)} & socket \\
677     \hline    
678   \end{tabular}
679   \caption{Macro per i tipi di file (definite in \texttt{sys/stat.h})}
680   \label{tab:file_type_macro}
681 \end{table}
682
683 Oltre a queste macro è possibile usare direttamente il valore di
684 \var{st\_mode} per ricavare il significato dei vari bit in esso memorizzati,
685 per questo sempre in \file{sys/stat.h} sono definiti i flag riportati in
686 \ntab:
687 \begin{table}[htb]
688   \centering
689   \footnotesize
690   \begin{tabular}[c]{|l|c|l|}
691     \hline
692     \textbf{Flag} & \textbf{Valore} & \textbf{Significato} \\
693     \hline
694     \hline
695     \macro{S\_IFMT}   &  0170000 & bitmask per i bit del tipo di file \\
696     \macro{S\_IFSOCK} &  0140000 & socket             \\
697     \macro{S\_IFLNK}  &  0120000 & link simbolico     \\
698     \macro{S\_IFREG}  &  0100000 & file regolare      \\ 
699     \macro{S\_IFBLK}  &  0060000 & device a blocchi   \\
700     \macro{S\_IFDIR}  &  0040000 & directory          \\ 
701     \macro{S\_IFCHR}  &  0020000 & device a caratteri \\
702     \macro{S\_IFIFO}  &  0010000 & fifo               \\
703     \hline
704     \macro{S\_ISUID}  &  0004000 & set UID bit   \\
705     \macro{S\_ISGID}  &  0002000 & set GID bit   \\
706     \macro{S\_ISVTX}  &  0001000 & sticky bit    \\
707     \hline
708 %    \macro{S\_IRWXU}  &  00700   & bitmask per i permessi del proprietario  \\
709     \macro{S\_IRUSR}  &  00400   & il proprietario ha permesso di lettura   \\
710     \macro{S\_IWUSR}  &  00200   & il proprietario ha permesso di scrittura \\
711     \macro{S\_IXUSR}  &  00100   & il proprietario ha permesso di esecuzione\\
712     \hline
713 %    \macro{S\_IRWXG}  &  00070   & bitmask per i permessi del gruppo        \\
714     \macro{S\_IRGRP}  &  00040   & il gruppo ha permesso di lettura         \\
715     \macro{S\_IWGRP}  &  00020   & il gruppo ha permesso di scrittura       \\
716     \macro{S\_IXGRP}  &  00010   & il gruppo ha permesso di esecuzione      \\
717     \hline
718 %    \macro{S\_IRWXO}  &  00007   & bitmask per i permessi di tutti gli altri\\
719     \macro{S\_IROTH}  &  00004   & gli altri hanno permesso di lettura      \\
720     \macro{S\_IWOTH}  &  00002   & gli altri hanno permesso di esecuzione   \\
721     \macro{S\_IXOTH}  &  00001   & gli altri hanno permesso di esecuzione   \\
722     \hline    
723   \end{tabular}
724   \caption{Costanti per l'identificazione dei vari bit che compongono il campo
725     \var{st\_mode} (definite in \file{sys/stat.h})}
726   \label{tab:file_mode_flags}
727 \end{table}
728
729 Il primo valore definisce la maschera dei bit usati nei quali viene
730 memorizzato il tipo di files, mentre gli altri possono essere usati per
731 effettuare delle selezioni sul tipo di file voluto, combinando opportunamente
732 i vari flag; ad esempio se si volesse controllare se un file è una directory o
733 un file ordinario si potrebbe definire la condizione:
734 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
735 #define IS_FILE_DIR(x) (((x) & S_IFMT) & (S_IFDIR | S_IFREG))
736 \end{lstlisting}
737 in cui prima si estraggono da \var{st\_mode} i bit relativi al tipo di file e
738 poi si effettua il confronto con la combinazione di tipi scelta.
739
740
741 \subsection{La dimensione dei file}
742 \label{sec:file_file_size}
743
744 Il membro \var{st\_size} contiene la dimensione del file in byte (se il file
745 è un file normale, nel caso di un link simbolico al dimensione è quella del
746 pathname che contiene). 
747
748 Il campo \var{st\_blocks} definisce la lunghezza del file in blocchi di 512
749 byte. Il campo \var{st\_blksize} infine definisce la dimensione preferita per
750 i trasferimenti sui file (che è la dimensione usata anche dalle librerie del C
751 per l'interfaccia degli stream); scrivere sul file a blocchi di dati di
752 dimensione inferiore sarebbe inefficiente.
753
754 Si tenga conto che lunghezza del file riportata in \var{st\_size} non è detto
755 che corrisponda all'occupazione dello spazio su disco per via della possibile
756 esistenza dei cosiddetti \textsl{buchi} (detti normalmente \textit{holes}) che
757 si formano tutte le volte che si va a scrivere su un file dopo aver eseguito
758 una \func{seek} (vedi \secref{sec:file_lseek}) oltre la sua conclusione
759 corrente.
760
761 In tal caso si avranno differenti risultati a seconda del modi in cui si
762 calcola la lunghezza del file, ad esempio il comando \cmd{du}, (che riporta il
763 numero di blocchi occupati) potrà dare una dimensione inferiore, mentre se si
764 legge dal file (ad esempio usando \cmd{wc -c}), dato che in tal caso per le
765 parti non scritte vengono restituiti degli zeri, si avrà lo stesso risultato
766 di \cmd{ls}.
767
768 Se è sempre possibile allargare un file scrivendoci sopra od usando la
769 funzione \func{seek} per spostarsi oltre la sua fine. Esistono però anche casi
770 in cui si può avere bisogno di effettuare un troncamento scartando i dati al
771 di là della dimensione scelta come nuova fine del file.
772
773 Un file può essere troncato a zero aprendolo con il flag \macro{O\_TRUNC}, ma
774 questo è un caso particolare; per qualunque altra dimensione si possono usare
775 le due funzioni:
776 \begin{functions}
777   \headdecl{unistd.h} \funcdecl{int truncate(const char *file\_name, off\_t
778     length)} Fa si che la dimensione del file \var{file\_name} sia troncata ad
779     un valore massimo specificato da \var{lenght}. 
780   
781   \funcdecl{int ftruncate(int fd, off\_t length))} Identica a \func{truncate}
782   eccetto che si usa con un file aperto, specificato tramite il suo file
783   descriptor \var{fd}.
784   
785   Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
786   caso di errore \var{errno} viene settato opportunamente; per
787   \func{ftruncate} si hanno i valori:
788   \begin{errlist}
789   \item \macro{EBADF} \var{fd}  non è un file descriptor.
790   \item \texttt{EINVAL} \var{fd} è un riferimento ad un socket, non a un file
791     o non è aperto in scrittura.
792   \end{errlist}
793   per \func{truncate} si hanno:
794   \begin{errlist}
795   \item \texttt{EACCES} il file non ha permesso di scrittura o non si ha il
796     permesso di esecuzione una delle directory del pathname. 
797   \item \texttt{ETXTBSY} Il file è un programma in esecuzione.
798   \end{errlist}
799   ed anche \macro{ENOTDIR}, \macro{ENAMETOOLONG}, \macro{ENOENT},
800   \macro{EROFS}, \macro{EIO}, \macro{EFAULT}, \macro{ELOOP}.
801 \end{functions}
802
803 Se il file è più lungo della lunghezza specificata i dati in eccesso saranno
804 perduti; il comportamento in caso di lunghezza inferiore non è specificato e
805 dipende dall'implementazione: il file può essere lasciato invariato o esteso
806 fino alla lunghezza scelta; in quest'ultimo caso lo spazio viene riempito con
807 zeri (e in genere si ha la creazione di un hole nel file).
808
809
810 \subsection{I tempi dei file}
811 \label{sec:file_file_times}
812
813 Il sistema mantiene per ciascun file tre tempi. Questi sono registrati
814 nell'inode insieme agli altri attributi del file e possono essere letti tramite
815 la funzione \func{stat}, che li restituisce attraverso tre campi della
816 struttura in \figref{fig:file_stat_struct}. Il significato di detti tempi e
817 dei relativi campi è riportato nello schema in \ntab:
818
819 \begin{table}[htb]
820   \centering
821   \footnotesize
822   \begin{tabular}[c]{|c|l|l|c|}
823     \hline
824     \textbf{Membro} & \textbf{Significato} & \textbf{Funzione} 
825     & \textbf{Opzione} \\
826     \hline
827     \hline
828     \var{st\_atime}& ultimo accesso ai dati del file &\func{read}& \cmd{-u}\\ 
829     \var{st\_mtime}& ultima modifica ai dati del file &\func{write}& default\\ 
830     \var{st\_ctime}& ultima modifica ai dati dell'inode&\func{chmod}, 
831     \func{utime} & \cmd{-c} \\ 
832     \hline
833   \end{tabular}
834   \caption{I tre tempi associati a ciascun file}
835   \label{tab:file_file_times}
836 \end{table}
837
838 Il primo punto da tenere presente è la differenza fra il cosiddetto tempo di
839 modifica (il \textit{modification time} \var{st\_mtime}) e il tempo di
840 cambiamento di stato (il \textit{chage time} \var{st\_ctime}). Il primo
841 infatti fa riferimento ad una modifica del contenuto di un file, mentre il
842 secondo ad una modifica dell'inode; siccome esistono molte operazioni (come la
843 funzione \func{link} e molte altre che vedremo in seguito) che modificano solo
844 le informazioni contenute nell'inode senza toccare il file, diventa necessario
845 l'utilizzo di un altro tempo.
846
847 Il sistema non tiene conto dell'ultimo accesso all'inode, pertanto funzioni
848 come \func{access} o \func{stat} non hanno alcuna influenza sui tre tempi. Il
849 tempo di ultimo accesso viene di solito usato per cancellare i file che non
850 servono più dopo un certo lasso di tempo (ad esempio \cmd{leafnode} cancella i
851 vecchi articoli sulla base di questo tempo).  
852
853 Il tempo di ultima modifica invece viene usato da \cmd{make} per decidere
854 quali file necessitano di essere ricompilati o (talvolta insieme anche al
855 tempo di cambiamento di stato) per decidere quali file devono essere
856 archiviati per il backup. Il comando \cmd{ls} (quando usato con le opzioni
857 \cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema riportato
858 nell'ultima colonna di \curtab.
859
860 L'effetto delle varie funzioni di manipolazione dei file sui tempi è
861 illustrato in \ntab. Si sono riportati gli effetti sia per il file a cui si fa
862 riferimento, sia per la directory che lo contiene; questi ultimi possono
863 essere capiti se si tiene conto di quanto già detto, e cioè che anche le
864 directory sono files, che il sistema tratta in maniera del tutto analoga agli
865 altri. 
866
867 Per questo motivo tutte le volte che compiremo una operazione su un file che
868 comporta una modifica della sua directory entry, andremo anche a scrivere
869 sulla directory che lo contiene cambiandone il tempo di modifica. Un esempio
870 di questo può essere la cancellazione di un file, mentre leggere o scrivere o
871 cambiarne i permessi ha effetti solo sui tempi del file.
872
873 \begin{table}[htb]
874   \centering
875   \footnotesize
876   \begin{tabular}[c]{|l|c|c|c|c|c|c|l|}
877     \hline
878     \multicolumn{1}{|p{3cm}|}{\centering{\vspace{6pt}\textbf{Funzione}}} &
879     \multicolumn{3}{|p{3cm}|}{\centering{File o directory di riferimento}}&
880     \multicolumn{3}{|p{3cm}|}{\centering{Directory genitrice del riferimento}} 
881     &\multicolumn{1}{|p{3.6cm}|}{\centering{\vspace{6pt}\textbf{Note}}} \\
882     \cline{2-7}
883     \cline{2-7}
884     \multicolumn{1}{|p{3cm}|}{} 
885     &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(a)}}}
886     &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(m)}}}
887     &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(c)}}}
888     &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(a)}}}
889     &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(m)}}}
890     &\multicolumn{1}{|p{.8cm}|}{\centering{\textsl{(c)}}}
891     &\multicolumn{1}{|p{3cm}|}{} \\
892     \hline
893     \hline
894     \func{chmod}, \func{fchmod} 
895     &         &         &$\bullet$&         &         &         & \\
896     \func{chown}, \func{fchown} 
897     &         &         &$\bullet$&         &         &         & \\
898     \func{creat}  
899     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$&  con 
900     \macro{O\_CREATE} \\    \func{creat}  
901     &         &$\bullet$&$\bullet$&         &$\bullet$&$\bullet$&   
902     con \macro{O\_TRUNC} \\    \func{exec}  
903     &$\bullet$&         &         &         &         &         & \\
904     \func{lchown}  
905     &         &         &$\bullet$&         &         &         & \\
906     \func{link}
907     &         &         &$\bullet$&         &$\bullet$&$\bullet$& \\
908     \func{mkdir}
909     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$& \\
910     \func{mkfifo}
911     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$& \\
912     \func{open}
913     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$& con 
914     \macro{O\_CREATE} \\    \func{open}
915     &         &$\bullet$&$\bullet$&         &         &         & con 
916     \macro{O\_TRUNC}  \\    \func{pipe}
917     &$\bullet$&$\bullet$&$\bullet$&         &         &         & \\
918     \func{read}
919     &$\bullet$&         &         &         &         &         & \\
920     \func{remove}
921     &         &         &$\bullet$&         &$\bullet$&$\bullet$& using 
922     \func{unlink}\\    \func{remove}
923     &         &         &         &         &$\bullet$&$\bullet$& using 
924     \func{rmdir}\\ \func{rename}
925     &         &         &$\bullet$&         &$\bullet$&$\bullet$& per entrambi
926     gli argomenti\\ \func{rmdir}
927     &         &         &         &         &$\bullet$&$\bullet$& \\ 
928     \func{truncate}, \func{ftruncate}
929     &         &$\bullet$&$\bullet$&         &         &         & \\ 
930     \func{unlink}
931     &         &         &$\bullet$&         &$\bullet$&$\bullet$& \\ 
932     \func{utime}
933     &$\bullet$&$\bullet$&$\bullet$&         &         &         & \\ 
934     \func{write}
935     &         &$\bullet$&$\bullet$&         &         &         & \\ 
936     \hline
937   \end{tabular}
938   \caption{Prospetto dei cambiamenti effettuati sui tempi di ultimo 
939     accesso \textsl{(a)}, ultima modifica \textsl{(m)} e ultimo cambiamento
940     \textsl{(c)} dalle varie funzioni operanti su file e directory.}
941   \label{tab:file_times_effects}  
942 \end{table}
943
944 Si noti infine come \var{st\_ctime} non abbia nulla a che fare con il tempo di
945 creazione del file, usato da molti altri sistemi operativi, che in unix non
946 esiste.
947
948
949 \subsection{La funzione \func{utime}}
950 \label{sec:file_utime}
951
952 I tempi di ultimo accesso e modifica possono essere cambiati usando la
953 funzione \func{utime}, il cui prototipo è:
954
955 \begin{prototype}{utime.h}
956 {int utime(const char * filename, struct utimbuf *times)} 
957
958 Cambia i tempi di ultimo accesso e modifica dell'inode specificato da
959 \var{filename} secondo i campi \var{actime} e \var{modtime} di \var{times}. Se
960 questa è \macro{NULL} allora viene usato il tempo corrente.
961
962 La funzione restituisce zero in caso di successo e -1 in caso di errore, nel
963 qual caso \var{errno} è settata opportunamente.
964 \begin{errlist}
965 \item \macro{EACCESS} non si ha il permesso di scrittura sul file.
966 \item \macro{ENOENT} \var{filename} non esiste.
967 \end{errlist}
968 \end{prototype}
969  
970 La struttura \var{utimebuf} usata da \func{utime} è definita come:
971 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
972 struct utimbuf {
973         time_t actime;  /* access time */
974         time_t modtime; /* modification time */
975 };
976 \end{lstlisting}
977
978 L'effetto della funzione e i privilegi necessari per eseguirla dipendono da
979 cosa è l'argomento \var{times}; se è \textit{NULL} la funzione setta il tempo
980 corrente ed è sufficiente avere accesso in scrittura al file; se invece si è
981 specificato un valore la funzione avrà successo solo se si è proprietari del
982 file (o si hanno i privilegi di amministratore).
983
984 Si tenga presente che non è comunque possibile specificare il tempo di
985 cambiamento di stato del file, che viene comunque cambiato dal kernel tutte le
986 volte che si modifica l'inode (quindi anche alla chiamata di \func{utime}).
987 Questo serve anche come misura di sicurezza per evitare che si possa
988 modificare un file nascondendo completamente le proprie tracce.  In realtà la
989 cosa resta possibile, se si è in grado di accedere al device, scrivendo
990 direttamente sul disco senza passare attraverso il filesystem, ma ovviamente è
991 molto più complicato da realizzare.
992
993
994
995
996 \section{Il controllo di accesso ai file}
997 \label{sec:file_access_control}
998
999 Una delle caratteristiche fondamentali di tutti i sistemi unix-like è quella
1000 del controllo di accesso ai file, che viene implementato per qualunque
1001 filesystem standard. In questa sezione ne esamineremo i concetti essenziali e
1002 le funzioni usate per gestirne i vari aspetti.
1003
1004
1005 \subsection{I permessi per l'accesso ai file}
1006 \label{sec:file_perm_overview}
1007
1008 Il controllo di accesso ai file in unix segue un modello abbastanza semplice
1009 (ma adatto alla gran parte delle esigenze) in cui si dividono i permessi su
1010 tre livelli. Si tenga conto poi che quanto diremo è vero solo per filesystem
1011 di tipo unix, e non è detto che sia applicabile a un filesystem
1012 qualunque\footnote{ed infatti non è vero per il filesystem vfat di Windows,
1013   per il quale i permessi vengono assegnati in maniera fissa con un opzione in
1014   fase di montaggio}.  Esistono inoltre estensioni che permettono di
1015 implementare le ACL (\textit{Access Control List}) che sono un meccanismo di
1016 controllo di accesso molto più sofisticato.
1017
1018 Ad ogni file unix associa sempre l'utente che ne è proprietario (il cosiddetto
1019 \textit{owner}) e il gruppo di appartenenza, secondo il meccanismo degli
1020 identificatori di utenti e gruppi (\acr{uid} e \acr{gid}). Questi valori
1021 sono accessibili da programma tramite i campi \var{st\_uid} e \var{st\_gid}
1022 della struttura \var{stat} (si veda \secref{sec:file_stat}). Ad ogni file
1023 viene inoltre associato un insieme di permessi che sono divisi in tre classi,
1024 e cioè attribuiti rispettivamente all'utente proprietario del file, a un
1025 qualunque utente faccia parte del gruppo cui appartiene il file, e a tutti gli
1026 altri utenti.
1027
1028 I permessi, così come vengono presi dai comandi e dalle routine di sistema,
1029 sono espressi da un numero di 12 bit; di questi i nove meno significativi sono
1030 usati a gruppi di tre per indicare i permessi base di lettura, scrittura ed
1031 esecuzione (indicati nei comandi di sistema con le lettere \cmd{w}, \cmd{r} e
1032 \cmd{x}) ed applicabili rispettivamente al proprietario, al gruppo, a tutti
1033 gli altri.  I restanti tre bit (\acr{suid}, \acr{sgid}, e
1034 \textsl{sticky}) sono usati per indicare alcune caratteristiche più complesse
1035 su cui torneremo in seguito (vedi \secref{sec:file_suid_sgid} e
1036 \secref{sec:file_sticky}).
1037
1038 Anche i permessi, come tutte le altre informazioni generali, sono tenuti per
1039 ciascun file nell'inode; in particolare essi sono contenuti in alcuni bit
1040 del campo \var{st\_mode} della struttura letta da \func{stat} (di nuovo si veda
1041 \secref{sec:file_stat} per i dettagli).
1042
1043 In genere ci si riferisce a questo raggruppamento dei permessi usando le
1044 lettere \cmd{u} (per \textit{user}), \cmd{g} (per \textit{group}) e \cmd{o}
1045 (per \textit{other}), inoltre se si vuole indicare tutti i raggruppamenti
1046 insieme si usa la lettera \cmd{a} (per \textit{all}). Si tenga ben presente
1047 questa distinzione dato che in certi casi, mutuando la terminologia in uso nel
1048 VMS, si parla dei permessi base come di permessi per \textit{owner},
1049 \textit{group} ed \textit{all}, le cui iniziali possono dar luogo a confusione.
1050 Le costanti che permettono di accedere al valore numerico di questi bit nel
1051 campo \var{st\_mode} sono riportate in \ntab.
1052
1053 \begin{table}[htb]
1054   \centering
1055     \footnotesize
1056   \begin{tabular}[c]{|c|l|}
1057     \hline
1058     \textbf{\var{st\_mode}} bit & \textbf{Significato} \\
1059     \hline 
1060     \hline 
1061     \macro{S\_IRUSR}  &  \textit{user-read}, l'utente può leggere     \\
1062     \macro{S\_IWUSR}  &  \textit{user-write}, l'utente può scrivere   \\
1063     \macro{S\_IXUSR}  &  \textit{user-execute}, l'utente può eseguire \\ 
1064     \hline              
1065     \macro{S\_IRGRP}  &  \textit{group-read}, il gruppo può leggere    \\
1066     \macro{S\_IWGRP}  &  \textit{group-write}, il gruppo può scrivere  \\
1067     \macro{S\_IXGRP}  &  \textit{group-execute}, il gruppo può eseguire\\
1068     \hline              
1069     \macro{S\_IROTH}  &  \textit{other-read}, tutti possono leggere    \\
1070     \macro{S\_IWOTH}  &  \textit{other-write}, tutti possono scrivere  \\
1071     \macro{S\_IXOTH}  &  \textit{other-execute}, tutti possono eseguire\\
1072     \hline              
1073   \end{tabular}
1074   \caption{I bit dei permessi di accesso ai file, come definiti in 
1075     \texttt{<sys/stat.h>}}
1076   \label{tab:file_bit_perm}
1077 \end{table}
1078
1079 Questi permessi vengono usati in maniera diversa dalle varie funzioni, e a
1080 seconda che si riferiscano a file, link simbolici o directory, qui ci
1081 limiteremo ad un riassunto delle regole generali, entrando nei dettagli più
1082 avanti.
1083
1084 La prima regola è che per poter accedere ad un file attraverso il suo pathname
1085 occorre il permesso di esecuzione in ciascuna delle directory che compongono
1086 il pathname, e lo stesso vale per aprire un file nella directory corrente (per
1087 la quale appunto serve il diritto di esecuzione).
1088
1089 Per una directory infatti il permesso di esecuzione ha il significato
1090 specifico che essa può essere attraversata nella risoluzione del pathname, ed
1091 è distinto dal permesso di lettura che invece implica che si può leggere il
1092 contenuto della directory. Questo significa che se si ha il permesso di
1093 esecuzione senza permesso di lettura si potrà lo stesso aprire un file in una
1094 directory (se si hanno i permessi opportuni per il medesimo) ma non si potrà
1095 vederlo con \cmd{ls} (per crearlo occorrerà anche il permesso di scrittura per
1096 la directory).
1097
1098 Avere il permesso di lettura per un file consente di aprirlo con le opzioni di
1099 sola lettura (\macro{O\_RDONLY}) o di lettura/scrittura (\macro{O\_RDWR}) e
1100 leggerne il contenuto. Avere il permesso di scrittura consente di aprire un
1101 file in sola scrittura (\macro{O\_WRONLY}) o lettura/scrittura
1102 (\macro{O\_RDWR}) e modificarne il contenuto, lo stesso permesso è necessario
1103 per poter troncare il file con l'opzione \macro{O\_TRUNC}.
1104
1105 Non si può creare un file fintanto che non si disponga del permesso di
1106 esecuzione e di quello di scrittura per la directory di destinazione; gli
1107 stessi permessi occorrono per cancellare un file da una directory (si ricordi
1108 che questo non implica necessariamente la rimozione del contenuto del file dal
1109 disco), non è necessario nessun tipo di permesso per il file stesso (infatti
1110 esso non viene toccato, viene solo modificato il contenuto della directory,
1111 rimuovendo la voce che ad esso fa rifermento).
1112
1113 Per poter eseguire un file (che sia un programma compilato od uno script di
1114 shell, od un altro tipo di file eseguibile riconosciuto dal kernel), occorre
1115 avere il permesso di esecuzione, inoltre solo i file regolari possono essere
1116 eseguiti.
1117
1118 I permessi per un link simbolico sono ignorati, contano quelli del file a cui
1119 fa riferimento; per questo in genere \cmd{ls} per un link simbolico riporta
1120 tutti i permessi come concessi; utente e gruppo a cui esso appartiene vengono
1121 ignorati quando il link viene risolto, vengono controllati solo quando viene
1122 richiesta la rimozione del link e quest'ultimo è in una directory con lo
1123 \textsl{sticky bit} settato (si veda \secref{sec:file_sticky}).
1124
1125 La procedura con cui il kernel stabilisce se un processo possiede un certo
1126 permesso (di lettura, scrittura o esecuzione) si basa sul confronto fra
1127 l'utente e il gruppo a cui il file appartiene (i valori di \var{st\_uid} e
1128 \var{st\_gid} accennati in precedenza) e l'\textit{effective user id},
1129 l'\textit{effective group id} e gli eventuali \textit{supplementary group id}
1130 del processo\footnote{in realtà Linux per quanto riguarda l'accesso ai file
1131   utilizza al posto degli \textit{effective id} i \textit{filesystem id} (si
1132   veda \secref{sec:proc_perms}), ma essendo questi del tutto equivalenti ai
1133   primi, eccetto il caso in cui si voglia scrivere un server NFS, ignoreremo
1134   questa differenza}.
1135
1136 Per una spiegazione dettagliata degli identificatori associati ai processi si
1137 veda \secref{sec:proc_perms}; normalmente, a parte quanto vedremo in
1138 \secref{sec:file_suid_sgid}, l'\textit{effective user id} e
1139 l'\textit{effective group id} corrispondono a \acr{uid} e \acr{gid}
1140 dell'utente che ha lanciato il processo, mentre i \textit{supplementary group
1141   id} sono quelli dei gruppi cui l'utente appartiene.
1142
1143 I passi attraverso i quali viene stabilito se il processo possiede il diritto
1144 di accesso sono i seguenti:
1145 \begin{itemize}
1146 \item Se l'\textit{effective user id} del processo è zero (corrispondente
1147   all'amministratore) l'accesso è sempre garantito senza nessun ulteriore
1148   controllo. Per questo motivo \textsl{root} ha piena libertà di accesso a
1149   tutti i file.
1150 \item Se l'\textit{effective user id} del processo è uguale all'uid del
1151   proprietario del file (nel qual caso si dice che il processo è proprietario
1152   del file) allora:
1153   \begin{itemize}
1154   \item se il relativo\footnote{per relativo si intende il bit di user-read se
1155       il processo vuole accedere in scrittura, quello di user-write per
1156       l'accesso in scrittura, etc.} bit dei permessi d'accesso dell'utente è
1157     settato, l'accesso è consentito
1158   \item altrimenti l'accesso è negato
1159   \end{itemize}
1160 \item Se l'\textit{effective group id} del processo o uno dei
1161   \textit{supplementary group id} dei processi corrispondono al \acr{gid} del
1162   file allora:
1163   \begin{itemize}
1164   \item se il bit dei permessi d'accesso del gruppo è settato, l'accesso è
1165     consentito, 
1166   \item altrimenti l'accesso è negato
1167   \end{itemize}
1168 \item se il bit dei permessi d'accesso per tutti gli altri è settato,
1169   l'accesso è consentito, altrimenti l'accesso è negato.
1170 \end{itemize}
1171
1172 Si tenga presente che questi passi vengono eseguiti esattamente in
1173 quest'ordine. Questo vuol dire che se un processo è il proprietario di un file
1174 l'accesso è consentito o negato solo sulla base dei permessi per l'utente; i
1175 permessi per il gruppo non vengono neanche controllati; lo stesso vale se il
1176 processo appartiene ad un gruppo appropriato, in questo caso i permessi per
1177 tutti gli altri non vengono controllati.
1178
1179
1180 \subsection{I bit \acr{suid} e \acr{sgid}}
1181 \label{sec:file_suid_sgid}
1182
1183 Come si è accennato (in \secref{sec:file_perm_overview}) nei dodici bit del
1184 campo \var{st\_mode} usati per il controllo di accesso oltre ai bit dei
1185 permessi veri e propri, ci sono altri tre bit che vengono usati per indicare
1186 alcune proprietà speciali dei file.  Due di questi sono i bit detti
1187 \acr{suid} (o \textit{set-user-ID bit}) e \acr{sgid} (o
1188 \textit{set-group-ID bit}) che sono identificati dalle costanti
1189 \macro{S\_ISUID} e \macro{S\_ISGID}.
1190
1191 Come spiegato in dettaglio in \secref{sec:proc_exec}, quando si lancia un
1192 programma il comportamento normale del kernel è quello di settare
1193 l'\textit{effective user id} e l'\textit{effective group id} del nuovo
1194 processo all'\acr{uid} e al \acr{gid} del processo corrente, che normalmente
1195 corrispondono dell'utente con cui si è entrati nel sistema.
1196
1197 Se però il file del programma\footnote{per motivi di sicurezza il kernel
1198   ignora i bit \acr{suid} e \acr{sgid} per gli script eseguibili} (che
1199 ovviamente deve essere eseguibile) ha il bit \acr{suid} settato, il kernel
1200 assegnerà come \textit{effective user id} al nuovo processo l'uid del
1201 proprietario del file al posto dell'uid del processo originario.  Avere il bit
1202 \acr{sgid} settato ha lo stesso effetto sull'\textit{effective group id} del
1203 processo.
1204
1205 I bit \textsl{suid} e \textsl{sgid} vengono usati per permettere agli utenti
1206 normali di usare programmi che abbisognano di privilegi speciali; l'esempio
1207 classico è il comando \cmd{passwd} che ha la necessità di modificare il file
1208 delle password, quest'ultimo ovviamente può essere scritto solo
1209 dall'amministratore, ma non è necessario chiamare l'amministratore per
1210 cambiare la propria password. Infatti il comando \cmd{passwd} appartiene a
1211 root ma ha il bit suid settato per cui quando viene lanciato da un utente
1212 normale parte con i privilegi di root.
1213
1214 Chiaramente avere un processo che ha privilegi superiori a quelli che avrebbe
1215 normalmente l'utente che lo ha lanciato comporta vari rischi, e questo tipo di
1216 programmi devono essere scritti accuratamente per evitare che possano essere
1217 usati per guadagnare privilegi non consentiti (torneremo sull'argomento in
1218 \secref{sec:proc_perms}).
1219
1220 La presenza dei bit \acr{suid} e \acr{sgid} su un file può essere
1221 rilevata con il comando \cmd{ls -l}, in tal caso comparirà la lettera \cmd{s}
1222 al posto della \cmd{x} in corrispondenza dei permessi di utente o gruppo. La
1223 stessa lettera \cmd{s} può essere usata nel comando \cmd{chmod} per settare
1224 questi bit. Infine questi bit possono essere controllati all'interno di
1225 \var{st\_mode} con l'uso delle due costanti \macro{S\_ISUID} e
1226 \macro{S\_IGID}, i cui valori sono riportati in
1227 \tabref{tab:file_mode_flags}.
1228
1229 Gli stessi bit vengono ad assumere in significato completamente diverso per le
1230 directory, normalmente infatti Linux usa la convenzione di SVR4 per indicare
1231 con questi bit l'uso della semantica BSD nella creazione di nuovi file (si
1232 veda \secref{sec:file_ownership} per una spiegazione dettagliata al
1233 proposito).
1234
1235 Infine Linux utilizza il bit \acr{sgid} per una ulteriore estensione
1236 mutuata da SVR4. Il caso in cui il file abbia il bit \acr{sgid} settato ma
1237 non il corrispondente bit di esecuzione viene utilizzato per attivare per
1238 quel file il \textit{mandatory locking} (argomento che affronteremo nei
1239 dettagli in \secref{sec:xxx_mandatory_lock}).
1240
1241
1242 \subsection{Il bit \textsl{sticky}}
1243 \label{sec:file_sticky}
1244
1245 L'ultimo dei bit rimanenti, identificato dalla costante \macro{S\_ISVTX}, è in
1246 parte un rimasuglio delle origini dei sistemi unix. A quell'epoca infatti la
1247 memoria virtuale e l'accesso ai files erano molto meno sofisticati e per
1248 ottenere la massima velocità possibile per i programmi usati più comunemente
1249 si poteva settare questo bit.
1250
1251 L'effetto di questo bit era che il segmento di testo del programma (si veda
1252 \secref{sec:proc_mem_layout} per i dettagli) veniva scritto nella swap la
1253 prima volta che questo veniva lanciato, e vi permaneva fino al riavvio della
1254 macchina (da questo il nome di \textsl{sticky bit}); essendo la swap un file
1255 continuo indicizzato direttamente in questo modo si poteva risparmiare in
1256 tempo di caricamento rispetto alla ricerca del file su disco. Lo
1257 \textsl{sticky bit} è indicato usando la lettera \cmd{t} al posto della
1258 \cmd{x} nei permessi per gli altri.
1259
1260 Ovviamente per evitare che gli utenti potessero intasare la swap solo
1261 l'amministratore era in grado di settare questo bit, che venne chiamato anche
1262 con il nome di \textit{saved text bit}, da cui deriva quello della costante.
1263 Le attuali implementazioni di memoria virtuale e filesystem rendono
1264 sostanzialmente inutile questo procedimento.
1265
1266 Benché ormai non venga più utilizzato per i file, lo \textsl{sticky bit} ha
1267 assunto un uso corrente per le directory\footnote{lo \textsl{sticky bit} per
1268   le directory è una estensione non definita nello standard POSIX, Linux però
1269   la supporta, così come BSD e SVR4}, in questo caso se il bit è settato un
1270 file potrà essere rimosso dalla directory soltanto se l'utente ha il permesso
1271 di scrittura ed inoltre è vera una delle seguenti condizioni:
1272 \begin{itemize}
1273 \item l'utente è proprietario del file
1274 \item l'utente è proprietario della directory
1275 \item l'utente è l'amministratore 
1276 \end{itemize}
1277 un classico esempio di directory che ha questo bit settato è \file{/tmp}, i
1278 permessi infatti di solito sono settati come:
1279 \begin{verbatim}
1280 $ ls -ld /tmp
1281 drwxrwxrwt    6 root     root         1024 Aug 10 01:03 /tmp
1282 \end{verbatim}%$
1283 in questo modo chiunque può leggere, scrivere ed eseguire i file temporanei
1284 ivi memorizzati, sia crearne di nuovi, ma solo l'utente che ha creato un file
1285 nella directory potrà cancellarlo o rinominarlo, così si può evitare che un
1286 utente possa, più o meno consapevolmente, cancellare i file degli altri.
1287
1288
1289 \subsection{La titolarità di nuovi file e directory}
1290 \label{sec:file_ownership}
1291
1292 Vedremo in \secref{sec:file_base_func} come creare nuovi file, ma se è
1293 possibile specificare in sede di creazione quali permessi applicare ad un
1294 file, non si può indicare a quale utente e gruppo esso deve appartenere.  Lo
1295 stesso problema di presenta per la creazione di nuove directory (procedimento
1296 descritto in \secref{sec:file_dir_creat_rem}).
1297
1298 Lo standard POSIX prescrive che l'uid del nuovo file corrisponda
1299 all'\textit{effective user id} del processo che lo crea; per il \acr{gid}
1300 invece prevede due diverse possibilità:
1301 \begin{itemize}
1302 \item il \acr{gid} del file corrisponde all'\textit{effective group id} del
1303   processo.
1304 \item il \acr{gid} del file corrisponde al gid della directory in cui esso è
1305   creato.
1306 \end{itemize}
1307 in genere BSD usa sempre la seconda possibilità, che viene per questo chiamata
1308 semantica BSD. Linux invece segue quella che viene chiamata semantica SVR4; di
1309 norma cioè il nuovo file viene creato, seguendo la prima opzione, con il
1310 \acr{gid} del processo, se però la directory in cui viene creato il file ha il
1311 bit \acr{sgid} settato allora viene usata la seconda opzione..
1312
1313 Usare la semantica BSD ha il vantaggio che il \acr{gid} viene sempre
1314 automaticamente propagato, restando coerente a quello della directory di
1315 partenza, in tutte le sottodirectory. La semantica SVR4 offre una maggiore
1316 possibilità di scelta, ma per ottenere lo stesso risultato necessita che per
1317 le nuove directory venga anche propagato anche il bit \acr{sgid}. Questo è
1318 comunque il comportamento di default di \func{mkdir}, ed é in questo modo ad
1319 esempio che Debian assicura che le sottodirectory create nelle home di un
1320 utente restino sempre con il \acr{gid} del gruppo primario dello stesso.
1321
1322
1323 \subsection{La funzione \func{access}}
1324 \label{sec:file_access}
1325
1326 Come detto in \secref{sec:file_access_control} il controllo di accesso ad
1327 un file viene fatto usando \textit{effective user id} e \textit{effective
1328   group id} del processo, ma ci sono casi in cui si può voler effettuare il
1329 controllo usando il \textit{real user id} e il \textit{real group id} (cioè
1330 l'uid dell'utente che ha lanciato il programma, che, come accennato in
1331 \secref{sec:file_suid_sgid} e spiegato in \secref{sec:proc_perms} non è
1332 detto sia uguale all'\textit{effective user id}). Per far questo si può usare
1333 la funzione \func{access}, il cui prototipo è:
1334
1335 \begin{prototype}{unistd.h}
1336 {int access(const char *pathname, int mode)}
1337
1338   La funzione verifica i permessi di accesso, indicati da \var{mode}, per il
1339   file indicato da \var{pathname}. 
1340   
1341   La funzione ritorna 0 se l'accesso è consentito, -1 altrimenti; in
1342   quest'ultimo caso la variabile \texttt{errno} viene settata secondo i codici
1343   di errore: \macro{EACCES}, \macro{EROFS}, \macro{EFAULT}, \macro{EINVAL},
1344   \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOTDIR}, \macro{ELOOP},
1345   \macro{EIO}.
1346 \end{prototype}
1347
1348
1349 I valori possibili per il parametro \var{mode} sono esprimibili come
1350 combinazione delle costanti numeriche riportate in \ntab\ (attraverso un OR
1351 binario). I primi tre valori implicano anche la verifica dell'esistenza del
1352 file, se si vuole verificare solo quest'ultima si può usare \macro{F\_OK}, o
1353 anche direttamente \func{stat}. In caso \var{pathname} si riferisca ad un link
1354 simbolico il controllo è fatto sul file a cui esso fa riferimento.
1355
1356 La funzione controlla solo i bit dei permessi di accesso, si ricordi che il
1357 fatto che una directory abbia permesso di scrittura non significa che ci si
1358 possa scrivere come in un file, e il fatto che un file abbia permesso di
1359 esecuzione non comporta che contenga un programma eseguibile. La funzione
1360 ritorna zero solo se tutte i permessi controllati sono disponibili, in caso
1361 contrario (o di errore) ritorna -1.
1362
1363 \begin{table}[htb]
1364   \centering
1365   \footnotesize
1366   \begin{tabular}{|c|l|}
1367     \hline
1368     \textbf{\var{mode}} & \textbf{Significato} \\
1369     \hline
1370     \hline
1371     \macro{R\_OK} & verifica il permesso di lettura \\
1372     \macro{W\_OK} & verifica il permesso di scritture \\
1373     \macro{X\_OK} & verifica il permesso di esecuzione \\
1374     \macro{F\_OK} & verifica l'esistenza del file \\
1375     \hline
1376   \end{tabular}
1377   \caption{Valori possibile per il parametro \var{mode} della funzione 
1378     \func{access}}
1379   \label{tab:file_access_mode_val}
1380 \end{table}
1381
1382 Un esempio tipico per l'uso di questa funzione è quello di un processo che sta
1383 eseguendo un programma coi privilegi di un altro utente (attraverso l'uso del
1384 suid bit) che vuole controllare se l'utente originale ha i permessi per
1385 accedere ad un certo file.
1386
1387
1388 \subsection{Le funzioni \texttt{chmod} e \texttt{fchmod}}
1389 \label{sec:file_chmod}
1390
1391 Per cambiare i permessi di un file il sistema mette ad disposizione due
1392 funzioni, che operano rispettivamente su un filename e su un file descriptor,
1393 i cui prototipi sono:
1394
1395 \begin{functions}
1396   \headdecl{sys/types.h} 
1397   \headdecl{sys/stat.h} 
1398   
1399   \funcdecl{int chmod(const char *path, mode\_t mode)} Cambia i permessi del
1400   file indicato da \var{path} al valore indicato da \var{mode}.
1401   
1402   \funcdecl{int fchmod(int fd, mode\_t mode)} Analoga alla precedente, ma usa
1403   il file descriptor \var{fd} per indicare il file.
1404   
1405   Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
1406   caso di errore \texttt{errno} può assumere i valori:
1407   \begin{errlist}
1408   \item \macro{EPERM} L'\textit{effective user id} non corrisponde a quello
1409     del proprietario del file o non è zero.
1410   \end{errlist}
1411   ed inoltre \macro{EROFS} e \macro{EIO}; \func{chmod} restituisce anche
1412   \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOMEM},
1413   \macro{ENOTDIR}, \macro{EACCES}, \macro{ELOOP}; \func{fchmod} anche
1414   \macro{EBADF}.
1415 \end{functions}
1416
1417 I valori possibili per \var{mode} sono indicati in \ntab. I valori possono
1418 esser combinati con l'OR binario delle relative macro, o specificati
1419 direttamente, come per l'analogo comando di shell, con il valore ottale. Ad
1420 esempio i permessi standard assegnati ai nuovi file (lettura e scrittura per
1421 il proprietario, sola lettura per il gruppo e gli altri) sono corrispondenti
1422 al valore ottale $0644$, un programma invece avrebbe anche il bit di
1423 esecuzione attivo, con un valore di $0755$, se si volesse attivare il bit suid
1424 il valore da fornire sarebbe $4755$.
1425
1426 \begin{table}[!htb]
1427   \centering
1428   \footnotesize
1429   \begin{tabular}[c]{|c|c|l|}
1430     \hline
1431     \textbf{\var{mode}} & \textbf{Valore} & \textbf{Significato} \\
1432     \hline
1433     \hline
1434     \macro{S\_ISUID} & 04000 & set user ID \\
1435     \macro{S\_ISGID} & 02000 & set group ID \\
1436     \macro{S\_ISVTX} & 01000 & sticky bit \\
1437     \hline
1438     \macro{S\_IRWXU} & 00700 & l'utente ha tutti i permessi \\
1439     \macro{S\_IRUSR} & 00400 & l'utente ha il permesso di lettura  \\
1440     \macro{S\_IWUSR} & 00200 & l'utente ha il permesso di scrittura \\
1441     \macro{S\_IXUSR} & 00100 & l'utente ha il permesso di esecuzione \\
1442     \hline
1443     \macro{S\_IRWXG} & 00070 & il gruppo ha tutti i permessi  \\
1444     \macro{S\_IRGRP} & 00040 & il gruppo ha il permesso di lettura  \\
1445     \macro{S\_IWGRP} & 00020 & il gruppo ha il permesso di scrittura \\
1446     \macro{S\_IXGRP} & 00010 & il gruppo ha il permesso di esecuzione \\
1447     \hline
1448     \macro{S\_IRWXO} & 00007 & gli altri hanno tutti i permessi \\
1449     \macro{S\_IROTH} & 00004 & gli altri hanno il permesso di lettura  \\
1450     \macro{S\_IWOTH} & 00002 & gli altri hanno il permesso di scrittura \\
1451     \macro{S\_IXOTH} & 00001 & gli altri hanno il permesso di esecuzione \\
1452     \hline
1453   \end{tabular}
1454   \caption{I valori delle costanti usate per indicare i permessi dei file.}
1455   \label{tab:file_permission_const}
1456 \end{table}
1457
1458 Il cambiamento dei permessi di un file attraverso queste funzioni ha comunque
1459 alcune limitazioni, provviste per motivi di sicurezza. Questo significa che
1460 anche se si è proprietari del file non tutte le operazioni sono permesse, in
1461 particolare:
1462 \begin{itemize}
1463 \item siccome solo l'amministratore può settare lo \textit{sticky bit} se se
1464   l'\textit{effective user id} del processo non è zero esso viene
1465   automaticamente cancellato (senza notifica di errore) qualora sia stato
1466   indicato in \var{mode}.
1467 \item per via della semantica SVR4 nella creazione dei nuovi file, si può
1468   avere il caso in cui il file creato da un processo è assegnato a un gruppo
1469   per il quale il processo non ha privilegi. Per evitare che si possa
1470   assegnare il bit \acr{sgid} ad un file appartenente a un gruppo per cui
1471   non si hanno diritti, questo viene automaticamente cancellato (senza
1472   notifica di errore) da \var{mode} qualora il gruppo del file non corrisponda
1473   a quelli associati al processo (la cosa non avviene quando
1474   l'\textit{effective user id} del processo è zero).
1475 \end{itemize}
1476
1477 Per alcuni filesystem\footnote{il filesystem \textsl{ext2} supporta questa
1478   caratteristica, che è mutuata da BSD.} è inoltre prevista una ulteriore
1479 misura di sicurezza, volta ad scongiurare l'abuso dei bit \acr{suid} e
1480 \acr{sgid}; essa consiste nel cancellare automaticamente questi bit qualora un
1481 processo che non appartenga all'amministratore scriva su un file. In questo
1482 modo anche se un utente malizioso scopre un file \acr{suid} su cui può
1483 scrivere, un eventuale modifica comporterà la perdita di ogni ulteriore
1484 privilegio.
1485
1486
1487 \subsection{La funzione \func{umask}}
1488 \label{sec:file_umask}
1489
1490 Oltre che dai valori indicati in sede di creazione, i permessi assegnati ai
1491 nuovi file sono controllati anche da una maschera di bit settata con la
1492 funzione \func{umask}, il cui prototipo è:
1493
1494 \begin{prototype}{stat.h}
1495 {mode\_t umask(mode\_t mask)}
1496
1497   Setta la maschera dei permessi dei bit al valore specificato da \var{mask}
1498   (di cui vengono presi solo i 9 bit meno significativi).
1499   
1500   La funzione ritorna il precedente valore della maschera. È una delle poche
1501   funzioni che non restituisce codici di errore.
1502 \end{prototype}
1503
1504 Questa maschera è una caratteristica di ogni processo e viene utilizzata per
1505 impedire che alcuni permessi possano essere assegnati ai nuovi file in sede di
1506 creazione, i bit indicati nella maschera vengono infatti esclusi quando un
1507 nuovo file viene creato.
1508
1509 In genere questa maschera serve per impostare un default che escluda alcuni
1510 permessi (usualmente quello di scrittura per il gruppo e gli altri,
1511 corrispondente ad un valore di $022$). Essa è utile perché le routine
1512 dell'interfaccia ANSI C degli stream non prevedono l'esistenza dei permessi, e
1513 pertanto tutti i nuovi file vengono sempre creati con un default di $666$
1514 (cioè permessi di lettura e scrittura per tutti, si veda
1515 \tabref{tab:file_permission_const} per un confronto); in questo modo è
1516 possibile cancellare automaticamente i permessi non voluti, senza doverlo fare
1517 esplicitamente.
1518
1519 In genere il valore di \func{umask} viene stabilito una volta per tutte al
1520 login a $022$, e di norma gli utenti non hanno motivi per modificarlo. Se però
1521 si vuole che un processo possa creare un file che chiunque possa leggere
1522 allora occorrerà cambiare il valore di \func{umask}.
1523
1524 \subsection{Le funzioni \func{chown}, \func{fchown} e \func{lchown}}
1525 \label{sec:file_chown}
1526
1527 Come per i permessi, il sistema fornisce anche delle funzioni che permettano
1528 di cambiare utente e gruppo cui il file appartiene; le funzioni in questione
1529 sono tre e i loro prototipi sono i seguenti:
1530
1531 \begin{functions}
1532   \headdecl{sys/types.h} 
1533   \headdecl{sys/stat.h} 
1534   
1535   \funcdecl{int chown(const char *path, uid\_t owner, gid\_t group)}
1536   \funcdecl{int fchown(int fd, uid\_t owner, gid\_t group)}
1537   \funcdecl{int lchown(const char *path, uid\_t owner, gid\_t group)}
1538
1539   Le funzioni cambiano utente e gruppo di appartenenza di un file ai valori
1540   specificati dalle variabili \var{owner} e \var{group}. 
1541
1542   Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
1543   caso di errore \texttt{errno} viene settato ai valori:
1544   \begin{errlist}
1545   \item \macro{EPERM} L'\textit{effective user id} non corrisponde a quello
1546     del proprietario del file o non è zero, o utente e gruppo non sono validi
1547   \end{errlist}
1548   Oltre a questi entrambe restituiscono gli errori \macro{EROFS} e
1549   \macro{EIO}; \func{chown} restituisce anche \macro{EFAULT},
1550   \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOMEM}, \macro{ENOTDIR},
1551   \macro{EACCES}, \macro{ELOOP}; \func{fchown} anche \macro{EBADF}.
1552 \end{functions}
1553
1554 In Linux soltanto l'amministratore può cambiare il proprietario di un file,
1555 seguendo la semantica di BSD che non consente agli utenti di assegnare i loro
1556 file ad altri (per evitare eventuali aggiramenti delle quote).
1557 L'amministratore può cambiare il gruppo di un file, il proprietario può
1558 cambiare il gruppo dei file che gli appartengono solo se il nuovo gruppo è il
1559 suo gruppo primario o uno dei gruppi a cui appartiene.
1560
1561 La funzione \func{chown} segue i link simbolici, per operare direttamente su
1562 in link simbolico si deve usare la funzione \func{lchown}\footnote{fino alla
1563   versione 2.1.81 in Linux \func{chown} non seguiva i link simbolici, da
1564   allora questo comportamento è stato assegnato alla funzione \func{lchown},
1565   introdotta per l'occasione, ed è stata creata una nuova system call per
1566   \func{chown} che seguisse i link simbolici}. La funzione \func{fchown} opera
1567 su un file aperto, essa è mutuata da BSD, ma non è nello standard POSIX.
1568 Un'altra estensione rispetto allo standard POSIX è che specificando -1 come
1569 valore per \var{owner} e \var{group} i valori restano immutati. 
1570
1571 Quando queste funzioni sono chiamate con successo da un processo senza i
1572 privilegi di root entrambi i bit \acr{suid} e \acr{sgid} vengono
1573 cancellati. Questo non avviene per il bit \acr{sgid} nel caso in cui esso
1574 sia usato (in assenza del corrispondente permesso di esecuzione) per indicare
1575 che per il file è attivo il \textit{mandatory locking}.
1576
1577 %La struttura fondamentale che contiene i dati essenziali relativi ai file è il
1578 %cosiddetto \textit{inode}; questo conterrà informazioni come il
1579 %tipo di file (file di dispositivo, directory, file di dati, per un elenco
1580 %completo vedi \ntab), i permessi (vedi \secref{sec:file_perms}), le date (vedi
1581 %\secref{sec:file_times}).
1582
1583