mount}. Lo scopo dell'opzione è ottenere che tutti i successivi
\textit{bind mount} ottenuti da un \textit{mount point} così marcato siano
di tipo \textit{shared} e vengano inseriti nello stesso \textit{mount peer
- group} in modo da ``\textsl{condivere}'' ogni ulteriore operazione di
+ group} in modo da ``\textsl{condividere}'' ogni ulteriore operazione di
montaggio o smontaggio. Con questa opzione le operazioni di montaggio e
smontaggio effettuate al di sotto di uno \textit{shared mount} vengono
automaticamente ``\textsl{propagate}'' a tutti gli altri membri del
\end{Console}
%$
con un errore che può sembrare sbagliato, dato che \cmd{ls} ci ha mostrato in
-prcedenza l'esistenza di \file{symlink}. Se invece andassimo a scrivere su
+precedenza l'esistenza di \file{symlink}. Se invece andassimo a scrivere su
\file{symlink}, l'effetto sarebbe quello di ottenere la creazione di
\file{/tmp/tmp\_file} (che a quel punto verrebbe creato) senza errori.
Si tenga anche presente che a partire dal kernel 3.16, se si abilita la
funzionalità dei \textit{protected symlinks} (attiva di default in tutte le
distribuzioni più recenti) la risoluzione dei nomi attraverso un collegamento
-simbolico può fallire per una serie di restrizione di sicurezza agguntive
+simbolico può fallire per una serie di restrizione di sicurezza aggiuntive
imposte dal meccanismo (si consulti sez.~\ref{sec:procadv_security_misc} per i
dettagli del meccanismo).
che contiene \param{pathname} o quello di attraversamento per una delle
directory superiori.
\item[\errcode{EBUSY}] \param{pathname} non può essere rimosso perché è in
- uso da parte del sistema (in particolare per i cosidetti \textit{silly
+ uso da parte del sistema (in particolare per i cosiddetti \textit{silly
renames} di NFS).
\item[\errcode{EISDIR}] \param{pathname} si riferisce ad una
directory.
\end{funcproto}
La funzione utilizza la funzione \func{unlink} per cancellare i file (e si
-applica anche a link simbolici, socket, \textit{fifo} e file di dispostivo) e
+applica anche a link simbolici, socket, \textit{fifo} e file di dispositivo) e
la funzione \func{rmdir} (vedi sez.~\ref{sec:file_dir_creat_rem}) per
cancellare le directory.\footnote{questo vale usando la \acr{glibc}; nella
\acr{libc4} e nella \acr{libc5} la funzione \func{remove} era un semplice
alias alla funzione \func{unlink} e quindi non poteva essere usata per le
- directory.} Si tenga presente che per alcune limitazioni del protocollo
+ directory.} Si tenga presente che, per alcune limitazioni del protocollo
NFS, utilizzare questa funzione su file che usano questo filesystem di rete
può comportare la scomparsa di file ancora in uso.
in ``\file{.}'' e ``\file{..}'' anche se validi in altri contesti, causeranno
il fallimento della funzione.
+Inoltre per eseguire la cancellazione, oltre ad essere vuota, occorre anche
+che la directory non sia utilizzata, questo vuol dire anche che non deve
+essere la directory di lavoro (vedi sez.~\ref{sec:file_work_dir}) o la
+directory radice (vedi sez.~\ref{sec:file_chroot}) di nessun processo, od
+essere utilizzata come \textit{mount point}.
+
Se la directory cancellata risultasse aperta in qualche processo per una
lettura dei suoi contenuti (vedi sez.~\ref{sec:file_dir_read}), pur
scomparendo dal filesystem e non essendo più possibile accedervi o crearvi
\func{versionsort}, che ordina i nomi tenendo conto del numero di versione,
cioè qualcosa per cui \texttt{file10} viene comunque dopo \texttt{file4}.
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
\footnotesize \centering
\begin{minipage}[c]{\codesamplewidth}
\includecodesample{listati/my_ls.c}
nome del file e la dimensione riportata in \var{data}.
Dato che la funzione verrà chiamata all'interno di \myfunc{dir\_scan} per ogni
-voce presente questo è sufficiente a stampare la lista completa dei file e
+voce presente, questo è sufficiente a stampare la lista completa dei file e
delle relative dimensioni. Si noti infine come si restituisca sempre 0 come
valore di ritorno per indicare una esecuzione senza errori.
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
\footnotesize \centering
\begin{minipage}[c]{\codesamplewidth}
\includecodesample{listati/dir_scan.c}
caso sarà \code{do\_ls}), ritornando con un codice di errore (\texttt{\small
28}) qualora questa presenti una anomalia, identificata da un codice di
ritorno negativo. Una volta terminato il ciclo la funzione si conclude con la
-chiusura (\texttt{\small 32}) dello \textit{stream}\footnote{nel nostro caso,
+chiusura (\texttt{\small 31}) dello \textit{stream}\footnote{nel nostro caso,
uscendo subito dopo la chiamata, questo non servirebbe, in generale però
l'operazione è necessaria, dato che la funzione può essere invocata molte
volte all'interno dello stesso processo, per cui non chiudere i
\index{directory~di~lavoro|(}
Come accennato in sez.~\ref{sec:proc_fork} a ciascun processo è associata una
-directory nel filesystem,\footnote{questa viene mantenuta all'interno dei dati
- della sua \kstruct{task\_struct} (vedi fig.~\ref{fig:proc_task_struct}), più
- precisamente nel campo \texttt{pwd} della sotto-struttura
- \kstruct{fs\_struct}.} che è chiamata \textsl{directory corrente} o
-\textsl{directory di lavoro} (in inglese \textit{current working directory}).
-La directory di lavoro è quella da cui si parte quando un \textit{pathname} è
-espresso in forma relativa, dove il ``\textsl{relativa}'' fa riferimento
-appunto a questa directory.
+directory nell'albero dei file,\footnote{questa viene mantenuta all'interno
+ dei dati della sua \kstruct{task\_struct} (vedi
+ fig.~\ref{fig:proc_task_struct}), più precisamente nel campo \texttt{pwd}
+ della sotto-struttura \kstruct{fs\_struct}.} che è chiamata
+\textsl{directory corrente} o \textsl{directory di lavoro} (in inglese
+\textit{current working directory}). La directory di lavoro è quella da cui
+si parte quando un \textit{pathname} è espresso in forma relativa, dove il
+``\textsl{relativa}'' fa riferimento appunto a questa directory.
Quando un utente effettua il login, questa directory viene impostata alla
\textit{home directory} del suo account. Il comando \cmd{cd} della shell
sez.~\ref{sec:proc_fork}), la directory di lavoro della shell diventa anche la
directory di lavoro di qualunque comando da essa lanciato.
-Dato che è il kernel che tiene traccia per ciascun processo
-dell'\textit{inode} della directory di lavoro, per ottenerne il
-\textit{pathname} occorre usare una apposita funzione,
-\funcd{getcwd},\footnote{con Linux \func{getcwd} è una \textit{system call}
- dalla versione 2.1.9, in precedenza il valore doveva essere ottenuto tramite
- il filesystem \texttt{/proc} da \procfile{/proc/self/cwd}.} il cui prototipo
-è:
+Dato che è il kernel che tiene traccia dell'\textit{inode} della directory di
+lavoro di ciascun processo, per ottenerne il \textit{pathname} occorre usare
+una apposita funzione, \funcd{getcwd},\footnote{con Linux \func{getcwd} è una
+ \textit{system call} dalla versione 2.1.9, in precedenza il valore doveva
+ essere ottenuto tramite il filesystem \texttt{/proc} da
+ \procfile{/proc/self/cwd}.} il cui prototipo è:
\begin{funcproto}{
\fhead{unistd.h}
\item[\errcode{ERANGE}] l'argomento \param{size} è più piccolo della
lunghezza del \textit{pathname}.
\end{errlist}
- ed inoltre \errcode{EFAULT} nel suo significato generico.}
+ ed inoltre \errcode{EFAULT} ed \errcode{ENOMEM} nel loro significato
+ generico.}
\end{funcproto}
La funzione restituisce il \textit{pathname} completo della directory di
esso ecceda le dimensioni specificate con \param{size} la funzione restituisce
un errore.
-Si può anche specificare un puntatore nullo come
-\param{buffer},\footnote{questa è un'estensione allo standard POSIX.1,
- supportata da Linux e dalla \acr{glibc}.} nel qual caso la stringa sarà
-allocata automaticamente per una dimensione pari a \param{size} qualora questa
-sia diversa da zero, o della lunghezza esatta del \textit{pathname}
-altrimenti. In questo caso ci si deve ricordare di disallocare la stringa con
-\func{free} una volta cessato il suo utilizzo.
+A partire dal kernel Linux 2.6.36 il nome può avere come prefisso la stringa
+\texttt{(unreachable)} se la directory di lavoro resta fuori dalla directory
+radice del processo dopo un \func{chroot} (torneremo su questi argomenti in
+sez.~\ref{sec:file_chroot}); pertanto è sempre opportuno controllare il primo
+carattere della stringa restituita dalla funzione per evitare di interpreare
+mare un \textit{pathname} irraggiungibile.
+
+Come estensione allo standard POSIX.1, supportata da Linux e dalla
+\acr{glibc}, si può anche specificare un puntatore nullo come \param{buffer}
+nel qual caso la stringa sarà allocata automaticamente per una dimensione pari
+a \param{size} qualora questa sia diversa da zero, o della lunghezza esatta
+del \textit{pathname} altrimenti. In questo caso ci si deve ricordare di
+disallocare la stringa con \func{free} una volta cessato il suo utilizzo.
Un uso comune di \func{getcwd} è quello di salvarsi la directory di lavoro
all'avvio del programma per poi potervi tornare in un tempo successivo, un
la ragione principale per cui questa funzione è deprecata, e non la tratteremo.
Una seconda funzione usata per ottenere la directory di lavoro è
-\funcm{get\_current\_dir\_name},\footnote{la funzione è una estensione GNU e
- presente solo nella \acr{glibc}.} che non prende nessun argomento ed è
-sostanzialmente equivalente ad una \code{getcwd(NULL, 0)}, con la differenza
-che se disponibile essa ritorna il valore della variabile di ambiente
-\envvar{PWD}, che essendo costruita dalla shell può contenere un
-\textit{pathname} comprendente anche dei collegamenti simbolici. Usando
-\func{getcwd} infatti, essendo il \textit{pathname} ricavato risalendo
-all'indietro l'albero della directory, si perderebbe traccia di ogni passaggio
-attraverso eventuali collegamenti simbolici.
+\funcm{get\_current\_dir\_name} (la funzione è una estensione GNU e presente
+solo nella \acr{glibc}) che non prende nessun argomento ed è sostanzialmente
+equivalente ad una \code{getcwd(NULL, 0)}, con la differenza che se
+disponibile essa ritorna il valore della variabile di ambiente \envvar{PWD},
+che essendo costruita dalla shell può contenere un \textit{pathname}
+comprendente anche dei collegamenti simbolici. Usando \func{getcwd} infatti,
+essendo il \textit{pathname} ricavato risalendo all'indietro l'albero della
+directory, si perderebbe traccia di ogni passaggio attraverso eventuali
+collegamenti simbolici.
Per cambiare la directory di lavoro si può usare la funzione di sistema
\funcd{chdir}, equivalente del comando di shell \cmd{cd}, il cui nome sta
\begin{errlist}
\item[\errcode{EACCES}] manca il permesso di ricerca su uno dei componenti
di \param{pathname}.
+ \item[\errcode{ENAMETOOLONG}] il nome indicato in \param{path} è troppo lungo.
\item[\errcode{ENOTDIR}] non si è specificata una directory.
\end{errlist}
- ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
- \errval{ENAMETOOLONG}, \errval{ENOENT} e \errval{ENOMEM} nel loro
- significato generico.}
+ ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP}, \errval{ENOENT} e
+ \errval{ENOMEM} nel loro significato generico.}
\end{funcproto}
La funzione cambia la directory di lavoro in \param{pathname} ed
Finora abbiamo parlato esclusivamente di file, directory e collegamenti
simbolici, ma in sez.~\ref{sec:file_file_types} abbiamo visto che il sistema
prevede anche degli altri tipi di file, che in genere vanno sotto il nome
-generico di \textsl{file speciali}, come i file di dispositivo, le \textit{fifo} ed i
-socket.
+generico di \textsl{file speciali}, come i file di dispositivo, le
+\textit{fifo} ed i socket.
La manipolazione delle caratteristiche di questi file speciali, il cambiamento
di nome o la loro cancellazione può essere effettuata con le stesse funzioni
la specifica \func{mkfifo}.} l'uso per la creazione di un file ordinario, di
una \textit{fifo} o di un socket è consentito anche agli utenti normali.
-I nuovi \textit{inode} creati con \func{mknod} apparterranno al proprietario e
-al gruppo del processo (usando \ids{UID} e \ids{GID} del gruppo effettivo) che
-li ha creati a meno non sia presente il bit \acr{sgid} per la directory o sia
+Gli \textit{inode} creati con \func{mknod} apparterranno al proprietario e al
+gruppo del processo (usando \ids{UID} e \ids{GID} del gruppo effettivo) che li
+ha creati a meno non sia presente il bit \acr{sgid} per la directory o sia
stata attivata la semantica BSD per il filesystem (si veda
sez.~\ref{sec:file_ownership_management}) in cui si va a creare
l'\textit{inode}, nel qual caso per il gruppo verrà usato il \ids{GID} del
``\textit{symlink attack}'' dove nell'intervallo fra la generazione di un nome
e l'accesso allo stesso, viene creato un collegamento simbolico con quel nome
verso un file diverso, ottenendo, se il programma sotto attacco ne ha la
-capacità, un accesso privilegiato.
+capacità, un accesso privilegiato.\footnote{dal kernel 3.6 sono state
+ introdotte delle contromisure, illustrate in
+ sez.~\ref{sec:procadv_security_misc}, che rendono impraticabili questo tipo
+ di attacchi, ma questa non è una buona scusa per ignorare il problema.}
\itindend{symlink~attack}
\end{errlist}}
\end{funcproto}
-
Come per \func{mktemp} anche in questo caso \param{template} non può essere
una stringa costante. La funzione apre un file in lettura/scrittura con la
funzione \func{open}, usando l'opzione \const{O\_EXCL} (si veda
\func{mkstemp}.}
\end{funcproto}
\noindent la cui sola differenza è la presenza dell'ulteriore argomento
-\var{flags} che consente di specificare i flag da passare ad \func{open}
-nell'apertura del file.
+\var{flags} che consente di specificare alcuni ulteriori flag
+(\const{O\_APPEND}, \const{O\_CLOEXEC}, \const{O\_SYNC}, il cui significato
+vedremo in sez.~\ref{sec:file_open_close}) da passare ad \func{open}
+nell'apertura del file.
+
+Di queste due funzioni sono state poi introdotte a partire dalla \acr{glibc}
+2.11 due varianti, \funcd{mkstemps} e \funcd{mkostemps} che consentono di
+indicare anche un suffisso, i loro prototipo sono:
+
+\begin{funcproto}{
+\fhead{stlib.h}
+\fdecl{int mkstemps(char *template, int suffixlen)}
+\fdesc{Apre un file temporaneo.}
+\fdecl{int mkostemps(char *template, int suffixlen, int flags)}
+\fdesc{Apre un file temporaneo.}
+}
+
+{Le funzioni hanno gli stessi valori di ritorno e gli stessi errori di
+ \func{mkstemp} con lo stesso significato tranne \errval{EINVAL} che viene
+ restituito se \param{template} non è di lunghezza pari ad almeno
+ $6+$\param{suffixlen} ed i 6 caratteri prima del suffisso non sono
+ \code{XXXXXX}.}
+\end{funcproto}
+Le due funzioni, estensione non standard delle \acr{glibc}, sono identiche a
+\funcd{mkstemp} e \funcd{mkostemp}, ma consentono di avere un nome del file
+nella forma \texttt{prefissoXXXXXXsuffisso} dove la lunghezza del suffisso
+deve essere indicata con \param{suffixlen}.
-In OpenBSD è stata introdotta un'altra funzione simile alle precedenti,
-\funcd{mkdtemp}, che crea invece una directory temporanea;\footnote{la
- funzione è stata introdotta nella \acr{glibc} a partire dalla versione
- 2.1.91 ed inserita nello standard POSIX.1-2008.} il suo prototipo è:
+Infine con OpenBSD è stata introdotta un'altra funzione simile alle
+precedenti, \funcd{mkdtemp}, che crea invece una directory
+temporanea;\footnote{la funzione è stata introdotta nella \acr{glibc} a
+ partire dalla versione 2.1.91 ed inserita nello standard POSIX.1-2008.} il
+suo prototipo è:
\begin{funcproto}{
\fhead{stlib.h}
La funzione crea una directory temporanea il cui nome è ottenuto sostituendo
le \code{XXXXXX} finali di \param{template} con permessi \code{0700} (si veda
sez.~\ref{sec:file_perm_overview} per i dettagli). Dato che la creazione della
-directory è sempre esclusiva i precedenti problemi di \textit{race condition}
+directory è sempre atomica i precedenti problemi di \textit{race condition}
non si pongono.
% LocalWords: setmntent getmntent addmntent endmntent hasmntopt such offsetof
% LocalWords: member scan attack EOVERFLOW BITS blkcnt rdev FDCWD functions
% LocalWords: faccessat grpid lacl AppArmor capsetp mygetfacl table Tb MSK
-% LocalWords: LAZYTIME submount peer
+% LocalWords: LAZYTIME submount peer protected hardlink symlinks silly
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
+% LocalWords: renames