650eb532daabd127cdadabcc3ec938c6c958cd2c
[gapil.git] / filedir.tex
1 %% filedir.tex
2 %%
3 %% Copyright (C) 2000-2002 Simone Piccardi.  Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
9 %% License".
10 %%
11 \chapter{File e directory}
12 \label{cha:files_and_dirs}
13
14 In questo capitolo tratteremo in dettaglio le modalità con cui si gestiscono
15 file e directory, iniziando dalle funzioni di libreria che si usano per
16 copiarli, spostarli e cambiarne i nomi. Esamineremo poi l'interfaccia che
17 permette la manipolazione dei vari attributi di file e directory ed alla fine
18 faremo una trattazione dettagliata su come è strutturato il sistema base di
19 protezioni e controllo dell'accesso ai file e sulle funzioni che ne permettono
20 la gestione. Tutto quello che riguarda invece la manipolazione del contenuto
21 dei file è lasciato ai capitoli successivi.
22
23
24
25 \section{La gestione di file e directory}
26 \label{sec:file_dir}
27
28 Come già accennato in \secref{sec:file_filesystem} in un sistema unix-like la
29 gestione dei file ha delle caratteristiche specifiche che derivano
30 direttamente dall'architettura del sistema; in questa sezione esamineremo le
31 funzioni usate per manipolazione nel filesytem di file e directory, per la
32 creazione di link simbolici e diretti, per la gestione e la lettura delle
33 directory; il tutto mettendo in evidenza le conseguenze della struttura
34 standard della gestione dei file in un sistema unix-like, introdotta nel
35 capitolo precedente.
36
37
38 \subsection{Le funzioni \func{link} e \func{unlink}}
39 \label{sec:file_link}
40
41 Una caratteristica comune a diversi sistemi operativi è quella di poter creare
42 dei nomi fittizi (come gli alias del MacOS o i collegamenti di Windows) che
43 permettono di fare riferimento allo stesso file chiamandolo con nomi diversi
44 o accedendovi da directory diverse.
45
46 Questo è possibile anche in ambiente Unix, dove tali collegamenti sono
47 usualmente chiamati \textit{link}; ma data la struttura del sistema di
48 gestione dei file (ed in particolare quanto trattato in
49 \secref{sec:file_arch_func}) ci sono due metodi sostanzialmente diversi per
50 fare questa operazione.
51
52 Come spiegato in \secref{sec:file_filesystem} l'accesso al contenuto di un
53 file su disco avviene attraverso il suo inode\index{inode}, e il nome che si
54 trova in una directory è solo un'etichetta associata ad un puntatore a che fa
55 riferimento al suddetto inode.
56
57 Questo significa che la realizzazione di un link è immediata in quanto uno
58 stesso file può avere tanti nomi diversi allo stesso tempo, dati da
59 altrettante diverse associazioni allo stesso inode; si noti poi che nessuno di
60 questi nomi viene ad assumere una particolare preferenza o originalità
61 rispetto agli altri.
62
63 Per aggiungere un nome ad un inode si utilizza la funzione \func{link}; si
64 suole chiamare questo tipo di associazione un collegamento diretto (o
65 \textit{hard link}).  Il prototipo della funzione e le sue caratteristiche
66 principali, come risultano dalla pagina di manuale, sono le seguenti:
67 \begin{prototype}{unistd.h}
68 {int link(const char *oldpath, const char *newpath)}
69   Crea un nuovo collegamento diretto al file indicato da \var{oldpath}
70   dandogli nome \var{newpath}.
71   
72   \bodydesc{La funzione restituisce zero in caso di successo e -1 in
73     caso di errore. La variabile \var{errno} viene impostata
74     opportunamente, i principali codici di errore sono:
75   \begin{errlist}
76   \item[\errcode{EXDEV}] \param{oldpath} e \param{newpath} non sono sullo
77     stesso filesystem.
78   \item[\errcode{EPERM}] il filesystem che contiene \param{oldpath} e
79     \param{newpath} non supporta i link diretti o è una directory.
80   \item[\errcode{EEXIST}] un file (o una directory) con quel nome esiste di
81     già.
82   \item[\errcode{EMLINK}] ci sono troppi link al file \param{oldpath} (il
83     numero massimo è specificato dalla variabile \const{LINK\_MAX}, vedi
84     \secref{sec:sys_limits}).
85   \end{errlist}
86   ed inoltre \const{EACCES}, \const{ENAMETOOLONG}, \const{ENOTDIR},
87   \const{EFAULT}, \const{ENOMEM}, \const{EROFS}, \const{ELOOP},
88   \const{ENOSPC}, \const{EIO}.}
89 \end{prototype}
90
91 La creazione di un nuovo collegamento diretto non copia il contenuto del file,
92 ma si limita a creare una voce nella directory specificata con \var{newpath} e
93 ad aumentare di uno il numero di riferimenti al file (riportato nel campo
94 \var{st\_nlink} della struttura \var{stat}, vedi \secref{sec:file_stat})
95 aggiungendo il nuovo nome ai precedenti. Si noti che uno stesso file può
96 essere così chiamato con vari nomi in diverse directory.
97  
98 Per quanto dicevamo in \secref{sec:file_filesystem} la creazione di un
99 collegamento diretto è possibile solo se entrambi i pathname sono nello stesso
100 filesystem; inoltre il filesystem deve supportare i collegamenti diretti (il
101 meccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di
102 Windows). 
103
104 La funzione inoltre opera sia sui file ordinari che sugli altri oggetti del
105 filesystem, con l'eccezione delle directory. In alcune versioni di Unix solo
106 l'amministratore è in grado di creare un collegamento diretto ad un'altra
107 directory: questo viene fatto perché con una tale operazione è possibile
108 creare dei circoli nel filesystem (vedi l'esempio mostrato in
109 \secref{sec:file_symlink}, dove riprenderemo il discorso) che molti programmi
110 non sono in grado di gestire e la cui rimozione diventerebbe estremamente
111 complicata (in genere per questo tipo di errori occorre far girare il
112 programma \cmd{fsck} per riparare il filesystem).
113
114 Data la pericolosità di questa operazione e la disponibilità dei link
115 simbolici che possono fornire la stessa funzionalità senza questi problemi,
116 nei filesystem usati in Linux questa caratteristica è stata completamente
117 disabilitata, e al tentativo di creare un link diretto ad una directory la
118 funzione restituisce l'errore \errcode{EPERM}.
119
120 La rimozione di un file (o più precisamente della voce che lo referenzia
121 all'interno di una directory) si effettua con la funzione \func{unlink}; il
122 suo prototipo è il seguente:
123 \begin{prototype}{unistd.h}{int unlink(const char *pathname)}
124   Cancella il nome specificato dal pathname nella relativa directory e
125   decrementa il numero di riferimenti nel relativo inode. Nel caso di link
126   simbolico cancella il link simbolico; nel caso di socket, fifo o file di
127   dispositivo rimuove il nome, ma come per i file i processi che hanno aperto
128   uno di questi oggetti possono continuare ad utilizzarlo.
129   
130   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
131     errore, nel qual caso il file non viene toccato. La variabile
132     \var{errno} viene impostata secondo i seguenti codici di errore:
133   \begin{errlist}
134   \item[\errcode{EISDIR}] \var{pathname} si riferisce ad una directory
135     (valore specifico ritornato da Linux che non consente l'uso di
136     \var{unlink} con le directory, e non conforme allo standard POSIX, che
137     prescrive invece l'uso di \errcode{EPERM} in caso l'operazione non sia
138     consentita o il processo non abbia privilegi sufficienti).
139   \item[\errcode{EROFS}] \var{pathname} è su un filesystem montato in sola
140   lettura.
141   \item[\errcode{EISDIR}] \var{pathname} fa riferimento a una directory.
142   \end{errlist}
143   ed inoltre: \const{EACCES}, \const{EFAULT}, \const{ENOENT}, \const{ENOTDIR},
144   \const{ENOMEM}, \const{EROFS}, \const{ELOOP}, \const{EIO}.}
145 \end{prototype}
146
147 Per cancellare una voce in una directory è necessario avere il permesso di
148 scrittura su di essa (dato che si va a rimuovere una voce dal suo contenuto) e
149 il diritto di esecuzione sulla directory che la contiene (torneremo in
150 dettaglio sui permessi e gli attributi in \secref{sec:file_access_control}),
151 se inoltre lo \textit{sticky} bit è impostato occorrerà anche essere
152 proprietari del file o proprietari della directory (o root, per cui nessuna
153 delle restrizioni è applicata).
154
155 Una delle caratteristiche di queste funzioni è che la creazione/rimozione
156 del nome dalla directory e l'incremento/decremento del numero di riferimenti
157 nell'inode devono essere effettuati in maniera atomica (si veda
158 \secref{sec:proc_atom_oper}) senza possibili interruzioni fra le due
159 operazioni. Per questo entrambe queste funzioni sono realizzate tramite una
160 singola system call.
161
162 Si ricordi infine che il file non viene eliminato dal disco fintanto che tutti
163 i riferimenti ad esso sono stati cancellati: solo quando il \textit{link
164   count} mantenuto nell'inode diventa zero lo spazio occupato viene rimosso. A
165 questo però si aggiunge un'altra condizione, e cioè che non ci siano processi
166 che abbiano detto file aperto.  
167
168 Questa proprietà viene spesso usata per essere sicuri di non lasciare file
169 temporanei su disco in caso di crash dei programmi; la tecnica è quella di
170 aprire il file e chiamare \func{unlink} subito dopo, in questo modo il
171 contenuto del file è sempre disponibile all'interno del processo attraverso il
172 suo file descriptor (vedi \secref{sec:file_fd}) fintanto che il processo non
173 chiude il file, ma non ne resta traccia in nessuna directory, e lo spazio
174 occupato su disco viene immediatamente rilasciato alla conclusione del
175 processo (quando tutti i file vengono chiusi).
176
177
178 \subsection{Le funzioni \func{remove} e \func{rename}}
179 \label{sec:file_remove}
180
181 Al contrario di quanto avviene con altri Unix, in Linux non è possibile usare
182 \func{unlink} sulle directory; per cancellare una directory si può usare la
183 funzione \func{rmdir} (vedi \secref{sec:file_dir_creat_rem}), oppure la
184 funzione \func{remove}. Questa è la funzione prevista dallo standard ANSI C
185 per cancellare un file o una directory (e funziona anche per i sistemi che non
186 supportano i link diretti). Per i file è identica a \func{unlink} e per le
187 directory è identica a \func{rmdir}:
188 \begin{prototype}{stdio.h}{int remove(const char *pathname)}
189   Cancella un nome dal filesystem. Usa \func{unlink} per i file e
190   \func{rmdir} per le directory.
191   
192   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
193     errore, nel qual caso il file non viene toccato. Per i codici di
194     errore vedi quanto riportato nelle descrizioni di \func{unlink} e
195     \func{rmdir}.}
196 \end{prototype}
197
198 Per cambiare nome ad un file o a una directory (che devono comunque essere
199 nello stesso filesystem) si usa invece la funzione \func{rename},\footnote{la
200   funzione è definita dallo standard ANSI C solo per i file, POSIX estende la
201   funzione anche alle directory.} il cui prototipo è:
202 \begin{prototype}{stdio.h}
203   {int rename(const char *oldpath, const char *newpath)} 
204   
205   Rinomina \var{oldpath} in \var{newpath}, eseguendo se necessario lo
206   spostamento di un file fra directory diverse. Eventuali altri link diretti
207   allo stesso file non vengono influenzati.
208   
209   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
210     errore, nel qual caso il file non viene toccato. La variabile
211     \var{errno} viene impostata secondo i seguenti codici di errore:
212   \begin{errlist} 
213   \item[\errcode{EISDIR}] \var{newpath} è una directory mentre \var{oldpath}
214     non è una directory.
215   \item[\errcode{EXDEV}] \var{oldpath} e \var{newpath} non sono sullo stesso
216     filesystem.
217   \item[\errcode{ENOTEMPTY}] \var{newpath} è una directory già esistente e non
218     vuota.
219   \item[\errcode{EBUSY}] o \var{oldpath} o \var{newpath} sono in uso da parte
220     di qualche processo (come directory di lavoro o come radice) o del sistema
221     (come mount point).
222   \item[\errcode{EINVAL}] \var{newpath} contiene un prefisso di \var{oldpath} o
223     più in generale si è cercato di creare una directory come sottodirectory
224     di se stessa.
225   \item[\errcode{ENOTDIR}] Uno dei componenti dei pathname non è una directory
226     o \var{oldpath} è una directory e \var{newpath} esiste e non è una
227     directory.
228   \end{errlist} 
229   ed inoltre \const{EACCESS}, \const{EPERM}, \const{EMLINK}, \const{ENOENT},
230   \const{ENOMEM}, \const{EROFS}, \const{ELOOP} e \const{ENOSPC}.}
231 \end{prototype}
232
233 Il comportamento della funzione è diverso a seconda che si voglia rinominare
234 un file o una directory; se ci riferisce a un file allora \var{newpath}, se
235 esiste, non deve essere una directory (altrimenti si ha l'errore
236 \errcode{EISDIR}). Nel caso \var{newpath} indichi un file esistente questo
237 viene cancellato e rimpiazzato (atomicamente).
238
239 Se \var{oldpath} è una directory allora \var{newpath}, se esiste, deve essere
240 una directory vuota, altrimenti si avranno gli errori \errcode{ENOTDIR} (se
241 non è una directory) o \errcode{ENOTEMPTY} (se non è vuota). Chiaramente
242 \var{newpath} non può contenere \var{oldpath} altrimenti si avrà un errore
243 \errcode{EINVAL}.
244
245 Se \var{oldpath} si riferisce a un link simbolico questo sarà rinominato; se
246 \var{newpath} è un link simbolico verrà cancellato come qualunque altro file.
247 Infine qualora \var{oldpath} e \var{newpath} siano due nomi dello stesso file
248 lo standard POSIX prevede che la funzione non dia errore, e non faccia nulla,
249 lasciando entrambi i nomi; Linux segue questo standard, anche se, come fatto
250 notare dal manuale delle \textit{glibc}, il comportamento più ragionevole
251 sarebbe quello di cancellare \var{oldpath}.
252
253 Il vantaggio nell'uso di questa funzione al posto della chiamata successiva di
254 \func{link} e \func{unlink} è che l'operazione è eseguita atomicamente, non
255 può esistere cioè nessun istante in cui un altro processo può trovare attivi
256 entrambi i nomi dello stesso file, o, in caso di sostituzione di un file
257 esistente, non trovare quest'ultimo prima che la sostituzione sia stata
258 eseguita.
259
260 In ogni caso se \var{newpath} esiste e l'operazione fallisce per un qualche
261 motivo (come un crash del kernel), \func{rename} garantisce di lasciare
262 presente un'istanza di \var{newpath}. Tuttavia nella sovrascrittura potrà
263 esistere una finestra in cui sia \var{oldpath} che \var{newpath} fanno
264 riferimento allo stesso file.
265
266
267 \subsection{I link simbolici}
268 \label{sec:file_symlink}
269
270 Come abbiamo visto in \secref{sec:file_link} la funzione \func{link} crea
271 riferimenti agli inodes, pertanto può funzionare soltanto per file che
272 risiedono sullo stesso filesystem e solo per un filesystem di tipo Unix.
273 Inoltre abbiamo visto che in Linux non è consentito eseguire un link diretto
274 ad una directory.
275
276 Per ovviare a queste limitazioni i sistemi Unix supportano un'altra forma di
277 link (i cosiddetti \textit{soft link} o \textit{symbolic link}), che sono,
278 come avviene in altri sistemi operativi, dei file speciali che contengono
279 semplicemente il riferimento ad un altro file (o directory). In questo modo è
280 possibile effettuare link anche attraverso filesystem diversi, a file posti in
281 filesystem che non supportano i link diretti, a delle directory, ed anche a
282 file che non esistono ancora.
283
284 Il sistema funziona in quanto i link simbolici sono contrassegnati come tali
285 al kernel (analogamente a quanto avviene per le directory) per cui per alcune
286 funzioni di libreria (come \func{open} o \func{stat}) dare come parametro un
287 link simbolico comporta l'applicazione della funzione al file da esso
288 specificato. La funzione che permette di creare un nuovo link simbolico è
289 \func{symlink}; il suo prototipo è:
290 \begin{prototype}{unistd.h}
291   {int symlink(const char *oldpath, const char *newpath)} 
292   Crea un nuovo link simbolico di nome \param{newpath} il cui contenuto è
293   \param{oldpath}.
294   
295   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
296     errore, nel qual caso la variabile \var{errno} assumerà i valori:
297   \begin{errlist}
298   \item[\errcode{EPERM}] il filesystem che contiene \param{newpath} non
299     supporta i link simbolici.
300   \item[\errcode{ENOENT}] una componente di \param{newpath} non esiste o
301     \param{oldpath} è una stringa vuota.
302   \item[\errcode{EEXIST}] esiste già un file \param{newpath}.
303   \item[\errcode{EROFS}] \param{newpath} è su un filesystem montato in sola
304     lettura.
305   \end{errlist}
306   ed inoltre \const{EFAULT}, \const{EACCES}, \const{ENAMETOOLONG},
307   \const{ENOTDIR}, \const{ENOMEM}, \const{ELOOP}, \const{ENOSPC} e
308   \const{EIO}.}
309 \end{prototype}
310
311 Si tenga presente che la funzione non effettua nessun controllo sull'esistenza
312 di un file di nome \param{oldpath}, ma si limita ad inserire quella stringa
313 nel link simbolico. Pertanto un link simbolico può anche riferirsi ad un file
314 che non esiste: in questo caso si ha quello che viene chiamato un
315 \textit{dangling link}, letteralmente un \textsl{link ciondolante}.
316
317 Come accennato i link simbolici sono risolti automaticamente dal kernel
318 all'invocazione delle varie system call; in \tabref{tab:file_symb_effect} si è
319 riportato un elenco dei comportamenti delle varie funzioni di libreria che
320 operano sui file nei confronti della risoluzione dei link simbolici,
321 specificando quali seguono il link simbolico e quali invece possono operare
322 direttamente sul suo contenuto.
323 \begin{table}[htb]
324   \centering
325   \footnotesize
326   \begin{tabular}[c]{|l|c|c|}
327     \hline
328     \textbf{Funzione} & \textbf{Segue il link} & \textbf{Non segue il link} \\
329     \hline 
330     \hline 
331     \func{access}   & $\bullet$ &           \\
332     \func{chdir}    & $\bullet$ &           \\
333     \func{chmod}    & $\bullet$ &           \\
334     \func{chown}    &           & $\bullet$ \\
335     \func{creat}    & $\bullet$ &           \\
336     \func{exec}     & $\bullet$ &           \\
337     \func{lchown}   & $\bullet$ & $\bullet$ \\
338     \func{link}     &           &           \\
339     \func{lstat}    &           & $\bullet$ \\
340     \func{mkdir}    & $\bullet$ &           \\
341     \func{mkfifo}   & $\bullet$ &           \\
342     \func{mknod}    & $\bullet$ &           \\
343     \func{open}     & $\bullet$ &           \\
344     \func{opendir}  & $\bullet$ &           \\
345     \func{pathconf} & $\bullet$ &           \\
346     \func{readlink} &           & $\bullet$ \\
347     \func{remove}   &           & $\bullet$ \\
348     \func{rename}   &           & $\bullet$ \\
349     \func{stat}     & $\bullet$ &           \\
350     \func{truncate} & $\bullet$ &           \\
351     \func{unlink}   &           & $\bullet$ \\
352     \hline 
353   \end{tabular}
354   \caption{Uso dei link simbolici da parte di alcune funzioni.}
355   \label{tab:file_symb_effect}
356 \end{table}
357
358 Si noti che non si è specificato il comportamento delle funzioni che operano
359 con i file descriptor, in quanto la risoluzione del link simbolico viene in
360 genere effettuata dalla funzione che restituisce il file descriptor
361 (normalmente la \func{open}) e tutte le operazioni seguenti fanno riferimento
362 solo a quest'ultimo.
363
364 Dato che, come indicato in \tabref{tab:file_symb_effect}, funzioni come la
365 \func{open} seguono i link simbolici, occorrono funzioni apposite per accedere
366 alle informazioni del link invece che a quelle del file a cui esso fa
367 riferimento. Quando si vuole leggere il contenuto di un link simbolico si usa
368 la funzione \func{readlink}, il cui prototipo è:
369 \begin{prototype}{unistd.h}
370 {int readlink(const char *path, char *buff, size\_t size)} 
371   Legge il contenuto del link simbolico indicato da \var{path} nel buffer
372   \var{buff} di dimensione \var{size}.
373   
374   \bodydesc{La funzione restituisce il numero di caratteri letti dentro
375     \var{buff} o -1 per un errore, nel qual caso la variabile
376     \var{errno} assumerà i valori:
377   \begin{errlist}
378   \item[\errcode{EINVAL}] \param{path} non è un link simbolico o \param{size}
379     non è positiva.
380   \end{errlist}
381   ed inoltre \const{ENOTDIR}, \const{ENAMETOOLONG}, \const{ENOENT},
382   \const{EACCES}, \const{ELOOP}, \const{EIO}, \const{EFAULT} e
383   \const{ENOMEM}.}
384 \end{prototype}
385
386 La funzione apre il link simbolico, ne legge il contenuto, lo scrive nel
387 buffer, e lo richiude. Si tenga presente che la funzione non termina la
388 stringa con un carattere nullo e la tronca alla dimensione specificata da
389 \var{size} per evitare di sovrascrivere oltre le dimensioni del buffer.
390
391
392 \begin{figure}[htb]
393   \centering
394   \includegraphics[width=9cm]{img/link_loop}
395   \caption{Esempio di loop nel filesystem creato con un link simbolico.}
396   \label{fig:file_link_loop}
397 \end{figure}
398
399 Un caso comune che si può avere con i link simbolici è la creazione dei
400 cosiddetti \textit{loop}. La situazione è illustrata in
401 \figref{fig:file_link_loop}, che riporta la struttura della directory
402 \file{/boot}. Come si vede si è creato al suo interno un link simbolico che
403 punta di nuovo a \file{/boot}.\footnote{Questo tipo di loop è stato effettuato
404   per poter permettere a \cmd{grub} (un bootloader in grado di leggere
405   direttamente da vari filesystem il file da lanciare come sistema operativo)
406   di vedere i file in questa directory con lo stesso path con cui verrebbero
407   visti dal sistema operativo, anche se essi si trovano, come è solito, su una
408   partizione separata (e che \cmd{grub} vedrebbe come radice).}
409
410 Questo può causare problemi per tutti quei programmi che effettuano la
411 scansione di una directory senza tener conto dei link simbolici, ad esempio se
412 lanciassimo un comando del tipo \code{grep -r linux *}, il loop nella
413 directory porterebbe il comando ad esaminare \file{/boot}, \file{/boot/boot},
414 \file{/boot/boot/boot} e così via.
415
416 Per questo motivo il kernel e le librerie prevedono che nella risoluzione di
417 un pathname possano essere seguiti un numero limitato di link simbolici, il
418 cui valore limite è specificato dalla costante \const{MAXSYMLINKS}. Qualora
419 questo limite venga superato viene generato un errore ed \var{errno} viene
420 impostata al valore \errcode{ELOOP}.
421
422 Un punto da tenere sempre presente è che, come abbiamo accennato, un link
423 simbolico può fare riferimento anche ad un file che non esiste; ad esempio
424 possiamo creare un file temporaneo nella nostra directory con un link del
425 tipo:
426 \begin{verbatim}
427 $ ln -s /tmp/tmp_file temporaneo
428 \end{verbatim}%$
429 anche se \file{/tmp/tmp\_file} non esiste. Questo può generare confusione, in
430 quanto aprendo in scrittura \file{temporaneo} verrà creato
431 \file{/tmp/tmp\_file} e scritto; ma accedendo in sola lettura a
432 \file{temporaneo}, ad esempio con \cmd{cat}, otterremmo:
433 \begin{verbatim}
434 $ cat temporaneo
435 cat: temporaneo: No such file or directory
436 \end{verbatim}%$
437 con un errore che può sembrare sbagliato, dato che un'ispezione con \cmd{ls}
438 ci mostrerebbe invece l'esistenza di \file{temporaneo}.
439
440
441 \subsection{La creazione e la cancellazione delle directory} 
442 \label{sec:file_dir_creat_rem}
443
444 Per creare e cancellare delle directory si usano le due funzioni (omonime
445 degli analoghi comandi di shell) \func{mkdir} e \func{rmdir}.  Per poter
446 accedere ai tipi usati da queste funzioni si deve includere il file
447 \file{sys/types.h}, il prototipo della prima è:
448 \begin{prototype}{sys/stat.h}
449   {int mkdir(const char *dirname, mode\_t mode)} 
450   Crea una nuova directory vuota con il nome indicato da \var{dirname},
451   assegnandole i permessi indicati da \var{mode}. Il nome può essere indicato
452   con il pathname assoluto o relativo.
453   
454   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
455     errore, nel qual caso \var{errno} assumerà i valori:
456   \begin{errlist}
457   \item[\errcode{EEXIST}] Un file (o una directory) con quel nome esiste di
458     già.
459   \item[\errcode{EACCESS}] 
460     Non c'è il permesso di scrittura per la directory in cui si vuole inserire
461     la nuova directory.
462   \item[\errcode{EMLINK}] La directory in cui si vuole creare la nuova
463     directory contiene troppi file. Sotto Linux questo normalmente non avviene
464     perché il filesystem standard consente la creazione di un numero di file
465     maggiore di quelli che possono essere contenuti nel disco, ma potendo
466     avere a che fare anche con filesystem di altri sistemi questo errore può
467     presentarsi.
468   \item[\errcode{ENOSPC}] Non c'è abbastanza spazio sul file system per creare
469     la nuova directory o si è esaurita la quota disco dell'utente.
470   \end{errlist}
471   ed inoltre anche \const{EPERM}, \const{EFAULT}, \const{ENAMETOOLONG},
472   \const{ENOENT}, \const{ENOTDIR}, \const{ENOMEM}, \const{ELOOP},
473   \const{EROFS}.}
474 \end{prototype}
475
476 La funzione crea una nuova directory vuota (che contiene solo le due voci
477 standard \file{.} e \file{..}). I permessi di accesso (vedi la trattazione in
478 \secref{sec:file_access_control}) specificati da \var{mode} (i cui possibili
479 valori sono riportati in \tabref{tab:file_permission_const}) sono modificati
480 dalla maschera di creazione dei file (si veda \secref{sec:file_umask}).  La
481 titolarità della nuova directory è impostata secondo quanto riportato in
482 \secref{sec:file_ownership}.
483
484 La seconda funzione serve ad eliminare una directory già vuota (la directory
485 deve cioè contenere soltanto le due voci standard \file{.} e \file{..}); il
486 suo prototipo è:
487 \begin{prototype}{sys/stat.h}{int rmdir(const char *dirname)} 
488   Cancella la directory \var{dirname}, che deve essere vuota.  Il nome può
489   essere indicato con il pathname assoluto o relativo.
490   
491   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
492     errore, nel qual caso \var{errno} assumerà i valori:
493   \begin{errlist}
494   \item[\errcode{EPERM}] Il filesystem non supporta la cancellazione di
495     directory, oppure la directory che contiene \var{dirname} ha lo sticky bit
496     impostato e l'userid effettivo del processo non corrisponde al
497     proprietario della directory.
498   \item[\errcode{EACCESS}] Non c'è il permesso di scrittura per la directory
499     che contiene la directory che si vuole cancellare, o non c'è il permesso
500     di attraversare (esecuzione) una delle directory specificate in
501     \var{dirname}.
502   \item[\errcode{EBUSY}] La directory specificata è la directory di lavoro o la
503     radice di qualche processo.
504   \item[\errcode{ENOTEMPTY}] La directory non è vuota.
505   \end{errlist}
506   ed inoltre anche \const{EFAULT}, \const{ENAMETOOLONG}, \const{ENOENT},
507   \const{ENOTDIR}, \const{ENOMEM}, \const{ELOOP}, \const{EROFS}.}
508 \end{prototype}
509
510 La modalità con cui avviene la cancellazione è analoga a quella di
511 \func{unlink}: fintanto che il numero di link all'inode della directory non
512 diventa nullo e nessun processo ha la directory aperta lo spazio occupato su
513 disco non viene rilasciato. Se un processo ha la directory aperta la funzione
514 rimuove il link all'inode e nel caso sia l'ultimo, pure le voci standard
515 \file{.} e \file{..}, a questo punto il kernel non consentirà di creare più
516 nuovi file nella directory.
517
518
519 \subsection{La creazione di file speciali}
520 \label{sec:file_mknod}
521
522 Finora abbiamo parlato esclusivamente di file, directory e link simbolici; in
523 \secref{sec:file_file_types} abbiamo visto però che il sistema prevede pure
524 degli altri tipi di file speciali, come i file di dispositivo e le fifo (i
525 socket sono un caso a parte, che vedremo in \capref{cha:socket_intro}).
526
527 La manipolazione delle caratteristiche di questi file e la loro cancellazione
528 può essere effettuata con le stesse funzioni che operano sui file regolari; ma
529 quando li si devono creare sono necessarie delle funzioni apposite. La prima
530 di queste funzioni è \func{mknod}, il suo prototipo è:
531 \begin{functions}
532   \headdecl{sys/types.h}
533   \headdecl{sys/stat.h}
534   \headdecl{fnctl.h}
535   \headdecl{unistd.h}
536   \funcdecl{int mknod(const char *pathname, mode\_t mode, dev\_t dev)} Crea un
537   inode, si usa per creare i file speciali.
538   
539   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
540     errore, nel qual caso \var{errno} assumerà i valori:
541   \begin{errlist}
542   \item[\errcode{EPERM}] Non si hanno privilegi sufficienti a creare l'inode, o
543     il filesystem su cui si è cercato di creare \func{pathname} non supporta
544     l'operazione.
545   \item[\errcode{EINVAL}] Il valore di \var{mode} non indica un file, una fifo
546     o un dipositivo.
547   \item[\errcode{EEXIST}] \param{pathname} esiste già o è un link simbolico.
548   \end{errlist}
549   ed inoltre anche \const{EFAULT}, \const{EACCESS}, \const{ENAMETOOLONG},
550   \const{ENOENT}, \const{ENOTDIR}, \const{ENOMEM}, \const{ELOOP},
551   \const{ENOSPC}, \const{EROFS}.}
552 \end{functions}
553
554 La funzione permette di creare un file speciale, ma si può usare anche per
555 creare file regolari e fifo; l'argomento \param{mode} specifica il tipo di
556 file che si vuole creare ed i relativi permessi, secondo i valori riportati in
557 \tabref{tab:file_mode_flags}, che vanno combinati con un OR binario. I
558 permessi sono comunque modificati nella maniera usuale dal valore di
559 \var{umask} (si veda \secref{sec:file_umask}).
560
561 Per il tipo di file può essere specificato solo uno fra: \const{S\_IFREG} per
562 un file regolare (che sarà creato vuoto), \const{S\_IFBLK} per un device a
563 blocchi, \const{S\_IFCHR} per un device a caratteri e \const{S\_IFIFO} per una
564 fifo. Un valore diverso comporterà l'errore \errcode{EINVAL}. Qualora si sia
565 specificato in \param{mode} un file di dispositivo, il valore di \param{dev}
566 viene usato per indicare a quale dispositivo si fa riferimento.
567
568 Solo l'amministratore può creare un file di dispositivo o un file regolare
569 usando questa funzione; ma in Linux\footnote{la funzione non è prevista dallo
570   standard POSIX, e deriva da SVr4, con appunto questa differenza e diversi
571   codici di errore.} l'uso per la creazione di una fifo è consentito anche
572 agli utenti normali.
573
574 I nuovi inode creati con \func{mknod} apparterranno al proprietario e al
575 gruppo del processo che li ha creati, a meno che non si sia attivato il bit
576 \acr{sgid} per la directory o sia stata attivata la semantica BSD per il
577 filesystem (si veda \secref{sec:file_ownership}) in cui si va a creare
578 l'inode.
579
580 Per creare una fifo (un file speciale, su cui torneremo in dettaglio in
581 \secref{sec:ipc_named_pipe}) lo standard POSIX specifica l'uso della funzione
582 \func{mkfifo}, il cui prototipo è:
583 \begin{functions}
584   \headdecl{sys/types.h} \headdecl{sys/stat.h} 
585   
586   \funcdecl{int mkfifo(const char *pathname, mode\_t mode)} Crea una fifo.
587   
588   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
589     errore, nel qual caso \var{errno} assumerà i valori \const{EACCESS},
590     \const{EEXIST}, \const{ENAMETOOLONG}, \const{ENOENT}, \const{ENOSPC},
591     \const{ENOTDIR} e \const{EROFS}.}
592 \end{functions}
593 \noindent come per \func{mknod} il file \param{pathname} non deve esistere
594 (neanche come link simbolico); al solito i permessi specificati da
595 \param{mode} vengono modificati dal valore di \var{umask}.
596
597
598
599 \subsection{Accesso alle directory}
600 \label{sec:file_dir_read}
601
602 Benché le directory siano oggetti del filesystem come tutti gli altri non ha
603 ovviamente senso aprirle come fossero dei file di dati. Può però essere utile
604 poterne leggere il contenuto ad esempio per fare la lista dei file che esse
605 contengono o ricerche sui medesimi. Solo il kernel può scrivere direttamente
606 in una directory (onde evitare inconsistenze all'interno del filesystem), i
607 processi devono creare i file usando le apposite funzioni.
608
609 Per accedere al contenuto delle directory si usano i cosiddetti
610 \textit{directory streams} (chiamati così per l'analogia con i file stream di
611 \capref{cha:files_std_interface}); la funzione \func{opendir} apre uno di
612 questi stream e la funzione \func{readdir} legge il contenuto della directory,
613 i cui elementi sono le \textit{directory entry} (da distinguersi da quelle
614 della cache di cui parlavamo in \secref{sec:file_vfs}) in un'opportuna
615 struttura \var{struct dirent}.
616
617 (NdA Il resto va scritto!!! É noioso e lo farò più avanti).
618
619
620 \subsection{La directory di lavoro}
621 \label{sec:file_work_dir}
622
623 A ciascun processo è associata una directory nel filesystem che è chiamata
624 directory corrente o directory di lavoro (\textit{current working directory})
625 che è quella a cui si fa riferimento quando un filename è espresso in forma
626 relativa, dove il ``relativa'' fa riferimento appunto a questa directory.
627
628 Quando un utente effettua il login, questa directory viene impostata alla
629 \textit{home directory} del suo account. Il comando \cmd{cd} della shell
630 consente di cambiarla a piacere, spostandosi da una directory ad un'altra, il
631 comando \cmd{pwd} la stampa sul terminale.  Siccome la directory corrente
632 resta la stessa quando viene creato un processo figlio (vedi
633 \secref{sec:proc_fork}), la directory corrente della shell diventa anche la
634 directory corrente di qualunque comando da essa lanciato.
635
636 In genere il kernel tiene traccia per ciascun processo dell'inode della
637 directory di lavoro corrente, per ottenere il pathname occorre usare una
638 apposita funzione di libreria,  \func{getcwd}, il cui prototipo è:
639 \begin{prototype}{unistd.h}{char *getcwd(char *buffer, size\_t size)}
640   Restituisce il filename completo della directory di lavoro corrente nella
641   stringa puntata da \var{buffer}, che deve essere precedentemente
642   allocata, per una dimensione massima di \var{size}.
643   
644   \bodydesc{La funzione restituisce il puntatore \var{buffer} se riesce,
645     \val{NULL} se fallisce, in quest'ultimo caso la variabile
646     \var{errno} è impostata con i seguenti codici di errore:
647   \begin{errlist}
648   \item[\errcode{EINVAL}] L'argomento \var{size} è zero e \var{buffer} non
649     è nullo.
650   \item[\errcode{ERANGE}] L'argomento \var{size} è più piccolo della
651     lunghezza del pathname. 
652   \item[\errcode{EACCESS}] Manca il permesso di lettura o di ricerca su uno dei
653     componenti del pathname (cioè su una delle directory superiori alla
654     corrente).
655   \end{errlist}}
656 \end{prototype}
657
658 Il buffer deve essere sufficientemente lungo da poter contenere il pathname
659 completo più lo zero di terminazione della stringa. Qualora esso ecceda le
660 dimensioni specificate con \var{size} la funzione restituisce un errore.  Si
661 può anche specificare un puntatore nullo come \var{buffer},\footnote{questa è
662   un'estensione allo standard POSIX.1, supportata da Linux.} nel qual caso la
663 stringa sarà allocata automaticamente per una dimensione pari a \var{size}
664 qualora questa sia diversa da zero, o della lunghezza esatta del pathname
665 altrimenti. In questo caso ci si deve ricordare di disallocare la stringa una
666 volta cessato il suo utilizzo.
667
668 Di questa funzione esiste una versione \code{char *getwd(char *buffer)}
669 fatta per compatibilità all'indietro con BSD, che non consente di specificare
670 la dimensione del buffer; esso deve essere allocato in precedenza ed avere una
671 dimensione superiore a \const{PATH\_MAX} (di solito 256 byte, vedi
672 \secref{sec:sys_limits}); il problema è che in Linux non esiste una dimensione
673 superiore per un pathname, per cui non è detto che il buffer sia sufficiente a
674 contenere il nome del file, e questa è la ragione principale per cui questa
675 funzione è deprecata.
676
677 Una seconda funzione simile è \code{char *get\_current\_dir\_name(void)} che è
678 sostanzialmente equivalente ad una \code{getcwd(NULL, 0)}, con la sola
679 differenza che essa ritorna il valore della variabile di ambiente \val{PWD},
680 che essendo costruita dalla shell può contenere un pathname comprendente anche
681 dei link simbolici. Usando \func{getcwd} infatti, essendo il pathname ricavato
682 risalendo all'indietro l'albero della directory, si perderebbe traccia di ogni
683 passaggio attraverso eventuali link simbolici.
684
685 Per cambiare la directory di lavoro corrente si può usare la funzione
686 \func{chdir} (equivalente del comando di shell \cmd{cd}) il cui nome sta
687 appunto per \textit{change directory}, il suo prototipo è:
688 \begin{prototype}{unistd.h}{int chdir(const char *pathname)} 
689   Cambia la directory di lavoro corrente in \param{pathname}.
690   
691   \bodydesc{La funzione restituisce 0 in caso di successo e -1 per un errore,
692     nel qual caso \var{errno} assumerà i valori:
693   \begin{errlist}
694   \item[\errcode{ENOTDIR}] Non si è specificata una directory.
695   \item[\errcode{EACCESS}] Manca il permesso di ricerca su uno dei componenti
696     di \param{path}.
697   \end{errlist}
698   ed inoltre \const{EFAULT}, \const{ENAMETOOLONG}, \const{ENOENT},
699   \const{ENOMEM}, \const{ELOOP} e \const{EIO}.}
700 \end{prototype}
701 \noindent ed ovviamente \param{pathname} deve indicare una directory per la
702 quale si hanno i permessi di accesso.
703
704 Dato che anche le directory sono file, è possibile riferirsi ad esse anche
705 tramite il file descriptor, e non solo tramite il filename, per fare questo si
706 usa \func{fchdir}, il cui prototipo è:
707 \begin{prototype}{unistd.h}{int fchdir(int fd)} 
708   Identica a \func{chdir}, ma usa il file descriptor \param{fd} invece del
709   pathname.
710   
711   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
712     errore, in caso di errore \var{errno} assumerà i valori \const{EBADF} o
713     \const{EACCES}.}
714 \end{prototype}
715 \noindent anche in questo caso \param{fd} deve essere un file descriptor
716 valido che fa riferimento ad una directory. Inoltre l'unico errore di accesso
717 possibile (tutti gli altri sarebbero occorsi all'apertura di \func{fd}), è
718 quello in cui il processo non ha il permesso di accesso alla directory
719 specificata da \param{fd}.
720
721
722
723 \subsection{I file temporanei}
724 \label{sec:file_temp_file}
725
726 In molte occasioni è utile poter creare dei file temporanei; benché la cosa
727 sembri semplice, in realtà il problema è più sottile di quanto non appaia a
728 prima vista. Infatti anche se sembrerebbe banale generare un nome a caso e
729 creare il file dopo aver controllato che questo non esista, nel momento fra il
730 controllo e la creazione si ha giusto lo spazio per una possibile \textit{race
731   condition} (si ricordi quanto visto in \secref{sec:proc_race_cond}).
732
733 Le \acr{glibc} provvedono varie funzioni per generare nomi di file temporanei,
734 di cui si abbia certezza di unicità (al momento della generazione); la prima
735 di queste funzioni è \func{tmpnam} il cui prototipo è:
736 \begin{prototype}{stdio.h}{char *tmpnam(char *string)}
737   Restituisce il puntatore ad una stringa contente un nome di file valido e
738   non esistente al momento dell'invocazione. 
739
740   \bodydesc{La funzione ritorna il puntatore alla stringa con il nome o
741   \val{NULL} in caso di fallimento. Non sono definiti errori.}
742 \end{prototype}
743 \noindent se si è passato un puntatore \param{string} non nullo questo deve
744 essere di dimensione \const{L\_tmpnam} (costante definita in \file{stdio.h},
745 come \const{P\_tmpdir} e \const{TMP\_MAX}) ed il nome generato vi verrà
746 copiato automaticamente; altrimenti il nome sarà generato in un buffer statico
747 interno che verrà sovrascritto ad una chiamata successiva.  Successive
748 invocazioni della funzione continueranno a restituire nomi unici fino ad un
749 massimo di \const{TMP\_MAX} volte. Al nome viene automaticamente aggiunto come
750 prefisso la directory specificata da \const{P\_tmpdir}.
751
752 Di questa funzione esiste una versione rientrante, \func{tmpnam\_r}, che non
753 fa nulla quando si passa \val{NULL} come parametro. Una funzione simile,
754 \func{tempnam}, permette di specificare un prefisso per il file
755 esplicitamente, il suo prototipo è:
756 \begin{prototype}{stdio.h}{char *tempnam(const char *dir, const char *pfx)}
757   Restituisce il puntatore ad una stringa contente un nome di file valido e
758   non esistente al momento dell'invocazione.
759
760   \bodydesc{La funzione ritorna il puntatore alla stringa con il nome o
761   \val{NULL} in caso di fallimento, \var{errno} viene impostata a
762   \const{ENOMEM} qualora fallisca l'allocazione della stringa.}
763 \end{prototype}
764
765 La funzione alloca con \code{malloc} la stringa in cui restituisce il nome,
766 per cui è sempre rientrante, occorre però ricordarsi di disallocare il
767 puntatore che restituisce.  L'argomento \param{pfx} specifica un prefisso di
768 massimo 5 caratteri per il nome provvisorio. La funzione assegna come
769 directory per il file temporaneo (verificando che esista e sia accessibili),
770 la prima valida delle seguenti:
771 \begin{itemize*}
772 \item La variabile di ambiente \const{TMPNAME} (non ha effetto se non è
773   definita o se il programma chiamante è \acr{suid} o \acr{sgid}, vedi
774   \secref{sec:file_suid_sgid}).
775 \item il valore dell'argomento \param{dir} (se diverso da \val{NULL}).
776 \item Il valore della costante \const{P\_tmpdir}.
777 \item la directory \file{/tmp}.
778 \end{itemize*}
779
780 In ogni caso, anche se la generazione del nome è casuale, ed è molto difficile
781 ottenere un nome duplicato, nulla assicura che un altro processo non possa
782 avere creato, fra l'ottenimento del nome e l'apertura del file, un altro file
783 con lo stesso nome; per questo motivo quando si usa il nome ottenuto da una di
784 queste funzioni occorre sempre aprire il nuovo file in modalità di esclusione
785 (cioè con l'opzione \const{O\_EXCL} per i file descriptor o con il flag
786 \code{x} per gli stream) che fa fallire l'apertura in caso il file sia già
787 esistente.
788
789 Per evitare di dovere effettuare a mano tutti questi controlli, lo standard
790 POSIX definisce la funzione \func{tempfile}, il cui prototipo è:
791 \begin{prototype}{stdio.h}{FILE *tmpfile (void)}
792   Restituisce un file temporaneo aperto in lettura/scrittura.
793   
794   \bodydesc{La funzione ritorna il puntatore allo stream associato al file
795     temporaneo in caso di successo e \val{NULL} in caso di errore, nel qual
796     caso \var{errno} assumerà i valori:
797     \begin{errlist}
798     \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale.
799     \item[\errcode{EEXIST}] Non è stato possibile generare un nome univoco.
800     \end{errlist}
801     ed inoltre \const{EFAULT}, \const{EMFILE}, \const{ENFILE}, \const{ENOSPC},
802     \const{EROFS} e \const{EACCESS}.}
803 \end{prototype}
804 \noindent essa restituisce direttamente uno stream già aperto (in modalità
805 \code{r+b}, si veda \secref{sec:file_fopen}) e pronto per l'uso, che viene
806 automaticamente cancellato alla sua chiusura o all'uscita dal programma. Lo
807 standard non specifica in quale directory verrà aperto il file, ma le
808 \acr{glibc} prima tentano con \const{P\_tmpdir} e poi con \file{/tmp}. Questa
809 funzione è rientrante e non soffre di problemi di \textit{race
810   condition}\index{race condition}.
811
812 Alcune versioni meno recenti di Unix non supportano queste funzioni; in questo
813 caso si possono usare le vecchie funzioni \func{mktemp} e \func{mkstemp} che
814 modificano una stringa di input che serve da modello e che deve essere
815 conclusa da 6 caratteri \code{X} che verranno sostituiti da un codice
816 unico. La prima delle due è analoga a \func{tmpnam} e genera un nome casuale,
817 il suo prototipo è:
818 \begin{prototype}{stlib.h}{char *mktemp(char *template)}
819   Genera un filename univoco sostituendo le \code{XXXXXX} finali di
820   \param{template}.
821   
822   \bodydesc{La funzione ritorna il puntatore \param{template} in caso di
823     successo e \val{NULL} in caso di errore, nel qual caso \var{errno}
824     assumerà i valori:
825     \begin{errlist}
826     \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
827     \end{errlist}}
828 \end{prototype}
829 \noindent dato che \param{template} deve poter essere modificata dalla
830 funzione non si può usare una stringa costante.  Tutte le avvertenze riguardo
831 alle possibili \textit{race condition}\index{race condition} date per
832 \func{tmpnam} continuano a valere; inoltre in alcune vecchie implementazioni
833 il valore di usato per sostituire le \code{XXXXXX} viene formato con il
834 \acr{pid} del processo più una lettera, il che mette a disposizione solo 26
835 possibilità diverse per il nome del file, e rende il nome temporaneo facile da
836 indovinare. Per tutti questi motivi la funzione è deprecata e non dovrebbe mai
837 essere usata.
838
839
840
841 La seconda funzione, \func{mkstemp} è sostanzialmente equivalente a
842 \func{tmpfile}, ma restituisce un file descriptor invece di uno stream; il suo
843 prototipo è:
844 \begin{prototype}{stlib.h}{int mkstemp(char *template)}
845   Genera un file temporaneo con un nome ottenuto sostituendo le \code{XXXXXX}
846   finali di \param{template}.
847   
848   \bodydesc{La funzione ritorna il file descriptor in caso successo e
849     -1 in caso di errore, nel qual caso \var{errno} assumerà i valori:
850     \begin{errlist}
851     \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
852     \item[\errcode{EEXIST}] non è riuscita a creare un file temporano, il
853       contenuto di \param{template} è indefinito.
854     \end{errlist}}
855 \end{prototype}
856 \noindent come per \func{mktemp} anche in questo caso \param{template} non può
857 essere una stringa costante. La funzione apre un file in lettura/scrittura con
858 la funzione \func{open}, usando l'opzione \const{O\_EXCL} (si veda
859 \secref{sec:file_open}), in questo modo al ritorno della funzione si ha la
860 certezza di essere i soli utenti del file. I permessi sono impostati al valore
861 \code{0600}\footnote{questo è vero a partire dalle \acr{glibc} 2.0.7, le
862   versioni precedenti delle \acr{glibc} e le vecchie \acr{libc5} e \acr{libc4}
863   usavano il valore \code{0666} che permetteva a chiunque di leggere i
864   contenuti del file.} (si veda \secref{sec:file_perm_overview}).
865
866 In OpenBSD è stata introdotta un'altra funzione\footnote{introdotta anche in
867   Linux a partire dalle \acr{glibc} 2.1.91.} simile alle precedenti,
868 \func{mkdtemp}, che crea una directory temporanea; il suo prototipo è:
869 \begin{prototype}{stlib.h}{char *mkdtemp(char *template)}
870   Genera una directory temporaneo il cui nome è ottenuto sostituendo le
871   \code{XXXXXX} finali di \param{template}.
872   
873   \bodydesc{La funzione ritorna il puntatore al nome della directory in caso
874     successo e \val{NULL} in caso di errore, nel qual caso \var{errno}
875     assumerà i valori:
876     \begin{errlist}
877     \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
878     \end{errlist}
879     più gli altri eventuali codici di errore di \func{mkdir}.}
880 \end{prototype}
881 \noindent la directory è creata con permessi \code{0700} (al solito si veda
882 \capref{cha:file_unix_interface} per i dettagli); dato che la creazione della
883 directory è sempre esclusiva i precedenti problemi di \textit{race
884   condition}\index{race condition} non si pongono.
885
886
887 \section{La manipolazione delle caratteristiche dei files}
888 \label{sec:file_infos}
889
890 Come spiegato in \secref{sec:file_filesystem} tutte le informazioni
891 generali relative alle caratteristiche di ciascun file, a partire dalle
892 informazioni relative al controllo di accesso, sono mantenute nell'inode.
893
894 Vedremo in questa sezione come sia possibile leggere tutte queste informazioni
895 usando la funzione \func{stat}, che permette l'accesso a tutti i dati
896 memorizzati nell'inode; esamineremo poi le varie funzioni usate per manipolare
897 tutte queste informazioni (eccetto quelle che riguardano la gestione del
898 controllo di accesso, trattate in in \secref{sec:file_access_control}).
899
900
901 \subsection{Le funzioni \func{stat}, \func{fstat} e \func{lstat}}
902 \label{sec:file_stat}
903
904 La lettura delle informazioni relative ai file è fatta attraverso la famiglia
905 delle funzioni \func{stat}; questa è la funzione che ad esempio usa il comando
906 \cmd{ls} per poter ottenere e mostrare tutti i dati dei files. I prototipi di
907 queste funzioni sono i seguenti:
908 \begin{functions}
909   \headdecl{sys/types.h} 
910   \headdecl{sys/stat.h} 
911   \headdecl{unistd.h}
912
913   \funcdecl{int stat(const char *file\_name, struct stat *buf)} Legge le
914   informazione del file specificato da \var{file\_name} e le inserisce in
915   \var{buf}.
916   
917   \funcdecl{int lstat(const char *file\_name, struct stat *buf)} Identica a
918   \func{stat} eccetto che se il \var{file\_name} è un link simbolico vengono
919   lette le informazioni relativa ad esso e non al file a cui fa riferimento.
920   
921   \funcdecl{int fstat(int filedes, struct stat *buf)} Identica a \func{stat}
922   eccetto che si usa con un file aperto, specificato tramite il suo file
923   descriptor \var{filedes}.
924   
925   \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 per un
926     errore, nel qual caso \var{errno} assumerà uno dei valori: \const{EBADF},
927     \const{ENOENT}, \const{ENOTDIR}, \const{ELOOP}, \const{EFAULT},
928     \const{EACCESS}, \const{ENOMEM}, \const{ENAMETOOLONG}.}
929 \end{functions}
930 \noindent il loro comportamento è identico, solo che operano rispettivamente
931 su un file, su un link simbolico e su un file descriptor.
932
933 La struttura \var{stat} usata da queste funzioni è definita nell'header
934 \file{sys/stat.h} e in generale dipende dall'implementazione; la versione
935 usata da Linux è mostrata in \figref{fig:file_stat_struct}, così come
936 riportata dalla pagina di manuale di \func{stat} (in realtà la definizione
937 effettivamente usata nel kernel dipende dall'architettura e ha altri campi
938 riservati per estensioni come tempi più precisi, o per il padding dei campi).
939
940 \begin{figure}[!htb]
941   \footnotesize
942   \centering
943   \begin{minipage}[c]{15cm}
944     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
945 struct stat {
946     dev_t         st_dev;      /* device */
947     ino_t         st_ino;      /* inode */
948     mode_t        st_mode;     /* protection */
949     nlink_t       st_nlink;    /* number of hard links */
950     uid_t         st_uid;      /* user ID of owner */
951     gid_t         st_gid;      /* group ID of owner */
952     dev_t         st_rdev;     /* device type (if inode device) */
953     off_t         st_size;     /* total size, in bytes */
954     unsigned long st_blksize;  /* blocksize for filesystem I/O */
955     unsigned long st_blocks;   /* number of blocks allocated */
956     time_t        st_atime;    /* time of last access */
957     time_t        st_mtime;    /* time of last modification */
958     time_t        st_ctime;    /* time of last change */
959 };
960     \end{lstlisting}
961   \end{minipage} 
962   \normalsize 
963   \caption{La struttura \var{stat} per la lettura delle informazioni dei 
964     file}
965   \label{fig:file_stat_struct}
966 \end{figure}
967
968 Si noti come i vari membri della struttura siano specificati come tipi
969 primitivi del sistema (di quelli definiti in
970 \tabref{tab:intro_primitive_types}, e dichiarati in \file{sys/types.h}).
971
972
973 \subsection{I tipi di file}
974 \label{sec:file_types}
975
976 Come riportato in \tabref{tab:file_file_types} in Linux oltre ai file e alle
977 directory esistono altri oggetti che possono stare su un filesystem.  Il tipo
978 di file è ritornato dalla \func{stat} come maschera binaria nel campo
979 \var{st\_mode} (che che contiene anche le informazioni relative ai permessi).
980
981 Dato che il valore numerico può variare a seconda delle implementazioni, lo
982 standard POSIX definisce un insieme di macro per verificare il tipo di file,
983 queste vengono usate anche da Linux che supporta pure le estensioni allo
984 standard per i link simbolici e i socket definite da BSD; l'elenco completo
985 delle macro con cui è possibile estrarre l'informazione da \var{st\_mode} è
986 riportato in \tabref{tab:file_type_macro}.
987 \begin{table}[htb]
988   \centering
989   \footnotesize
990   \begin{tabular}[c]{|l|l|}
991     \hline
992     \textbf{Macro} & \textbf{Tipo del file} \\
993     \hline
994     \hline
995     \macro{S\_ISREG(m)}  & file regolare \\
996     \macro{S\_ISDIR(m)}  & directory \\
997     \macro{S\_ISCHR(m)}  & device a caratteri \\
998     \macro{S\_ISBLK(m)}  & device a blocchi\\
999     \macro{S\_ISFIFO(m)} & fifo \\
1000     \macro{S\_ISLNK(m)}  & link simbolico \\
1001     \macro{S\_ISSOCK(m)} & socket \\
1002     \hline    
1003   \end{tabular}
1004   \caption{Macro per i tipi di file (definite in \texttt{sys/stat.h}).}
1005   \label{tab:file_type_macro}
1006 \end{table}
1007
1008 Oltre alle macro di \tabref{tab:file_type_macro} è possibile usare
1009 direttamente il valore di \var{st\_mode} per ricavare il tipo di file
1010 controllando direttamente i vari bit in esso memorizzati. Per questo sempre in
1011 \file{sys/stat.h} sono definite le costanti numeriche riportate in
1012 \tabref{tab:file_mode_flags}.
1013
1014 Il primo valore dell'elenco di \tabref{tab:file_mode_flags} è la maschera
1015 binaria che permette di estrarre i bit nei quali viene memorizzato il tipo di
1016 file, i valori successivi sono le costanti corrispondenti ai singoli bit, e
1017 possono essere usati per effettuare la selezione sul tipo di file voluto, con
1018 un'opportuna combinazione.
1019
1020 \begin{table}[htb]
1021   \centering
1022   \footnotesize
1023   \begin{tabular}[c]{|l|c|l|}
1024     \hline
1025     \textbf{Flag} & \textbf{Valore} & \textbf{Significato} \\
1026     \hline
1027     \hline
1028     \const{S\_IFMT}   &  0170000 & bitmask per i bit del tipo di file \\
1029     \const{S\_IFSOCK} &  0140000 & socket             \\
1030     \const{S\_IFLNK}  &  0120000 & link simbolico     \\
1031     \const{S\_IFREG}  &  0100000 & file regolare      \\ 
1032     \const{S\_IFBLK}  &  0060000 & device a blocchi   \\
1033     \const{S\_IFDIR}  &  0040000 & directory          \\ 
1034     \const{S\_IFCHR}  &  0020000 & device a caratteri \\
1035     \const{S\_IFIFO}  &  0010000 & fifo               \\
1036     \hline
1037     \const{S\_ISUID}  &  0004000 & set UID bit   \\
1038     \const{S\_ISGID}  &  0002000 & set GID bit   \\
1039     \const{S\_ISVTX}  &  0001000 & sticky bit    \\
1040     \hline
1041 %    \const{S\_IRWXU}  &  00700   & bitmask per i permessi del proprietario  \\
1042     \const{S\_IRUSR}  &  00400   & il proprietario ha permesso di lettura   \\
1043     \const{S\_IWUSR}  &  00200   & il proprietario ha permesso di scrittura \\
1044     \const{S\_IXUSR}  &  00100   & il proprietario ha permesso di esecuzione\\
1045     \hline
1046 %    \const{S\_IRWXG}  &  00070   & bitmask per i permessi del gruppo        \\
1047     \const{S\_IRGRP}  &  00040   & il gruppo ha permesso di lettura         \\
1048     \const{S\_IWGRP}  &  00020   & il gruppo ha permesso di scrittura       \\
1049     \const{S\_IXGRP}  &  00010   & il gruppo ha permesso di esecuzione      \\
1050     \hline
1051 %    \const{S\_IRWXO}  &  00007   & bitmask per i permessi di tutti gli altri\\
1052     \const{S\_IROTH}  &  00004   & gli altri hanno permesso di lettura      \\
1053     \const{S\_IWOTH}  &  00002   & gli altri hanno permesso di esecuzione   \\
1054     \const{S\_IXOTH}  &  00001   & gli altri hanno permesso di esecuzione   \\
1055     \hline    
1056   \end{tabular}
1057   \caption{Costanti per l'identificazione dei vari bit che compongono il campo
1058     \var{st\_mode} (definite in \file{sys/stat.h}).}
1059   \label{tab:file_mode_flags}
1060 \end{table}
1061
1062 Ad esempio se si volesse impostare una condizione che permetta di controllare
1063 se un file è una directory o un file ordinario si potrebbe definire la macro
1064 di preprocessore:
1065 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
1066 #define IS_FILE_DIR(x) (((x) & S_IFMT) & (S_IFDIR | S_IFREG))
1067 \end{lstlisting}
1068 in cui prima si estraggono da \var{st\_mode} i bit relativi al tipo di file e
1069 poi si effettua il confronto con la combinazione di tipi scelta.
1070
1071
1072 \subsection{Le dimensioni dei file}
1073 \label{sec:file_file_size}
1074
1075 Il membro \var{st\_size} contiene la dimensione del file in byte (se si tratta
1076 di un file regolare, nel caso di un link simbolico la dimensione è quella del
1077 pathname che contiene, per le fifo è sempre nullo).
1078
1079 Il campo \var{st\_blocks} definisce la lunghezza del file in blocchi di 512
1080 byte. Il campo \var{st\_blksize} infine definisce la dimensione preferita per
1081 i trasferimenti sui file (che è la dimensione usata anche dalle librerie del C
1082 per l'interfaccia degli stream); scrivere sul file a blocchi di dati di
1083 dimensione inferiore sarebbe inefficiente.
1084
1085 Si tenga conto che la lunghezza del file riportata in \var{st\_size} non è
1086 detto che corrisponda all'occupazione dello spazio su disco per via della
1087 possibile esistenza dei cosiddetti \textit{holes} (letteralmente
1088 \textsl{buchi}) che si formano tutte le volte che si va a scrivere su un file
1089 dopo aver eseguito una \func{lseek} (vedi \secref{sec:file_lseek}) oltre la
1090 sua fine.
1091
1092 In questo caso si avranno risultati differenti a seconda del modo in cui si
1093 calcola la lunghezza del file, ad esempio il comando \cmd{du}, (che riporta il
1094 numero di blocchi occupati) potrà dare una dimensione inferiore, mentre se si
1095 legge dal file (ad esempio usando il comando \cmd{wc -c}), dato che in tal
1096 caso per le parti non scritte vengono restituiti degli zeri, si avrà lo stesso
1097 risultato di \cmd{ls}.
1098
1099 Se è sempre possibile allargare un file, scrivendoci sopra od usando la
1100 funzione \func{lseek} per spostarsi oltre la sua fine, esistono anche casi in
1101 cui si può avere bisogno di effettuare un troncamento, scartando i dati
1102 presenti al di là della dimensione scelta come nuova fine del file.
1103
1104 Un file può sempre essere troncato a zero aprendolo con il flag
1105 \const{O\_TRUNC}, ma questo è un caso particolare; per qualunque altra
1106 dimensione si possono usare le due funzioni \func{truncate} e
1107 \func{ftruncate}, i cui prototipi sono:
1108 \begin{functions}
1109   \headdecl{unistd.h} \funcdecl{int truncate(const char *file\_name, off\_t
1110     length)} Fa si che la dimensione del file \var{file\_name} sia troncata ad
1111     un valore massimo specificato da \var{lenght}. 
1112   
1113   \funcdecl{int ftruncate(int fd, off\_t length))} Identica a \func{truncate}
1114   eccetto che si usa con un file aperto, specificato tramite il suo file
1115   descriptor \var{fd}.
1116   
1117   \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per un
1118     errore, nel qual caso \var{errno} viene impostata opportunamente; per
1119     \func{ftruncate} si hanno i valori:
1120   \begin{errlist}
1121   \item[\errcode{EBADF}] \var{fd}  non è un file descriptor.
1122   \item[\errcode{EINVAL}] \var{fd} è un riferimento ad un socket, non a un file
1123     o non è aperto in scrittura.
1124   \end{errlist}
1125   per \func{truncate} si hanno:
1126   \begin{errlist}
1127   \item[\errcode{EACCES}] il file non ha permesso di scrittura o non si ha il
1128     permesso di esecuzione una delle directory del pathname. 
1129   \item[\errcode{ETXTBSY}] Il file è un programma in esecuzione.
1130   \end{errlist}
1131   ed anche \const{ENOTDIR}, \const{ENAMETOOLONG}, \const{ENOENT},
1132   \const{EROFS}, \const{EIO}, \const{EFAULT}, \const{ELOOP}.}
1133 \end{functions}
1134
1135 Se il file è più lungo della lunghezza specificata i dati in eccesso saranno
1136 perduti; il comportamento in caso di lunghezza inferiore non è specificato e
1137 dipende dall'implementazione: il file può essere lasciato invariato o esteso
1138 fino alla lunghezza scelta; in quest'ultimo caso lo spazio viene riempito con
1139 zeri (e in genere si ha la creazione di un \textit{hole} nel file).
1140
1141
1142 \subsection{I tempi dei file}
1143 \label{sec:file_file_times}
1144
1145 Il sistema mantiene per ciascun file tre tempi. Questi sono registrati
1146 nell'inode insieme agli altri attributi del file e possono essere letti
1147 tramite la funzione \func{stat}, che li restituisce attraverso tre campi della
1148 struttura \var{stat} di \figref{fig:file_stat_struct}. Il significato di detti
1149 tempi e dei relativi campi è riportato nello schema in
1150 \tabref{tab:file_file_times}, dove è anche riportato un esempio delle funzioni
1151 che effettuano cambiamenti su di essi.
1152
1153 \begin{table}[htb]
1154   \centering
1155   \footnotesize
1156   \begin{tabular}[c]{|c|l|l|c|}
1157     \hline
1158     \textbf{Membro} & \textbf{Significato} & \textbf{Funzione} 
1159     & \textbf{Opzione di \cmd{ls}} \\
1160     \hline
1161     \hline
1162     \var{st\_atime}& ultimo accesso ai dati del file &\func{read}, 
1163     \func{utime} & \cmd{-u}\\ 
1164     \var{st\_mtime}& ultima modifica ai dati del file &\func{write}, 
1165     \func{utime} & default\\ 
1166     \var{st\_ctime}& ultima modifica ai dati dell'inode&\func{chmod}, 
1167     \func{utime} & \cmd{-c} \\ 
1168     \hline
1169   \end{tabular}
1170   \caption{I tre tempi associati a ciascun file.}
1171   \label{tab:file_file_times}
1172 \end{table}
1173
1174 Il primo punto da tenere presente è la differenza fra il cosiddetto tempo di
1175 modifica (il \textit{modification time} \var{st\_mtime}) e il tempo di
1176 cambiamento di stato (il \textit{change time} \var{st\_ctime}). Il primo
1177 infatti fa riferimento ad una modifica del contenuto di un file, mentre il
1178 secondo ad una modifica dell'inode; siccome esistono molte operazioni (come la
1179 funzione \func{link} e molte altre che vedremo in seguito) che modificano solo
1180 le informazioni contenute nell'inode senza toccare il file, diventa necessario
1181 l'utilizzo di un altro tempo.
1182
1183 Il sistema non tiene conto dell'ultimo accesso all'inode, pertanto funzioni
1184 come \func{access} o \func{stat} non hanno alcuna influenza sui tre tempi. Il
1185 tempo di ultimo accesso (ai dati) viene di solito usato per cancellare i file
1186 che non servono più dopo un certo lasso di tempo (ad esempio \cmd{leafnode}
1187 cancella i vecchi articoli sulla base di questo tempo).
1188
1189 Il tempo di ultima modifica invece viene usato da \cmd{make} per decidere
1190 quali file necessitano di essere ricompilati o (talvolta insieme anche al
1191 tempo di cambiamento di stato) per decidere quali file devono essere
1192 archiviati per il backup. Il comando \cmd{ls} (quando usato con le opzioni
1193 \cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema riportato
1194 nell'ultima colonna di \tabref{tab:file_file_times}.
1195
1196 \begin{table}[htb]
1197   \centering
1198   \footnotesize
1199   \begin{tabular}[c]{|l|c|c|c|c|c|c|l|}
1200     \hline
1201     \multicolumn{1}{|p{3cm}|}{\centering{\vspace{6pt}\textbf{Funzione}}} &
1202     \multicolumn{3}{|p{3.6cm}|}{\centering{
1203         \textbf{File o directory del riferimento}}}&
1204     \multicolumn{3}{|p{3.6cm}|}{\centering{
1205         \textbf{Directory contenente il riferimento}}} 
1206     &\multicolumn{1}{|p{3.6cm}|}{\centering{\vspace{6pt}\textbf{Note}}} \\
1207     \cline{2-7}
1208     \cline{2-7}
1209     \multicolumn{1}{|p{3cm}|}{} 
1210     &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(a)}}}
1211     &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(m)}}}
1212     &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(c)}}}
1213     &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(a)}}}
1214     &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(m)}}}
1215     &\multicolumn{1}{|p{.9cm}|}{\centering{\textsl{(c)}}}
1216     &\multicolumn{1}{|p{3cm}|}{} \\
1217     \hline
1218     \hline
1219     \func{chmod}, \func{fchmod} 
1220     &         &         &$\bullet$&         &         &         & \\
1221     \func{chown}, \func{fchown} 
1222     &         &         &$\bullet$&         &         &         & \\
1223     \func{creat}  
1224     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$&  con 
1225     \const{O\_CREATE} \\    \func{creat}  
1226     &         &$\bullet$&$\bullet$&         &$\bullet$&$\bullet$&   
1227     con \const{O\_TRUNC} \\    \func{exec}  
1228     &$\bullet$&         &         &         &         &         & \\
1229     \func{lchown}  
1230     &         &         &$\bullet$&         &         &         & \\
1231     \func{link}
1232     &         &         &$\bullet$&         &$\bullet$&$\bullet$& \\
1233     \func{mkdir}
1234     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$& \\
1235     \func{mkfifo}
1236     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$& \\
1237     \func{open}
1238     &$\bullet$&$\bullet$&$\bullet$&         &$\bullet$&$\bullet$& con 
1239     \const{O\_CREATE} \\    \func{open}
1240     &         &$\bullet$&$\bullet$&         &         &         & con 
1241     \const{O\_TRUNC}  \\    \func{pipe}
1242     &$\bullet$&$\bullet$&$\bullet$&         &         &         & \\
1243     \func{read}
1244     &$\bullet$&         &         &         &         &         & \\
1245     \func{remove}
1246     &         &         &$\bullet$&         &$\bullet$&$\bullet$& se esegue 
1247     \func{unlink}\\    \func{remove}
1248     &         &         &         &         &$\bullet$&$\bullet$& se esegue 
1249     \func{rmdir}\\ \func{rename}
1250     &         &         &$\bullet$&         &$\bullet$&$\bullet$& per entrambi
1251     gli argomenti\\ \func{rmdir}
1252     &         &         &         &         &$\bullet$&$\bullet$& \\ 
1253     \func{truncate}, \func{ftruncate}
1254     &         &$\bullet$&$\bullet$&         &         &         & \\ 
1255     \func{unlink}
1256     &         &         &$\bullet$&         &$\bullet$&$\bullet$& \\ 
1257     \func{utime}
1258     &$\bullet$&$\bullet$&$\bullet$&         &         &         & \\ 
1259     \func{write}
1260     &         &$\bullet$&$\bullet$&         &         &         & \\ 
1261     \hline
1262   \end{tabular}
1263   \caption{Prospetto dei cambiamenti effettuati sui tempi di ultimo 
1264     accesso \textsl{(a)}, ultima modifica \textsl{(m)} e ultimo cambiamento
1265     \textsl{(c)} dalle varie funzioni operanti su file e directory.}
1266   \label{tab:file_times_effects}  
1267 \end{table}
1268
1269 L'effetto delle varie funzioni di manipolazione dei file sui tempi è
1270 illustrato in \tabref{tab:file_times_effects}. Si sono riportati gli effetti
1271 sia per il file a cui si fa riferimento, sia per la directory che lo contiene;
1272 questi ultimi possono essere capiti se si tiene conto di quanto già detto, e
1273 cioè che anche le directory sono file (che contengono una lista di nomi) che
1274 il sistema tratta in maniera del tutto analoga a tutti gli altri.
1275
1276 Per questo motivo tutte le volte che compiremo un'operazione su un file che
1277 comporta una modifica del nome contenuto nella directory, andremo anche a
1278 scrivere sulla directory che lo contiene cambiandone il tempo di modifica. Un
1279 esempio di questo può essere la cancellazione di un file, invece leggere o
1280 scrivere o cambiare i permessi di un file ha effetti solo sui tempi di
1281 quest'ultimo.
1282
1283 Si noti infine come \var{st\_ctime} non abbia nulla a che fare con il tempo di
1284 creazione del file, usato in molti altri sistemi operativi, ma che in Unix non
1285 esiste. Per questo motivo quando si copia un file, a meno di preservare
1286 esplicitamente i tempi (ad esempio con l'opzione \cmd{-p} di \cmd{cp}) esso
1287 avrà sempre il tempo corrente come data di ultima modifica.
1288
1289
1290 \subsection{La funzione \func{utime}}
1291 \label{sec:file_utime}
1292
1293 I tempi di ultimo accesso e modifica possono essere cambiati usando la
1294 funzione \func{utime}, il cui prototipo è:
1295 \begin{prototype}{utime.h}
1296 {int utime(const char *filename, struct utimbuf *times)} 
1297
1298 Cambia i tempi di ultimo accesso e modifica dell'inode specificato da
1299 \param{filename} secondo i campi \var{actime} e \var{modtime} di
1300 \param{times}. Se questa è \val{NULL} allora viene usato il tempo corrente.
1301
1302 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
1303   errore, nel qual caso \var{errno} assumerà uno dei valori:
1304   \begin{errlist}
1305   \item[\errcode{EACCESS}] non si ha il permesso di scrittura sul file.
1306   \item[\errcode{ENOENT}] \param{filename} non esiste.
1307   \end{errlist}}
1308 \end{prototype}
1309  
1310 La funzione prende come argomento \param{times} una struttura \var{utimebuf},
1311 la cui definizione è riportata in \figref{fig:struct_utimebuf}, con la quale
1312 si possono specificare i nuovi valori che si vogliono impostare per tempi.
1313
1314 \begin{figure}[!htb]
1315   \footnotesize \centering
1316   \begin{minipage}[c]{15cm}
1317     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
1318 struct utimbuf {
1319         time_t actime;  /* access time */
1320         time_t modtime; /* modification time */
1321 };
1322     \end{lstlisting}
1323   \end{minipage} 
1324   \normalsize 
1325   \caption{La struttura \type{utimbuf}, usata da \func{utime} per modificare i
1326     tempi dei file.} 
1327   \label{fig:struct_utimebuf}
1328 \end{figure}
1329
1330 L'effetto della funzione e i privilegi necessari per eseguirla dipendono da
1331 cosa è l'argomento \param{times}; se è \val{NULL} la funzione imposta il
1332 tempo corrente ed è sufficiente avere accesso in scrittura al file; se invece
1333 si è specificato un valore la funzione avrà successo solo se si è proprietari
1334 del file (o si hanno i privilegi di amministratore).
1335
1336 Si tenga presente che non è comunque possibile specificare il tempo di
1337 cambiamento di stato del file, che viene comunque cambiato dal kernel tutte le
1338 volte che si modifica l'inode (quindi anche alla chiamata di \func{utime}).
1339 Questo serve anche come misura di sicurezza per evitare che si possa
1340 modificare un file nascondendo completamente le proprie tracce.  In realtà la
1341 cosa resta possibile, se si è in grado di accedere al file di dispositivo,
1342 scrivendo direttamente sul disco senza passare attraverso il filesystem, ma
1343 ovviamente in questo modo la cosa è molto più complicata da realizzare.
1344
1345
1346
1347 \section{Il controllo di accesso ai file}
1348 \label{sec:file_access_control}
1349
1350 Una delle caratteristiche fondamentali di tutti i sistemi unix-like è quella
1351 del controllo di accesso ai file, che viene implementato per qualunque
1352 filesystem standard.\footnote{per standard si intende che implementa le
1353   caratteristiche previste dallo standard POSIX. In Linux sono disponibili
1354   anche una serie di altri filesystem, come quelli di Windiws e del Mac, che
1355   non supportano queste caratteristiche.} In questa sezione ne esamineremo i
1356 concetti essenziali e le funzioni usate per gestirne i vari aspetti.
1357
1358
1359 \subsection{I permessi per l'accesso ai file}
1360 \label{sec:file_perm_overview}
1361
1362 Ad ogni file Linux associa sempre l'utente che ne è proprietario (il
1363 cosiddetto \textit{owner}) ed un gruppo di appartenenza, secondo il meccanismo
1364 degli identificatori di utente e gruppo (\acr{uid} e \acr{gid}). Questi valori
1365 sono accessibili da programma tramite la funzione \func{stat}, e sono
1366 mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura \var{stat}
1367 (si veda \secref{sec:file_stat}).\footnote{Questo è vero solo per filesystem
1368   di tipo Unix, ad esempio non è vero per il filesystem vfat di Windows, che
1369   non fornisce nessun supporto per l'accesso multiutente, e per il quale i
1370   permessi vengono assegnati in maniera fissa con un opzione in fase di
1371   montaggio.}
1372
1373 Il controllo di accesso ai file segue un modello abbastanza semplice che
1374 prevede tre permessi fondamentali strutturati su tre livelli di accesso.
1375 Esistono varie estensioni a questo modello,\footnote{come le \textit{Access
1376     Control List} che possono essere aggiunte al filesystem standard con
1377   opportune patch, la cui introduzione nei kernel ufficiali è iniziata con la
1378   serie 2.5.x. per arrivare a meccanismi di controllo ancora più sofisticati
1379   come il \textit{mandatory access control} di SE-Linux.} ma nella maggior
1380 parte dei casi il meccanismo standard è più che sufficiente a soddisfare tutte
1381 le necessità più comuni.  I tre permessi di base associati ad ogni file sono:
1382 \begin{itemize*}
1383 \item il permesso di lettura (indicato con la lettera \texttt{r}, dall'inglese
1384   \textit{read}).
1385 \item il permesso di scrittura (indicato con la lettera \texttt{w},
1386   dall'inglese \textit{write}).
1387 \item il permesso di esecuzione (indicato con la lettera \texttt{x},
1388   dall'inglese \textit{execute}).
1389 \end{itemize*}
1390 mentre i tre livelli su cui sono divisi i privilegi sono:
1391 \begin{itemize*}
1392 \item i privilegi per l'utente proprietario del file.
1393 \item i privilegi per un qualunque utente faccia parte del gruppo cui
1394   appartiene il file.
1395 \item i privilegi per tutti gli altri utenti.
1396 \end{itemize*}
1397
1398 L'insieme dei permessi viene espresso con un numero a 12 bit; di questi i nove
1399 meno significativi sono usati a gruppi di tre per indicare i permessi base di
1400 lettura, scrittura ed esecuzione e sono applicati rispettivamente
1401 rispettivamente al proprietario, al gruppo, a tutti gli altri.
1402
1403 I restanti tre bit (noti come \acr{suid}, \acr{sgid}, e \textsl{sticky}) sono
1404 usati per indicare alcune caratteristiche più complesse del meccanismo del
1405 controllo di accesso su cui torneremo in seguito (in
1406 \secref{sec:file_suid_sgid} e \secref{sec:file_sticky}); lo schema di
1407 allocazione dei bit è riportato in \figref{fig:file_perm_bit}.
1408
1409 \begin{figure}[htb]
1410   \centering
1411   \includegraphics[width=6cm]{img/fileperm}
1412   \caption{Lo schema dei bit utilizzati per specificare i permessi di un file
1413     contenuti nel campo \var{st\_mode} di \var{fstat}.}
1414   \label{fig:file_perm_bit}
1415 \end{figure}
1416
1417 Anche i permessi, come tutte le altre informazioni pertinenti al file, sono
1418 memorizzati nell'inode; in particolare essi sono contenuti in alcuni bit del
1419 campo \var{st\_mode} della struttura \func{stat} (si veda di nuovo
1420 \figref{fig:file_stat_struct}).
1421
1422 In genere ci si riferisce ai tre livelli dei privilegi usando le lettere
1423 \cmd{u} (per \textit{user}), \cmd{g} (per \textit{group}) e \cmd{o} (per
1424 \textit{other}), inoltre se si vuole indicare tutti i raggruppamenti insieme
1425 si usa la lettera \cmd{a} (per \textit{all}). Si tenga ben presente questa
1426 distinzione dato che in certi casi, mutuando la terminologia in uso nel VMS,
1427 si parla dei permessi base come di permessi per \textit{owner}, \textit{group}
1428 ed \textit{all}, le cui iniziali possono dar luogo a confusione.  Le costanti
1429 che permettono di accedere al valore numerico di questi bit nel campo
1430 \var{st\_mode} sono riportate in \tabref{tab:file_bit_perm}.
1431
1432 \begin{table}[htb]
1433   \centering
1434     \footnotesize
1435   \begin{tabular}[c]{|c|l|}
1436     \hline
1437     \textbf{\var{st\_mode}} bit & \textbf{Significato} \\
1438     \hline 
1439     \hline 
1440     \const{S\_IRUSR}  &  \textit{user-read}, l'utente può leggere     \\
1441     \const{S\_IWUSR}  &  \textit{user-write}, l'utente può scrivere   \\
1442     \const{S\_IXUSR}  &  \textit{user-execute}, l'utente può eseguire \\ 
1443     \hline              
1444     \const{S\_IRGRP}  &  \textit{group-read}, il gruppo può leggere    \\
1445     \const{S\_IWGRP}  &  \textit{group-write}, il gruppo può scrivere  \\
1446     \const{S\_IXGRP}  &  \textit{group-execute}, il gruppo può eseguire\\
1447     \hline              
1448     \const{S\_IROTH}  &  \textit{other-read}, tutti possono leggere    \\
1449     \const{S\_IWOTH}  &  \textit{other-write}, tutti possono scrivere  \\
1450     \const{S\_IXOTH}  &  \textit{other-execute}, tutti possono eseguire\\
1451     \hline              
1452   \end{tabular}
1453   \caption{I bit dei permessi di accesso ai file, come definiti in 
1454     \texttt{<sys/stat.h>}}
1455   \label{tab:file_bit_perm}
1456 \end{table}
1457
1458 I permessi vengono usati in maniera diversa dalle varie funzioni, e a seconda
1459 che si riferiscano a dei file, dei link simbolici o delle directory; qui ci
1460 limiteremo ad un riassunto delle regole generali, entrando nei dettagli più
1461 avanti.
1462
1463 La prima regola è che per poter accedere ad un file attraverso il suo pathname
1464 occorre il permesso di esecuzione in ciascuna delle directory che compongono
1465 il pathname; lo stesso vale per aprire un file nella directory corrente (per
1466 la quale appunto serve il diritto di esecuzione).
1467
1468 Per una directory infatti il permesso di esecuzione significa che essa può
1469 essere attraversata nella risoluzione del pathname, ed è distinto dal permesso
1470 di lettura che invece implica che si può leggere il contenuto della directory.
1471 Questo significa che se si ha il permesso di esecuzione senza permesso di
1472 lettura si potrà lo stesso aprire un file in una directory (se si hanno i
1473 permessi opportuni per il medesimo) ma non si potrà vederlo con \cmd{ls}
1474 (mentre per crearlo occorrerà anche il permesso di scrittura per la
1475 directory).
1476
1477 Avere il permesso di lettura per un file consente di aprirlo con le opzioni
1478 (si veda quanto riportato in \tabref{tab:file_open_flags}) di sola lettura o
1479 di lettura/scrittura e leggerne il contenuto. Avere il permesso di scrittura
1480 consente di aprire un file in sola scrittura o lettura/scrittura e modificarne
1481 il contenuto, lo stesso permesso è necessario per poter troncare il file.
1482
1483 Non si può creare un file fintanto che non si disponga del permesso di
1484 esecuzione e di quello di scrittura per la directory di destinazione; gli
1485 stessi permessi occorrono per cancellare un file da una directory (si ricordi
1486 che questo non implica necessariamente la rimozione del contenuto del file dal
1487 disco), non è necessario nessun tipo di permesso per il file stesso (infatti
1488 esso non viene toccato, viene solo modificato il contenuto della directory,
1489 rimuovendo la voce che ad esso fa riferimento).
1490
1491 Per poter eseguire un file (che sia un programma compilato od uno script di
1492 shell, od un altro tipo di file eseguibile riconosciuto dal kernel), occorre
1493 avere il permesso di esecuzione, inoltre solo i file regolari possono essere
1494 eseguiti.
1495
1496 I permessi per un link simbolico sono ignorati, contano quelli del file a cui
1497 fa riferimento; per questo in genere il comando \cmd{ls} riporta per un link
1498 simbolico tutti i permessi come concessi; utente e gruppo a cui esso
1499 appartiene vengono pure ignorati quando il link viene risolto, vengono
1500 controllati solo quando viene richiesta la rimozione del link e quest'ultimo è
1501 in una directory con lo \textsl{sticky bit} impostato (si veda
1502 \secref{sec:file_sticky}).
1503
1504 La procedura con cui il kernel stabilisce se un processo possiede un certo
1505 permesso (di lettura, scrittura o esecuzione) si basa sul confronto fra
1506 l'utente e il gruppo a cui il file appartiene (i valori di \var{st\_uid} e
1507 \var{st\_gid} accennati in precedenza) e l'userid effettivo, il groupid
1508 effettivo e gli eventuali groupid supplementari del processo.\footnote{in
1509   realtà Linux, per quanto riguarda l'accesso ai file, utilizza gli gli
1510   identificatori del gruppo \textit{filesystem} (si ricordi quanto esposto in
1511   \secref{sec:proc_perms}), ma essendo questi del tutto equivalenti ai primi,
1512   eccetto il caso in cui si voglia scrivere un server NFS, ignoreremo questa
1513   differenza.}
1514
1515 Per una spiegazione dettagliata degli identificatori associati ai processi si
1516 veda \secref{sec:proc_perms}; normalmente, a parte quanto vedremo in
1517 \secref{sec:file_suid_sgid}, l'userid effettivo e il groupid effectivo
1518 corrispondono ai valori dell'\acr{uid} e del \acr{gid} dell'utente che ha
1519 lanciato il processo, mentre i groupid supplementari sono quelli dei gruppi
1520 cui l'utente appartiene.
1521
1522 I passi attraverso i quali viene stabilito se il processo possiede il diritto
1523 di accesso sono i seguenti:
1524 \begin{enumerate}
1525 \item Se l'userid effettivo del processo è zero (corrispondente
1526   all'amministratore) l'accesso è sempre garantito senza nessun ulteriore
1527   controllo. Per questo motivo \textsl{root} ha piena libertà di accesso a
1528   tutti i file.
1529 \item Se l'userid effettivo del processo è uguale all'\acr{uid} del
1530   proprietario del file (nel qual caso si dice che il processo è proprietario
1531   del file) allora:
1532   \begin{itemize*}
1533   \item se il relativo\footnote{per relativo si intende il bit di user-read se
1534       il processo vuole accedere in scrittura, quello di user-write per
1535       l'accesso in scrittura, etc.} bit dei permessi d'accesso dell'utente è
1536     impostato, l'accesso è consentito
1537   \item altrimenti l'accesso è negato
1538   \end{itemize*}
1539 \item Se il groupid effettivo del processo o uno dei groupid supplementari dei
1540   processi corrispondono al \acr{gid} del file allora:
1541   \begin{itemize*}
1542   \item se il bit dei permessi d'accesso del gruppo è impostato, l'accesso è
1543     consentito, 
1544   \item altrimenti l'accesso è negato
1545   \end{itemize*}
1546 \item se il bit dei permessi d'accesso per tutti gli altri è impostato,
1547   l'accesso è consentito, altrimenti l'accesso è negato.
1548 \end{enumerate}
1549
1550 Si tenga presente che questi passi vengono eseguiti esattamente in
1551 quest'ordine. Questo vuol dire che se un processo è il proprietario di un file,
1552 l'accesso è consentito o negato solo sulla base dei permessi per l'utente; i
1553 permessi per il gruppo non vengono neanche controllati. Lo stesso vale se il
1554 processo appartiene ad un gruppo appropriato, in questo caso i permessi per
1555 tutti gli altri non vengono controllati.
1556
1557
1558 \subsection{I bit \acr{suid} e \acr{sgid}}
1559 \label{sec:file_suid_sgid}
1560
1561 Come si è accennato (in \secref{sec:file_perm_overview}) nei dodici bit del
1562 campo \var{st\_mode} di \var{stat} che vengono usati per il controllo di
1563 accesso oltre ai bit dei permessi veri e propri, ci sono altri tre bit che
1564 vengono usati per indicare alcune proprietà speciali dei file.  Due di questi
1565 sono i bit detti \acr{suid} (da \textit{set-user-ID bit}) e \acr{sgid} (da
1566 \textit{set-group-ID bit}) che sono identificati dalle costanti
1567 \const{S\_ISUID} e \const{S\_ISGID}.
1568
1569 Come spiegato in dettaglio in \secref{sec:proc_exec}, quando si lancia un
1570 programma il comportamento normale del kernel è quello di impostare gli
1571 identificatori del gruppo \textit{effective} del nuovo processo al valore dei
1572 corrispondenti del gruppo \textit{real} del processo corrente, che normalmente
1573 corrispondono dell'utente con cui si è entrati nel sistema.
1574
1575 Se però il file del programma (che ovviamente deve essere
1576 eseguibile\footnote{per motivi di sicurezza il kernel ignora i bit \acr{suid}
1577   e \acr{sgid} per gli script eseguibili.}) ha il bit \acr{suid} impostato, il
1578 kernel assegnerà come userid effettivo al nuovo processo l'\acr{uid} del
1579 proprietario del file al posto dell'\acr{uid} del processo originario.  Avere
1580 il bit \acr{sgid} impostato ha lo stesso effetto sul groupid effettivo del
1581 processo.
1582
1583 I bit \acr{suid} e \acr{sgid} vengono usati per permettere agli utenti normali
1584 di usare programmi che abbisognano di privilegi speciali; l'esempio classico è
1585 il comando \cmd{passwd} che ha la necessità di modificare il file delle
1586 password, quest'ultimo ovviamente può essere scritto solo dall'amministratore,
1587 ma non è necessario chiamare l'amministratore per cambiare la propria
1588 password. Infatti il comando \cmd{passwd} appartiene a root ma ha il bit
1589 \acr{suid} impostato per cui quando viene lanciato da un utente normale parte
1590 con i privilegi di root.
1591
1592 Chiaramente avere un processo che ha privilegi superiori a quelli che avrebbe
1593 normalmente l'utente che lo ha lanciato comporta vari rischi, e questo tipo di
1594 programmi devono essere scritti accuratamente per evitare che possano essere
1595 usati per guadagnare privilegi non consentiti (l'argomento è affrontato in
1596 dettaglio in \secref{sec:proc_perms}).
1597
1598 La presenza dei bit \acr{suid} e \acr{sgid} su un file può essere rilevata con
1599 il comando \cmd{ls -l}, che visualizza una lettera \cmd{s} al posto della
1600 \cmd{x} in corrispondenza dei permessi di utente o gruppo. La stessa lettera
1601 \cmd{s} può essere usata nel comando \cmd{chmod} per impostare questi bit.
1602 Infine questi bit possono essere controllati all'interno di \var{st\_mode} con
1603 l'uso delle due costanti \const{S\_ISUID} e \const{S\_IGID}, i cui valori sono
1604 riportati in \tabref{tab:file_mode_flags}.
1605
1606 Gli stessi bit vengono ad assumere in significato completamente diverso per le
1607 directory, normalmente infatti Linux usa la convenzione di SVr4 per indicare
1608 con questi bit l'uso della semantica BSD nella creazione di nuovi file (si
1609 veda \secref{sec:file_ownership} per una spiegazione dettagliata al
1610 proposito).
1611
1612 Infine Linux utilizza il bit \acr{sgid} per una ulteriore estensione mutuata
1613 da SVr4. Il caso in cui un file ha il bit \acr{sgid} impostato senza che lo
1614 sia anche il corrispondente bit di esecuzione viene utilizzato per attivare
1615 per quel file il \textit{mandatory locking} (affronteremo questo argomento in
1616 dettaglio più avanti, in \secref{sec:file_mand_locking}).
1617
1618
1619 \subsection{Il bit \textsl{sticky}}
1620 \label{sec:file_sticky}
1621
1622 L'ultimo dei bit rimanenti, identificato dalla costante \const{S\_ISVTX}, è in
1623 parte un rimasuglio delle origini dei sistemi Unix. A quell'epoca infatti la
1624 memoria virtuale e l'accesso ai files erano molto meno sofisticati e per
1625 ottenere la massima velocità possibile per i programmi usati più comunemente
1626 si poteva impostare questo bit.
1627
1628 L'effetto di questo bit era che il segmento di testo del programma (si veda
1629 \secref{sec:proc_mem_layout} per i dettagli) veniva scritto nella swap la
1630 prima volta che questo veniva lanciato, e vi permaneva fino al riavvio della
1631 macchina (da questo il nome di \textsl{sticky bit}); essendo la swap un file
1632 continuo indicizzato direttamente in questo modo si poteva risparmiare in
1633 tempo di caricamento rispetto alla ricerca del file su disco. Lo
1634 \textsl{sticky bit} è indicato usando la lettera \cmd{t} al posto della
1635 \cmd{x} nei permessi per gli altri.
1636
1637 Ovviamente per evitare che gli utenti potessero intasare la swap solo
1638 l'amministratore era in grado di impostare questo bit, che venne chiamato
1639 anche con il nome di \textit{saved text bit}, da cui deriva quello della
1640 costante.  Le attuali implementazioni di memoria virtuale e filesystem rendono
1641 sostanzialmente inutile questo procedimento.
1642
1643 Benché ormai non venga più utilizzato per i file, lo \textsl{sticky bit} ha
1644 invece assunto un uso importante per le directory;\footnote{lo \textsl{sticky
1645     bit} per le directory è un'estensione non definita nello standard POSIX,
1646   Linux però la supporta, così come BSD e SVr4.} in questo caso se tale bit è
1647 impostato un file potrà essere rimosso dalla directory soltanto se l'utente ha
1648 il permesso di scrittura su di essa ed inoltre è vera una delle seguenti
1649 condizioni:
1650 \begin{itemize*}
1651 \item l'utente è proprietario del file
1652 \item l'utente è proprietario della directory
1653 \item l'utente è l'amministratore 
1654 \end{itemize*}
1655 un classico esempio di directory che ha questo bit impostato è \file{/tmp}, i
1656 permessi infatti di solito sono impostati come:
1657 \begin{verbatim}
1658 $ ls -ld /tmp
1659 drwxrwxrwt    6 root     root         1024 Aug 10 01:03 /tmp
1660 \end{verbatim}%$
1661 in questo modo chiunque può creare file in questa directory (che infatti è
1662 normalmente utilizzata per la creazione di file temporanei), ma solo l'utente
1663 che ha creato un certo file potrà cancellarlo o rinominarlo. In questo modo si
1664 evita che un utente possa, più o meno consapevolmente, cancellare i file degli
1665 altri.
1666
1667
1668 \subsection{La titolarità di nuovi file e directory}
1669 \label{sec:file_ownership}
1670
1671 Vedremo in \secref{sec:file_base_func} con quali funzioni si possono creare
1672 nuovi file, in tale occasione vedremo che è possibile specificare in sede di
1673 creazione quali permessi applicare ad un file, però non si può indicare a
1674 quale utente e gruppo esso deve appartenere.  Lo stesso problema di presenta
1675 per la creazione di nuove directory (procedimento descritto in
1676 \secref{sec:file_dir_creat_rem}).
1677
1678 Lo standard POSIX prescrive che l'\acr{uid} del nuovo file corrisponda
1679 all'userid effettivo del processo che lo crea; per il \acr{gid} invece prevede
1680 due diverse possibilità:
1681 \begin{itemize*}
1682 \item il \acr{gid} del file corrisponde al groupid effettivo del processo.
1683 \item il \acr{gid} del file corrisponde al \acr{gid} della directory in cui
1684   esso è creato.
1685 \end{itemize*}
1686 in genere BSD usa sempre la seconda possibilità, che viene per questo chiamata
1687 semantica BSD. Linux invece segue quella che viene chiamata semantica SVr4; di
1688 norma cioè il nuovo file viene creato, seguendo la prima opzione, con il
1689 \acr{gid} del processo, se però la directory in cui viene creato il file ha il
1690 bit \acr{sgid} impostato allora viene usata la seconda opzione.
1691
1692 Usare la semantica BSD ha il vantaggio che il \acr{gid} viene sempre
1693 automaticamente propagato, restando coerente a quello della directory di
1694 partenza, in tutte le sottodirectory. La semantica SVr4 offre la possibilità
1695 di scegliere, ma per ottenere lo stesso risultato di coerenza che si ha con
1696 BSD necessita che per le nuove directory venga anche propagato anche il bit
1697 \acr{sgid}. Questo è il comportamento predefinito di \cmd{mkdir}, ed è in
1698 questo modo ad esempio che Debian assicura che le sottodirectory create nella
1699 home di un utente restino sempre con il \acr{gid} del gruppo primario dello
1700 stesso.
1701
1702
1703 \subsection{La funzione \func{access}}
1704 \label{sec:file_access}
1705
1706 Come visto in \secref{sec:file_access_control} il controllo di accesso ad un
1707 file viene fatto utilizzando l'userid ed il groupid effettivo del processo; ci
1708 sono casi però in cui si può voler effettuare il controllo con l'userid reale
1709 ed il groupid reale, vale a dire usando i valori di \acr{uid} e \acr{gid}
1710 relativi all'utente che ha lanciato il programma, e che, come accennato in
1711 \secref{sec:file_suid_sgid} e spiegato in dettaglio in
1712 \secref{sec:proc_perms}, non è detto siano uguali a quelli effettivi.  Per far
1713 questo si può usare la funzione \func{access}, il cui prototipo è:
1714 \begin{prototype}{unistd.h}
1715 {int access(const char *pathname, int mode)}
1716
1717 Verifica i permessi di accesso, indicati da \param{mode}, per il file indicato
1718 da \param{pathname}.
1719   
1720 \bodydesc{La funzione ritorna 0 se l'accesso è consentito, -1 se l'accesso non
1721   è consentito ed in caso di errore; nel qual caso la variabile \var{errno}
1722   assumerà i valori:
1723   \begin{errlist}
1724   \item[\errcode{EINVAL}] il valore di \param{mode} non è valido.
1725   \item[\errcode{EACCES}] l'accesso al file non è consentito, o non si ha il
1726     permesso di attraversare una delle directory di \param{pathname}.
1727   \item[\errcode{EROFS}] si è richiesto l'accesso in scrittura per un file su
1728     un filesystem montato in sola lettura.
1729   \end{errlist}
1730   ed inoltre \const{EFAULT}, \const{ENAMETOOLONG}, \const{ENOENT},
1731   \const{ENOTDIR}, \const{ELOOP}, \const{EIO}.}
1732 \end{prototype}
1733
1734 I valori possibili per l'argomento \param{mode} sono esprimibili come
1735 combinazione delle costanti numeriche riportate in
1736 \tabref{tab:file_access_mode_val} (attraverso un OR binario delle stesse). I
1737 primi tre valori implicano anche la verifica dell'esistenza del file, se si
1738 vuole verificare solo quest'ultima si può usare \const{F\_OK}, o anche
1739 direttamente \func{stat}. Nel caso in cui \var{pathname} si riferisca ad un
1740 link simbolico, questo viene seguito ed il controllo è fatto sul file a cui
1741 esso fa riferimento.
1742
1743 La funzione controlla solo i bit dei permessi di accesso, si ricordi che il
1744 fatto che una directory abbia permesso di scrittura non significa che ci si
1745 possa scrivere come in un file, e il fatto che un file abbia permesso di
1746 esecuzione non comporta che contenga un programma eseguibile. La funzione
1747 ritorna zero solo se tutte i permessi controllati sono disponibili, in caso
1748 contrario (o di errore) ritorna -1.
1749 \begin{table}[htb]
1750   \centering
1751   \footnotesize
1752   \begin{tabular}{|c|l|}
1753     \hline
1754     \textbf{\var{mode}} & \textbf{Significato} \\
1755     \hline
1756     \hline
1757     \const{R\_OK} & verifica il permesso di lettura \\
1758     \const{W\_OK} & verifica il permesso di scritture \\
1759     \const{X\_OK} & verifica il permesso di esecuzione \\
1760     \const{F\_OK} & verifica l'esistenza del file \\
1761     \hline
1762   \end{tabular}
1763   \caption{Valori possibile per il parametro \var{mode} della funzione 
1764     \func{access}.}
1765   \label{tab:file_access_mode_val}
1766 \end{table}
1767
1768 Un esempio tipico per l'uso di questa funzione è quello di un processo che sta
1769 eseguendo un programma coi privilegi di un altro utente (ad esempio attraverso
1770 l'uso del \acr{suid} bit) che vuole controllare se l'utente originale ha i
1771 permessi per accedere ad un certo file.
1772
1773
1774 \subsection{Le funzioni \func{chmod} e \func{fchmod}}
1775 \label{sec:file_chmod}
1776
1777 Per cambiare i permessi di un file il sistema mette ad disposizione due
1778 funzioni \func{chmod} e \func{fchmod}, che operano rispettivamente su un
1779 filename e su un file descriptor, i loro prototipi sono:
1780 \begin{functions}
1781   \headdecl{sys/types.h} 
1782   \headdecl{sys/stat.h} 
1783   
1784   \funcdecl{int chmod(const char *path, mode\_t mode)} Cambia i permessi del
1785   file indicato da \var{path} al valore indicato da \var{mode}.
1786   
1787   \funcdecl{int fchmod(int fd, mode\_t mode)} Analoga alla precedente, ma usa
1788   il file descriptor \var{fd} per indicare il file.
1789   
1790   \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per
1791     un errore, in caso di errore \var{errno} può assumere i valori:
1792   \begin{errlist}
1793   \item[\errcode{EPERM}] L'userid effettivo non corrisponde a quello del
1794     proprietario del file o non è zero.
1795     \item[\errcode{EROFS}] Il file è su un filesystem in sola lettura.
1796   \end{errlist}
1797   ed inoltre \const{EIO}; \func{chmod} restituisce anche \const{EFAULT},
1798   \const{ENAMETOOLONG}, \const{ENOENT}, \const{ENOMEM}, \const{ENOTDIR},
1799   \const{EACCES}, \const{ELOOP}; \func{fchmod} anche \const{EBADF}.}
1800 \end{functions}
1801
1802 Entrambe le funzioni utilizzano come secondo argomento \param{mode}, una
1803 variabile dell'apposito tipo primitivo \type{mode\_t} (vedi
1804 \tabref{tab:intro_primitive_types}) utilizzato per specificare i permessi sui
1805 file.
1806
1807 \begin{table}[!htb]
1808   \centering
1809   \footnotesize
1810   \begin{tabular}[c]{|c|c|l|}
1811     \hline
1812     \textbf{\var{mode}} & \textbf{Valore} & \textbf{Significato} \\
1813     \hline
1814     \hline
1815     \const{S\_ISUID} & 04000 & set user ID \\
1816     \const{S\_ISGID} & 02000 & set group ID \\
1817     \const{S\_ISVTX} & 01000 & sticky bit \\
1818     \hline
1819     \const{S\_IRWXU} & 00700 & l'utente ha tutti i permessi \\
1820     \const{S\_IRUSR} & 00400 & l'utente ha il permesso di lettura  \\
1821     \const{S\_IWUSR} & 00200 & l'utente ha il permesso di scrittura \\
1822     \const{S\_IXUSR} & 00100 & l'utente ha il permesso di esecuzione \\
1823     \hline
1824     \const{S\_IRWXG} & 00070 & il gruppo ha tutti i permessi  \\
1825     \const{S\_IRGRP} & 00040 & il gruppo ha il permesso di lettura  \\
1826     \const{S\_IWGRP} & 00020 & il gruppo ha il permesso di scrittura \\
1827     \const{S\_IXGRP} & 00010 & il gruppo ha il permesso di esecuzione \\
1828     \hline
1829     \const{S\_IRWXO} & 00007 & gli altri hanno tutti i permessi \\
1830     \const{S\_IROTH} & 00004 & gli altri hanno il permesso di lettura  \\
1831     \const{S\_IWOTH} & 00002 & gli altri hanno il permesso di scrittura \\
1832     \const{S\_IXOTH} & 00001 & gli altri hanno il permesso di esecuzione \\
1833     \hline
1834   \end{tabular}
1835   \caption{Valori delle costanti usate per indicare i vari bit di
1836     \param{mode} utilizzato per impostare i permessi dei file.}
1837   \label{tab:file_permission_const}
1838 \end{table}
1839
1840 Le costanti con cui specificare i singoli bit di \param{mode} sono riportate
1841 in \tabref{tab:file_permission_const}. Il valore di \param{mode} può essere
1842 ottenuto combinando fra loro con un OR binario le costanti simboliche relative
1843 ai vari bit, o specificato direttamente, come per l'omonimo comando di shell,
1844 con un valore numerico (la shell lo vuole in ottale, dato che i bit dei
1845 permessi sono divisibili in gruppi di tre), che si può calcolare direttamente
1846 usando lo schema si utilizzo dei bit illustrato in \figref{fig:file_perm_bit}.
1847
1848 Ad esempio i permessi standard assegnati ai nuovi file (lettura e scrittura
1849 per il proprietario, sola lettura per il gruppo e gli altri) sono
1850 corrispondenti al valore ottale $0644$, un programma invece avrebbe anche il
1851 bit di esecuzione attivo, con un valore di $0755$, se si volesse attivare il
1852 bit \acr{suid} il valore da fornire sarebbe $4755$.
1853
1854 Il cambiamento dei permessi di un file eseguito attraverso queste funzioni ha
1855 comunque alcune limitazioni, previste per motivi di sicurezza. L'uso delle
1856 funzioni infatti è possibile solo se l'userid effettivo del processo
1857 corrisponde a quello del proprietario del file o dell'amministratore,
1858 altrimenti esse falliranno con un errore di \errcode{EPERM}.
1859
1860 Ma oltre a questa regola generale, di immediata comprensione, esistono delle
1861 limitazioni ulteriori. Per questo motivo, anche se si è proprietari del file,
1862 non tutti i valori possibili di \param{mode} sono permessi o hanno effetto;
1863 in particolare accade che:
1864 \begin{enumerate}
1865 \item siccome solo l'amministratore può impostare lo \textit{sticky bit}, se
1866   l'userid effettivo del processo non è zero esso viene automaticamente
1867   cancellato (senza notifica di errore) qualora sia stato indicato in
1868   \param{mode}.
1869 \item per quanto detto in \secref{sec:file_ownership} riguardo la creazione
1870   dei nuovi file, si può avere il caso in cui il file creato da un processo è
1871   assegnato a un gruppo per il quale il processo non ha privilegi. Per evitare
1872   che si possa assegnare il bit \acr{sgid} ad un file appartenente a un gruppo
1873   per cui non si hanno diritti, questo viene automaticamente cancellato da
1874   \param{mode} (senza notifica di errore) qualora il gruppo del file non
1875   corrisponda a quelli associati al processo (la cosa non avviene quando
1876   l'userid effettivo del processo è zero).
1877 \end{enumerate}
1878
1879 Per alcuni filesystem\footnote{il filesystem \acr{ext2} supporta questa
1880   caratteristica, che è mutuata da BSD.} è inoltre prevista una ulteriore
1881 misura di sicurezza, volta a scongiurare l'abuso dei bit \acr{suid} e
1882 \acr{sgid}; essa consiste nel cancellare automaticamente questi bit dai
1883 permessi di un file qualora un processo che non appartenga all'amministratore
1884 effettui una scrittura. In questo modo anche se un utente malizioso scopre un
1885 file \acr{suid} su cui può scrivere, un'eventuale modifica comporterà la
1886 perdita di questo privilegio.
1887
1888 \subsection{La funzione \func{umask}}
1889 \label{sec:file_umask}
1890
1891 Oltre che dai valori indicati in sede di creazione, i permessi assegnati ai
1892 nuovi file sono controllati anche da una maschera di bit impostata con la
1893 funzione \func{umask}, il cui prototipo è:
1894 \begin{prototype}{stat.h}
1895 {mode\_t umask(mode\_t mask)}
1896
1897   Imposta la maschera dei permessi dei bit al valore specificato da \var{mask}
1898   (di cui vengono presi solo i 9 bit meno significativi).
1899   
1900   \bodydesc{La funzione ritorna il precedente valore della maschera. È una
1901     delle poche funzioni che non restituisce codici di errore.}
1902 \end{prototype}
1903
1904 Questa maschera è una caratteristica di ogni processo\footnote{è infatti
1905   contenuta nel campo \var{umask} di \var{fs\_struct}, vedi
1906   \figref{fig:proc_task_struct}.} e viene utilizzata per impedire che alcuni
1907 permessi possano essere assegnati ai nuovi file in sede di creazione. I bit
1908 indicati nella maschera vengono infatti esclusi quando un nuovo file viene
1909 creato.
1910
1911 In genere questa maschera serve per impostare un valore predefinito dei
1912 permessi che ne escluda alcuni (usualmente quello di scrittura per il gruppo e
1913 gli altri, corrispondente ad un valore di $022$). Essa è utile perché le
1914 routine dell'interfaccia ANSI C degli stream non prevedono l'esistenza dei
1915 permessi, e pertanto tutti i nuovi file vengono sempre creati con un valore di
1916 $666$ (cioè permessi di lettura e scrittura per tutti, si veda
1917 \tabref{tab:file_permission_const} per un confronto); in questo modo è
1918 possibile cancellare automaticamente i permessi non voluti, senza doverlo fare
1919 esplicitamente.
1920
1921 In genere il valore di \func{umask} viene stabilito una volta per tutte al
1922 login a $022$, e di norma gli utenti non hanno motivi per modificarlo. Se però
1923 si vuole che un processo possa creare un file che chiunque possa leggere
1924 allora occorrerà cambiare il valore di \func{umask}.
1925
1926
1927 \subsection{Le funzioni \func{chown}, \func{fchown} e \func{lchown}}
1928 \label{sec:file_chown}
1929
1930 Come per i permessi, il sistema fornisce anche delle funzioni che permettano
1931 di cambiare utente e gruppo cui il file appartiene; le funzioni in questione
1932 sono tre e i loro prototipi sono i seguenti:
1933 \begin{functions}
1934   \headdecl{sys/types.h} 
1935   \headdecl{sys/stat.h} 
1936   
1937   \funcdecl{int chown(const char *path, uid\_t owner, gid\_t group)}
1938   \funcdecl{int fchown(int fd, uid\_t owner, gid\_t group)}
1939   \funcdecl{int lchown(const char *path, uid\_t owner, gid\_t group)}
1940
1941   Le funzioni cambiano utente e gruppo di appartenenza di un file ai valori
1942   specificati dalle variabili \var{owner} e \var{group}. 
1943   
1944   \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per
1945     un errore, in caso di errore \var{errno} può assumere i valori:
1946   \begin{errlist}
1947   \item[\errcode{EPERM}] L'userid effettivo non corrisponde a quello del
1948     proprietario del file o non è zero, o utente e gruppo non sono validi
1949   \end{errlist}
1950   Oltre a questi entrambe restituiscono gli errori \const{EROFS} e
1951   \const{EIO}; \func{chown} restituisce anche \const{EFAULT},
1952   \const{ENAMETOOLONG}, \const{ENOENT}, \const{ENOMEM}, \const{ENOTDIR},
1953   \const{EACCES}, \const{ELOOP}; \func{fchown} anche \const{EBADF}.}
1954 \end{functions}
1955
1956 In Linux soltanto l'amministratore può cambiare il proprietario di un file,
1957 seguendo la semantica di BSD che non consente agli utenti di assegnare i loro
1958 file ad altri (per evitare eventuali aggiramenti delle quote).
1959 L'amministratore può cambiare il gruppo di un file, il proprietario può
1960 cambiare il gruppo dei file che gli appartengono solo se il nuovo gruppo è il
1961 suo gruppo primario o uno dei gruppi a cui appartiene.
1962
1963 La funzione \func{chown} segue i link simbolici, per operare direttamente su
1964 un link simbolico si deve usare la funzione \func{lchown}.\footnote{fino alla
1965   versione 2.1.81 in Linux \func{chown} non seguiva i link simbolici, da
1966   allora questo comportamento è stato assegnato alla funzione \func{lchown},
1967   introdotta per l'occasione, ed è stata creata una nuova system call per
1968   \func{chown} che seguisse i link simbolici.} La funzione \func{fchown} opera
1969 su un file aperto, essa è mutuata da BSD, ma non è nello standard POSIX.
1970 Un'altra estensione rispetto allo standard POSIX è che specificando -1 come
1971 valore per \var{owner} e \var{group} i valori restano immutati.
1972
1973 Quando queste funzioni sono chiamate con successo da un processo senza i
1974 privilegi di root entrambi i bit \acr{suid} e \acr{sgid} vengono
1975 cancellati. Questo non avviene per il bit \acr{sgid} nel caso in cui esso
1976 sia usato (in assenza del corrispondente permesso di esecuzione) per indicare
1977 che per il file è attivo il \textit{mandatory locking}.
1978
1979 %La struttura fondamentale che contiene i dati essenziali relativi ai file è il
1980 %cosiddetto \textit{inode}; questo conterrà informazioni come il
1981 %tipo di file (file di dispositivo, directory, file di dati, per un elenco
1982 %completo vedi \ntab), i permessi (vedi \secref{sec:file_perms}), le date (vedi
1983 %\secref{sec:file_times}).
1984
1985
1986 \subsection{Un quadro d'insieme sui permessi}
1987 \label{sec:file_riepilogo}
1988
1989 Avendo affrontato in maniera separata il comportamento delle varie funzioni ed
1990 il significato dei singoli bit dei permessi sui file, vale la pena fare un
1991 riepilogo in cui si riassumono le caratteristiche di ciascuno di essi, in modo
1992 da poter fornire un quadro d'insieme.
1993
1994 In \tabref{tab:file_fileperm_bits} si sono riassunti gli effetti dei vari bit
1995 per un file; per quanto riguarda l'applicazione dei permessi per proprietario,
1996 gruppo ed altri si ricordi quanto illustrato in
1997 \secref{sec:file_perm_overview}. Si rammenti che il valore dei permessi non ha
1998 alcun effetto qualora il processo possieda i privilegi di amministratore.
1999
2000 \begin{table}[!htb]
2001   \centering
2002   \footnotesize
2003   \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|}
2004     \hline
2005     \multicolumn{3}{|c|}{}&
2006     \multicolumn{3}{|c|}{user}&
2007     \multicolumn{3}{|c|}{group}&
2008     \multicolumn{3}{|c|}{other}&
2009     \multirow{2}{*}{\textbf{Operazioni possibili}} \\
2010     \cline{1-12}
2011     \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\
2012     \hline
2013     \hline
2014     1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del propritario\\
2015     -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo propritario\\
2016     -&1&-&-&-&0&-&-&-&-&-&-&Il \textit{mandatory locking} è abilitato\\
2017     -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato\\
2018     -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario\\
2019     -&-&-&-&1&-&-&-&-&-&-&-&Permesso di lettura per il gruppo proprietario\\
2020     -&-&-&-&-&1&-&-&-&-&-&-&Permesso di lettura per tutti gli altri\\
2021     -&-&-&-&-&-&1&-&-&-&-&-&Permesso di scrittura per il proprietario\\
2022     -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario\\
2023     -&-&-&-&-&-&-&-&1&-&-&-&Permesso di scrittura per tutti gli altri \\
2024     -&-&-&-&-&-&-&-&-&1&-&-&Permesso di esecuzione per il proprietario\\
2025     -&-&-&-&-&-&-&-&-&-&1&-&Permesso di esecuzione per il gruppo proprietario\\
2026     -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri\\
2027     \hline
2028   \end{tabular}
2029   \caption{Tabella riassuntiva del significato dei bit dei permessi per un
2030     file.} 
2031   \label{tab:file_fileperm_bits}
2032 \end{table}
2033
2034 Per compattezza, nella tabella si sono specificati i bit di \acr{suid},
2035 \acr{sgid} e \acr{stiky} con la notazione illustrata anche in
2036 \figref{fig:file_perm_bit}. 
2037
2038 In \tabref{tab:file_dirperm_bits} si sono invece riassunti gli effetti dei
2039 vari bit dei permessi per una directory; anche in questo caso si sono
2040 specificati i bit di \acr{suid}, \acr{sgid} e \acr{stiky} con la notazione
2041 compatta illustrata in \figref{fig:file_perm_bit}.
2042
2043 \begin{table}[!htb]
2044   \centering
2045   \footnotesize
2046   \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|}
2047     \hline
2048     \multicolumn{3}{|c|}{}&
2049     \multicolumn{3}{|c|}{user}&
2050     \multicolumn{3}{|c|}{group}&
2051     \multicolumn{3}{|c|}{other}&
2052     \multirow{2}{*}{\textbf{Operazioni possibili}} \\
2053     \cline{1-12}
2054     \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\
2055     \hline
2056     \hline
2057     1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato\\
2058     -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file creati\\
2059     -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella directory\\
2060     -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario\\
2061     -&-&-&-&1&-&-&-&-&-&-&-&Permesso di visualizzazione per il gruppo proprietario\\
2062     -&-&-&-&-&1&-&-&-&-&-&-&Permesso di visualizzazione per tutti gli altri\\
2063     -&-&-&-&-&-&1&-&-&-&-&-&Permesso di aggiornamento per il proprietario\\
2064     -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo proprietario\\
2065     -&-&-&-&-&-&-&-&1&-&-&-&Permesso di aggiornamento per tutti gli altri \\
2066     -&-&-&-&-&-&-&-&-&1&-&-&Permesso di attraversamento per il proprietario\\
2067     -&-&-&-&-&-&-&-&-&-&1&-&Permesso di attraversamento per il gruppo proprietario\\
2068     -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri\\
2069     \hline
2070   \end{tabular}
2071   \caption{Tabella riassuntiva del significato dei bit dei permessi per una
2072     directory.} 
2073   \label{tab:file_dirperm_bits}
2074 \end{table}
2075
2076 Nelle tabelle si è indicato con $-$ il fatto che il valore degli altri bit non
2077 è influente rispetto a quanto indicato in ciascuna riga; l'operazione fa
2078 riferimento soltanto alla combinazione di bit per i quali il valore è
2079 riportato esplicitamente.
2080
2081
2082 \subsection{La funzione \func{chroot}}
2083 \label{sec:file_chroot}
2084
2085 Benché non abbia niente a che fare con permessi, utenti e gruppi, la funzione
2086 \func{chroot} viene usata spesso per restringere le capacità di acccesso di un
2087 programma ad una sezione limitata del filesystem, per cui ne parleremo in
2088 questa sezione.
2089
2090 Come accennato in \secref{sec:proc_fork} ogni processo oltre ad una directory
2091 di lavoro corrente, ha anche una directory radice,\footnote{entrambe sono
2092   contenute in due campi di \var{fs\_struct}, vedi
2093   \figref{fig:proc_task_struct}.} che è la directory che per il processo
2094 costituisce la radice dell'albero dei file e rispetto alla quale vengono
2095 risolti i pathname assoluti (si ricordi quanto detto in
2096 \secref{sec:file_organization}). La radice viene eredidata dal padre per ogni
2097 processo figlio, e quindi di norma coincide con la \file{/} del sistema.
2098
2099 In certe situazioni però per motivi di sicurezza non si vuole che un processo
2100 possa accedere a tutto il filesystem; per questo si può cambiare la directory
2101 radice con la funzione \func{chroot}, il cui prototipo è:
2102 \begin{prototype}{unistd.h}{int chroot(const char *path)}
2103   Cambia la directory radice del processo a quella specificata da
2104   \param{path}.
2105   
2106 \bodydesc{La funzione restituisce zero in caso di successo e -1 per
2107     un errore, in caso di errore \var{errno} può assumere i valori:
2108   \begin{errlist}
2109   \item[\errcode{EPERM}] L'userid effettivo del processo non è zero.
2110   \end{errlist}
2111   ed inoltre \const{EFAULT}, \const{ENAMETOOLONG}, \const{ENOENT},
2112   \const{ENOMEM}, \const{ENOTDIR}, \const{EACCES}, \const{ELOOP};
2113   \const{EROFS} e \const{EIO}.}
2114 \end{prototype}
2115 \noindent in questo modo la directory radice del processo diventerà
2116 \param{path} (che ovviamente deve esistere) ed ogni pathname assoluto sarà
2117 risolto a partire da essa, rendendo impossibile accedere alla parte di albero
2118 sovrastante; si ha cioè quella che viene chiamata una \textit{chroot jail}.
2119
2120 Solo l'amministratore può usare questa funzione, e la nuova radice, per quanto
2121 detto in \secref{sec:proc_fork}, sarà ereditata da tutti i processi figli. Si
2122 tenga presente che la funzione non cambia la directory di lavoro corrente, che
2123 potrebbe restare fuori dalla \textit{chroot jail}.
2124
2125 Questo è il motivo per cui la funzione è efficace solo se dopo averla eseguita
2126 si cedono i privilegi di root. Infatti se in qualche modo il processo ha una
2127 directory di lavoro corrente fuori dalla \textit{chroot jail}, potrà comunque
2128 accedere a tutto il filesystem usando pathname relativi.
2129
2130 Ma quando ad un processo restano i privilegi di root esso potrà sempre portare
2131 la directory di lavoro corrente fuori dalla \textit{chroot jail} creando una
2132 sottodirectory ed eseguendo una \func{chroot} su di essa. Per questo motivo
2133 l'uso di questa funzione non ha molto senso quando un processo necessita dei
2134 privilegi di root per le sue normali operazioni.
2135
2136 Un caso tipico di uso di \func{chroot} è quello di un server ftp anonimo, in
2137 questo caso infatti si vuole che il server veda solo i file che deve
2138 trasferire, per cui in genere si esegue una \func{chroot} sulla directory che
2139 contiene i file.  Si tenga presente però che in questo caso occorrerà
2140 replicare all'interno della \textit{chroot jail} tutti i file (in genere
2141 programmi e librerie) di cui il server potrebbe avere bisogno.
2142
2143 %%% Local Variables: 
2144 %%% mode: latex
2145 %%% TeX-master: "gapil"
2146 %%% End: