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