Trattata fstatat, e correzioni varie per utimensat.
[gapil.git] / fileio.tex
index 419877a21af55b911f88481c2aba421ec1983360..975a9c1a19e9439df54323abdcd2a42a09322e6f 100644 (file)
@@ -739,13 +739,13 @@ torni a corrispondere al valore di \const{O\_DSYNC}.
 % NOTE: per le differenze fra O_DSYNC, O_SYNC e O_RSYNC introdotte nella  
 % nello sviluppo del kernel 2.6.33, vedi http://lwn.net/Articles/350219/ 
 
-Il flag \constd{O\_PATH}, introdotto con il kernel 2.6.39, viene usato per
-limitare l'uso del file descriptor restituito da \func{open} o
-all'identificazione di una posizione sul filesystem (ad uso delle
-\textit{at-functions} che tratteremo in sez.~\ref{sec:file_openat}) o alle
-operazioni che riguardano il file descriptor in quanto tale, senza consentire
-operazioni sul file; in sostanza se si apre un file con \const{O\_PATH} si
-potrà soltanto:
+Il flag \constd{O\_PATH},\label{open_o_path_flag} introdotto con il kernel
+2.6.39, viene usato per limitare l'uso del file descriptor restituito da
+\func{open} o all'identificazione di una posizione sul filesystem (ad uso
+delle \textit{at-functions} che tratteremo in sez.~\ref{sec:file_openat}) o
+alle operazioni che riguardano il file descriptor in quanto tale, senza
+consentire operazioni sul file; in sostanza se si apre un file con
+\const{O\_PATH} si potrà soltanto:
 \begin{itemize*}
 \item usare il file descriptor come indicatore della directory di partenza con
   una delle \textit{at-functions} (vedi sez.~\ref{sec:file_openat});
@@ -771,7 +771,7 @@ operano effettivamente sul file (come ad esempio \func{read}, \func{write},
 \func{fchown}, \func{fchmod}, \func{ioctl}, ecc.) fallirà con un errore di
 \errval{EBADF}, come se questo non fosse un file descriptor valido. Per questo
 motivo usando questo flag non è necessario avere nessun permesso per aprire un
-file, neanche quello di lettura (occorre ovviamente avere il permesso di
+file, neanche quello di lettura (ma occorre ovviamente avere il permesso di
 esecuzione per le directory sovrastanti).
 
 Questo consente di usare il file descriptor con funzioni che non richiedono
@@ -791,7 +791,6 @@ così da poter usare il file descriptor ottenuto per le funzioni
 supportano l'uso come come primo argomento (torneremo su questo in
 sez.~\ref{sec:file_openat}).
 
-
 Nelle prime versioni di Unix i valori di \param{flag} specificabili per
 \func{open} erano solo quelli relativi alle modalità di accesso del file.  Per
 questo motivo per creare un nuovo file c'era una \textit{system call}
@@ -985,23 +984,23 @@ indefinito.
 Infine si tenga presente che, come accennato in sez.~\ref{sec:file_file_size},
 con \func{lseek} è possibile impostare una posizione anche oltre la corrente
 fine del file. In tal caso alla successiva scrittura il file sarà esteso a
-partire da detta posizione, con la creazione di quello che viene chiamato
+partire da detta posizione, con la creazione di quello che viene chiamato un
 ``\textsl{buco}'' (in gergo \textit{hole}) nel file.  Il nome deriva dal fatto
 che nonostante la dimensione del file sia cresciuta in seguito alla scrittura
-effettuata, lo spazio vuoto fra la precedente fine del file ed la nuova parte
-scritta dopo lo spostamento non corrisponde ad una allocazione effettiva di
+effettuata, lo spazio vuoto fra la precedente fine del file e la nuova parte,
+scritta dopo lo spostamento, non corrisponde ad una allocazione effettiva di
 spazio su disco, che sarebbe inutile dato che quella zona è effettivamente
 vuota.
 
 Questa è una delle caratteristiche specifiche della gestione dei file di un
-sistema unix-like e si dice che il file in questione è uno \textit{sparse
-  file}. In sostanza, se si ricorda la struttura di un filesystem illustrata
-in fig.~\ref{fig:file_filesys_detail}, quello che accade è che
-nell'\textit{inode} del file viene segnata l'allocazione di un blocco di dati
-a partire dalla nuova posizione, ma non viene allocato nulla per le posizioni
-intermedie; in caso di lettura sequenziale del contenuto del file il kernel si
-accorgerà della presenza del buco, e restituirà degli zeri come contenuto di
-quella parte del file.
+sistema unix-like e quando si ha questa situazione si dice che il file in
+questione è uno \textit{sparse file}. In sostanza, se si ricorda la struttura
+di un filesystem illustrata in fig.~\ref{fig:file_filesys_detail}, quello che
+accade è che nell'\textit{inode} del file viene segnata l'allocazione di un
+blocco di dati a partire dalla nuova posizione, ma non viene allocato nulla
+per le posizioni intermedie. In caso di lettura sequenziale del contenuto del
+file il kernel si accorgerà della presenza del buco, e restituirà degli zeri
+come contenuto di quella parte del file.
 
 Questa funzionalità comporta una delle caratteristiche della gestione dei file
 su Unix che spesso genera più confusione in chi non la conosce, per cui
@@ -1011,24 +1010,23 @@ disco e comunque maggiore della dimensione che riporta un comando come
 \cmd{du}, che calcola lo spazio disco occupato in base al numero dei blocchi
 effettivamente allocati per il file.
 
-Questo avviene proprio perché in un sistema unix-like la dimensione di un file
-è una caratteristica del tutto indipendente dalla quantità di spazio disco
-effettivamente allocato, e viene registrata sull'\textit{inode} come le altre
-proprietà del file. La dimensione viene aggiornata automaticamente quando si
-estende un file scrivendoci, e viene riportata dal campo \var{st\_size} di una
-struttura \struct{stat} quando si effettua la chiamata ad una delle funzioni
-\texttt{*stat} viste in sez.~\ref{sec:file_stat}.
-
-Questo comporta che in generale, fintanto che lo si è scritto sequenzialmente,
-la dimensione di un file sarà più o meno corrispondente alla quantità di
-spazio disco da esso occupato, ma esistono dei casi, come questo in cui ci si
-sposta in una posizione oltre la fine corrente del file, o come quello
-accennato in sez.~\ref{sec:file_file_size} in cui si estende la dimensione di
-un file con una \func{truncate}, in cui in sostanza si modifica il valore
-della dimensione di \var{st\_size} senza allocare spazio su disco. Questo
-consente di creare inizialmente file di dimensioni anche molto grandi, senza
-dover occupare da subito dello spazio disco che in realtà sarebbe
-inutilizzato.
+Tutto ciò avviene proprio perché in un sistema unix-like la dimensione di un
+file è una caratteristica del tutto indipendente dalla quantità di spazio
+disco effettivamente allocato, e viene registrata sull'\textit{inode} come le
+altre proprietà del file. La dimensione viene aggiornata automaticamente
+quando si estende un file scrivendoci, e viene riportata dal campo
+\var{st\_size} di una struttura \struct{stat} quando si effettua la chiamata
+ad una delle funzioni \texttt{*stat} viste in sez.~\ref{sec:file_stat}.
+
+Questo comporta che la dimensione di un file, fintanto che lo si è scritto
+sequenzialmente, sarà corrispondente alla quantità di spazio disco da esso
+occupato, ma possono esistere dei casi, come questo in cui ci si sposta in una
+posizione oltre la fine corrente del file, o come quello accennato in
+sez.~\ref{sec:file_file_size} in cui si estende la dimensione di un file con
+una \func{truncate}, in cui si modifica soltanto il valore della dimensione di
+\var{st\_size} senza allocare spazio su disco. Così è possibile creare
+inizialmente file di dimensioni anche molto grandi, senza dover occupare da
+subito dello spazio disco che in realtà sarebbe inutilizzato.
 
 \itindend{sparse~file}
 
@@ -1168,7 +1166,7 @@ funzione di sistema, \funcd{pread}, il cui prototipo è:
 
 La funzione prende esattamente gli stessi argomenti di \func{read} con lo
 stesso significato, a cui si aggiunge l'argomento \param{offset} che indica
-una posizione sul file a partire dalla quale verranno i \param{count}
+una posizione sul file a partire dalla quale verranno letti i \param{count}
 byte. Identico è il comportamento ed il valore di ritorno, ma la posizione
 corrente sul file resterà invariata.  Il valore di \param{offset} fa sempre
 riferimento all'inizio del file.
@@ -1222,7 +1220,8 @@ prototipo è:
     potuto scrivere qualsiasi dato.
   \item[\errcode{EINVAL}] \param{fd} è connesso ad un oggetto che non consente
     la scrittura o si è usato \const{O\_DIRECT} ed il buffer non è allineato.
-%  \item[\errcode{EPERM}] la scrittura è proibita da un \textit{file seal}.
+  \item[\errcode{EPERM}] la scrittura è proibita da un \textit{file seal}
+    (vedi sez.~\ref{sec:file_fcntl_ioctl}).
   \item[\errcode{EPIPE}] \param{fd} è connesso ad una \textit{pipe} il cui
     altro capo è chiuso in lettura; in questo caso viene anche generato il
     segnale \signal{SIGPIPE}, se questo viene gestito (o bloccato o ignorato)
@@ -1281,7 +1280,7 @@ In questa sezione approfondiremo alcune delle caratteristiche più sottili
 della gestione file in un sistema unix-like, esaminando in dettaglio il
 comportamento delle funzioni base, inoltre tratteremo le funzioni che
 permettono di eseguire alcune operazioni avanzate con i file (il grosso
-dell'argomento sarà comunque affrontato in cap.~\ref{cha:file_advanced}).
+dell'argomento sarà comunque affrontato nel cap.~\ref{cha:file_advanced}).
 
 
 \subsection{La gestione dell'accesso concorrente ai files}
@@ -1589,16 +1588,16 @@ fra \param{newfd} e \param{oldfd}, fallendo con un errore di \errval{EINVAL}.
 
 Come accennato in sez.~\ref{sec:file_open_close} tutte le operazioni di
 scrittura sono in genere bufferizzate dal kernel, che provvede ad effettuarle
-in maniera asincrona, ad esempio accorpando gli accessi alla stessa zona del
-disco in un secondo tempo rispetto al momento della esecuzione della
-\func{write}.
+in maniera asincrona per ottimizzarle, ad esempio accorpando gli accessi alla
+stessa zona del disco in un secondo tempo rispetto al momento della esecuzione
+della \func{write}.
 
-Per questo motivo quando è necessaria una sincronizzazione dei dati il sistema
-mette a disposizione delle funzioni che provvedono a forzare lo scarico dei
-dati dai buffer del kernel.  La prima di queste funzioni di sistema è
-\funcd{sync}, il cui prototipo è:\footnote{questo è il prototipo usato a
-  partire dalla \acr{glibc} 2.2.2 seguendo gli standard, in precedenza la
-  funzione era definita come \code{int sync(void)} e ritornava sempre $0$.}
+Per questo motivo quando è necessaria una sincronizzazione immediata dei dati
+il sistema mette a disposizione delle funzioni che provvedono a forzare lo
+scarico dei dati dai buffer del kernel.  La prima di queste funzioni di
+sistema è \funcd{sync}, il cui prototipo è:\footnote{questo è il prototipo
+  usato a partire dalla \acr{glibc} 2.2.2 seguendo gli standard, in precedenza
+  la funzione era definita come \code{int sync(void)} e ritornava sempre $0$.}
 
 \begin{funcproto}{
 \fhead{unistd.h}
@@ -1672,8 +1671,8 @@ gli altri dati contenuti nell'\textit{inode} che si leggono con \func{fstat},
 come i tempi del file. Se lo scopo dell'operazione, come avviene spesso per i
 database, è assicurarsi che i dati raggiungano il disco e siano rileggibili
 immediatamente in maniera corretta, è sufficiente l'uso di \func{fdatasync}
-che non comporta anche l'esecuzione di operazioni non necessarie all'integrità
-dei dati, come l'aggiornamento dei tempi di ultima modifica ed ultimo accesso.
+che evita le scritture non necessarie per avere l'integrità dei dati, come
+l'aggiornamento dei tempi di ultima modifica ed ultimo accesso.
 
 Si tenga presente che l'uso di queste funzioni non comporta la
 sincronizzazione della directory che contiene il file e la scrittura della
@@ -1689,12 +1688,12 @@ all'esecuzione di una \func{write} (come NFS o altri filesystem di rete) per
 cui l'errore viene rilevato quando la scrittura viene effettivamente
 eseguita.
 
-L'uso di \func{sync} presenta in certi casi, quando ci sono più filesystem
-montati, problemi di prestazioni dovute al fatto che la funzione provoca la
-sincronizzazione dei dati su tutti quanti i filesystem, anche quando
-interesserebbe che questo avvenga soltanto su quello dei file su cui si sta
-lavorando, se i dati in attesa sono molti questo può causare seri problemi di
-prestazioni. 
+L'uso di \func{sync} può causare, quando ci sono più filesystem montati,
+problemi di prestazioni dovuti al fatto che effettua la sincronizzazione dei
+dati su tutti i filesystem, anche quando sarebbe sufficiente eseguirla
+soltanto su quello dei file su cui si sta lavorando; quando i dati in attesa
+sono molti questo può causare una alta attività di I/O ed i relativi problemi
+di prestazioni.
 
 Per questo motivo è stata introdotta una nuova funzione di sistema,
 \funcd{syncfs},\footnote{la funzione è stata introdotta a partire dal kernel
@@ -1719,11 +1718,11 @@ prototipo è:
 \end{funcproto}
 
 La funzione richiede che si specifichi nell'argomento \param{fd} un file
-descriptor su cui si sta operando, e lo scarico dei dati sarà limitato al
-filesystem su cui il file ad esso corrispondente si trova.
+descriptor su cui si sta operando, e la registrazione immediata dei dati sarà
+limitata al filesystem su cui il file ad esso corrispondente si trova.
 
 
-\subsection{Le \textit{at-functions}: \func{openat} e affini}
+\subsection{Le \textit{at-functions}: \func{openat} e le altre}
 \label{sec:file_openat}
 
 \itindbeg{at-functions}
@@ -1735,53 +1734,71 @@ diretto ad un file posto nella directory di lavoro corrente, che alcuni dei
 componenti dello stesso vengano modificati in parallelo alla chiamata a
 \func{open}, cosa che lascia aperta la possibilità di una \textit{race
   condition} in cui c'è spazio per un \textit{symlink attack} (si ricordi
-quanto visto per \func{access} in sez.~\ref{sec:file_perm_management}). 
+quanto visto per \func{access} in sez.~\ref{sec:file_perm_management})
+cambiando una delle directory sovrastanti il file fra un controllo e la
+successiva apertura. 
 
-Inoltre come già accennato, la directory di lavoro corrente è una proprietà
+Inoltre, come già accennato, la directory di lavoro corrente è una proprietà
 associata al singolo processo; questo significa che quando si lavora con i
-\textit{thread} questa sarà sempre la stessa per tutti \textit{thread}, ed un
-cabiamento di directory di lavoro effettuato all'interno di un \textit{thread}
-verrà applicato a tutti, non esiste quindi con le funzioni classiche un modo
-semplice per far si che i singoli \textit{thread} possano aprire file usando
-una propria directory per risolvere i \textit{pathname} relativi.
+\textit{thread} questa è la stessa per tutti, per cui se la si cambia
+all'interno di un \textit{thread} il cambiamento varrà anche per tutti gli
+altri. Non esiste quindi con le funzioni classiche un modo semplice per far sì
+che i singoli \textit{thread} possano aprire file usando una propria directory
+per risolvere i \textit{pathname} relativi.
 
 Per risolvere questi problemi, riprendendo una interfaccia già presente in
 Solaris, a fianco delle normali funzioni che operano sui file (come
 \func{open}, \func{mkdir}, ecc.) sono state introdotte delle ulteriori
-funzioni di sistema, chiamate ``\textit{at-functions}'' in quanto quasi tutte
-sono contraddistinte dal suffisso \texttt{at}, che permettono l'apertura di un
-file (o le rispettive altre operazioni) usando un \textit{pathname} relativo
-ad una directory specificata.\footnote{l'introduzione è avvenuta su proposta
-  dello sviluppatore principale della \acr{glibc} Urlich Drepper e le
-  corrispondenti \textit{system call} sono state inserite nel kernel a partire
-  dalla versione 2.6.16, in precedenza era disponibile una emulazione che, sia
-  pure con prestazioni inferiori, funzionava facendo ricorso all'uso del
-  filesystem \textit{proc} con l'apertura del file attraverso il riferimento a
+funzioni di sistema, chiamate genericamente ``\textit{at-functions}'' in
+quanto usualmente contraddistinte dal suffisso \texttt{at}, che permettono
+l'apertura di un file (o le rispettive altre operazioni) usando un
+\textit{pathname} relativo ad una directory
+specificata.\footnote{l'introduzione è avvenuta su proposta dello sviluppatore
+  principale della \acr{glibc} Urlich Drepper e le corrispondenti
+  \textit{system call} sono state inserite nel kernel a partire dalla versione
+  2.6.16, in precedenza era disponibile una emulazione che, sia pure con
+  prestazioni inferiori, funzionava facendo ricorso all'uso del filesystem
+  \textit{proc} con l'apertura del file attraverso il riferimento a
   \textit{pathname} del tipo di \texttt{/proc/self/fd/dirfd/relative\_path}.}
+Essendo accomunate dalla stessa interfaccia le tratteremo insieme in questa
+sezione pur non essendo strettamente attinenti l'I/O su file.
+
 
 Benché queste funzioni non siano presenti negli standard tradizionali esse
 sono state adottate da altri sistemi unix-like come Solaris, i vari BSD, fino
-ad essere incluse in una recente revisione (la POSIX.1-2008) dello standard
-POSIX.1. Con la \acr{glibc} per l'accesso a queste funzioni è necessario
-definire la macro \macro{\_ATFILE\_SOURCE} (attiva di default).
-
-L'uso di queste funzioni prevede una apertura iniziale della directory che si
-intende usare come base per la risoluzione dei \textit{pathname} relativi,
-dopo di che si dovrà passare il suddetto file descriptor alle stesse, che
-useranno quella directory come punto di partenza per la risoluzione. In questo
-modo, anche quando si lavora con i \textit{thread}, si può mantenere una
-directory di lavoro diversa per ciascuno di essi.
-
-Questo metodo, oltre a risolvere i problemi di \textit{race condition} dovuti
-al possibile cambiamento di uno dei componenti del \textit{pathname}, consente
-anche di ottenere aumenti di prestazioni significativi quando si devono
-eseguire molte operazioni su sezioni dell'albero dei file che prevedono delle
-gerarchie di sottodirectory molto profonde. Infatti in questo caso basta
-eseguire la risoluzione del \textit{pathname} di una qualunque directory di
-partenza una sola volta (nell'apertura iniziale) e non tutte le volte che si
-deve accedere a ciascun file che essa contiene. 
-
-La sintassi generale di queste nuove funzioni è l'utilizzo come primo
+ad essere incluse in una recente revisione dello standard POSIX.1 (la
+POSIX.1-2008). Con la \acr{glibc} per l'accesso a queste funzioni è necessario
+definire la macro \macro{\_ATFILE\_SOURCE} (comunque attiva di default).
+
+L'uso di queste funzioni richiede una apertura preliminare della directory che
+si intende usare come base per la risoluzione dei \textit{pathname} relativi
+(ad esempio usando \func{open} con il flag \const{O\_PATH} visto in
+sez.~\ref{sec:file_open_close}) per ottenere un file descriptor che dovrà
+essere passato alle stesse.  Tutte queste funzioni infatti prevedono la
+presenza un apposito argomento, in genere il primo, che negli esempi seguenti
+chiameremo sempre \param{dirfd}.
+
+In questo modo, una volta aperta la directory di partenza, si potranno
+effettuare controlli ed aperture solo con \textit{pathname} relativi alla
+stessa, e tutte le \textit{race condition} dovute al possibile cambiamento di
+uno dei componenti posti al di sopra della stessa cesseranno di esistere.
+Inoltre, pur restando la directory di lavoro una proprietà comune del
+processo, si potranno usare queste funzioni quando si lavora con i
+\textit{thread} per eseguire la risoluzione dei \textit{pathname} relativi ed
+avere una directory di partenza diversa in ciascuno di essi.
+
+Questo metodo consente inoltre di ottenere aumenti di prestazioni
+significativi quando si devono eseguire molte operazioni su sezioni
+dell'albero dei file che prevedono delle gerarchie di sottodirectory molto
+profonde. Infatti in questo caso basta eseguire la risoluzione del
+\textit{pathname} di una qualunque directory di partenza una sola volta
+(nell'apertura iniziale) e non tutte le volte che si deve accedere a ciascun
+file che essa contiene. Infine poter identificare una directory di partenza
+tramite il suo file descriptor consente di avere un riferimento stabile alla
+stessa anche qualora venisse rinominata, e tiene occupato il filesystem dove
+si trova, come per la directory di lavoro di un processo.
+
+La sintassi generica di queste nuove funzioni prevede l'utilizzo come primo
 argomento del file descriptor della directory da usare come base per la
 risoluzione dei nomi, mentre gli argomenti successivi restano identici a
 quelli della corrispondente funzione ordinaria. Come esempio prendiamo in
@@ -1805,22 +1822,15 @@ esame la nuova funzione di sistema \funcd{openat}, il cui prototipo è:
 \end{funcproto}
 
 Il comportamento di \func{openat} è del tutto analogo a quello di \func{open},
-con la sola eccezione del fatto che se per l'argomento \pathname{pathname} si
-utilizza un \textit{pathname} relativo questo, sarà risolto rispetto alla
-directory indicata da \param{dirfd}. Qualora invece si usi un
+con la sola eccezione del fatto che se per l'argomento \param{pathname} si
+utilizza un \textit{pathname} relativo questo sarà risolto rispetto alla
+directory indicata da \param{dirfd}; qualora invece si usi un
 \textit{pathname} assoluto \param{dirfd} verrà semplicemente ignorato. Infine
-se per \param{dirfd} si usa il valore speciale \constd{AT\_FDCWD}, la
+se per \param{dirfd} si usa il valore speciale \constd{AT\_FDCWD} la
 risoluzione sarà effettuata rispetto alla directory di lavoro corrente del
-processo. Si tenga presente però che questa, come le altre costanti
-\texttt{AT\_*}, è definita in \headfile{fcntl.h}, pertanto se la si vuole
-usare occorrerà includere comunque questo file, anche per le funzioni che non
-sono definite in esso.
-
-Si tenga comunque presente che l'uso di \func{openat} non risolve in generale
-tutte le possibili \textit{race condition} legati all'apertura di un file,
-dopo un eventuale controllo di accesso o esistenza, ma consente comunque di
-difendersi da tutti gli attacchi eseguiti modificando le componenti superiori
-del suo \textit{pathname}. Inoltre una ...
+processo. Questa, come le altre costanti \texttt{AT\_*}, è definita in
+\headfile{fcntl.h}, per cui per usarla occorrerà includere comunque questo
+file, anche per le funzioni che non sono definite in esso.
 
 Così come il comportamento, anche i valori di ritorno e le condizioni di
 errore delle nuove funzioni sono gli stessi delle funzioni classiche, agli
@@ -1828,8 +1838,8 @@ errori si aggiungono però quelli dovuti a valori errati per \param{dirfd}; in
 particolare si avrà un errore di \errcode{EBADF} se esso non è un file
 descriptor valido, ed un errore di \errcode{ENOTDIR} se esso non fa
 riferimento ad una directory, tranne il caso in cui si sia specificato un
-\textit{pathname} assoluto, nel qual caso, come detto, il valore
-di \param{dirfd} sarà completamente ignorato.
+\textit{pathname} assoluto, nel qual caso, come detto, il valore di
+\param{dirfd} sarà completamente ignorato.
 
 \begin{table}[htb]
   \centering
@@ -1841,17 +1851,20 @@ di \param{dirfd} sarà completamente ignorato.
     \hline
      \func{execveat}  &$\bullet$&\func{execve}  \\
      \func{faccessat} &$\bullet$&\func{access}  \\
-     \funcm{fchmodat} &$\bullet$&\func{chmod}   \\
+     \func{fchmodat}  &$\bullet$&\func{chmod}   \\
      \func{fchownat}  &$\bullet$&\func{chown},\func{lchown}\\
-     \funcm{fstatat}  &$\bullet$&\func{stat},\func{lstat}  \\
-     \func{linkat}    &$\bullet$\footnotemark&\func{link}    \\
+     \func{fstatat}   &$\bullet$&\func{stat},\func{lstat}  \\
+     \funcm{futimesat}& --      & obsoleta  \\
+     \func{linkat}    &$\bullet$&\func{link}    \\
      \funcm{mkdirat}  & --      &\func{mkdir}   \\
      \funcm{mkfifoat} & --      &\func{mkfifo}  \\
      \funcm{mknodat}  & --      &\func{mknod}   \\
      \func{openat}    & --      &\func{open}    \\
      \funcm{readlinkat}& --     &\func{readlink}\\
-     \funcm{renameat} & --      &\func{rename}  \\
-     \funcm{statx}    &$\bullet$&\func{stat}  \\
+     \func{renameat}  & --      &\func{rename}  \\
+     \func{renameat2}\footnotemark& -- &\func{rename}  \\
+     \funcm{scandirat}& --      &\func{scandir}  \\
+     \func{statx}     &$\bullet$&\func{stat}  \\
      \funcm{symlinkat}& --      &\func{symlink} \\
      \func{unlinkat}  &$\bullet$&\func{unlink},\func{rmdir}  \\
      \func{utimensat} &$\bullet$&\func{utimes},\func{lutimes}\\
@@ -1862,57 +1875,109 @@ di \param{dirfd} sarà completamente ignorato.
   \label{tab:file_atfunc_corr}
 \end{table}
 
-\footnotetext{in questo caso l'argomento \param{flags} è disponibile ed
-  utilizzabile solo a partire dal kernel 2.6.18.}
+\footnotetext{anche se la funzione ha un argomento \param{flags} questo
+  attiene a funzionalità specifiche della stessa e non all'uso generico fatto
+  nelle altre \textit{at-functions}, pertanto lo si è indicato come assente.}
 
 In tab.~\ref{tab:file_atfunc_corr} si sono riportate le funzioni introdotte
 con questa nuova interfaccia, con a fianco la corrispondente funzione
-classica. La gran parte di queste seguono la convenzione appena vista per
-\func{openat}, in cui agli argomenti della corrispondente funzione classica
-viene anteposto l'argomento \param{dirfd}, ed hanno per il resto un
-comportamento identico e non staremo pertanto a trattarle una per una. Per una
-parte di queste, indicate dal contenuto della omonima colonna di
+classica. Tutte seguono la convenzione appena vista per \func{openat}, in cui
+agli argomenti della funzione classica viene anteposto l'argomento
+\param{dirfd}. Per alcune, indicate dal contenuto della omonima colonna di
 tab.~\ref{tab:file_atfunc_corr}, oltre al nuovo argomento iniziale, è prevista
-anche l'aggiunta di un ulteriore argomento finale, \param{flags}.
-
-
-% TODO trattare fstatat e con essa
-% TODO trattare anche statx, aggiunta con il kernel 4.11 (vedi
-% https://lwn.net/Articles/707602/ e
-% https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a528d35e8bfcc521d7cb70aaf03e1bd296c8493f) 
+anche l'aggiunta di un argomento finale, \param{flags}, che è stato introdotto
+per fornire un meccanismo con cui modificarne il comportamento.
+
+Per tutte quelle che non hanno un argomento aggiuntivo il comportamento è
+identico alla corrispondente funzione ordinaria, pertanto non le tratteremo
+esplicitamente, vale per loro quanto detto con \func{openat} per l'uso del
+nuovo argomento \param{dirfd}. Tratteremo invece esplicitamente tutte quelle
+per cui l'argomento è presente, in quanto il loro comportamento viene
+modificato a seconda del valore assegnato a \param{flags}; questo deve essere
+passato come maschera binaria con una opportuna combinazione delle costanti
+elencate in tab.~\ref{tab:at-functions_constant_values}, in quanto sono
+possibili diversi valori a seconda della funzione usata.
 
-% TODO manca prototipo di linkat, verificare se metterlo o metter menzione
-% altre modifiche al riguardo nel 3.11 (AT_EMPTY_PATH?) vedi
-% http://lwn.net/Articles/562488/
-
-% TODO: Trattare esempio di inzializzazione di file e successivo collegamento
-% con l'uso di O_TMPFILE e linkat, vedi man open
-
-
-% TODO manca prototipo di utimensat, verificare se metterlo o metter menzione
-% TODO manca prototipo di renameat2, introdotta nel 3.15, vedi
-% http://lwn.net/Articles/569134/ 
-% TODO manca prototipo di execveat, introdotta nel 3.19, vedi
-% https://lwn.net/Articles/626150/ cerca anche fexecve
-
-
-Per tutte le funzioni che lo prevedono, a parte \func{unlinkat} e
-\funcd{faccessat}, l'ulteriore argomento è stato introdotto solo per fornire
-un meccanismo con cui modificarne il comportamento nel caso si stia operando
-su un collegamento simbolico, così da poter scegliere se far agire la funzione
-direttamente sullo stesso o sul file da esso referenziato. Dato che in certi
-casi esso può fornire ulteriori indicazioni per modificare il comportamento
-delle funzioni, \param{flags} deve comunque essere passato come maschera
-binaria, ed impostato usando i valori delle appropriate costanti
-\texttt{AT\_*}, definite in \headfile{fcntl.h}.
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Costante} & \textbf{Significato} \\
+    \hline
+    \hline
+    \constd{AT\_EMPTY\_PATH}    & Usato per operare direttamente (specificando
+                                  una stringa vuota  per il \texttt{pathname})
+                                  sul file descriptor \param{dirfd} che in
+                                  questo caso può essere un file qualunque.\\
+    \constd{AT\_SYMLINK\_NOFOLLOW}& Se impostato la funzione non esegue la
+                                    dereferenziazione dei collegamenti
+                                    simbolici.\\
+    \hline
+    \constd{AT\_EACCES}         & Usato solo da \func{faccessat}, richiede che
+                                  il controllo dei permessi sia fatto usando
+                                  l'\ids{UID} effettivo invece di quello
+                                  reale.\\
+    \constd{AT\_NO\_AUTOMOUNT}  & Usato solo da \func{fstatat} e \func{statx},
+                                  evita il montaggio automatico qualora 
+                                  \param{pathname} faccia riferimento ad una
+                                  directory marcata per
+                                  l'\textit{automount}\footnotemark
+                                  (dal kernel 2.6.38).\\
+    \constd{AT\_REMOVEDIR}      & Usato solo da \func{unlinkat}, richiede che
+                                  la funzione si comporti come \func{rmdir}
+                                  invece che come \func{unlink}.\\
+    \constd{AT\_SYMLINK\_FOLLOW}& Usato solo da \func{linkat}, se impostato la
+                                  funzione esegue la dereferenziazione dei
+                                  collegamenti simbolici.\\
+    \hline
+  \end{tabular}  
+  \caption{Le costanti utilizzate per i bit dell'argomento aggiuntivo
+    \param{flags} delle \textit{at-functions}, definite in
+    \headfile{fcntl.h}.}
+  \label{tab:at-functions_constant_values}
+\end{table}
 
-Come esempio di questo secondo tipo di funzioni possiamo considerare
-\funcd{fchownat}, che può essere usata per sostituire sia \func{chown}
-che \func{lchown}; il suo prototipo è:
+\footnotetext{si tratta di una funzionalità fornita dal kernel che consente di
+  montare automaticamente una directory quando si accede ad un
+  \textit{pathname} al di sotto di essa, per i dettagli, più di natura
+  sistemistica, si può consultare sez.~5.1.6 di \cite{AGL}.}
+
+Si tenga presente che non tutte le funzioni che prevedono l'argomento
+aggiuntivo sono \textit{system call}, ad esempio \func{faccessat} e
+\func{fchmodat} sono realizzate con dei \textit{wrapper} nella \acr{glibc} per
+aderenza allo standard POSIX.1-2008, dato che la \textit{system call}
+sottostante non prevede l'argomento \param{flags}. 
+
+In tab.~\ref{tab:at-functions_constant_values} si sono elencati i valori
+utilizzabili per i flag (tranne quelli specifici di \func{statx} su cui
+torneremo più avanti), mantenendo nella prima parte quelli comuni usati da più
+funzioni. Il primo di questi è \const{AT\_SYMLINK\_NOFOLLOW}, che viene usato
+da tutte le funzioni tranne \func{linkat} e \func{unlinkat}, e che consente di
+scegliere, quando si sta operando su un collegamento simbolico, se far agire
+la funzione direttamente sullo stesso o sul file da esso referenziato. Si
+tenga presente però che per \funcm{fchmodat} questo, che è l'unico flag
+consentito e previsto dallo standard, non è attualmente implementato (anche
+perché non avrebbe molto senso cambiare i permessi di un link simbolico) e
+pertanto l'uso della funzione è analogo a quello delle altre funzioni che non
+hanno l'argomento \param{flags} (e non la tratteremo esplicitamente).
+
+L'altro flag comune è \const{AT\_EMPTY\_PATH}, utilizzabile a partire dal
+kernel 2.6.39, che consente di usare per \param{dirfd} un file descriptor
+associato ad un file qualunque e non necessariamente ad una directory; in
+particolare si può usare un file descriptor ottenuto aprendo un file con il
+flag \param{O\_PATH} (vedi quanto illustrato a
+pag.~\pageref{open_o_path_flag}). Quando si usa questo flag \param{pathname}
+deve essere vuoto, da cui il nome della costante, ed in tal caso la funzione
+agirà direttamente sul file associato al file descriptor \param{dirfd}.
+
+Una prima funzione che utilizza l'argomento \param{flag} è \funcd{fchownat},
+che può essere usata per sostituire sia \func{chown} che \func{lchown}; il suo
+prototipo è:
 
 \begin{funcproto}{
-\fhead{unistd.h}
 \fhead{fcntl.h} 
+\fhead{unistd.h}
 \fdecl{int fchownat(int dirfd, const char *pathname, uid\_t owner, gid\_t
     group, int flags)}
 \fdesc{Modifica il proprietario di un file.} 
@@ -1929,19 +1994,20 @@ che \func{lchown}; il suo prototipo è:
 }  
 \end{funcproto}
 
-In questo caso il valore di \param{flags} stabilisce il comportamento della
-funzione quando la si applica ad un collegamento simbolico, e l'unico valore
-utilizzabile è \const{AT\_SYMLINK\_NOFOLLOW}, che se impostato indica alla
-funzione di non eseguire la dereferenziazione di un eventuale collegamento
-simbolico, facendo comportare \func{fchownat} come \func{lchown} invece che
-come \func{chown}.
+In questo caso, oltre a quanto già detto per \func{openat} riguardo all'uso di
+\param{dirfd}, se si è impostato \const{AT\_SYMLINK\_NOFOLLOW} in
+\param{flags}, si indica alla funzione di non eseguire la dereferenziazione di
+un eventuale collegamento simbolico, facendo comportare \func{fchownat} come
+\func{lchown} invece che come \func{chown}. La funzione supporta anche l'uso
+di \const{AT\_EMPTY\_PATH}, con il significato illustrato in precedenza e non
+ha flag specifici.
 
-Come accennato fra tutte quelle marcate in tab.~\ref{tab:file_atfunc_corr}
-solo due funzioni possono usare l'argomento \param{flags} per indicare altro
-rispetto alla possibilità di seguire o meno un collegamento simbolico, la
-prima di queste è \funcd{faccessat}, ed il suo prototipo è:
+Una seconda funzione che utilizza l'argomento \param{flags}, in questo caso
+anche per modificare il suo comportamento, è \funcd{faccessat}, ed il suo
+prototipo è:
 
 \begin{funcproto}{
+\fhead{fcntl.h} 
 \fhead{unistd.h}
 \fdecl{int faccessat(int dirfd, const char *path, int mode, int flags)}
 \fdesc{Controlla i permessi di accesso.} 
@@ -1958,23 +2024,22 @@ prima di queste è \funcd{faccessat}, ed il suo prototipo è:
 }  
 \end{funcproto}
 
-La funzione esegue il controllo di accesso ad un file, ma
-l'argomento \param{flags} consente di modificarne il comportamento rispetto a
-quello ordinario di \func{access}. In questo caso esso può essere specificato
-come maschera binaria di due valori: il solito \const{AT\_SYMLINK\_NOFOLLOW},
-con il significato già spiegato, e \const{AT\_EACCES} per indicare alla
-funzione di eseguire il controllo dei permessi usando l'\ids{UID} effettivo
-invece di quello reale (il comportamento di default, che riprende quello di
-\func{access}).
+La funzione esegue il controllo di accesso ad un file, e \param{flags}
+consente di modificarne il comportamento rispetto a quello ordinario di
+\func{access} (cui è analoga, e con cui condivide i problemi di sicurezza
+visti in sez.~\ref{sec:file_stat}) usando il valore \const{AT\_EACCES} per
+indicare alla funzione di eseguire il controllo dei permessi con l'\ids{UID}
+\textsl{effettivo} invece di quello \textsl{reale}. L'unico altro valore
+consentito è \const{AT\_SYMLINK\_NOFOLLOW}, con il significato già spiegato.
 
-
-La seconda eccezione è \funcd{unlinkat}, in questo caso
-l'argomento \param{flags} viene utilizzato perché tramite esso si può indicare
-alla funzione di comportarsi sia come analogo di \func{unlink} che di
-\func{rmdir}; il suo prototipo è:
+Un'altra funzione che ha un utilizzo specifico dell'argomento \param{flags} è
+\funcd{unlinkat}, in questo caso l'argomento viene utilizzato perché tramite
+esso si può indicare alla funzione di comportarsi sia come analogo di
+\func{unlink} che di \func{rmdir}; il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{fcntl.h}
+\fhead{unistd.h}
 \fdecl{int unlinkat(int dirfd, const char *pathname, int flags)}
 \fdesc{Rimuove una voce da una directory.} 
 }
@@ -1994,152 +2059,177 @@ alla funzione di comportarsi sia come analogo di \func{unlink} che di
 Di default il comportamento di \func{unlinkat} è equivalente a quello che
 avrebbe \func{unlink} applicata a \param{pathname}, fallendo in tutti i casi
 in cui questo è una directory, se però si imposta \param{flags} al valore di
-\const{AT\_REMOVEDIR}, essa si comporterà come \func{rmdir}, in tal
-caso \param{pathname} deve essere una directory, che sarà rimossa qualora
-risulti vuota.  Non essendo in questo caso prevista la possibilità di usare
-altri valori (la funzione non segue comunque i collegamenti simbolici) anche
-se \param{flags} è una maschera binaria, essendo \const{AT\_REMOVEDIR} l'unico
-flag disponibile per questa funzione, lo si può assegnare direttamente.
-
-Infine una terza funzione, \funcm{linkat}, utilizza in maniera diversa dalle
-altre l'argomento \param{flags}, anche se in questo caso l'utilizzo continua
-ad essere attinente al comportamento con i collegamenti simbolici. Si ricordi
-che su Linux il comportamento di \func{link} è quello di non seguire mai i
-collegamenti simbolici, pertanto l'uso ordinario dell'argomento parrebbe in
-questo caso essere inutile.  A partire dal kernel 2.6.18 invece però è stato
-aggiunta per questa funzione la possibilità di usare il valore
-\const{AT\_SYMLINK\_FOLLOW}, che richiede di dereferenziare i collegamenti
-simbolici.
-
-Dato che questo è il comportamento adottato per un valore nullo
-di \param{flags} da tutte le altre funzioni, \func{linkat} è l'unica per cui
-può essere usato esplicitamente questo valore e per la quale non ha senso
-usare \const{AT\_SYMLINK\_NOFOLLOW}. Per avere un quadro d'insieme si è
-riassunto in tab.~\ref{tab:at-functions_constant_values} l'elenco delle
-costanti utilizzabili per i valori di \param{flags}.
-
-\begin{table}[htb]
-  \centering
-  \footnotesize
-  \begin{tabular}[c]{|l|p{8cm}|}
-    \hline
-    \textbf{Costante} & \textbf{Significato} \\
-    \hline
-    \hline
-    \constd{AT\_SYMLINK\_NOFOLLOW}& Se impostato la funzione non esegue la
-                                    dereferenziazione dei collegamenti
-                                    simbolici.\\ 
-    \constd{AT\_SYMLINK\_FOLLOW}& Se impostato la funzione esegue la
-                                  dereferenziazione dei collegamenti simbolici
-                                  (usato esplicitamente solo da
-                                  \func{linkat}).\\ 
-    \constd{AT\_EACCES}         & Usato solo da \func{faccessat}, richiede che
-                                  il controllo dei permessi sia fatto usando
-                                  l'\ids{UID} effettivo invece di quello
-                                  reale.\\
-    \constd{AT\_REMOVEDIR}      & Usato solo da \func{unlinkat}, richiede che
-                                  la funzione si comporti come \func{rmdir}
-                                  invece che come \func{unlink}.\\
-    \hline
-  \end{tabular}  
-  \caption{Le costanti utilizzate per i bit dell'argomento
-    aggiuntivo \param{flags} delle \textit{at-functions}.} 
-  \label{tab:at-functions_constant_values}
-\end{table}
-
-
-\texttt{ATTENZIONE PARTE DA RIVEDERE}
-
-
-Un'ultima differenza fra le \textit{at-functions} e le funzioni tradizionali
-di cui sono estensione è, come accennato in sez.~\ref{sec:file_temp_file},
-quella relativa a \func{utimensat} che non è propriamente una corrispondente
-esatta di \func{utimes} e \func{lutimes}, dato che questa funzione ha una
-maggiore precisione nella indicazione dei tempi dei file, per i quali come per
-\func{futimes}, si devono usare strutture \struct{timespec} che consentono una
-precisione fino al nanosecondo; la funzione è stata introdotta con il kernel
-2.6.22,\footnote{in precedenza, a partire dal kernel 2.6.16, era stata
-  introdotta una \textit{system call} \funcm{futimesat} seguendo una bozza
-  della revisione dello standard poi modificata; questa funzione, sostituita
-  da \func{utimensat}, è stata dichiarata obsoleta, non è supportata da
-  nessuno standard e non deve essere più utilizzata: pertanto non ne
-  parleremo.} ed il suo prototipo è:
+\const{AT\_REMOVEDIR}, essa si comporterà come \func{rmdir}, in tal caso
+\param{pathname} deve essere una directory, che sarà rimossa qualora risulti
+vuota.  Non essendo in questo caso prevista la possibilità di usare altri
+valori (la funzione non segue comunque i collegamenti simbolici e
+\const{AT\_EMPTY\_PATH} non è supportato) anche se \param{flags} è una
+maschera binaria, essendo \const{AT\_REMOVEDIR} l'unico flag disponibile per
+questa funzione, lo si può assegnare direttamente.
+
+Un'altra funzione che usa l'argomento \param{flags} è \func{utimensat}, che
+però non è una corrispondente esatta delle funzioni classiche \func{utimes} e
+\func{lutimes}, in quanto ha una maggiore precisione nella indicazione dei
+tempi dei file, per i quali, come per \func{futimens}, si devono usare
+strutture \struct{timespec} che consentono una precisione fino al nanosecondo;
+la funzione è stata introdotta con il kernel 2.6.22,\footnote{in precedenza, a
+  partire dal kernel 2.6.16, era stata introdotta una \textit{system call}
+  \funcm{futimesat} seguendo una bozza della revisione dello standard poi
+  modificata; questa funzione, sostituita da \func{utimensat}, è stata
+  dichiarata obsoleta, non è supportata da nessuno standard e non deve essere
+  più utilizzata: pertanto non ne parleremo.} ed il suo prototipo è:
 
 \begin{funcproto}{
-\fhead{sys/time.h}
+\fhead{fcntl.h}
+\fhead{sys/stat.h}
 \fdecl{int utimensat(int dirfd, const char *pathname, const struct
-    timespec times[2], int flags)}
+    timespec times[2],\\
+\phantom{int utimensat(}int flags)}
 \fdesc{Cambia i tempi di un file.} 
 }
 
 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
-  caso \var{errno} assumerà uno dei valori: 
+  caso \var{errno} assumerà i valori di \func{utimes}, \func{lutimes} e
+  \func{futimens} con lo stesso significato ed inoltre:
   \begin{errlist}
-  \item[\errcode{EACCES}] si è richiesta l'impostazione del tempo corrente ma
-    non si ha il permesso di scrittura sul file, o non si è proprietari del
-    file o non si hanno i privilegi di amministratore; oppure il file è
-    immutabile (vedi sez.~\ref{sec:file_perm_overview}).
   \item[\errcode{EBADF}] \param{dirfd} non è \const{AT\_FDCWD} o un file
     descriptor valido.
-  \item[\errcode{EFAULT}] \param{times} non è un puntatore valido oppure
-    \param{dirfd} è \const{AT\_FDCWD} ma \param{pathname} è \var{NULL} o non è
-    un puntatore valido.
-  \item[\errcode{EINVAL}] si sono usati dei valori non corretti per i tempi di
-    \param{times}, oppure è si usato un valore non valido per \param{flags},
+  \item[\errcode{EFAULT}] \param{dirfd} è \const{AT\_FDCWD} ma
+    \param{pathname} è \var{NULL} o non è un puntatore valido.
+  \item[\errcode{EINVAL}] si usato un valore non valido per \param{flags},
     oppure \param{pathname} è \var{NULL}, \param{dirfd} non è
     \const{AT\_FDCWD} e \param{flags} contiene \const{AT\_SYMLINK\_NOFOLLOW}.
-  \item[\errcode{EPERM}] si è richiesto un cambiamento nei tempi non al tempo
-    corrente, ma non si è proprietari del file o non si hanno i privilegi di
-    amministratore; oppure il file è immutabile o \textit{append-only} (vedi
-    sez.~\ref{sec:file_perm_overview}).
   \item[\errcode{ESRCH}] non c'è il permesso di attraversamento per una delle
     componenti di \param{pathname}.
   \end{errlist}
-  ed inoltre per entrambe \errval{EROFS} e per \func{utimensat}
-  \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR} nel
-  loro significato generico.}
+}
 \end{funcproto}
 
 La funzione imposta i tempi dei file utilizzando i valori passati nel vettore
-di strutture \struct{timespec} esattamente come \func{futimes} (si veda quanto
-illustrato in sez.~\ref{sec:file_file_times}). 
-
-La funzione supporta invece, rispetto ad \func{utimes} che abbiamo visto in
-sez.~\ref{sec:file_file_times}, una sintassi più complessa che consente una
-indicazione sicura del file su cui operare specificando la directory su cui si
-trova tramite il file descriptor \param{dirfd} ed il suo nome come
-\textit{pathname relativo} in \param{pathname}.\footnote{su Linux solo
-  \func{utimensat} è una \textit{system call} e \func{futimens} è una funzione
-  di libreria, infatti se \param{pathname} è \var{NULL} \param{dirfd} viene
-  considerato un file descriptor ordinario e il cambiamento del tempo
-  applicato al file sottostante, qualunque esso sia, per cui
-  \code{futimens(fd, times}) è del tutto equivalente a \code{utimensat(fd,
-    NULL, times, 0)} ma nella \acr{glibc} questo comportamento è disabilitato
-  seguendo lo standard POSIX, e la funzione ritorna un errore di
-  \errval{EINVAL} se invocata in questo modo.}
-
-Torneremo su questa sintassi e sulla sua motivazione in
-sez.~\ref{sec:file_openat}, quando tratteremo tutte le altre funzioni (le
-cosiddette \textit{at-functions}) che la utilizzano; essa prevede comunque
-anche la presenza dell'argomento \param{flags} con cui attivare flag di
-controllo che modificano il comportamento della funzione, nel caso specifico
-l'unico valore consentito è \const{AT\_SYMLINK\_NOFOLLOW} che indica alla
-funzione di non dereferenziare i collegamenti simbolici, cosa che le permette
-di riprodurre le funzionalità di \func{lutimes}.
-
-
-\texttt{ATTENZIONE PARTE DA RIVEDERE}
+di strutture \struct{timespec} ed ha in questo lo stesso comportamento di
+\func{futimens}, vista in sez.~\ref{sec:file_file_times}, ma al contrario di
+questa può essere applicata anche direttamente ad un file come \func{utimes};
+l'unico valore consentito per \param{flags} è \const{AT\_SYMLINK\_NOFOLLOW}
+che indica alla funzione di non dereferenziare i collegamenti simbolici, cosa
+che le permette di riprodurre anche le funzionalità di \func{lutimes} (con una
+precisione dei tempi maggiore).
+
+Su Linux solo \func{utimensat} è una \textit{system call} mentre
+\func{futimens} è una funzione di libreria, infatti \func{utimensat} ha un
+comportamento speciale se \param{pathname} è \var{NULL}, in tal caso
+\param{dirfd} viene considerato un file descriptor ordinario e il cambiamento
+del tempo viene applicato al file sottostante, qualunque esso sia. Viene cioè
+sempre usato il comportamento che per altre funzioni deve essere attivato con
+\const{AT\_EMPTY\_PATH} (che non è previsto per questa funzione) per cui
+\code{futimens(fd, times}) è del tutto equivalente a \code{utimensat(fd, NULL,
+  times, 0)}. Si tenga presente che nella \acr{glibc} questo comportamento è
+disabilitato, e la funzione, seguendo lo standard POSIX, ritorna un errore di
+\errval{EINVAL} se invocata in questo modo.
+
+Come analoga delle funzioni \func{stat}, \func{fstat} e \func{lstat} si può
+utilizzare invece \funcd{fstatat}, il cui prototipo è:
 
+\begin{funcproto}{
+\fhead{fcntl.h}
+\fhead{sys/stat.h}
+\fdecl{int fstatat(int dirfd, const char *pathname, struct stat *statbuf, int
+  flags)} 
+\fdesc{Rimuove una voce da una directory.} 
+}
+
+{La funzione ritorna gli stessi valori e gli stessi codici di errore di
+  \func{stat}, \func{fstat}, o \func{lstat} a seconda del valore di
+  \param{flags}, ed in più:
+  \begin{errlist}
+  \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
+  \item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
+  \item[\errcode{ENOTDIR}] \param{pathname} è un \textit{pathname} relativo,
+    ma \param{dirfd} fa riferimento ad un file.
+  \end{errlist}
+}  
+\end{funcproto}
+
+La funzione ha lo stesso comportamento delle sue equivalenti classiche, l'uso
+di \param{flags} consente di farla comportare come \func{lstat} se si usa
+\const{AT\_SYMLINK\_NOFOLLOW}, o come \func{fstat} se si usa con
+\const{AT\_EMPTY\_PATH} e si passa il file descriptor in \param{dirfd}. Viene
+però supportato l'ulteriore valore \const{AT\_NO\_AUTOMOUNT} che qualora
+\param{pathname} faccia riferimento ad una directory marcata per
+l'\textit{automount} ne evita il montaggio automatico.
+
+                                  
+Ancora diverso è il caso di \funcd{linkat},\footnote{si tenga presente che per
+  questa funzione l'argomento \param{flags} è disponibile ed utilizzabile solo
+  a partire dal kernel 2.6.18.} anche se in questo caso l'utilizzo continua ad
+essere attinente al comportamento con i collegamenti simbolici, il suo
+prototipo è:
+
+\begin{funcproto}{
+\fhead{fcntl.h}
+\fdecl{int linkat(int olddirfd, const char *oldpath, int newdirfd, \\
+\phantom{int linkat(}const char *newpath, int flags)}
+\fdesc{Crea un nuovo collegamento diretto (\textit{hard link}).} 
+}
+
+{La funzione ritorna gli stessi valori e gli stessi codici di errore di
+  \func{link}, ed in più:
+  \begin{errlist}
+  \item[\errcode{EBADF}] \param{olddirfd} o \param{newdirfd} non sono un file
+    descriptor valido.
+  \item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
+  \item[\errcode{ENOTDIR}] \param{oldpath} e \param{newpath} è un
+    \textit{pathname} relativo, ma \param{oldirfd} o \param{newdirfd} fa
+    riferimento ad un file.
+  \end{errlist}
+}  
+\end{funcproto}
+
+In questo caso dato che su Linux il comportamento di \func{link} è quello di
+non seguire mai i collegamenti simbolici, \const{AT\_SYMLINK\_NOFOLLOW} non
+viene utilizzato, mentre si può usare \const{AT\_EMPTY\_PATH} con il
+significato illustrato in precedenza.  A partire dal kernel 2.6.18 è è stato
+inoltre aggiunto per questa funzione la possibilità di usare il valore
+\const{AT\_SYMLINK\_FOLLOW}, che richiede di dereferenziare i collegamenti
+simbolici.
+
+
+
+Un'altra funzione che 
 
-\itindend{at-functions}
+
+
+% TODO trattare fstatat e con essa
+% TODO trattare anche statx, aggiunta con il kernel 4.11 (vedi
+% https://lwn.net/Articles/707602/ e
+% https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a528d35e8bfcc521d7cb70aaf03e1bd296c8493f) 
+
+% TODO manca prototipo di linkat, verificare se metterlo o metter menzione
+% altre modifiche al riguardo nel 3.11 (AT_EMPTY_PATH?) vedi
+% http://lwn.net/Articles/562488/
+
+% TODO: Trattare esempio di inzializzazione di file e successivo collegamento
+% con l'uso di O_TMPFILE e linkat, vedi man open
 
 % TODO: manca prototipo e motivazione di fexecve, da trattare qui in quanto
 % inserita nello stesso standard e da usare con openat, vedi 
 % http://pubs.opengroup.org/onlinepubs/9699939699/toc.pdf
-
+% TODO manca prototipo di execveat, introdotta nel 3.19, vedi
+% https://lwn.net/Articles/626150/ cerca anche fexecve
 % TODO: manca prototipo e motivazione di execveat, vedi
 % http://man7.org/linux/man-pages/man2/execveat.2.html 
 
+% TODO manca prototipo di renameat2, introdotta nel 3.15, vedi
+% http://lwn.net/Articles/569134/ 
+
+
+% TODO: trattare i nuovi AT_flags quando e se arriveranno, vedi
+% https://lwn.net/Articles/767547/ 
+
+
+
+\itindend{at-functions}
+
+
 \subsection{Le operazioni di controllo}
 \label{sec:file_fcntl_ioctl}
 
@@ -2149,6 +2239,8 @@ un file descriptor, che non riguardano la normale lettura e scrittura di dati,
 ma la gestione sia delle loro proprietà, che di tutta una serie di ulteriori
 funzionalità che il kernel può mettere a disposizione.
 
+% TODO: trattare qui i file seal 
+
 Per le operazioni di manipolazione e di controllo delle varie proprietà e
 caratteristiche di un file descriptor, viene usata la funzione di sistema
 \funcd{fcntl},\footnote{ad esempio si gestiscono con questa funzione varie
@@ -4524,4 +4616,5 @@ con uno dei valori \const{FSETLOCKING\_INTERNAL} o
 % LocalWords:  nell' du vm Documentation Urlich Drepper futimesat times l'I
 %  LocalWords:  futimens fs Tread all'I ll TMPFILE EDQUOT extN Minix UDF XFS
 %  LocalWords:  shmem Btrfs ubifs tmpfile fchmod fchown fsetxattr fchdir PF
-%  LocalWords:  fstatfs sull' SIGTTIN EDESTADDRREQ datagram connect
+%  LocalWords:  fstatfs sull' SIGTTIN EDESTADDRREQ datagram connect seal
+%  LocalWords:  dirty execveat execve scandirat statx