\begin{figure}[!htb]
\centering
- \includegraphics[width=12cm]{img/disk_struct}
+ \includegraphics[width=11cm]{img/disk_struct}
\caption{Organizzazione dello spazio su un disco in partizioni e
filesystem.}
\label{fig:file_disk_filesys}
\begin{figure}[!htb]
\centering
- \includegraphics[width=12cm]{img/filesys_struct}
+ \includegraphics[width=11cm]{img/filesys_struct}
\caption{Strutturazione dei dati all'interno di un filesystem.}
\label{fig:file_filesys_detail}
\end{figure}
della serie 2.2.x i 16 più significativi avevano un valore riservato che
doveva essere specificato obbligatoriamente,\footnote{il valore era il
\textit{magic number} \code{0xC0ED}, si può usare la costante
- \const{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags} riservata
+ \constd{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags} riservata
al \textit{magic number}, mentre per specificarlo si può dare un OR
- aritmetico con la costante \const{MS\_MGC\_VAL}.} e si potevano usare solo i
+ aritmetico con la costante \constd{MS\_MGC\_VAL}.} e si potevano usare solo i
16 meno significativi. Oggi invece, con un numero di opzioni superiore, sono
utilizzati tutti e 32 i bit, ma qualora nei 16 più significativi sia presente
detto valore, che non esprime una combinazione valida, esso viene ignorato. Il
\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
\itindbeg{bind~mount}
-\item[\const{MS\_BIND}] Effettua un cosiddetto \textit{bind mount}, in cui è
+\item[\constd{MS\_BIND}] Effettua un cosiddetto \textit{bind mount}, in cui è
possibile montare una directory di un filesystem in un'altra directory,
l'opzione è disponibile a partire dai kernel della serie 2.4. In questo caso
verranno presi in considerazione solo gli argomenti \param{source}, che
\itindend{bind~mount}
-\item[\const{MS\_DIRSYNC}] Richiede che ogni modifica al contenuto di una
+\item[\constd{MS\_DIRSYNC}] Richiede che ogni modifica al contenuto di una
directory venga immediatamente registrata su disco in maniera sincrona
(introdotta a partire dai kernel della serie 2.6). L'opzione si applica a
tutte le directory del filesystem, ma su alcuni filesystem è possibile
operazioni sulle directory non saranno più bufferizzate e si bloccheranno
fino all'arrivo dei dati sul disco prima che un programma possa proseguire.
-\item[\const{MS\_MANDLOCK}] Consente l'uso del \textit{mandatory locking}
+\item[\constd{MS\_MANDLOCK}] Consente l'uso del \textit{mandatory locking}
(vedi sez.~\ref{sec:file_mand_locking}) sui file del filesystem. Per poterlo
utilizzare effettivamente però esso dovrà essere comunque attivato
esplicitamente per i singoli file impostando i permessi come illustrato in
sez.~\ref{sec:file_mand_locking}.
-\item[\const{MS\_MOVE}] Effettua uno del spostamento del \textit{mount point}
+\item[\constd{MS\_MOVE}] Effettua uno del spostamento del \textit{mount point}
di un filesystem. La directory del \textit{mount point} originale deve
essere indicata nell'argomento \param{source}, e la sua nuova posizione
nell'argomento \param{target}. Tutti gli altri argomenti della funzione
sotto \param{source} sarà immediatamente visibile sotto \param{target}. Non
esiste cioè nessun momento in cui il filesystem non risulti montato in una o
nell'altra directory e pertanto è garantito che la risoluzione di
- \itindsub{pathname}{relativo} \textit{pathname} relativi all'interno del
- filesystem non possa fallire.
+ \textit{pathname} relativi all'interno del filesystem non possa fallire.
-\item[\const{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento
+\item[\constd{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento
degli \textit{access time} (vedi sez.~\ref{sec:file_file_times}) per
qualunque tipo di file. Dato che l'aggiornamento degli \textit{access time}
è una funzionalità la cui utilità è spesso irrilevante ma comporta un costo
sviluppo del kernel sono state introdotte altre opzioni che forniscono
soluzioni più appropriate e meno radicali.
-\item[\const{MS\_NODEV}] Viene disabilitato sul filesystem l'accesso ai file
+\item[\constd{MS\_NODEV}] Viene disabilitato sul filesystem l'accesso ai file
di dispositivo eventualmente presenti su di esso. L'opzione viene usata come
misura di precauzione per rendere inutile la presenza di eventuali file di
dispositivo su filesystem che non dovrebbero contenerne.\footnote{si ricordi
dispositivo con permessi ``opportunamente'' ampliati che gli consentirebbero
di accedere anche a risorse cui non dovrebbe.
-\item[\const{MS\_NODIRATIME}] Viene disabilitato sul filesystem
+\item[\constd{MS\_NODIRATIME}] Viene disabilitato sul filesystem
l'aggiornamento degli \textit{access time} (vedi
sez.~\ref{sec:file_file_times}), ma soltanto per le directory. Costituisce
una alternativa per \const{MS\_NOATIME}, che elimina l'informazione per le
directory, che in pratica che non viene mai utilizzata, mantenendola per i
file in cui invece ha un impiego, sia pur limitato.
-\item[\const{MS\_NOEXEC}] Viene disabilitata sul filesystem l'esecuzione di un
+\item[\constd{MS\_NOEXEC}] Viene disabilitata sul filesystem l'esecuzione di un
qualunque file eseguibile eventualmente presente su di esso. L'opzione viene
usata come misura di precauzione per rendere impossibile l'uso di programmi
posti su filesystem che non dovrebbero contenerne.
vuole che gli utenti eseguano solo i programmi forniti
dall'amministratore.}
-\item[\const{MS\_NOSUID}] Viene disabilitato sul filesystem l'effetto dei bit
+\item[\constd{MS\_NOSUID}] Viene disabilitato sul filesystem l'effetto dei bit
dei permessi \acr{suid} e \acr{sgid} (vedi sez.~\ref{sec:file_special_perm})
eventualmente presenti sui file in esso contenuti. L'opzione viene usata
come misura di precauzione per rendere inefficace l'effetto di questi bit
di un altro utente, che gli consentirebbe di eseguirlo per conto di
quest'ultimo.
-\item[\const{MS\_PRIVATE}] Marca un \textit{mount point} come privato. Si
+\item[\constd{MS\_PRIVATE}] Marca un \textit{mount point} come privato. Si
tratta di una delle nuove opzioni (insieme a \const{MS\_SHARED},
\const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti parte
dell'infrastruttura degli \textit{shared subtree} introdotta a partire dal
\const{MS\_BIND}. Si usa questo flag principalmente per revocare gli effetti
delle altre opzioni e riportare il comportamento a quello ordinario.
-\item[\const{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura,
+\item[\constd{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura,
non sarà possibile nessuna modifica ai suoi contenuti. Viene usato tutte le
volte che si deve accedere ai contenuti di un filesystem con la certezza che
questo non venga modificato (ad esempio per ispezionare un filesystem
corrotto). All'avvio di default il kernel monta la radice in questa
modalità.
-\item[\const{MS\_REC}] Applica ricorsivamente a tutti i \textit{mount point}
+\item[\constd{MS\_REC}] Applica ricorsivamente a tutti i \textit{mount point}
presenti al di sotto del \textit{mount point} indicato gli effetti della
opzione degli \textit{shared subtree} associata. Anche questo caso
l'argomento \param{target} deve fare riferimento ad un \textit{mount point}
% TODO trattare l'opzione \texttt{lazytime} introdotta con il kernel 4.0,
% vedi http://lwn.net/Articles/621046/
-\item[\const{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli
+\item[\constd{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli
\textit{access time} sul filesystem soltanto quando questo risulti
antecedente il valore corrente del \textit{modification time} o del
\textit{change time} (per i tempi dei file si veda
l'introduzione di questo comportamento l'uso delle alternative
\const{MS\_NOATIME} e \const{MS\_NODIRATIME} è sostanzialmente inutile.
-\item[\const{MS\_REMOUNT}] Consente di rimontare un filesystem già montato
+\item[\constd{MS\_REMOUNT}] Consente di rimontare un filesystem già montato
cambiandone le opzioni di montaggio in maniera atomica. In questo modo si
possono modificare le opzioni del filesystem anche se questo è in uso. Gli
argomenti \param{source} e \param{target} devono essere gli stessi usati per
\itindbeg{shared~subtree}
-\item[\const{MS\_SHARED}] Marca un \textit{mount point} come \textit{shared
+\item[\constd{MS\_SHARED}] Marca un \textit{mount point} come \textit{shared
mount}. Si tratta di una delle nuove opzioni (insieme a
\const{MS\_PRIVATE}, \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti
parte dell'infrastruttura dei cosiddetti \textit{shared subtree} introdotta
\itindend{shared~subtree}
-\item[\const{MS\_SILENT}] Richiede la soppressione di alcuni messaggi di
+\item[\constd{MS\_SILENT}] Richiede la soppressione di alcuni messaggi di
avvertimento nei log del kernel (vedi sez.~\ref{sec:sess_daemon}). L'opzione
è presente a partire dal kernel 2.6.17 e sostituisce, utilizzando un nome
non fuorviante, la precedente \const{MS\_VERBOSE}, introdotta nel kernel
2.6.12, che aveva lo stesso effetto.
-\item[\const{MS\_SLAVE}] Marca un \textit{mount point} come \textit{slave
+\item[\constd{MS\_SLAVE}] Marca un \textit{mount point} come \textit{slave
mount}. Si tratta di una delle nuove opzioni (insieme a
\const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_UNBINDABLE}) facenti
parte dell'infrastruttura degli \textit{shared subtree} introdotta a partire
essi potranno eseguire al loro interno ulteriori montaggi che non saranno
propagati né negli altri né nel \textit{mount point} originale.
-\item[\const{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per
+\item[\constd{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per
cui l'\textit{access time} viene aggiornato ad ogni accesso al
file. L'opzione è disponibile solo a partire dal kernel 2.6.30 quando il
comportamento di default del kernel è diventato quello fornito da
\const{MS\_RELATIME}.
-\item[\const{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona richiedendo che
+\item[\constd{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona richiedendo che
ogni modifica al contenuto del filesystem venga immediatamente registrata su
disco. Lo stesso comportamento può essere ottenuto con il flag
\const{O\_SYNC} di \func{open} (vedi sez.~\ref{sec:file_open_close}).
compromesso in cui questo comportamento avviene solo per le directory, ed ha
quindi una incidenza nettamente minore, si può usare \const{MS\_DIRSYNC}.
-\item[\const{MS\_UNBINDABLE}] Marca un \textit{mount point} come
+\item[\constd{MS\_UNBINDABLE}] Marca un \textit{mount point} come
\textit{unbindable mount}. Si tratta di una delle nuove opzioni (insieme a
\const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_SLAVE}) facenti parte
dell'infrastruttura degli \textit{shared subtree} introdotta a partire dal
Il valore di \param{flags} è una maschera binaria dei flag che controllano le
modalità di smontaggio, che deve essere specificato con un OR aritmetico delle
costanti illustrate in tab.~\ref{tab:umount2_flags}. Specificando
-\const{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è
+\constd{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è
occupato per via di una delle condizioni descritte in precedenza. A seconda
del tipo di filesystem alcune (o tutte) possono essere superate, evitando
l'errore di \errcode{EBUSY}. In tutti i casi prima dello smontaggio viene
\hline
\hline
\const{MNT\_FORCE} & Forza lo smontaggio del filesystem anche se questo è
- occupato (presente dai kernel della serie 2.2).\\
+ occupato (presente dai kernel della serie 2.2).\\
\const{MNT\_DETACH} & Esegue uno smontaggio ``\textsl{pigro}'', in cui si
- blocca l'accesso ma si aspetta che il filesystem si
- liberi (presente dal kernel 2.4.11 e dalla
- \acr{glibc} 2.11).\\
+ blocca l'accesso ma si aspetta che il filesystem si
+ liberi (presente dal kernel 2.4.11 e dalla
+ \acr{glibc} 2.11).\\
\const{MNT\_EXPIRE} & Se non occupato marca un \textit{mount point} come
- ``\textsl{in scadenza}'' in modo che ad una
- successiva chiamata senza utilizzo del filesystem
- questo venga smontato (presente dal
- kernel 2.6.8 e dalla \acr{glibc} 2.11).\\
+ ``\textsl{in scadenza}'' in modo che ad una
+ successiva chiamata senza utilizzo del filesystem
+ questo venga smontato (presente dal
+ kernel 2.6.8 e dalla \acr{glibc} 2.11).\\
\const{UMOUNT\_NOFOLLOW}& Non dereferenzia \param{target} se questo è un
- collegamento simbolico (vedi
- sez.~\ref{sec:link_symlink_rename}) evitando
- problemi di sicurezza (presente dal kernel 2.6.34).\\
+ collegamento simbolico (vedi
+ sez.~\ref{sec:link_symlink_rename}) evitando
+ problemi di sicurezza (presente dal kernel
+ 2.6.34).\\
\hline
\end{tabular}
\caption{Costanti che identificano i bit dell'argomento \param{flags}
\label{tab:umount2_flags}
\end{table}
-Con l'opzione \const{MNT\_DETACH} si richiede invece uno smontaggio
+Con l'opzione \constd{MNT\_DETACH} si richiede invece uno smontaggio
``\textsl{pigro}'' (o \textit{lazy umount}) in cui il filesystem diventa
inaccessibile per i nuovi processi subito dopo la chiamata della funzione, ma
resta accessibile per quelli che lo hanno ancora in uso e non viene smontato
fintanto che resta occupato.
-Con \const{MNT\_EXPIRE}, che non può essere specificato insieme agli altri
+Con \constd{MNT\_EXPIRE}, che non può essere specificato insieme agli altri
due, si marca il \textit{mount point} di un filesystem non occupato come
``\textsl{in scadenza}'', in tal caso \func{umount2} ritorna con un errore di
\errcode{EAGAIN}, mentre in caso di filesystem occupato si sarebbe ricevuto
automaticamente i filesystem che restano inutilizzati per un certo periodo di
tempo.
-Infine il flag \const{UMOUNT\_NOFOLLOW} non dereferenzia \param{target} se
+Infine il flag \constd{UMOUNT\_NOFOLLOW} non dereferenzia \param{target} se
questo è un collegamento simbolico (vedi
sez.~\ref{sec:link_symlink_rename}). Questa è una misura di sicurezza
introdotta per evitare, per quei filesystem per il quale è prevista una
\label{fig:sys_statfs}
\end{figure}
+\conffilebeg{/etc/mtab}
La \acr{glibc} provvede infine una serie di funzioni per la gestione dei due
-file \conffile{/etc/fstab}\footnote{più precisamente \funcm{setfsent},
+file \conffiled{/etc/fstab}\footnote{più precisamente \funcm{setfsent},
\funcm{getfsent}, \funcm{getfsfile}, \funcm{getfsspec}, \funcm{endfsent}.}
ed \conffile{/etc/mtab}\footnote{più precisamente \funcm{setmntent},
\funcm{getmntent},\funcm{getmntent\_r}, \funcm{addmntent},\funcm{endmntent},
disponibile e sempre aggiornata. Per questo motivo tralasceremo la
trattazione, di queste funzioni, rimandando al manuale della \acr{glibc}
\cite{GlibcMan} per la documentazione completa.
+\conffileend{/etc/mtab}
% TODO (bassa priorità) scrivere delle funzioni (getfsent e getmntent &C)
% TODO (bassa priorità) documentare ? swapon e swapoff (man 2 ...)
Per questo motivo il kernel e le librerie prevedono che nella risoluzione di
un \textit{pathname} possano essere seguiti fino ad un certo numero massimo di
collegamenti simbolici, il cui valore limite è specificato dalla costante
-\const{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un
+\constd{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un
errore ed \var{errno} viene impostata al valore \errcode{ELOOP}, che nella
quasi totalità dei casi indica appunto che si è creato un collegamento
simbolico che fa riferimento ad una directory del suo stesso
segnalata dalla definizione di altrettante macro nella forma
\code{\_DIRENT\_HAVE\_D\_XXX} dove \code{XXX} è il nome del relativo
campo. Come si può evincere da fig.~\ref{fig:file_dirent_struct} nel caso di
-Linux sono pertanto definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
-\macro{\_DIRENT\_HAVE\_D\_OFF} e \macro{\_DIRENT\_HAVE\_D\_RECLEN}, mentre non
-è definita la macro \macro{\_DIRENT\_HAVE\_D\_NAMLEN}.
+Linux sono pertanto definite le macro \macrod{\_DIRENT\_HAVE\_D\_TYPE},
+\macrod{\_DIRENT\_HAVE\_D\_OFF} e \macrod{\_DIRENT\_HAVE\_D\_RECLEN}, mentre non
+è definita la macro \macrod{\_DIRENT\_HAVE\_D\_NAMLEN}.
Dato che possono essere presenti campi opzionali e che lo standard
POSIX.1-2001 non specifica una dimensione definita per il nome dei file (che
\vspace{3pt}
\begin{funcbox}{
\fhead{stddef.h}
-\fdecl{size\_t \macro{offsetof}(type, member)}
+\fdecl{size\_t \macrod{offsetof}(type, member)}
\fdesc{Restituisce la posizione del campo \param{member} nella
struttura \param{type}.}
}
\textbf{Valore} & \textbf{Tipo di file} \\
\hline
\hline
- \const{DT\_UNKNOWN} & Tipo sconosciuto.\\
- \const{DT\_REG} & File normale.\\
- \const{DT\_DIR} & Directory.\\
- \const{DT\_LNK} & Collegamento simbolico.\\
- \const{DT\_FIFO} & Fifo.\\
- \const{DT\_SOCK} & Socket.\\
- \const{DT\_CHR} & Dispositivo a caratteri.\\
- \const{DT\_BLK} & Dispositivo a blocchi.\\
+ \constd{DT\_UNKNOWN} & Tipo sconosciuto.\\
+ \constd{DT\_REG} & File normale.\\
+ \constd{DT\_DIR} & Directory.\\
+ \constd{DT\_LNK} & Collegamento simbolico.\\
+ \constd{DT\_FIFO} & Fifo.\\
+ \constd{DT\_SOCK} & Socket.\\
+ \constd{DT\_CHR} & Dispositivo a caratteri.\\
+ \constd{DT\_BLK} & Dispositivo a blocchi.\\
\hline
\end{tabular}
\caption{Costanti che indicano i vari tipi di file nel campo \var{d\_type}
\vspace{3pt}
\begin{funcbox}{
\fhead{dirent.h}
-\fdecl{int \macro{IFTODT}(mode\_t MODE)}
+\fdecl{int \macrod{IFTODT}(mode\_t MODE)}
\fdesc{Converte il tipo di file dal formato di \var{st\_mode} a quello di
\var{d\_type}.}
-\fdecl{mode\_t \macro{DTTOIF}(int DTYPE)}
+\fdecl{mode\_t \macrod{DTTOIF}(int DTYPE)}
\fdesc{Converte il tipo di file dal formato di \var{d\_type} a quello di
\var{st\_mode}.}
}
precisamente nel campo \texttt{pwd} della sotto-struttura
\kstruct{fs\_struct}.} che è chiamata \textsl{directory corrente} o
\textsl{directory di lavoro} (in inglese \textit{current working directory}).
-La directory di lavoro è quella da cui si parte quando un
-\itindsub{pathname}{relativo} \textit{pathname} è espresso in forma relativa,
-dove il ``\textsl{relativa}'' fa riferimento appunto a questa directory.
+La directory di lavoro è quella da cui si parte quando un \textit{pathname} è
+espresso in forma relativa, dove il ``\textsl{relativa}'' fa riferimento
+appunto a questa directory.
Quando un utente effettua il login, questa directory viene impostata alla
\textit{home directory} del suo account. Il comando \cmd{cd} della shell
Le macro sono definite nel file \headfile{sys/sysmacros.h},\footnote{se si usa
la \acr{glibc} dalla versione 2.3.3 queste macro sono degli alias alle
- versioni specifiche di questa libreria, \macro{gnu\_dev\_major},
- \macro{gnu\_dev\_minor} e \macro{gnu\_dev\_makedev} che si possono usare
+ versioni specifiche di questa libreria, \macrod{gnu\_dev\_major},
+ \macrod{gnu\_dev\_minor} e \macrod{gnu\_dev\_makedev} che si possono usare
direttamente, al costo di una minore portabilità.} che viene automaticamente
incluso quando si include \headfile{sys/types.h}. Si possono pertanto ottenere
i valori del \textit{major number} e \textit{minor number} di un dispositivo
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/types.h}
-\fdecl{int \macro{major}(dev\_t dev)}
+\fdecl{int \macrod{major}(dev\_t dev)}
\fdesc{Restituisce il \textit{major number} del dispositivo \param{dev}.}
-\fdecl{int \macro{minor}(dev\_t dev)}
+\fdecl{int \macrod{minor}(dev\_t dev)}
\fdesc{Restituisce il \textit{minor number} del dispositivo \param{dev}.}
}
\end{funcbox}
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/types.h}
-\fdecl{dev\_t \macro{makedev}(int major, int minor)}
+\fdecl{dev\_t \macrod{makedev}(int major, int minor)}
\fdesc{Dati \textit{major number} e \textit{minor number} restituisce
l'identificativo di un dispositivo.}
}
La funzione restituisce il puntatore ad una stringa contente un nome di file
valido e non esistente al momento dell'invocazione. Se si è passato come
argomento \param{string} un puntatore non nullo ad un buffer di caratteri
-questo deve essere di dimensione \const{L\_tmpnam} ed il nome generato vi
+questo deve essere di dimensione \constd{L\_tmpnam} ed il nome generato vi
verrà copiato automaticamente, altrimenti il nome sarà generato in un buffer
statico interno che verrà sovrascritto ad una chiamata successiva. Successive
invocazioni della funzione continueranno a restituire nomi unici fino ad un
-massimo di \const{TMP\_MAX} volte, limite oltre il quale il comportamento è
+massimo di \constd{TMP\_MAX} volte, limite oltre il quale il comportamento è
indefinito. Al nome viene automaticamente aggiunto come prefisso la directory
-specificata dalla costante \const{P\_tmpdir}.\footnote{le costanti
+specificata dalla costante \constd{P\_tmpdir}.\footnote{le costanti
\const{L\_tmpnam}, \const{P\_tmpdir} e \const{TMP\_MAX} sono definite in
\headfile{stdio.h}.}
-Di questa funzione esiste una versione \ rientrante,
-\funcm{tmpnam\_r}, che non fa nulla quando si passa \val{NULL} come argomento.
-Una funzione simile, \funcd{tempnam}, permette di specificare un prefisso per
-il file esplicitamente, il suo prototipo è:
+Di questa funzione esiste una versione rientrante, \funcm{tmpnam\_r}, che non
+fa nulla quando si passa \val{NULL} come argomento. Una funzione simile,
+\funcd{tempnam}, permette di specificare un prefisso per il file
+esplicitamente, il suo prototipo è:
\begin{funcproto}{
\fhead{stdio.h}
\end{funcproto}
La funzione alloca con \code{malloc} la stringa in cui restituisce il nome,
-per cui è sempre \ rientrante, occorre però
-ricordarsi di disallocare con \code{free} il puntatore che restituisce.
-L'argomento \param{pfx} specifica un prefisso di massimo 5 caratteri per il
-nome provvisorio. La funzione assegna come directory per il file temporaneo,
-verificando che esista e sia accessibile, la prima valida fra le seguenti:
+per cui è sempre rientrante, occorre però ricordarsi di disallocare con
+\code{free} il puntatore che restituisce. L'argomento \param{pfx} specifica
+un prefisso di massimo 5 caratteri per il nome provvisorio. La funzione
+assegna come directory per il file temporaneo, verificando che esista e sia
+accessibile, la prima valida fra le seguenti:
\begin{itemize*}
\item la variabile di ambiente \envvar{TMPDIR} (non ha effetto se non è
definita o se il programma chiamante è \acr{suid} o \acr{sgid}, vedi
\textbf{Macro} & \textbf{Tipo del file} \\
\hline
\hline
- \macro{S\_ISREG}\texttt{(m)} & File normale.\\
- \macro{S\_ISDIR}\texttt{(m)} & Directory.\\
- \macro{S\_ISCHR}\texttt{(m)} & Dispositivo a caratteri.\\
- \macro{S\_ISBLK}\texttt{(m)} & Dispositivo a blocchi.\\
- \macro{S\_ISFIFO}\texttt{(m)} & Fifo.\\
- \macro{S\_ISLNK}\texttt{(m)} & Collegamento simbolico.\\
- \macro{S\_ISSOCK}\texttt{(m)} & Socket.\\
+ \macrod{S\_ISREG}\texttt{(m)} & File normale.\\
+ \macrod{S\_ISDIR}\texttt{(m)} & Directory.\\
+ \macrod{S\_ISCHR}\texttt{(m)} & Dispositivo a caratteri.\\
+ \macrod{S\_ISBLK}\texttt{(m)} & Dispositivo a blocchi.\\
+ \macrod{S\_ISFIFO}\texttt{(m)} & Fifo.\\
+ \macrod{S\_ISLNK}\texttt{(m)} & Collegamento simbolico.\\
+ \macrod{S\_ISSOCK}\texttt{(m)} & Socket.\\
\hline
\end{tabular}
\caption{Macro per i tipi di file (definite in \headfile{sys/stat.h}).}
\textbf{Flag} & \textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{S\_IFMT} & 0170000 & Maschera per i bit del tipo di file.\\
- \const{S\_IFSOCK} & 0140000 & Socket.\\
- \const{S\_IFLNK} & 0120000 & Collegamento simbolico.\\
- \const{S\_IFREG} & 0100000 & File regolare.\\
- \const{S\_IFBLK} & 0060000 & Dispositivo a blocchi.\\
- \const{S\_IFDIR} & 0040000 & Directory.\\
- \const{S\_IFCHR} & 0020000 & Dispositivo a caratteri.\\
- \const{S\_IFIFO} & 0010000 & Fifo.\\
+ \constd{S\_IFMT} & 0170000 & Maschera per i bit del tipo di file.\\
+ \constd{S\_IFSOCK} & 0140000 & Socket.\\
+ \constd{S\_IFLNK} & 0120000 & Collegamento simbolico.\\
+ \constd{S\_IFREG} & 0100000 & File regolare.\\
+ \constd{S\_IFBLK} & 0060000 & Dispositivo a blocchi.\\
+ \constd{S\_IFDIR} & 0040000 & Directory.\\
+ \constd{S\_IFCHR} & 0020000 & Dispositivo a caratteri.\\
+ \constd{S\_IFIFO} & 0010000 & Fifo.\\
\hline
- \const{S\_ISUID} & 0004000 & Set user ID (\acr{suid}) bit, vedi
+ \constd{S\_ISUID} & 0004000 & Set user ID (\acr{suid}) bit, vedi
sez.~\ref{sec:file_special_perm}).\\
- \const{S\_ISGID} & 0002000 & Set group ID (\acr{sgid}) bit, vedi
+ \constd{S\_ISGID} & 0002000 & Set group ID (\acr{sgid}) bit, vedi
sez.~\ref{sec:file_special_perm}).\\
- \const{S\_ISVTX} & 0001000 & \acr{Sticky} bit, vedi
+ \constd{S\_ISVTX} & 0001000 & \acr{Sticky} bit, vedi
sez.~\ref{sec:file_special_perm}).\\
\hline
- \const{S\_IRWXU} & 00700 & Maschera per i permessi del proprietario.\\
- \const{S\_IRUSR} & 00400 & Il proprietario ha permesso di lettura.\\
- \const{S\_IWUSR} & 00200 & Il proprietario ha permesso di scrittura.\\
- \const{S\_IXUSR} & 00100 & Il proprietario ha permesso di esecuzione.\\
+ \constd{S\_IRWXU} & 00700 & Maschera per i permessi del proprietario.\\
+ \constd{S\_IRUSR} & 00400 & Il proprietario ha permesso di lettura.\\
+ \constd{S\_IWUSR} & 00200 & Il proprietario ha permesso di scrittura.\\
+ \constd{S\_IXUSR} & 00100 & Il proprietario ha permesso di esecuzione.\\
\hline
- \const{S\_IRWXG} & 00070 & Maschera per i permessi del gruppo.\\
- \const{S\_IRGRP} & 00040 & Il gruppo ha permesso di lettura.\\
- \const{S\_IWGRP} & 00020 & Il gruppo ha permesso di scrittura.\\
- \const{S\_IXGRP} & 00010 & Il gruppo ha permesso di esecuzione.\\
+ \constd{S\_IRWXG} & 00070 & Maschera per i permessi del gruppo.\\
+ \constd{S\_IRGRP} & 00040 & Il gruppo ha permesso di lettura.\\
+ \constd{S\_IWGRP} & 00020 & Il gruppo ha permesso di scrittura.\\
+ \constd{S\_IXGRP} & 00010 & Il gruppo ha permesso di esecuzione.\\
\hline
- \const{S\_IRWXO} & 00007 & Maschera per i permessi di tutti gli altri\\
- \const{S\_IROTH} & 00004 & Gli altri hanno permesso di lettura.\\
- \const{S\_IWOTH} & 00002 & Gli altri hanno permesso di esecuzione.\\
- \const{S\_IXOTH} & 00001 & Gli altri hanno permesso di esecuzione.\\
+ \constd{S\_IRWXO} & 00007 & Maschera per i permessi di tutti gli altri\\
+ \constd{S\_IROTH} & 00004 & Gli altri hanno permesso di lettura.\\
+ \constd{S\_IWOTH} & 00002 & Gli altri hanno permesso di esecuzione.\\
+ \constd{S\_IXOTH} & 00001 & Gli altri hanno permesso di esecuzione.\\
\hline
\end{tabular}
\caption{Costanti per l'identificazione dei vari bit che compongono il campo
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 \const{UTIME\_NOW} si richiede l'uso del tempo corrente, mentre con
-\const{UTIME\_OMIT} si richiede di non impostare il tempo. Si può così
+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.
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 \itindsub{pathname}{relativo} \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)}.}
+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
\textbf{\var{st\_mode}} bit & \textbf{Significato} \\
\hline
\hline
- \const{S\_IRUSR} & \textit{user-read}, l'utente può leggere.\\
- \const{S\_IWUSR} & \textit{user-write}, l'utente può scrivere.\\
- \const{S\_IXUSR} & \textit{user-execute}, l'utente può eseguire.\\
+ \constd{S\_IRUSR} & \textit{user-read}, l'utente può leggere.\\
+ \constd{S\_IWUSR} & \textit{user-write}, l'utente può scrivere.\\
+ \constd{S\_IXUSR} & \textit{user-execute}, l'utente può eseguire.\\
\hline
- \const{S\_IRGRP} & \textit{group-read}, il gruppo può leggere.\\
- \const{S\_IWGRP} & \textit{group-write}, il gruppo può scrivere.\\
- \const{S\_IXGRP} & \textit{group-execute}, il gruppo può eseguire.\\
+ \constd{S\_IRGRP} & \textit{group-read}, il gruppo può leggere.\\
+ \constd{S\_IWGRP} & \textit{group-write}, il gruppo può scrivere.\\
+ \constd{S\_IXGRP} & \textit{group-execute}, il gruppo può eseguire.\\
\hline
- \const{S\_IROTH} & \textit{other-read}, tutti possono leggere.\\
- \const{S\_IWOTH} & \textit{other-write}, tutti possono scrivere.\\
- \const{S\_IXOTH} & \textit{other-execute}, tutti possono eseguire.\\
+ \constd{S\_IROTH} & \textit{other-read}, tutti possono leggere.\\
+ \constd{S\_IWOTH} & \textit{other-write}, tutti possono scrivere.\\
+ \constd{S\_IXOTH} & \textit{other-execute}, tutti possono eseguire.\\
\hline
\end{tabular}
\caption{I bit dei permessi di accesso ai file, come definiti in
\textbf{\param{mode}} & \textbf{Significato} \\
\hline
\hline
- \const{R\_OK} & Verifica il permesso di lettura. \\
- \const{W\_OK} & Verifica il permesso di scrittura. \\
- \const{X\_OK} & Verifica il permesso di esecuzione. \\
- \const{F\_OK} & Verifica l'esistenza del file. \\
+ \constd{R\_OK} & Verifica il permesso di lettura. \\
+ \constd{W\_OK} & Verifica il permesso di scrittura. \\
+ \constd{X\_OK} & Verifica il permesso di esecuzione. \\
+ \constd{F\_OK} & Verifica l'esistenza del file. \\
\hline
\end{tabular}
\caption{Valori possibili per l'argomento \param{mode} della funzione
\textbf{\param{mode}} & \textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{S\_ISUID} & 04000 & Set user ID bit.\\
- \const{S\_ISGID} & 02000 & Set group ID bit.\\
- \const{S\_ISVTX} & 01000 & Sticky bit.\\
+ \constd{S\_ISUID} & 04000 & Set user ID bit.\\
+ \constd{S\_ISGID} & 02000 & Set group ID bit.\\
+ \constd{S\_ISVTX} & 01000 & Sticky bit.\\
\hline
- \const{S\_IRWXU} & 00700 & L'utente ha tutti i permessi.\\
- \const{S\_IRUSR} & 00400 & L'utente ha il permesso di lettura.\\
- \const{S\_IWUSR} & 00200 & L'utente ha il permesso di scrittura.\\
- \const{S\_IXUSR} & 00100 & L'utente ha il permesso di esecuzione.\\
+ \constd{S\_IRWXU} & 00700 & L'utente ha tutti i permessi.\\
+ \constd{S\_IRUSR} & 00400 & L'utente ha il permesso di lettura.\\
+ \constd{S\_IWUSR} & 00200 & L'utente ha il permesso di scrittura.\\
+ \constd{S\_IXUSR} & 00100 & L'utente ha il permesso di esecuzione.\\
\hline
- \const{S\_IRWXG} & 00070 & Il gruppo ha tutti i permessi.\\
- \const{S\_IRGRP} & 00040 & Il gruppo ha il permesso di lettura.\\
- \const{S\_IWGRP} & 00020 & Il gruppo ha il permesso di scrittura.\\
- \const{S\_IXGRP} & 00010 & Il gruppo ha il permesso di esecuzione.\\
+ \constd{S\_IRWXG} & 00070 & Il gruppo ha tutti i permessi.\\
+ \constd{S\_IRGRP} & 00040 & Il gruppo ha il permesso di lettura.\\
+ \constd{S\_IWGRP} & 00020 & Il gruppo ha il permesso di scrittura.\\
+ \constd{S\_IXGRP} & 00010 & Il gruppo ha il permesso di esecuzione.\\
\hline
- \const{S\_IRWXO} & 00007 & Gli altri hanno tutti i permessi.\\
- \const{S\_IROTH} & 00004 & Gli altri hanno il permesso di lettura.\\
- \const{S\_IWOTH} & 00002 & Gli altri hanno il permesso di scrittura.\\
- \const{S\_IXOTH} & 00001 & Gli altri hanno il permesso di esecuzione.\\
+ \constd{S\_IRWXO} & 00007 & Gli altri hanno tutti i permessi.\\
+ \constd{S\_IROTH} & 00004 & Gli altri hanno il permesso di lettura.\\
+ \constd{S\_IWOTH} & 00002 & Gli altri hanno il permesso di scrittura.\\
+ \constd{S\_IXOTH} & 00001 & Gli altri hanno il permesso di esecuzione.\\
\hline
\end{tabular}
\caption{Valori delle costanti usate per indicare i vari bit di
puntato da \param{value}, e la sua dimensione totale (in byte) sarà indicata
dall'argomento \param{size}. Infine l'argomento \param{flag} consente di
controllare le modalità di sovrascrittura dell'attributo esteso, esso può
-prendere due valori: con \const{XATTR\_REPLACE} si richiede che l'attributo
+prendere due valori: con \constd{XATTR\_REPLACE} si richiede che l'attributo
esista, nel qual caso verrà sovrascritto, altrimenti si avrà errore, mentre
-con \const{XATTR\_CREATE} si richiede che l'attributo non esista, nel qual
+con \constd{XATTR\_CREATE} si richiede che l'attributo non esista, nel qual
caso verrà creato, altrimenti si avrà errore ed il valore attuale non sarà
modificato. Utilizzando per \param{flag} un valore nullo l'attributo verrà
modificato se è già presente, o creato se non c'è.
\textbf{Tipo} & \textbf{Descrizione} \\
\hline
\hline
- \const{ACL\_USER\_OBJ} & Voce che contiene i diritti di accesso del
+ \constd{ACL\_USER\_OBJ}& Voce che contiene i diritti di accesso del
proprietario del file.\\
- \const{ACL\_USER} & Voce che contiene i diritti di accesso per
+ \constd{ACL\_USER} & Voce che contiene i diritti di accesso per
l'utente indicato dal rispettivo
qualificatore.\\
- \const{ACL\_GROUP\_OBJ}& Voce che contiene i diritti di accesso del
+ \constd{ACL\_GROUP\_OBJ}&Voce che contiene i diritti di accesso del
gruppo proprietario del file.\\
- \const{ACL\_GROUP} & Voce che contiene i diritti di accesso per
+ \constd{ACL\_GROUP} & Voce che contiene i diritti di accesso per
il gruppo indicato dal rispettivo
qualificatore.\\
- \const{ACL\_MASK} & Voce che contiene la maschera dei massimi
+ \constd{ACL\_MASK} & Voce che contiene la maschera dei massimi
permessi di accesso che possono essere garantiti
da voci del tipo \const{ACL\_USER},
\const{ACL\_GROUP} e \const{ACL\_GROUP\_OBJ}.\\
- \const{ACL\_OTHER} & Voce che contiene i diritti di accesso di chi
+ \constd{ACL\_OTHER} & Voce che contiene i diritti di accesso di chi
non corrisponde a nessuna altra voce dell'ACL.\\
\hline
\end{tabular}
\textbf{Tipo} & \textbf{Descrizione} \\
\hline
\hline
- \const{ACL\_TYPE\_ACCESS} & Indica una ACL di accesso.\\
- \const{ACL\_TYPE\_DEFAULT}& Indica una ACL di default.\\
+ \constd{ACL\_TYPE\_ACCESS} & Indica una ACL di accesso.\\
+ \constd{ACL\_TYPE\_DEFAULT}& Indica una ACL di default.\\
\hline
\end{tabular}
\caption{Le costanti che identificano il tipo di ACL.}
\textbf{Tipo} & \textbf{Descrizione} \\
\hline
\hline
- \const{TEXT\_ABBREVIATE} & Stampa le voci in forma abbreviata.\\
- \const{TEXT\_NUMERIC\_IDS} & non effettua la risoluzione numerica di
+ \constd{TEXT\_ABBREVIATE} & Stampa le voci in forma abbreviata.\\
+ \constd{TEXT\_NUMERIC\_IDS} & non effettua la risoluzione numerica di
\ids{UID} e \ids{GID}.\\
- \const{TEXT\_SOME\_EFFECTIVE}& Per ciascuna voce che contiene permessi che
+ \constd{TEXT\_SOME\_EFFECTIVE}&Per ciascuna voce che contiene permessi che
vengono eliminati dalla \const{ACL\_MASK}
viene generato un commento con i permessi
effettivamente risultanti; il commento è
separato con un tabulatore.\\
- \const{TEXT\_ALL\_EFFECTIVE} & Viene generato un commento con i permessi
+ \constd{TEXT\_ALL\_EFFECTIVE}& Viene generato un commento con i permessi
effettivi per ciascuna voce che contiene
permessi citati nella \const{ACL\_MASK},
anche quando questi non vengono modificati
da essa; il commento è separato con un
tabulatore.\\
- \const{TEXT\_SMART\_INDENT} & Da usare in combinazione con le precedenti
+ \constd{TEXT\_SMART\_INDENT} & Da usare in combinazione con le precedenti
opzioni \const{TEXT\_SOME\_EFFECTIVE} e
\const{TEXT\_ALL\_EFFECTIVE}, aumenta
automaticamente il numero di spaziatori
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/quota.h}
-\fdecl{int \macro{QCMD}(subcmd,type)}
+\fdecl{int \macrod{QCMD}(subcmd,type)}
\fdesc{Imposta il comando \param{subcmd} per il tipo di quote (utente o
gruppo) \param{type}.}
}
\textbf{Comando} & \textbf{Descrizione} \\
\hline
\hline
- \const{Q\_QUOTAON} & Attiva l'applicazione delle quote disco per il
+ \constd{Q\_QUOTAON} & Attiva l'applicazione delle quote disco per il
filesystem indicato da \param{dev}, si deve passare
in \param{addr} il \textit{pathname} al file che
mantiene le quote, che deve esistere, e \param{id}
valori di tab.~\ref{tab:quotactl_id_format};
l'operazione richiede i privilegi di
amministratore.\\
- \const{Q\_QUOTAOFF} & Disattiva l'applicazione delle quote disco per il
+ \constd{Q\_QUOTAOFF}& Disattiva l'applicazione delle quote disco per il
filesystem indicato da \param{dev}, \param{id}
e \param{addr} vengono ignorati; l'operazione
richiede i privilegi di amministratore.\\
- \const{Q\_GETQUOTA} & Legge i limiti ed i valori correnti delle quote nel
+ \constd{Q\_GETQUOTA}& Legge i limiti ed i valori correnti delle quote nel
filesystem indicato da \param{dev} per l'utente o
il gruppo specificato da \param{id}; si devono avere
i privilegi di amministratore per leggere i dati
parte, il risultato viene restituito in una struttura
\struct{dqblk} all'indirizzo indicato
da \param{addr}.\\
- \const{Q\_SETQUOTA} & Imposta i limiti per le quote nel filesystem
+ \constd{Q\_SETQUOTA}& Imposta i limiti per le quote nel filesystem
indicato da \param{dev} per l'utente o il gruppo
specificato da \param{id} secondo i valori ottenuti
dalla struttura \struct{dqblk} puntata
da \param{addr}; l'operazione richiede i privilegi
di amministratore.\\
- \const{Q\_GETINFO} & Legge le informazioni (in sostanza i \textit{grace
+ \constd{Q\_GETINFO} & Legge le informazioni (in sostanza i \textit{grace
time}) delle quote del filesystem indicato
da \param{dev} sulla struttura \struct{dqinfo}
puntata da \param{addr}, \param{id} viene ignorato.\\
- \const{Q\_SETINFO} & Imposta le informazioni delle quote del filesystem
+ \constd{Q\_SETINFO} & Imposta le informazioni delle quote del filesystem
indicato da \param{dev} come ottenuti dalla
struttura \struct{dqinfo} puntata
da \param{addr}, \param{id} viene ignorato;
l'operazione richiede i privilegi di amministratore.\\
- \const{Q\_GETFMT} & Richiede il valore identificativo (quello di
+ \constd{Q\_GETFMT} & Richiede il valore identificativo (quello di
tab.~\ref{tab:quotactl_id_format}) per il formato
delle quote attualmente in uso sul filesystem
indicato da \param{dev}, che sarà memorizzato
sul buffer di 4 byte puntato da \param{addr}.\\
- \const{Q\_SYNC} & Aggiorna la copia su disco dei dati delle quote del
+ \constd{Q\_SYNC} & Aggiorna la copia su disco dei dati delle quote del
filesystem indicato da \param{dev}; in questo
caso \param{dev} può anche essere \val{NULL} nel
qual caso verranno aggiornati i dati per tutti i
filesystem con quote attive, \param{id}
e \param{addr} vengono comunque ignorati.\\
- \const{Q\_GETSTATS} & Ottiene statistiche ed altre informazioni generali
+ \constd{Q\_GETSTATS}& Ottiene statistiche ed altre informazioni generali
relative al sistema delle quote per il filesystem
indicato da \param{dev}, richiede che si
passi come argomento \param{addr} l'indirizzo di una
\textbf{Costante} & \textbf{Descrizione} \\
\hline
\hline
- \const{QIF\_BLIMITS}& Limiti sui blocchi di
- spazio disco (\val{dqb\_bhardlimit} e
- \val{dqb\_bsoftlimit}).\\
- \const{QIF\_SPACE} & Uso corrente
- dello spazio disco (\val{dqb\_curspace}).\\
- \const{QIF\_ILIMITS}& Limiti sugli \textit{inode}
- (\val{dqb\_ihardlimit} e \val{dqb\_isoftlimit}).\\
- \const{QIF\_INODES} & Uso corrente
- degli \textit{inode} (\val{dqb\_curinodes}).\\
- \const{QIF\_BTIME} & Tempo di
- sforamento del \textit{soft limit} sul numero di
- blocchi (\val{dqb\_btime}).\\
- \const{QIF\_ITIME} & Tempo di sforamento del \textit{soft limit} sul
- numero di \textit{inode} (\val{dqb\_itime}).\\
- \const{QIF\_LIMITS} & L'insieme di \const{QIF\_BLIMITS} e
- \const{QIF\_ILIMITS}.\\
- \const{QIF\_USAGE} & L'insieme di \const{QIF\_SPACE} e
- \const{QIF\_INODES}.\\
- \const{QIF\_TIMES} & L'insieme di \const{QIF\_BTIME} e
- \const{QIF\_ITIME}.\\
- \const{QIF\_ALL} & Tutti i precedenti.\\
+ \constd{QIF\_BLIMITS}& Limiti sui blocchi di spazio disco
+ (\val{dqb\_bhardlimit} e \val{dqb\_bsoftlimit}).\\
+ \constd{QIF\_SPACE} & Uso corrente dello spazio disco
+ (\val{dqb\_curspace}).\\
+ \constd{QIF\_ILIMITS}& Limiti sugli \textit{inode}
+ (\val{dqb\_ihardlimit} e \val{dqb\_isoftlimit}).\\
+ \constd{QIF\_INODES} & Uso corrente degli \textit{inode}
+ (\val{dqb\_curinodes}).\\
+ \constd{QIF\_BTIME} & Tempo di sforamento del \textit{soft limit} sul
+ numero di blocchi (\val{dqb\_btime}).\\
+ \constd{QIF\_ITIME} & Tempo di sforamento del \textit{soft limit} sul
+ numero di \textit{inode} (\val{dqb\_itime}).\\
+ \constd{QIF\_LIMITS} & L'insieme di \const{QIF\_BLIMITS} e
+ \const{QIF\_ILIMITS}.\\
+ \constd{QIF\_USAGE} & L'insieme di \const{QIF\_SPACE} e
+ \const{QIF\_INODES}.\\
+ \constd{QIF\_TIMES} & L'insieme di \const{QIF\_BTIME} e
+ \const{QIF\_ITIME}.\\
+ \constd{QIF\_ALL} & Tutti i precedenti.\\
\hline
\end{tabular}
\caption{Costanti per il campo \val{dqb\_valid} di \struct{dqblk}.}
\textbf{Identificatore} & \textbf{Descrizione} \\
\hline
\hline
- \const{QFMT\_VFS\_OLD}& Il vecchio (ed obsoleto) formato delle quote.\\
- \const{QFMT\_VFS\_V0} & La versione 0 usata dal VFS di Linux, supporta
- \ids{UID} e \ids{GID} a 32 bit e limiti fino a
- $2^{42}$ byte e $2^{32}$ file.\\
- \const{QFMT\_VFS\_V1} & La versione 1 usata dal VFS di Linux, supporta
- \ids{UID} e \ids{GID} a 32 bit e limiti fino a
- $2^{64}$ byte e $2^{64}$ file.\\
+ \constd{QFMT\_VFS\_OLD}& Il vecchio (ed obsoleto) formato delle quote.\\
+ \constd{QFMT\_VFS\_V0} & La versione 0 usata dal VFS di Linux, supporta
+ \ids{UID} e \ids{GID} a 32 bit e limiti fino a
+ $2^{42}$ byte e $2^{32}$ file.\\
+ \constd{QFMT\_VFS\_V1} & La versione 1 usata dal VFS di Linux, supporta
+ \ids{UID} e \ids{GID} a 32 bit e limiti fino a
+ $2^{64}$ byte e $2^{64}$ file.\\
\hline
\end{tabular}
\caption{Valori di identificazione del formato delle quote.}
\label{tab:quotactl_id_format}
\end{table}
-
-
Altre due operazioni che necessitano di ulteriori spiegazioni sono
\const{Q\_GETINFO} e \const{Q\_SETINFO}, che consentono di ottenere i dati
relativi alle impostazioni delle altre proprietà delle quote, che al momento
\textbf{Costante} & \textbf{Descrizione} \\
\hline
\hline
- \const{IIF\_BGRACE}& Il \textit{grace period} per i blocchi
+ \constd{IIF\_BGRACE}& Il \textit{grace period} per i blocchi
(\val{dqi\_bgrace}).\\
- \const{IIF\_IGRACE}& Il \textit{grace period} per gli \textit{inode}
+ \constd{IIF\_IGRACE}& Il \textit{grace period} per gli \textit{inode}
(\val{dqi\_igrace}).\\
- \const{IIF\_FLAGS} & I flag delle quote (\val{dqi\_flags}) (inusato ?).\\
- \const{IIF\_ALL} & Tutti i precedenti.\\
+ \constd{IIF\_FLAGS} & I flag delle quote (\val{dqi\_flags}) (inusato ?).\\
+ \constd{IIF\_ALL} & Tutti i precedenti.\\
\hline
\end{tabular}
\caption{Costanti per il campo \val{dqi\_valid} di \struct{dqinfo}.}
\textbf{Flag} & \textbf{Descrizione} \\
\hline
\hline
- \const{SECURE\_KEEP\_CAPS}& Il processo non subisce la cancellazione delle
+ \constd{SECURE\_KEEP\_CAPS}&Il processo non subisce la cancellazione delle
sue \textit{capabilities} quando tutti i suoi
\ids{UID} passano ad un valore non
nullo (regola di compatibilità per il cambio
elenco), sostituisce il precedente uso
dell'operazione \const{PR\_SET\_KEEPCAPS} di
\func{prctl}.\\
- \const{SECURE\_NO\_SETUID\_FIXUP}&Il processo non subisce le modifiche
+ \constd{SECURE\_NO\_SETUID\_FIXUP}&Il processo non subisce le modifiche
delle sue \textit{capabilities} nel passaggio
da nullo a non nullo degli \ids{UID}
dei gruppi \textit{effective} e
\textit{file system} (regole di compatibilità
per il cambio di \ids{UID} nn.~1 e 2 del
precedente elenco).\\
- \const{SECURE\_NOROOT} & Il processo non assume nessuna capacità
+ \constd{SECURE\_NOROOT} & Il processo non assume nessuna capacità
aggiuntiva quando esegue un programma, anche
se ha \ids{UID} nullo o il programma ha
il \acr{suid} bit attivo ed appartiene
corrispondente flag di blocco, identificato da una costante omonima con
l'estensione \texttt{\_LOCKED}, la cui attivazione è irreversibile ed ha
l'effetto di rendere permanente l'impostazione corrente del corrispondente
-flag ordinario; in sostanza con \const{SECURE\_KEEP\_CAPS\_LOCKED} si rende
+flag ordinario; in sostanza con \constd{SECURE\_KEEP\_CAPS\_LOCKED} si rende
non più modificabile \const{SECURE\_KEEP\_CAPS}, ed analogamente avviene con
-\const{SECURE\_NO\_SETUID\_FIXUP\_LOCKED} per
-\const{SECURE\_NO\_SETUID\_FIXUP} e con \const{SECURE\_NOROOT\_LOCKED} per
+\constd{SECURE\_NO\_SETUID\_FIXUP\_LOCKED} per
+\const{SECURE\_NO\_SETUID\_FIXUP} e con \constd{SECURE\_NOROOT\_LOCKED} per
\const{SECURE\_NOROOT}.
Per l'impostazione di questi flag sono state predisposte due specifiche
%
% POSIX-draft defined capabilities.
%
- \const{CAP\_AUDIT\_CONTROL}& Abilitare e disabilitare il
+ \constd{CAP\_AUDIT\_CONTROL}& Abilitare e disabilitare il
controllo dell'auditing (dal kernel 2.6.11).\\
- \const{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
+ \constd{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
auditing del kernel (dal kernel 2.6.11).\\
% TODO verificare questa roba dell'auditing
- \const{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare
+ \constd{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare
la sospensione del sistema (dal kernel 3.5).\\
- \const{CAP\_CHOWN} & Cambiare proprietario e gruppo
+ \constd{CAP\_CHOWN} & Cambiare proprietario e gruppo
proprietario di un file (vedi
sez.~\ref{sec:file_ownership_management}).\\
- \const{CAP\_DAC\_OVERRIDE}& Evitare il controllo dei
- permessi di lettura, scrittura ed esecuzione dei
- file, (vedi sez.~\ref{sec:file_access_control}).\\
- \const{CAP\_DAC\_READ\_SEARCH}& Evitare il controllo dei
+ \constd{CAP\_DAC\_OVERRIDE}& Evitare il controllo dei
+ permessi di lettura, scrittura ed esecuzione dei
+ file, (vedi sez.~\ref{sec:file_access_control}).\\
+ \constd{CAP\_DAC\_READ\_SEARCH}& Evitare il controllo dei
permessi di lettura ed esecuzione per
le directory (vedi
sez.~\ref{sec:file_access_control}).\\
per tutte le operazioni privilegiate non coperte
dalle precedenti \const{CAP\_DAC\_OVERRIDE} e
\const{CAP\_DAC\_READ\_SEARCH}.\\
- \const{CAP\_FSETID} & Evitare la cancellazione automatica dei bit
+ \constd{CAP\_FSETID} & Evitare la cancellazione automatica dei bit
\acr{suid} e \acr{sgid} quando un file
per i quali sono impostati viene modificato da
un processo senza questa capacità e la capacità
quando questo è relativo ad un gruppo cui non si
appartiene (vedi
sez.~\ref{sec:file_perm_management}).\\
- \const{CAP\_KILL} & Mandare segnali a qualunque
+ \constd{CAP\_KILL} & Mandare segnali a qualunque
processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
- \const{CAP\_SETFCAP} & Impostare le \textit{capabilities} di un file
+ \constd{CAP\_SETFCAP} & Impostare le \textit{capabilities} di un file
(dal kernel 2.6.24).\\
- \const{CAP\_SETGID} & Manipolare i group ID dei
+ \constd{CAP\_SETGID} & Manipolare i group ID dei
processi, sia il principale che i supplementari,
(vedi sez.~\ref{sec:proc_setgroups}) che quelli
trasmessi tramite i socket \textit{unix domain}
(vedi sez.~\ref{sec:unix_socket}).\\
- \const{CAP\_SETUID} & Manipolare gli user ID del
+ \constd{CAP\_SETUID} & Manipolare gli user ID del
processo (vedi sez.~\ref{sec:proc_setuid}) e di
trasmettere un user ID arbitrario nel passaggio
delle credenziali coi socket \textit{unix
% Linux specific capabilities
%
\hline
- \const{CAP\_IPC\_LOCK} & Effettuare il \textit{memory locking} con le
+ \constd{CAP\_IPC\_LOCK} & Effettuare il \textit{memory locking} con le
funzioni \func{mlock}, \func{mlockall},
\func{shmctl}, \func{mmap} (vedi
sez.~\ref{sec:proc_mem_lock} e
sez.~\ref{sec:file_memory_map}). \\
% TODO verificare l'interazione con SHM_HUGETLB
- \const{CAP\_IPC\_OWNER} & Evitare il controllo dei permessi
+ \constd{CAP\_IPC\_OWNER}& Evitare il controllo dei permessi
per le operazioni sugli oggetti di
intercomunicazione fra processi (vedi
sez.~\ref{sec:ipc_sysv}).\\
- \const{CAP\_LEASE} & Creare dei \textit{file lease} (vedi
+ \constd{CAP\_LEASE} & Creare dei \textit{file lease} (vedi
sez.~\ref{sec:file_asyncronous_lease})
pur non essendo proprietari del file (dal kernel
2.4).\\
- \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi
- \textit{immutable} e \textit{append-only} (vedi
- sez.~\ref{sec:file_perm_overview}) se
- supportati.\\
- \const{CAP\_MKNOD} & Creare file di dispositivo con \func{mknod} (vedi
+ \constd{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi
+ \textit{immutable} e \textit{append-only} (vedi
+ sez.~\ref{sec:file_perm_overview}) se
+ supportati.\\
+ \constd{CAP\_MAC\_ADMIN}& Amministrare il \textit{Mandatory
+ Access Control} di \textit{Smack} (dal kernel
+ 2.6.25).\\
+ \constd{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory
+ Access Control} di \textit{Smack} (dal kernel
+ 2.6.25).\\
+ \constd{CAP\_MKNOD} & Creare file di dispositivo con \func{mknod} (vedi
sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\
\const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni
privilegiate sulla rete.\\
- \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi
+ \constd{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi
sez.~\ref{sec:TCP_func_bind}).\\
- \const{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
+ \constd{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
\textit{broadcast} e \textit{multicast}.\\
- \const{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e \texttt{PACKET}
+ \constd{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e \texttt{PACKET}
(vedi sez.~\ref{sec:sock_type}).\\
\const{CAP\_SETPCAP} & Effettuare modifiche privilegiate alle
\textit{capabilities}.\\
\const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\
- \const{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi
+ \constd{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi
sez.~\ref{sec:sys_reboot}).\\
- \const{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi
+ \constd{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi
sez.~\ref{sec:file_chroot}).\\
- \const{CAP\_MAC\_ADMIN} & Amministrare il \textit{Mandatory
- Access Control} di \textit{Smack} (dal kernel
- 2.6.25).\\
- \const{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory
- Access Control} di \textit{Smack} (dal kernel
- 2.6.25).\\
- \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\
+ \constd{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\
\const{CAP\_SYS\_NICE} & Modificare le varie priorità dei processi (vedi
sez.~\ref{sec:proc_priority}).\\
- \const{CAP\_SYS\_PACCT} & Usare le funzioni di \textit{accounting} dei
+ \constd{CAP\_SYS\_PACCT}& Usare le funzioni di \textit{accounting} dei
processi (vedi
sez.~\ref{sec:sys_bsd_accounting}).\\
- \const{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
+ \constd{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
\func{ptrace} (vedi
sez.~\ref{sec:process_ptrace}).\\
- \const{CAP\_SYS\_RAWIO} & Operare sulle porte di I/O con \func{ioperm} e
+ \constd{CAP\_SYS\_RAWIO}& Operare sulle porte di I/O con \func{ioperm} e
\func{iopl} (vedi
sez.~\ref{sec:process_io_port}).\\
\const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\
- \const{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi
+ \constd{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi
sez.~\ref{sec:sys_time}).\\
- \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
+ \constd{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
con la funzione \func{vhangup}.\\
- \const{CAP\_SYSLOG} & Gestire il buffer dei messaggi
+ \constd{CAP\_SYSLOG} & Gestire il buffer dei messaggi
del kernel, (vedi sez.~\ref{sec:sess_daemon}),
introdotta dal kernel 2.6.38 come capacità
separata da \const{CAP\_SYS\_ADMIN}.\\
- \const{CAP\_WAKE\_ALARM}& Usare i timer di tipo
+ \constd{CAP\_WAKE\_ALARM}&Usare i timer di tipo
\const{CLOCK\_BOOTTIME\_ALARM} e
\const{CLOCK\_REALTIME\_ALARM}, vedi
sez.~\ref{sec:sig_timer_adv} (dal kernel 3.0).\\
\label{tab:proc_capabilities}
\end{table}
+\constbeg{CAP\_SETPCAP}
Prima di dettagliare il significato della capacità più generiche, conviene
però dedicare un discorso a parte a \const{CAP\_SETPCAP}, il cui significato è
conseguente impossibilità successiva di eseguire programmi con quella
capacità), o di impostare i \textit{securebits} delle \textit{capabilities}.
+\constend{CAP\_SETPCAP}
+\constbeg{CAP\_FOWNER}
+
La prima fra le capacità ``\textsl{ampie}'' che occorre dettagliare
maggiormente è \const{CAP\_FOWNER}, che rimuove le restrizioni poste ad un
processo che non ha la proprietà di un file in un vasto campo di
sez.~\ref{sec:file_open_close} e sez.~\ref{sec:file_fcntl_ioctl}) senza
restrizioni.
+\constend{CAP\_FOWNER}
+\constbeg{CAP\_NET\_ADMIN}
+
Una seconda capacità che copre diverse operazioni, in questo caso riguardanti
la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni
privilegiate dei socket (vedi sez.~\ref{sec:sock_generic_options}), abilitare
configurazione delle interfacce di rete (vedi
sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la tabella di instradamento.
+\constend{CAP\_NET\_ADMIN}
+\constbeg{CAP\_SYS\_ADMIN}
+
Una terza \textit{capability} con vasto campo di applicazione è
\const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e
usare \const{CLONE\_NEWNS} con \func{unshare} e \func{clone}, (vedi
sez.~\ref{sec:process_clone}).
+\constend{CAP\_SYS\_ADMIN}
+\constbeg{CAP\_SYS\_NICE}
+
Originariamente \const{CAP\_SYS\_NICE} riguardava soltanto la capacità di
aumentare le priorità di esecuzione dei processi, come la diminuzione del
valore di \textit{nice} (vedi sez.~\ref{sec:proc_sched_stand}), l'uso delle
arbitrarie nell'accesso a disco (vedi sez.~\ref{sec:io_priority}) e nelle
politiche di allocazione delle pagine di memoria ai nodi di un sistema NUMA.
+\constend{CAP\_SYS\_NICE}
+\constbeg{CAP\_SYS\_RESOURCE}
+
Infine la \textit{capability} \const{CAP\_SYS\_RESOURCE} attiene alla
possibilità di superare i limiti imposti sulle risorse di sistema, come usare
lo spazio disco riservato all'amministratore sui filesystem che lo supportano,
numero di processi, ed i limiti sulle dimensioni dei messaggi delle code del
SysV IPC (vedi sez.~\ref{sec:ipc_sysv_mq}).
+\constend{CAP\_SYS\_RESOURCE}
+
Per la gestione delle \textit{capabilities} il kernel mette a disposizione due
funzioni che permettono rispettivamente di leggere ed impostare i valori dei
tre insiemi illustrati in precedenza. Queste due funzioni di sistema sono
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{CAP\_EFFECTIVE} & Capacità dell'insieme \textsl{effettivo}.\\
- \const{CAP\_PERMITTED} & Capacità dell'insieme \textsl{permesso}.\\
- \const{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\
+ \constd{CAP\_EFFECTIVE} & Capacità dell'insieme \textsl{effettivo}.\\
+ \constd{CAP\_PERMITTED} & Capacità dell'insieme \textsl{permesso}.\\
+ \constd{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\
\hline
\end{tabular}
\caption{Valori possibili per il tipo di dato \type{cap\_flag\_t} che
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/capability.h}
-\fdecl{int \macro{CAP\_DIFFERS}(value, flag)}
+\fdecl{int \macrod{CAP\_DIFFERS}(value, flag)}
\fdesc{Controlla lo stato di eventuali differenze delle \textit{capabilities}
nell'insieme \texttt{flag}.}
}
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{CAP\_CLEAR}& La capacità non è impostata.\\
- \const{CAP\_SET} & La capacità è impostata.\\
+ \constd{CAP\_CLEAR}& La capacità non è impostata.\\
+ \constd{CAP\_SET} & La capacità è impostata.\\
\hline
\end{tabular}
\caption{Valori possibili per il tipo di dato \type{cap\_flag\_value\_t} che
\kstruct{fs\_struct}; vedi fig.~\ref{fig:proc_task_struct}.} che, pur
essendo di norma corrispondente alla radice dell'albero dei file dell'intero
sistema, ha per il processo il significato specifico di directory rispetto
-alla quale vengono risolti i \itindsub{pathname}{assoluto}\textit{pathname}
-assoluti.\footnote{cioè quando un processo chiede la risoluzione di un
- \textit{pathname}, il kernel usa sempre questa directory come punto di
- partenza.} Il fatto che questo valore sia specificato per ogni processo apre
-allora la possibilità di modificare le modalità di risoluzione dei
-\itindsub{pathname}{assoluto} \textit{pathname} assoluti da parte di un
-processo cambiando questa directory, così come si fa coi
-\itindsub{pathname}{relativo} \textit{pathname} relativi cambiando la
-directory di lavoro.
+alla quale vengono risolti i \textit{pathname} assoluti.\footnote{cioè quando
+ un processo chiede la risoluzione di un \textit{pathname}, il kernel usa
+ sempre questa directory come punto di partenza.} Il fatto che questo valore
+sia specificato per ogni processo apre allora la possibilità di modificare le
+modalità di risoluzione dei \textit{pathname} assoluti da parte di un processo
+cambiando questa directory, così come si fa coi \textit{pathname} relativi
+cambiando la directory di lavoro.
Normalmente la directory radice di un processo coincide con la radice generica
dell'albero dei file, che è la directory che viene montata direttamente dal
\end{funcproto}
La funzione imposta la directory radice del processo a quella specificata da
-\param{path} (che ovviamente deve esistere) ed ogni
-\itindsub{pathname}{assoluto} \textit{pathname} assoluto usato dalle funzioni
-chiamate nel processo sarà risolto a partire da essa, rendendo impossibile
-accedere alla parte di albero sovrastante. Si ha così quella che viene
-chiamata una \textit{chroot jail}, in quanto il processo non può più accedere
-a file al di fuori della sezione di albero in cui è stato
+\param{path} (che ovviamente deve esistere) ed ogni \textit{pathname} assoluto
+usato dalle funzioni chiamate nel processo sarà risolto a partire da essa,
+rendendo impossibile accedere alla parte di albero sovrastante. Si ha così
+quella che viene chiamata una \textit{chroot jail}, in quanto il processo non
+può più accedere a file al di fuori della sezione di albero in cui è stato
\textsl{imprigionato}.
Solo un processo con i privilegi di amministratore può usare questa
ad un ramo di albero solo se dopo averla eseguita si cedono i privilegi di
amministratore. Infatti se per un qualunque motivo il processo resta con la
sua directory di lavoro al di fuori dalla \textit{chroot jail}, potrà accedere
-a tutto il resto del filesystem usando \itindsub{pathname}{relativo} dei
-\textit{pathname} relativi, dato che in tal caso è possibile, grazie all'uso
-di ``\texttt{..}'', risalire all'indietro fino alla radice effettiva
-dell'albero dei file.
+a tutto il resto del filesystem usando dei \textit{pathname} relativi, dato
+che in tal caso è possibile, grazie all'uso di ``\texttt{..}'', risalire
+all'indietro fino alla radice effettiva dell'albero dei file.
Potrebbe sembrare che per risolvere il problema sia sufficiente ricordarsi di
eseguire preventivamente anche una \func{chdir} sulla directory su cui si