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