From 4ee752aa050a142f6a8c35d44a98e704f7fdf6bf Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 3 Sep 2018 22:19:40 +0200 Subject: [PATCH] Spostata utimesat nella sezione delle at-functions --- filedir.tex | 134 +++++++++++++++++++--------------------------------- fileio.tex | 77 +++++++++++++++++++++++++++++- 2 files changed, 123 insertions(+), 88 deletions(-) diff --git a/filedir.tex b/filedir.tex index cdbb7c1..b78f99b 100644 --- a/filedir.tex +++ b/filedir.tex @@ -3893,8 +3893,6 @@ puntatore nullo di nuovo verrà utilizzato il tempo corrente. \end{figure} - - Oltre ad \func{utimes} su Linux sono presenti altre due funzioni per la manipolazione dei tempi dei file,\footnote{le due funzioni non sono definite in nessuno standard, ma sono presenti, oltre che su Linux, anche su BSD; @@ -3936,60 +3934,48 @@ collegamento simbolico; il suo prototipo è: Le due funzioni hanno lo stesso comportamento di \texttt{utimes} e richiedono gli stessi privilegi per poter operare, la differenza è che con \func{futimes} si può indicare il file su cui operare se questo è già aperto facendo -riferimento al suo file descriptor, mentre con \func{lutimes} nel caso in -cui \param{filename} sia un collegamento simbolico saranno modificati i suoi +riferimento al suo file descriptor, mentre con \func{lutimes}, nel caso in cui +\param{filename} sia un collegamento simbolico, saranno modificati i suoi tempi invece di quelli del file a cui esso punta. Nonostante il kernel nelle versioni più recenti supporti, come accennato, risoluzioni dei tempi dei file fino al nanosecondo, le funzioni fin qui esaminate non consentono di impostare valori con questa precisione. Per questo -sono state introdotte due nuove funzioni di sistema, \funcd{futimens} e -\funcd{utimensat}, in grado di eseguire questo compito; i rispettivi prototipi -sono: +sono state introdotte due nuove funzioni di sistema, \func{utimensat} (che +vedremo in sez.~\ref{sec:file_openat} insieme alle altre +\textit{at-functions}), e \funcd{futimens}, il cui prototipo è: \begin{funcproto}{ \fhead{sys/time.h} -\fdecl{futimens(int fd, const struct timespec times[2])} +\fdecl{int futimens(int fd, const struct timespec times[2])} \fdesc{Cambia i tempi di un file già aperto.} -\fdecl{int utimensat(int dirfd, const char *pathname, const struct - timespec times[2], int flags)} -\fdesc{Cambia i tempi di un file.} } -{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual - caso \var{errno} assumerà uno dei valori: +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: \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{fd} non è un file descriptor valido (solo - \func{futimens}), oppure \param{dirfd} non è \const{AT\_FDCWD} o un file - descriptor valido (solo \func{utimensat}). - \item[\errcode{EFAULT}] \param{times} non è un puntatore valido (per - entrambe), oppure \param{dirfd} è \const{AT\_FDCWD} ma \param{pathname} è - \var{NULL} o non è un puntatore valido (solo \func{utimensat}). - \item[\errcode{EINVAL}] si sono usati dei valori non corretti per i tempi - di \param{times} (per entrambe), oppure è 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} - (solo \func{utimensat}). + \item[\errcode{EBADF}] \param{fd} non è un file descriptor valido. + \item[\errcode{EFAULT}] \param{times} non è un puntatore valido. + \item[\errcode{EINVAL}] si sono usati dei valori non corretti per i tempi di + \param{times}. \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} (solo \func{utimensat}) \end{errlist} - ed inoltre per entrambe \errval{EROFS} e per \func{utimensat} - \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR} nel - loro significato generico.} + ed inoltre per entrambe \errval{EROFS} nel suo significato generico.} \end{funcproto} -Entrambe le funzioni utilizzano per indicare i valori dei tempi un -vettore \param{times} di due strutture \struct{timespec}, la cui definizione è -riportata in fig.~\ref{fig:sys_timespec_struct}, che permette di specificare -un valore dei tempi con una precisione fino al nanosecondo. +La funzione è sostanzialmente una estensione di \func{futimes} che consente di +specificare i tempi con precisione maggiore. Per questo per indicare i valori +dei tempi da impostare utilizza un vettore \param{times} di due strutture +\struct{timespec} che permettono di indicare il valore del tempo con una +precisione fino al nanosecondo (se ne è riportata la definizione in +fig.~\ref{fig:sys_timespec_struct}). \begin{figure}[!htb] \footnotesize \centering @@ -4005,48 +3991,23 @@ un valore dei tempi con una precisione fino al nanosecondo. Come per le precedenti funzioni il primo elemento di \param{times} indica il tempo di ultimo accesso ed il secondo quello di ultima modifica, e se si usa il valore \val{NULL} verrà impostato il tempo corrente sia per l'ultimo -accesso che per l'ultima modifica. Nei singoli elementi di \param{times} si -possono inoltre utilizzare due valori speciali per il campo \var{tv\_nsec}: -con \constd{UTIME\_NOW} si richiede l'uso del tempo corrente, mentre con -\constd{UTIME\_OMIT} si richiede di non impostare il tempo. Si può così -aggiornare in maniera specifica soltanto uno fra il tempo di ultimo accesso e -quello di ultima modifica. Quando si usa uno di questi valori speciali per -\var{tv\_nsec} il corrispondente valore di \var{tv\_sec} viene ignorato. - -Queste due funzioni sono una estensione definita nella revisione POSIX.1-2008 -dello standard POSIX, in Linux sono state introdotte a partire dal kernel -2.6.22,\footnote{si tenga presente però che per kernel precedenti il 2.6.26 le - due funzioni sono difettose nel rispetto di alcuni requisiti minori dello - standard e nel controllo della correttezza dei tempi, per i dettagli dei - quali si rimanda alla pagina di manuale.} e supportate dalla \acr{glibc} a -partire dalla versione 2.6.\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.} La prima è sostanzialmente una estensione di -\func{futimes} che consente di specificare i tempi con precisione maggiore, la -seconda supporta invece, rispetto ad \func{utimes}, 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)}.} - -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}. +accesso che per l'ultima modifica. +Nei singoli elementi di \param{times} si possono inoltre utilizzare due valori +speciali per il campo \var{tv\_nsec}: con \constd{UTIME\_NOW} si richiede +l'uso del tempo corrente, mentre con \constd{UTIME\_OMIT} si richiede di non +impostare il tempo. Si può così aggiornare in maniera specifica soltanto uno +fra il tempo di ultimo accesso e quello di ultima modifica. Quando si usa uno +di questi valori speciali per \var{tv\_nsec} il corrispondente valore di +\var{tv\_sec} viene ignorato. +Questa funzione e \func{utimensat} sono una estensione definita nella +revisione POSIX.1-2008 dello standard POSIX; in Linux sono state introdotte a +partire dal kernel 2.6.22, e sono supportate dalla \acr{glibc} a partire dalla +versione 2.6, si tenga presente però che per kernel precedenti il 2.6.26 le +due funzioni sono difettose nel rispetto di alcuni requisiti minori dello +standard e nel controllo della correttezza dei tempi, per i dettagli dei quali +si rimanda alla pagina di manuale. \section{Il controllo di accesso ai file} @@ -4123,8 +4084,8 @@ complesse del meccanismo del controllo di accesso su cui torneremo in seguito (in sez.~\ref{sec:file_special_perm}), lo schema di allocazione dei bit è riportato in fig.~\ref{fig:file_perm_bit}. Come tutte le altre proprietà di un file anche i permessi sono memorizzati nell'\textit{inode}, e come -accennato in sez.~\ref{sec:file_types} essi sono vengono restituiti in una -parte del campo \var{st\_mode} della struttura \struct{stat} (si veda di nuovo +accennato in sez.~\ref{sec:file_types} essi vengono restituiti in una parte +del campo \var{st\_mode} della struttura \struct{stat} (si veda di nuovo fig.~\ref{fig:file_stat_struct}). In genere ci si riferisce ai tre livelli dei privilegi usando le lettere @@ -4450,12 +4411,12 @@ consapevolmente, cancellare i file temporanei creati degli altri utenti. \subsection{Le funzioni per la gestione dei permessi dei file} \label{sec:file_perm_management} -Come visto in sez.~\ref{sec:file_access_control} il controllo di accesso ad un -file viene fatto utilizzando l'\ids{UID} ed il \ids{GID} effettivo del processo; -ci sono casi però in cui si può voler effettuare il controllo con l'\ids{UID} -reale ed il \ids{GID} reale, vale a dire usando i valori di \ids{UID} e -\ids{GID} relativi all'utente che ha lanciato il programma, e che, come -accennato in sez.~\ref{sec:file_special_perm} e spiegato in dettaglio in +Come visto in sez.~\ref{sec:file_perm_overview} il controllo di accesso ad un +file viene fatto utilizzando l'\ids{UID} ed il \ids{GID} effettivo del +processo; ci sono casi però in cui si può voler effettuare il controllo con +l'\ids{UID} reale ed il \ids{GID} reale, vale a dire usando i valori di +\ids{UID} e \ids{GID} relativi all'utente che ha lanciato il programma, e che, +come accennato in sez.~\ref{sec:file_special_perm} e spiegato in dettaglio in sez.~\ref{sec:proc_perms}, non è detto siano uguali a quelli effettivi. Per far questo si può usare la funzione di sistema \funcd{access}, il cui @@ -4763,12 +4724,13 @@ completamente i problemi di accesso da parte di altri utenti dello stesso gruppo, in quanto di default i permessi assegnati al gruppo non sono sufficienti per un accesso in scrittura; in questo caso si deve aver cura di usare prima della creazione dei file un valore per \textit{umask} lasci il -permesso di scrittura.\footnote{in tal caso si può assegnare agli utenti del - gruppo una \textit{umask} di $002$, anche se la soluzione migliore in questo - caso è usare una ACL di default (vedi sez.~\ref{sec:file_ACL}).} +permesso di scrittura per il gruppo.\footnote{in tal caso si può assegnare + agli utenti del gruppo una \textit{umask} di $002$, anche se la soluzione + migliore in questo caso è usare una ACL di default (vedi + sez.~\ref{sec:file_ACL}).} Come avviene nel caso dei permessi esistono anche delle appropriate funzioni -di sistema, \funcd{chown} \funcd{fchown} e \funcd{lchown}, che permettono di +di sistema, \funcd{chown}, \funcd{fchown} e \funcd{lchown}, che permettono di cambiare sia l'utente che il gruppo a cui un file appartiene; i rispettivi prototipi sono: @@ -4781,7 +4743,7 @@ prototipi sono: \fdesc{Cambiano proprietario e gruppo proprietario di un file.} } -{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual +{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EPERM}] l'\ids{UID} effettivo non corrisponde a quello del diff --git a/fileio.tex b/fileio.tex index 4b364ec..0a66a9b 100644 --- a/fileio.tex +++ b/fileio.tex @@ -1863,15 +1863,88 @@ costanti utilizzabili per i valori di \param{flags}. \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. +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} +\fdecl{int utimensat(int dirfd, const char *pathname, const struct + timespec times[2], 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: + \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}, + 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} -% NOTA: manca prototipo di utimensat, per ora si lascia una menzione \itindend{at-functions} -- 2.30.2