file e directory, iniziando dalle funzioni di libreria che si usano per
copiarli, spostarli e cambiarne i nomi. Esamineremo poi l'interfaccia che
permette la manipolazione dei vari attributi di file e directory ed alla
-finefaremo una trattazione dettagliata su come è strutturato il sistema base
+fine faremo una trattazione dettagliata su come è strutturato il sistema base
di protezioni e controllo di accesso ai file e sulle funzioni che ne
permettono la gestione. Tutto quello che riguarda invece la manipolazione del
contenuto dei file è lasciato ai capitoli successivi.
Una caratteristica comune a diversi sistemi operativi è quella di poter creare
dei nomi fittizi (come gli alias del MacOS o i collegamenti di Windows) che
-permettono di fare riferiremento allo stesso file chiamandolo con nomi diversi
+permettono di fare riferimento allo stesso file chiamandolo con nomi diversi
o accedendovi da directory diverse.
Questo è possibile anche in ambiente unix, dove tali collegamenti sono
Per quanto dicevamo in \secref{sec:file_filesystem} la creazione di un
collegamento diretto è possibile solo se entrambi i pathname sono nello stesso
filesystem; inoltre il filesystem deve supportare i collegamenti diretti (il
-mneccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di
+meccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di
Windows).
La funzione inoltre opera sia sui file ordinari che sugli altri oggetti del
Una delle caratteristiche di queste funzioni è che la creazione/rimozione
della nome dalla directory e l'incremento/decremento del numero di riferimenti
nell'inode deve essere una operazione atomica (si veda
-\secref{cha:proc_atom_oper}), per questo entrambe queste funzioni sono
+\secref{sec:proc_atom_oper}), per questo entrambe queste funzioni sono
realizzate tramite una singola system call.
Si ricordi infine che il file non viene eliminato dal disco fintanto che tutti
\begin{prototype}{stdio.h}
{int rename(const char *oldpath, const char *newpath)}
- Rinomina \var{oldpath} in \var{newpth}, eseguendo se necessario lo
+ Rinomina \var{oldpath} in \var{newpath}, eseguendo se necessario lo
spostamento di un file fra directory diverse. Eventuali altri link diretti
allo stesso file non vengono influenzati.
Come abbiamo visto in \secref{sec:file_link} la funzione \func{link} crea
riferimenti agli inodes, pertanto può funzionare soltanto per file che
-risiedono sullo stesso filesysteme e solo per un filesystem di tipo unix.
+risiedono sullo stesso filesystem e solo per un filesystem di tipo unix.
Inoltre abbiamo visto che in Linux non è consentito eseguire un link diretto
ad una directory.
\begin{figure}[htb]
\centering
- \includegraphics[width=5cm]{img/link_loop.eps}
+ \includegraphics[width=5cm]{img/link_loop}
\caption{Esempio di loop nel filesystem creato con un link simbolico.}
\label{fig:file_link_loop}
\end{figure}
\item \macro{EMLINK} La directory in cui si vuole creare la nuova directory
contiene troppi file. Sotto Linux questo normalmente non avviene perché il
filesystem standard consente la creazione di un numero di file maggiore di
- quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che
+ quelli che possono essere contenuti nel disco, ma potendo avere a che
fare anche con filesystem di altri sistemi questo errore può presentarsi.
\item \macro{ENOSPC} Non c'è abbastanza spazio sul file system per creare
la nuova directory o si è esaurita la quota disco dell'utente.
Il buffer deve essere sufficientemente lungo da poter contenere il pathname
completo più lo zero di terminazione della stringa. Qualora esso ecceda le
-dimensioni specificate con \var{size} la funzione restituiece un errore. Si
+dimensioni specificate con \var{size} la funzione restituisce un errore. Si
può anche specificare un puntatore nullo come \var{buffer}\footnote{questa è
una estensione allo standard POSIX.1, supportata da Linux}, nel qual caso la
stringa sarà allocata automaticamente per una dimensione pari a \var{size}
nell'inode insieme agli altri attributi del file e possono essere letti
tramite la funzione \func{stat}, che li restituisce attraverso tre campi della
struttura \var{stat} di \figref{fig:file_stat_struct}. Il significato di detti
-tempi e dei relativi campi è riportato nello schema in \ntab:
+tempi e dei relativi campi è riportato nello schema in \ntab, dove si è anche
+riportato un esempio delle funzioni che effettuano cambiamenti su di essi.
\begin{table}[htb]
\centering
& \textbf{Opzione} \\
\hline
\hline
- \var{st\_atime}& ultimo accesso ai dati del file &\func{read}& \cmd{-u}\\
- \var{st\_mtime}& ultima modifica ai dati del file &\func{write}& default\\
+ \var{st\_atime}& ultimo accesso ai dati del file &\func{read},
+ \func{utime} & \cmd{-u}\\
+ \var{st\_mtime}& ultima modifica ai dati del file &\func{write},
+ \func{utime} & default\\
\var{st\_ctime}& ultima modifica ai dati dell'inode&\func{chmod},
\func{utime} & \cmd{-c} \\
\hline
Si noti infine come \var{st\_ctime} non abbia nulla a che fare con il tempo di
creazione del file, usato in molti altri sistemi operativi, ma che in unix non
-esiste.
+esiste. Per questo motivo quando si copia un file, a meno di preservare
+esplicitamente i tempi (ad esempio con l'opzione \cmd{-p} di \cmd{cp}) esso
+avrà sempre il tempo corrente come data di ultima modifica.
\subsection{La funzione \func{utime}}
Se però il file del programma\footnote{per motivi di sicurezza il kernel
ignora i bit \acr{suid} e \acr{sgid} per gli script eseguibili} (che
ovviamente deve essere eseguibile) ha il bit \acr{suid} settato, il kernel
-assegnerà come \textit{effective user id} al nuovo processo l'uid del
-proprietario del file al posto dell'uid del processo originario. Avere il bit
-\acr{sgid} settato ha lo stesso effetto sull'\textit{effective group id} del
-processo.
-
-I bit \acr{suid} e \acr{sgid} vengono usati per permettere agli utenti
-normali di usare programmi che abbisognano di privilegi speciali; l'esempio
-classico è il comando \cmd{passwd} che ha la necessità di modificare il file
-delle password, quest'ultimo ovviamente può essere scritto solo
-dall'amministratore, ma non è necessario chiamare l'amministratore per
-cambiare la propria password. Infatti il comando \cmd{passwd} appartiene a
-root ma ha il bit suid settato per cui quando viene lanciato da un utente
-normale parte con i privilegi di root.
+assegnerà come \textit{effective user id} al nuovo processo l'\acr{uid} del
+proprietario del file al posto dell'\acr{uid} del processo originario. Avere
+il bit \acr{sgid} settato ha lo stesso effetto sull'\textit{effective group
+ id} del processo.
+
+I bit \acr{suid} e \acr{sgid} vengono usati per permettere agli utenti normali
+di usare programmi che abbisognano di privilegi speciali; l'esempio classico è
+il comando \cmd{passwd} che ha la necessità di modificare il file delle
+password, quest'ultimo ovviamente può essere scritto solo dall'amministratore,
+ma non è necessario chiamare l'amministratore per cambiare la propria
+password. Infatti il comando \cmd{passwd} appartiene a root ma ha il bit
+\acr{suid} settato per cui quando viene lanciato da un utente normale parte
+con i privilegi di root.
Chiaramente avere un processo che ha privilegi superiori a quelli che avrebbe
normalmente l'utente che lo ha lanciato comporta vari rischi, e questo tipo di
mutuata da SVR4. Il caso in cui il file abbia il bit \acr{sgid} settato ma
non il corrispondente bit di esecuzione viene utilizzato per attivare per
quel file il \textit{mandatory locking} (argomento che affronteremo nei
-dettagli in \secref{sec:xxx_mandatory_lock}).
+dettagli in \secref{sec:file_mand_locking}).
\subsection{Il bit \textsl{sticky}}
\begin{itemize}
\item il \acr{gid} del file corrisponde all'\textit{effective group id} del
processo.
-\item il \acr{gid} del file corrisponde al gid della directory in cui esso è
- creato.
+\item il \acr{gid} del file corrisponde al \acr{gid} della directory in cui
+ esso è creato.
\end{itemize}
in genere BSD usa sempre la seconda possibilità, che viene per questo chiamata
-semantica BSD. Linux invece segue quella che viene chiamata semantica SVR4; di
+semantica BSD. Linux invece segue quella che viene chiamata semantica SVr4; di
norma cioè il nuovo file viene creato, seguendo la prima opzione, con il
\acr{gid} del processo, se però la directory in cui viene creato il file ha il
bit \acr{sgid} settato allora viene usata la seconda opzione.
nuovi file (lettura e scrittura per il proprietario, sola lettura per il
gruppo e gli altri) sono corrispondenti al valore ottale $0644$, un programma
invece avrebbe anche il bit di esecuzione attivo, con un valore di $0755$, se
-si volesse attivare il bit suid il valore da fornire sarebbe $4755$.
+si volesse attivare il bit \acr{suid} il valore da fornire sarebbe $4755$.
\begin{table}[!htb]
\centering