Riposizionamento degli argomenti ed ancora sulle at-functions
[gapil.git] / fileio.tex
index e6a904f1cced90f6b42c354db6b11b22f053b0fe..7c2a1718c0e212292330ed6a27236aed83b28684 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});
@@ -1740,19 +1740,18 @@ successiva apertura.
 
 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
-cambiamento di directory di lavoro effettuato all'interno di un \textit{thread}
-verrà applicato a tutti gli altri. 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 di lavoro 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 in maniera generica ``\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
+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
@@ -1821,15 +1820,14 @@ esame la nuova funzione di sistema \funcd{openat}, il cui prototipo è:
 
 Il comportamento di \func{openat} è del tutto analogo a quello di \func{open},
 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
+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 costante, 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.
+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
@@ -1837,8 +1835,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
@@ -1850,20 +1848,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{fstatat}   &$\bullet$&\func{stat},\func{lstat}  \\
      \funcm{futimesat}& --      & obsoleta  \\
-     \func{linkat}    &$\bullet$\footnotemark&\func{link}    \\
+     \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{renameat2}& --      &\func{rename}  \\
+     \func{renameat}  & --      &\func{rename}  \\
+     \func{renameat2}\footnotemark& -- &\func{rename}  \\
      \funcm{scandirat}& --      &\func{scandir}  \\
-     \funcm{statx}    &$\bullet$&\func{stat}  \\
+     \func{statx}     &$\bullet$&\func{stat}  \\
      \funcm{symlinkat}& --      &\func{symlink} \\
      \func{unlinkat}  &$\bullet$&\func{unlink},\func{rmdir}  \\
      \func{utimensat} &$\bullet$&\func{utimes},\func{lutimes}\\
@@ -1874,33 +1872,102 @@ 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}.
-
-Per le funzioni che lo prevedono l'ulteriore argomento \param{flag} è stato
-introdotto per fornire un meccanismo con cui modificarne il comportamento.  Il
-solo caso generale, valido per tutte, è quello in cui si sta operando su un
-collegamento simbolico, e si vuole poter scegliere se far agire la funzione
-direttamente sullo stesso o sul file da esso referenziato. Ma oltre a questo
-caso generico, l'argomento viene usato per controllare ulteriori
-caratteristiche di funzionamento, dipendenti dalla funzione stessa, per cui
-deve essere comunque passato come maschera binaria ed impostato usando i
-valori delle appropriate costanti \texttt{AT\_*}, definite in
-\headfile{fcntl.h}.
-
-%% Verificare uso generico di AT_EMPTY_XX
-
-Come esempio delle funzioni che lo utilizzano solo nel caso generico possiamo
+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}. Quando invece l'argomento è presente il
+comportamento viene modificato a seconda del valore assegnato a \param{flags},
+che 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.
+
+\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}
+
+\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 \func{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}.
+
+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}.
+
+Come esempio di funzione che utilizza solo questi due flag generici possiamo
 considerare \funcd{fchownat}, che può essere usata per sostituire sia
 \func{chown} che \func{lchown}; il suo prototipo è:
 
@@ -1923,17 +1990,14 @@ considerare \funcd{fchownat}, che può essere usata per sostituire sia
 }  
 \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
+In questo caso se si è impostato \const{AT\_SYMLINK\_NOFOLLOW} 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}.
+come \func{chown}. 
 
-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 è:
+Un'altra funzione che utilizza l'argomento \param{flags}, usandolo per
+indicare altro rispetto alla possibilità di seguire o meno un collegamento
+simbolico, è \funcd{faccessat}, ed il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{unistd.h}
@@ -1952,20 +2016,19 @@ 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, 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 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}
@@ -1988,23 +2051,51 @@ 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\_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.
+
+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 
+
+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
@@ -2012,43 +2103,6 @@ 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\_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\_EMPTY\_PATH}    & Usato da varie funzioni per operare 
-                                  direttamente (specificando una stringa vuota
-                                  per il \texttt{pathname}) sul file descriptor
-                                  \param{dirfd} che in questo caso deve essere
-                                  ottenuto aprendo un file, che
-                                  può non essere una directory, con il flag
-                                  \param{O\_PATH} (vedi 
-                                  sez.~\ref{sec:file_open_close}).\\
-    \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}& Se impostato la funzione esegue la
-                                  dereferenziazione dei collegamenti simbolici
-                                  (usato esplicitamente solo da
-                                  \func{linkat}).\\ 
-    \constd{AT\_SYMLINK\_NOFOLLOW}& Se impostato la funzione non 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}.} 
-  \label{tab:at-functions_constant_values}
-\end{table}
-
 
 
 
@@ -2071,6 +2125,9 @@ costanti utilizzabili per i valori di \param{flags}.
 % https://lwn.net/Articles/626150/ cerca anche fexecve
 
 
+% TODO: trattare i nuovi AT_flags quando e se arriveranno, vedi
+% https://lwn.net/Articles/767547/ 
+
 \texttt{ATTENZIONE PARTE DA RIVEDERE}