La struttura \struct{stat} usata da queste funzioni è definita nell'header
\file{sys/stat.h} e in generale dipende dall'implementazione; la versione
usata da Linux è mostrata in fig.~\ref{fig:file_stat_struct}, così come
-riportata dalla pagina di manuale di \func{stat} (in realtà la definizione
+riportata dalla pagina di manuale di \func{stat}; in realtà la definizione
effettivamente usata nel kernel dipende dall'architettura e ha altri campi
-riservati per estensioni come tempi più precisi, o per il padding dei campi).
+riservati per estensioni come tempi dei file più precisi (vedi
+sez.~\ref{sec:file_file_times}), o per il padding dei campi.
\begin{figure}[!htb]
\footnotesize
primitivi del sistema (di quelli definiti in
tab.~\ref{tab:intro_primitive_types}, e dichiarati in \file{sys/types.h}).
-% TODO: aggiornare con i cambiamenti ai tempi fatti con il 2.6
-
\subsection{I tipi di file}
\label{sec:file_types}
il filesystem, ma ovviamente in questo modo la cosa è molto più complicata da
realizzare.
+Infine a partire dal kernel 2.6 la risoluzione dei tempi dei file, che nei
+campi di tab.~\ref{tab:file_file_times} è espressa in secondi, è stata
+portata ai nanosecondi per la gran parte dei filesystem. La ulteriore
+informazione può essere acceduta attraverso altri campi; se si sono definite
+le macro \macro{\_BSD\_SOURCE} o \macro{\_SVID\_SOURCE} questi sono
+\var{st\_atim.tv\_nsec}, \var{st\_mtim.tv\_nsec} e \var{st\_ctim.tv\_nsec} se
+queste non sono definite, \var{st\_atimensec}, \var{st\_mtimensec} e
+\var{st\_mtimensec}. Qualora il supporto per questa maggior precisione sia
+assente questi campi aggiuntivi saranno nulli.
+
+%TODO documentare utimes
\section{Il controllo di accesso ai file}
l'uso del \itindex{suid~bit} \textit{suid bit}) che vuole controllare se
l'utente originale ha i permessi per accedere ad un certo file.
-% TODO documentare euidaccess (e eaccess)
+Del tutto analoghe a \func{access} sono le due funzioni \funcd{euidaccess} e
+\funcd{eaccess} che ripetono lo stesso controllo usando però gli
+identificatori del gruppo effettivo, verificando quindi le effettive capacità
+di accesso ad un file. Le funzioni hanno entrambe lo stesso
+prototipo\footnote{in realtà \func{eaccess} è solo un sinonimo di
+ \func{euidaccess} fornita per compatibilità con l'uso di questo nome in
+ altri sistemi.} che è del tutto identico a quello di \func{access}. Prendono
+anche gli stessi valori e restituiscono gli stessi risultati e gli stessi
+codici di errore.
Per cambiare i permessi di un file il sistema mette ad disposizione due
funzioni \funcd{chmod} e \funcd{fchmod}, che operano rispettivamente su un
\begin{table}[htb]
\centering
\footnotesize
- \begin{tabular}{|c|p{10cm}|}
+ \begin{tabular}{|l|p{10cm}|}
\hline
\textbf{Nome} & \textbf{Descrizione} \\
\hline
ACL, \index{SELinux} SELinux, ecc.) al tradizionale meccanismo dei controlli
di accesso di Unix, l'accesso ai loro valori viene regolato in maniera diversa
a seconda sia della loro classe sia di quali, fra le estensioni che li
-utilizzano, sono poste in uso. In particolare, per ciascuna delle classi
+utilizzano, sono poste in uso. In particolare, per ciascuna delle classi
riportate in tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti
casi:
-\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{1.7cm}\desclabelstyle{\nextlinelabel}}
\item[\texttt{security}] L'accesso agli \textit{extended security attributes}
dipende dalle politiche di sicurezza stabilite da loro stessi tramite
l'utilizzo di un sistema di controllo basato sui
controllo che accedono ad informazioni non disponibili ai processi ordinari.
\item[\texttt{user}] L'accesso agli \textit{extended user attributes} è
- regolato dagli ordinari permessi dei file a cui essi fanno riferimento:
- occorre avere il permesso di lettura per leggerli e quello di scrittura per
- scriverli o modificarli. Dato l'uso di questi attributi, si è scelto cioè di
- applicare per il loro accesso gli stessi criteri che si usano per l'accesso
- al contenuto dei file (o delle directory) cui essi fanno riferimento.
-
- Questa scelta vale però soltanto per i file e le directory ordinarie, se
- valesse in generale infatti si avrebbe un serio problema di sicurezza dato
- che esistono diversi oggetti sul filesystem per i quali è normale avere
- avere il permesso di scrittura consentito a tutti gli utenti, come i link
- simbolici, o alcuni file di dispositivo come \texttt{/dev/null}. Se fosse
- possibile usare su di essi gli \textit{extended user attributes} un utente
- qualunque potrebbe inserirvi dati a piacere.\footnote{la cosa è stata notata
- su XFS, dove questo comportamento permetteva, non essendovi limiti sullo
- spazio occupabile dagli \textit{Extended Attributes}, di bloccare il
- sistema riempiendo il disco.}
-
- La semantica del controllo di accesso che abbiamo indicato inoltre non
- avrebbe alcun senso al di fuori di file e directory: i permessi di lettura e
- scrittura per un file di dispositivo attengono alle capacità di accesso al
- dispositivo sottostante,\footnote{motivo per cui si può formattare un disco
- anche se \texttt{/dev} è su un filesystem in sola lettura.} mentre per i
- link simbolici questi vengono semplicemente ignorati: in nessuno dei due
- casi hanno a che fare con il contenuto del file, e nella discussione
- relativa all'uso degli \textit{extended user attributes} nessuno è mai stato
- capace di indicare una qualche forma sensata di utilizzo degli stessi per
- link simbolici o file di dispositivo, e neanche per le fifo o i socket.
-
- Per questo motivo gli \textit{extended user attributes} sono stati
- completamente disabilitati per tutto ciò che non sia un file regolare o una
- directory.\footnote{si può verificare la semantica adottata consultando il
- file \texttt{fs/xattr.c} dei sorgenti del kernel.} Inoltre per le
- directory è stata introdotta una ulteriore restrizione, dovuta di nuovo alla
- presenza ordinaria di permessi di scrittura completi su directory come
- \texttt{/tmp}. Questo è un altro caso particolare, in cui il premesso di
- scrittura viene usato, unito alla presenza dello \itindex{sticky~bit}
- \textit{sticky bit}, per garantire il permesso di creazione di nuovi file.
- Per questo motivo, per evitare eventuali abusi, se una directory ha lo
- \itindex{sticky~bit} \textit{sticky bit} attivo sarà consentito scrivere i
- suoi \textit{extended user attributes} soltanto se si è proprietari della
- stessa, o si hanno i privilegi amministrativi della capability
- \index{capabilities} \const{CAP\_FOWNER}.
+ regolato dai normali permessi dei file: occorre avere il permesso di lettura
+ per leggerli e quello di scrittura per scriverli o modificarli. Dato l'uso
+ di questi attributi si è scelto di applicare al loro accesso gli stessi
+ criteri che si usano per l'accesso al contenuto dei file (o delle directory)
+ cui essi fanno riferimento. Questa scelta vale però soltanto per i file e le
+ directory ordinarie, se valesse in generale infatti si avrebbe un serio
+ problema di sicurezza dato che esistono diversi oggetti sul filesystem per i
+ quali è normale avere avere il permesso di scrittura consentito a tutti gli
+ utenti, come i link simbolici, o alcuni file di dispositivo come
+ \texttt{/dev/null}. Se fosse possibile usare su di essi gli \textit{extended
+ user attributes} un utente qualunque potrebbe inserirvi dati a
+ piacere.\footnote{la cosa è stata notata su XFS, dove questo comportamento
+ permetteva, non essendovi limiti sullo spazio occupabile dagli
+ \textit{Extended Attributes}, di bloccare il sistema riempiendo il disco.}
+
+ La semantica del controllo di accesso indicata inoltre non avrebbe alcun
+ senso al di fuori di file e directory: i permessi di lettura e scrittura per
+ un file di dispositivo attengono alle capacità di accesso al dispositivo
+ sottostante,\footnote{motivo per cui si può formattare un disco anche se
+ \texttt{/dev} è su un filesystem in sola lettura.} mentre per i link
+ simbolici questi vengono semplicemente ignorati: in nessuno dei due casi
+ hanno a che fare con il contenuto del file, e nella discussione relativa
+ all'uso degli \textit{extended user attributes} nessuno è mai stato capace
+ di indicare una qualche forma sensata di utilizzo degli stessi per link
+ simbolici o file di dispositivo, e neanche per le fifo o i socket. Per
+ questo motivo essi sono stati completamente disabilitati per tutto ciò che
+ non sia un file regolare o una directory.\footnote{si può verificare la
+ semantica adottata consultando il file \texttt{fs/xattr.c} dei sorgenti
+ del kernel.} Inoltre per le directory è stata introdotta una ulteriore
+ restrizione, dovuta di nuovo alla presenza ordinaria di permessi di
+ scrittura completi su directory come \texttt{/tmp}. Per questo motivo, per
+ evitare eventuali abusi, se una directory ha lo \itindex{sticky~bit}
+ \textit{sticky bit} attivo sarà consentito scrivere i suoi \textit{extended
+ user attributes} soltanto se si è proprietari della stessa, o si hanno i
+ privilegi amministrativi della capability \index{capabilities}
+ \const{CAP\_FOWNER}.
\end{basedescript}
Le funzioni per la gestione degli attributi estesi, come altre funzioni di
gestione avanzate specifiche di Linux, non fanno parte delle \acr{glibc}, e
sono fornite da una apposita libreria, \texttt{libattr}, che deve essere
installata a parte;\footnote{la versione corrente della libreria è
- \texttt{libattr1}, e nel caso si usi Debian la si può installare con il
- pacchetto omonimo ed il collegato \texttt{libattr1-dev}.} pertanto se un
-programma le utilizza si dovrà indicare esplicitamente l'uso della suddetta
-libreria invocando il compilatore con l'opzione \texttt{-lattr}.
+ \texttt{libattr1}.} pertanto se un programma le utilizza si dovrà indicare
+esplicitamente l'uso della suddetta libreria invocando il compilatore con
+l'opzione \texttt{-lattr}.
Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni,
\funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che consentono
\item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
filesystem o sono disabilitati.
\end{errlist}
- Oltre a questi potranno essere restituiti tutti gli errori di \func{stat},
- ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso
- all'attributo. }
+ e tutti gli errori di \func{stat}, come \errcode{EPERM} se non si hanno i
+ permessi di accesso all'attributo. }
\end{functions}
Le funzioni \func{getxattr} e \func{lgetxattr} prendono come primo argomento
\itindend{Extended~Attributes}
-% TODO trattare gli attributi estesi e le funzioni la documentazione di
-% sistema è nei pacchetti libxattr1-dev e attr
-
-
\subsection{Le \textit{Access Control List}}
\label{sec:file_ACL}
utilizzo.
Una volta che si disponga della ACL desiderata, questa potrà essere impostata
-su un file o una directory. Per far questo sono disponibili due funzioni; la
-prima è \funcd{acl\_set\_file}, il cui prototipo è:
+su un file o una directory. Per impostare una ACL sono disponibili due
+funzioni; la prima è \funcd{acl\_set\_file}, che opera sia su file che su
+directory, ed il cui prototipo è:
\begin{functions}
\headdecl{sys/types.h}
\headdecl{sys/acl.h}
\funcdecl{int acl\_set\_file(const char *path, acl\_type\_t type, acl\_t
acl)}
- Imposta una ACL su un file.
+ Imposta una ACL su un file o una directory.
\bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
errore, nel qual caso \var{errno} assumerà uno dei valori:
}
\end{functions}
-La funzione ...
-
-%TODO: finire
-
-La seconda funzione che consente di impostare una ACL è
-\funcd{acl\_set\_fd}, il cui prototipo è:
+La funzione consente di assegnare la ACL contenuta in \param{acl} al file o
+alla directory indicate dal pathname \param{path}, mentre con \param{type} si
+indica il tipo di ACL utilizzando le constanti di tab.~\ref{tab:acl_type}, ma
+si tenga presente che le ACL di default possono essere solo impostate
+qualora \param{path} indichi una directory. Inoltre perché la funzione abbia
+successo la ACL dovrà essere valida, e contenere tutti le voci necessarie,
+unica eccezione è quella in cui si specifica una ACL vuota per cancellare la
+ACL di default associata a \func{path}.\footnote{questo però è una estensione
+ della implementazione delle ACL di Linux, la bozza di standard POSIX.1e
+ prevedeva l'uso della apposita funzione \funcd{acl\_delete\_def\_file}, che
+ prende come unico argomento il pathname della directory di cui si vuole
+ cancellare l'ACL di default, per i dettagli si ricorra alla pagina di
+ manuale.} La seconda funzione che consente di impostare una ACL è
+\funcd{acl\_set\_fd}, ed il suo prototipo è:
\begin{functions}
\headdecl{sys/types.h}
\headdecl{sys/acl.h}
}
\end{functions}
+La funzione è del tutto è analoga a \funcd{acl\_set\_file} ma opera
+esclusivamente sui file identificati tramite un file descriptor. Non dovendo
+avere a che fare con directory (e con la conseguente possibilità di avere una
+ACL di default) la funzione non necessita che si specifichi il tipo di ACL,
+che sarà sempre di accesso, e prende come unico argomento, a parte il file
+descriptor, la ACL da impostare.
+
Le funzioni viste finora operano a livello di una intera ACL, eseguendo in una
sola volta tutte le operazioni relative a tutte le voci in essa contenuta. In
generale è possibile modificare un singolo valore all'interno di una singola
-voce direttamente con le funzioni previste dallo standardo POSIX.1e. Queste
-funzioni però sono alquanto macchinose da utilizzare per cui è probabilmente
-più semplice operare direttamente sulla rappresentazione testuale. Questo è il
+voce direttamente con le funzioni previste dallo standard POSIX.1e. Queste
+funzioni però sono alquanto macchinose da utilizzare per cui è molto più
+semplice operare direttamente sulla rappresentazione testuale. Questo è il
motivo per non tratteremo nei dettagli dette funzioni, fornendone solo una
descrizione sommaria; chi fosse interessato potrà ricorrere alle pagina di
manuale.
dalla funzione \funcd{acl\_get\_entry} (per una voce esistente) o dalla
funzione \funcd{acl\_create\_entry} per una voce da aggiungere. Nel caso della
prima funzione si potrà poi ripetere la lettura per ottenere i puntatori alle
-singoli voci.
-
-Una volta ottenuti detti puntatori si porà operare sui contenuti delle singole
-voci ...
-
-
-%TODO: finire
+singole voci successive alla prima.
+
+Una volta ottenuti detti puntatori si potrà operare sui contenuti delle singole
+voci; con le funzioni \funcd{acl\_get\_tag\_type}, \funcd{acl\_get\_qualifier},
+\funcd{acl\_get\_permset} si potranno leggere rispettivamente tipo,
+qualificatore e permessi mentre con le corrispondente funzioni
+\funcd{acl\_set\_tag\_type}, \funcd{acl\_set\_qualifier},
+\funcd{acl\_set\_permset} si possono impostare i valori; in entrambi i casi
+vengono utilizzati tipi di dato ad hoc.\footnote{descritti nelle singole
+ pagine di manuale.} Si possono poi copiare i valori di una voce da una ACL
+ad un altra con \funcd{acl\_copy\_entry} o eliminare una voce da una ACL con
+\funcd{acl\_delete\_entry}.
\itindend{Access~Control~List}
-
-% TODO trattare le ACL, la documentazione di sistema è nei pacchetti
-% libacl1-dev e acl
+% la documentazione di sistema è nei pacchetti libacl1-dev e acl
% vedi anche http://www.suse.de/~agruen/acl/linux-acls/online/
% LocalWords: fsetxattr flags XATTR REPLACE listxattr llistxattr flistxattr by
% LocalWords: removexattr lremovexattr fremovexattr attributename lacl acl
% LocalWords: OBJ setfacl len any prefix separator options NUMERIC IDS SMART
-% LocalWords: INDENT major number IDE Documentation makedev fopendir proc
+% LocalWords: INDENT major number IDE Documentation makedev fopendir proc copy
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
+% LocalWords: euidaccess eaccess delete def tag qualifier permset