X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filedir.tex;h=84e702263b54b3da646cf8b8c8d8a69886f443e4;hp=d72b71e8717e7a3b69123560b0c8728dfe0c7f5a;hb=71bd769469078fc921d9646d62b0f9293b6ae47c;hpb=c474f4307db945bc45287edd0ea4c2c29374d0ee diff --git a/filedir.tex b/filedir.tex index d72b71e..84e7022 100644 --- a/filedir.tex +++ b/filedir.tex @@ -1,9 +1,9 @@ %% filedir.tex %% -%% Copyright (C) 2000-2004 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2006 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the -%% Free Software Foundation; with the Invariant Sections being "Prefazione", +%% Free Software Foundation; with the Invariant Sections being "Un preambolo", %% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the %% license is included in the section entitled "GNU Free Documentation %% License". @@ -93,20 +93,20 @@ chiamare questo tipo di associazione un collegamento diretto (o \textit{hard \errval{ENOSPC}, \errval{EIO}.} \end{prototype} -La funzione crea sul pathname \param{newpath} un collegamento diretto al file -indicato da \param{oldpath}. Per quanto detto la creazione di un nuovo -collegamento diretto non copia il contenuto del file, ma si limita a creare -una voce nella directory specificata da \param{newpath} e ad aumentare di uno -il numero di riferimenti al file (riportato nel campo \var{st\_nlink} della -struttura \struct{stat}, vedi sez.~\ref{sec:file_stat}) aggiungendo il nuovo -nome ai precedenti. Si noti che uno stesso file può essere così chiamato con -vari nomi in diverse directory. +La funzione crea sul \itindex{pathname}\textit{pathname} \param{newpath} un +collegamento diretto al file indicato da \param{oldpath}. Per quanto detto la +creazione di un nuovo collegamento diretto non copia il contenuto del file, ma +si limita a creare una voce nella directory specificata da \param{newpath} e +ad aumentare di uno il numero di riferimenti al file (riportato nel campo +\var{st\_nlink} della struttura \struct{stat}, vedi sez.~\ref{sec:file_stat}) +aggiungendo il nuovo nome ai precedenti. Si noti che uno stesso file può +essere così chiamato con vari nomi in diverse directory. Per quanto dicevamo in sez.~\ref{sec:file_filesystem} la creazione di un -collegamento diretto è possibile solo se entrambi i pathname sono nello stesso -filesystem; inoltre il filesystem deve supportare i collegamenti diretti (il -meccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di -Windows). +collegamento diretto è possibile solo se entrambi i +\itindex{pathname}\textit{pathname} sono nello stesso filesystem; inoltre il +filesystem deve supportare i collegamenti diretti (il meccanismo non è +disponibile ad esempio con il filesystem \acr{vfat} di Windows). La funzione inoltre opera sia sui file ordinari che sugli altri oggetti del filesystem, con l'eccezione delle directory. In alcune versioni di Unix solo @@ -155,18 +155,19 @@ suo prototipo La funzione cancella il nome specificato da \param{pathname} nella relativa directory e decrementa il numero di riferimenti nel relativo inode\index{inode}. Nel caso di link simbolico cancella il link simbolico; nel -caso di socket\index{socket}, fifo o file di dispositivo\index{file!di - dispositivo} rimuove il nome, ma come per i file i processi che hanno aperto -uno di questi oggetti possono continuare ad utilizzarlo. +caso di socket\index{socket}, fifo o file di +dispositivo\index{file!di~dispositivo} rimuove il nome, ma come per i file i +processi che hanno aperto uno di questi oggetti possono continuare ad +utilizzarlo. Per cancellare una voce in una directory è necessario avere il permesso di scrittura su di essa, dato che si va a rimuovere una voce dal suo contenuto, e il diritto di esecuzione sulla directory che la contiene (affronteremo in dettaglio l'argomento dei permessi di file e directory in -sez.~\ref{sec:file_access_control}). Se inoltre lo \textit{sticky} bit (vedi -sez.~\ref{sec:file_sticky}) è impostato occorrerà anche essere proprietari del -file o proprietari della directory (o root, per cui nessuna delle restrizioni -è applicata). +sez.~\ref{sec:file_access_control}). Se inoltre lo +\itindex{sticky~bit}\textit{sticky bit} (vedi sez.~\ref{sec:file_sticky}) è +impostato occorrerà anche essere proprietari del file o proprietari della +directory (o root, per cui nessuna delle restrizioni è applicata). Una delle caratteristiche di queste funzioni è che la creazione/rimozione del nome dalla directory e l'incremento/decremento del numero di riferimenti @@ -182,11 +183,11 @@ disco viene rimosso (si ricordi comunque che a questo si aggiunge sempre un'ulteriore condizione,\footnote{come vedremo in cap.~\ref{cha:file_unix_interface} il kernel mantiene anche una tabella dei file aperti nei vari processi, che a sua volta contiene i riferimenti agli - inode ad essi relativi. Prima di procedere alla cancellazione dello spazio - occupato su disco dal contenuto di un file il kernel controlla anche questa - tabella, per verificare che anche in essa non ci sia più nessun riferimento - all'inode in questione.} e cioè che non ci siano processi che abbiano il -suddetto file aperto). + \index{inode} inode ad essi relativi. Prima di procedere alla cancellazione + dello spazio occupato su disco dal contenuto di un file il kernel controlla + anche questa tabella, per verificare che anche in essa non ci sia più nessun + riferimento all'inode in questione.} e cioè che non ci siano processi che +abbiano il suddetto file aperto). Questa proprietà viene spesso usata per essere sicuri di non lasciare file temporanei su disco in caso di crash dei programmi; la tecnica è quella di @@ -255,9 +256,9 @@ nello stesso filesystem) si usa invece la funzione \funcd{rename},\footnote{la \item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di \param{oldpath} o più in generale si è cercato di creare una directory come sotto-directory di se stessa. - \item[\errcode{ENOTDIR}] Uno dei componenti dei pathname non è una directory - o \param{oldpath} è una directory e \param{newpath} esiste e non è una - directory. + \item[\errcode{ENOTDIR}] Uno dei componenti dei + \itindex{pathname}\textit{pathname} non è una directory o \param{oldpath} + è una directory e \param{newpath} esiste e non è una directory. \end{errlist} ed inoltre \errval{EACCES}, \errval{EPERM}, \errval{EMLINK}, \errval{ENOENT}, \errval{ENOMEM}, \errval{EROFS}, \errval{ELOOP} e @@ -306,7 +307,7 @@ riferimento allo stesso file. \label{sec:file_symlink} Come abbiamo visto in sez.~\ref{sec:file_link} la funzione \func{link} crea -riferimenti agli inode\index{inode}, pertanto può funzionare soltanto per file +riferimenti agli \index{inode}inode, pertanto può funzionare soltanto per file che risiedono sullo stesso filesystem e solo per un filesystem di tipo Unix. Inoltre abbiamo visto che in Linux non è consentito eseguire un link diretto ad una directory. @@ -445,9 +446,9 @@ punta di nuovo a \file{/boot}.\footnote{il loop mostrato in fig.~\ref{fig:file_link_loop} è un usato per poter permettere a \cmd{grub} (un bootloader in grado di leggere direttamente da vari filesystem il file da lanciare come sistema operativo) di vedere i file contenuti nella - directory \file{/boot} con lo stesso pathname con cui verrebbero visti dal - sistema operativo, anche se essi si trovano, come accade spesso, su una - partizione separata (che \cmd{grub}, all'avvio, vede come radice).} + directory \file{/boot} con lo stesso \textit{pathname} con cui verrebbero + visti dal sistema operativo, anche se essi si trovano, come accade spesso, + su una partizione separata (che \cmd{grub}, all'avvio, vede come radice).} Questo può causare problemi per tutti quei programmi che effettuano la scansione di una directory senza tener conto dei link simbolici, ad esempio se @@ -456,10 +457,10 @@ directory porterebbe il comando ad esaminare \file{/boot}, \file{/boot/boot}, \file{/boot/boot/boot} e così via. Per questo motivo il kernel e le librerie prevedono che nella risoluzione di -un pathname possano essere seguiti un numero limitato di link simbolici, il -cui valore limite è specificato dalla costante \const{MAXSYMLINKS}. Qualora -questo limite venga superato viene generato un errore ed \var{errno} viene -impostata al valore \errcode{ELOOP}. +un \itindex{pathname}\textit{pathname} possano essere seguiti un numero +limitato di link simbolici, il cui valore limite è specificato dalla costante +\const{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un +errore ed \var{errno} viene impostata al valore \errcode{ELOOP}. Un punto da tenere sempre presente è che, come abbiamo accennato, un link simbolico può fare riferimento anche ad un file che non esiste; ad esempio @@ -484,11 +485,12 @@ ci mostrerebbe invece l'esistenza di \file{temporaneo}. \label{sec:file_dir_creat_rem} Benché in sostanza le directory non siano altro che dei file contenenti -elenchi di nomi ed inode, non è possibile trattarle come file ordinari e -devono essere create direttamente dal kernel attraverso una opportuna system -call.\footnote{questo permette anche, attraverso l'uso del VFS, l'utilizzo di - diversi formati per la gestione dei suddetti elenchi.} La funzione usata -per creare una directory è \funcd{mkdir}, ed il suo prototipo è: +elenchi di nomi ed \index{inode}inode, non è possibile trattarle come file +ordinari e devono essere create direttamente dal kernel attraverso una +opportuna system call.\footnote{questo permette anche, attraverso l'uso del + VFS, l'utilizzo di diversi formati per la gestione dei suddetti elenchi.} +La funzione usata per creare una directory è \funcd{mkdir}, ed il suo +prototipo è: \begin{functions} \headdecl{sys/stat.h} \headdecl{sys/types.h} @@ -520,8 +522,8 @@ per creare una directory La funzione crea una nuova directory vuota, che contiene cioè solo le due voci standard (\file{.} e \file{..}), con il nome indicato dall'argomento -\param{dirname}. Il nome può essere indicato sia come pathname assoluto che -relativo. +\param{dirname}. Il nome può essere indicato sia come +\itindex{pathname}\textit{pathname} assoluto che relativo. I permessi di accesso alla directory (vedi sez.~\ref{sec:file_access_control}) sono specificati da \param{mode}, i cui possibili valori sono riportati in @@ -539,9 +541,9 @@ prototipo errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} \item[\errcode{EPERM}] Il filesystem non supporta la cancellazione di - directory, oppure la directory che contiene \param{dirname} ha lo sticky - bit impostato e l'user-ID effettivo del processo non corrisponde al - proprietario della directory. + directory, oppure la directory che contiene \param{dirname} ha lo + \itindex{sticky~bit} \textit{sticky bit} impostato e l'user-ID effettivo + del processo non corrisponde al proprietario della directory. \item[\errcode{EACCES}] Non c'è il permesso di scrittura per la directory che contiene la directory che si vuole cancellare, o non c'è il permesso di attraversare (esecuzione) una delle directory specificate in @@ -556,7 +558,8 @@ prototipo La funzione cancella la directory \param{dirname}, che deve essere vuota (la directory deve cioè contenere soltanto le due voci standard \file{.} e -\file{..}). Il nome può essere indicato con il pathname assoluto o relativo. +\file{..}). Il nome può essere indicato con il +\itindex{pathname}\textit{pathname} assoluto o relativo. La modalità con cui avviene la cancellazione è analoga a quella di \func{unlink}: fintanto che il numero di link all'inode\index{inode} della @@ -572,10 +575,9 @@ consentir Finora abbiamo parlato esclusivamente di file, directory e link simbolici; in sez.~\ref{sec:file_file_types} abbiamo visto però che il sistema prevede pure -degli altri tipi di file speciali, come i file di dispositivo -\index{file!di dispositivo} -e le fifo (i socket\index{socket} sono un caso a parte, che -vedremo in cap.~\ref{cha:socket_intro}). +degli altri tipi di file speciali, come i file di dispositivo +\index{file!di~dispositivo} e le fifo (i socket\index{socket} sono un caso a +parte, che vedremo in cap.~\ref{cha:socket_intro}). La manipolazione delle caratteristiche di questi file e la loro cancellazione può essere effettuata con le stesse funzioni che operano sui file regolari; ma @@ -584,7 +586,7 @@ di queste funzioni \begin{functions} \headdecl{sys/types.h} \headdecl{sys/stat.h} - \headdecl{fnctl.h} + \headdecl{fcntl.h} \headdecl{unistd.h} \funcdecl{int mknod(const char *pathname, mode\_t mode, dev\_t dev)} @@ -594,7 +596,7 @@ di queste funzioni errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} \item[\errcode{EPERM}] Non si hanno privilegi sufficienti a creare l'inode, o - il filesystem su cui si è cercato di creare \func{pathname} non supporta + il filesystem su cui si è cercato di creare \param{pathname} non supporta l'operazione. \item[\errcode{EINVAL}] Il valore di \param{mode} non indica un file, una fifo o un dispositivo. @@ -613,11 +615,11 @@ permessi sono comunque modificati nella maniera usuale dal valore di \var{umask} (si veda sez.~\ref{sec:file_umask}). Per il tipo di file può essere specificato solo uno fra: \const{S\_IFREG} per -un file regolare (che sarà creato vuoto), \const{S\_IFBLK} per un device a -blocchi, \const{S\_IFCHR} per un device a caratteri e \const{S\_IFIFO} per una -fifo. Un valore diverso comporterà l'errore \errcode{EINVAL}. Qualora si sia -specificato in \param{mode} un file di dispositivo, il valore di \param{dev} -viene usato per indicare a quale dispositivo si fa riferimento. +un file regolare (che sarà creato vuoto), \const{S\_IFBLK} per un dispositivo +a blocchi, \const{S\_IFCHR} per un dispositivo a caratteri e \const{S\_IFIFO} +per una fifo. Un valore diverso comporterà l'errore \errcode{EINVAL}. Qualora +si sia specificato in \param{mode} un file di dispositivo, il valore di +\param{dev} viene usato per indicare a quale dispositivo si fa riferimento. Solo l'amministratore può creare un file di dispositivo o un file regolare usando questa funzione; ma in Linux\footnote{la funzione non è prevista dallo @@ -658,11 +660,12 @@ modificati dal valore di \var{umask}. \label{sec:file_dir_read} Benché le directory alla fine non siano altro che dei file che contengono -delle liste di nomi ed inode, per il ruolo che rivestono nella struttura del -sistema, non possono essere trattate come dei normali file di dati. Ad -esempio, onde evitare inconsistenze all'interno del filesystem, solo il kernel -può scrivere il contenuto di una directory, e non può essere un processo a -inserirvi direttamente delle voci con le usuali funzioni di scrittura. +delle liste di nomi ed \index{inode}inode, per il ruolo che rivestono nella +struttura del sistema, non possono essere trattate come dei normali file di +dati. Ad esempio, onde evitare inconsistenze all'interno del filesystem, solo +il kernel può scrivere il contenuto di una directory, e non può essere un +processo a inserirvi direttamente delle voci con le usuali funzioni di +scrittura. Ma se la scrittura e l'aggiornamento dei dati delle directory è compito del kernel, sono molte le situazioni in cui i processi necessitano di poterne @@ -765,11 +768,11 @@ con i thread; il suo prototipo errore, gli errori sono gli stessi di \func{readdir}.} \end{functions} -La funzione restituisce in \param{result} (come \textit{value result - argument}) l'indirizzo dove sono stati salvati i dati, che di norma -corrisponde a quello della struttura precedentemente allocata e specificata -dall'argomento \param{entry} (anche se non è assicurato che la funzione usi lo -spazio fornito dall'utente). +La funzione restituisce in \param{result} (come +\itindex{value~result~argument}\textit{value result argument}) l'indirizzo +dove sono stati salvati i dati, che di norma corrisponde a quello della +struttura precedentemente allocata e specificata dall'argomento \param{entry} +(anche se non è assicurato che la funzione usi lo spazio fornito dall'utente). I vari campi di \struct{dirent} contengono le informazioni relative alle voci presenti nella directory; sia BSD che SVr4\footnote{POSIX prevede invece solo @@ -781,8 +784,8 @@ terminata da uno zero,\footnote{lo standard POSIX non specifica una lunghezza, ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del campo è definita come \code{NAME\_MAX+1} che di norma porta al valore di 256 byte usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero di -inode cui il file è associato (di solito corrisponde al campo \var{st\_ino} di -\struct{stat}). +\index{inode}inode cui il file è associato (di solito corrisponde al campo +\var{st\_ino} di \struct{stat}). \begin{figure}[!htb] \footnotesize \centering @@ -843,7 +846,7 @@ Il campo \var{d\_off} contiene invece la posizione della voce successiva della directory, mentre il campo \var{d\_reclen} la lunghezza totale della voce letta. Con questi due campi diventa possibile, determinando la posizione delle varie voci, spostarsi all'interno dello stream usando la funzione -\func{seekdir},\footnote{sia questa funzione che \func{telldir}, sono +\funcd{seekdir},\footnote{sia questa funzione che \func{telldir}, sono estensioni prese da BSD, non previste dallo standard POSIX.} il cui prototipo è: \begin{prototype}{dirent.h}{void seekdir(DIR *dir, off\_t offset)} @@ -853,7 +856,7 @@ prototipo La funzione non ritorna nulla e non segnala errori, è però necessario che il valore dell'argomento \param{offset} sia valido per lo stream \param{dir}; esso pertanto deve essere stato ottenuto o dal valore di \var{d\_off} di -\struct{dirent} o dal valore restituito dalla funzione \func{telldir}, che +\struct{dirent} o dal valore restituito dalla funzione \funcd{telldir}, che legge la posizione corrente; il prototipo di quest'ultima è: \begin{prototype}{dirent.h}{off\_t telldir(DIR *dir)} Ritorna la posizione corrente in un \textit{directory stream}. @@ -906,20 +909,27 @@ ed ordinamento) del contenuto di una directory; la funzione Al solito, per la presenza fra gli argomenti di due puntatori a funzione, il prototipo non è molto comprensibile; queste funzioni però sono quelle che -controllano rispettivamente la selezione di una voce (\param{select}) e -l'ordinamento di tutte le voci selezionate (\param{compar}). +controllano rispettivamente la selezione di una voce (quella passata con +l'argomento \param{select}) e l'ordinamento di tutte le voci selezionate +(quella specificata dell'argomento \param{compar}). La funzione legge tutte le voci della directory indicata dall'argomento -\param{dir}, passando ciascuna di esse come argomento alla funzione di -\param{select}; se questa ritorna un valore diverso da zero la voce viene -inserita in una struttura allocata dinamicamente con \func{malloc}, qualora si -specifichi un valore \val{NULL} per \func{select} vengono selezionate tutte le -voci. Tutte le voci selezionate vengono poi inserite un una lista (anch'essa -allocata con \func{malloc}, che viene riordinata tramite \func{qsort} usando -la funzione \param{compar} come criterio di ordinamento; alla fine l'indirizzo -della lista ordinata è restituito nell'argomento \param{namelist}. - -Per l'ordinamento sono disponibili anche due funzioni predefinite, +\param{dir}, passando ciascuna di esse (una struttura \struct{dirent}) come +argomento della funzione di selezione specificata da \param{select}; se questa +ritorna un valore diverso da zero la voce viene inserita in un vettore che +viene allocato dinamicamente con \func{malloc}. Qualora si specifichi un +valore \val{NULL} per \func{select} vengono selezionate tutte le voci. + +Le voci selezionate possono essere riordinate tramite \func{qsort}, le modalità +del riordinamento possono essere personalizzate usando la funzione +\param{compar} come criterio di ordinamento di\func{qsort}, la funzione prende +come argomenti le due strutture \struct{dirent} da confrontare restituendo un +valore positivo, nullo o negativo per indicarne l'ordinamento; alla fine +l'indirizzo della lista delle strutture \struct{dirent} così ordinate viene +restituito nell'argomento \param{namelist}. + +Per l'ordinamento (vale a dire come valori possibili per l'argomento +\param{compar}) sono disponibili anche due funzioni predefinite, \funcd{alphasort} e \funcd{versionsort}, i cui prototipi sono: \begin{functions} \headdecl{dirent.h} @@ -945,12 +955,12 @@ delle varie voci). Le \acr{glibc} prevedono come estensione\footnote{le glibc, a partire dalla versione 2.1, effettuano anche l'ordinamento alfabetico tenendo conto delle varie localizzazioni, usando \func{strcoll} al posto di \func{strcmp}.} anche \func{versionsort}, che ordina i nomi tenendo conto -del numero di versione (cioè qualcosa per cui \file{file10} viene comunque -dopo \func{file4}.) +del numero di versione (cioè qualcosa per cui \texttt{file10} viene comunque +dopo \texttt{file4}.) Un semplice esempio dell'uso di queste funzioni è riportato in fig.~\ref{fig:file_my_ls}, dove si è riportata la sezione principale di un -programma che, usando la routine di scansione illustrata in +programma che, usando la funzione di scansione illustrata in fig.~\ref{fig:file_dirscan}, stampa i nomi dei file contenuti in una directory e la relativa dimensione (in sostanza una versione semplificata del comando \cmd{ls}). @@ -971,7 +981,7 @@ la stampa della sintassi, anch'essa omessa) ma il codice completo potr trovato coi sorgenti allegati nel file \file{myls.c}. In sostanza tutto quello che fa il programma, dopo aver controllato -(\texttt{\small 10--13}) di avere almeno un parametro (che indicherà la +(\texttt{\small 10--13}) di avere almeno un argomento (che indicherà la directory da esaminare) è chiamare (\texttt{\small 14}) la funzione \func{DirScan} per eseguire la scansione, usando la funzione \code{do\_ls} (\texttt{\small 20--26}) per fare tutto il lavoro. @@ -992,7 +1002,7 @@ valore di ritorno per indicare una esecuzione senza errori. \begin{minipage}[c]{15.6cm} \includecodesample{listati/DirScan.c} \end{minipage} - \caption{Codice della routine di scansione di una directory contenuta nel + \caption{Codice della funzione di scansione di una directory contenuta nel file \file{DirScan.c}.} \label{fig:file_dirscan} \end{figure} @@ -1039,11 +1049,14 @@ concluse con successo. \subsection{La directory di lavoro} \label{sec:file_work_dir} +\itindbeg{pathname} + A ciascun processo è associata una directory nel filesystem che è chiamata \textsl{directory corrente} o \textsl{directory di lavoro} (in inglese \textit{current working directory}) che è quella a cui si fa riferimento -quando un pathname è espresso in forma relativa, dove il ``\textsl{relativa}'' -fa riferimento appunto a questa directory. +quando un \itindsub{pathname}{relativo}\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 @@ -1054,10 +1067,11 @@ sez.~\ref{sec:proc_fork}), la directory corrente della shell diventa anche la directory corrente di qualunque comando da essa lanciato. In genere il kernel tiene traccia per ciascun processo dell'inode\index{inode} -della directory di lavoro, per ottenere il pathname occorre usare una apposita -funzione di libreria, \funcd{getcwd}, il cui prototipo è: +della directory di lavoro, per ottenere il \textit{pathname} +occorre usare una apposita funzione di libreria, \funcd{getcwd}, il cui +prototipo è: \begin{prototype}{unistd.h}{char *getcwd(char *buffer, size\_t size)} - Legge il pathname della directory di lavoro corrente. + Legge il \textit{pathname} della directory di lavoro corrente. \bodydesc{La funzione restituisce il puntatore \param{buffer} se riesce, \val{NULL} se fallisce, in quest'ultimo caso la variabile @@ -1066,43 +1080,44 @@ funzione di libreria, \funcd{getcwd}, il cui prototipo \item[\errcode{EINVAL}] L'argomento \param{size} è zero e \param{buffer} non è nullo. \item[\errcode{ERANGE}] L'argomento \param{size} è più piccolo della - lunghezza del pathname. + lunghezza del \textit{pathname}. \item[\errcode{EACCES}] Manca il permesso di lettura o di ricerca su uno dei - componenti del pathname (cioè su una delle directory superiori alla - corrente). + componenti del \textit{pathname} (cioè su una delle directory superiori + alla corrente). \end{errlist}} \end{prototype} -La funzione restituisce il pathname completo della directory di lavoro nella -stringa puntata da \param{buffer}, che deve essere precedentemente allocata, -per una dimensione massima di \param{size}. Il buffer deve essere -sufficientemente lungo da poter contenere il pathname completo più lo zero di -terminazione della stringa. Qualora esso ecceda le dimensioni specificate con -\param{size} la funzione restituisce un errore. +La funzione restituisce il \textit{pathname} completo della directory di +lavoro nella stringa puntata da \param{buffer}, che deve essere +precedentemente allocata, per una dimensione massima di \param{size}. Il +buffer deve essere sufficientemente lungo da poter contenere il +\textit{pathname} completo più lo zero di terminazione della stringa. Qualora +esso ecceda le dimensioni specificate con \param{size} la funzione restituisce +un errore. Si può anche specificare un puntatore nullo come \param{buffer},\footnote{questa è un'estensione allo standard POSIX.1, supportata da Linux.} nel qual caso la stringa sarà allocata automaticamente per una dimensione pari a \param{size} qualora questa sia diversa da zero, o -della lunghezza esatta del pathname altrimenti. In questo caso ci si deve -ricordare di disallocare la stringa una volta cessato il suo utilizzo. +della lunghezza esatta del \textit{pathname} altrimenti. In questo caso ci si +deve ricordare di disallocare la stringa una volta cessato il suo utilizzo. Di questa funzione esiste una versione \code{char *getwd(char *buffer)} fatta per compatibilità all'indietro con BSD, che non consente di specificare la dimensione del buffer; esso deve essere allocato in precedenza ed avere una dimensione superiore a \const{PATH\_MAX} (di solito 256 byte, vedi sez.~\ref{sec:sys_limits}); il problema è che in Linux non esiste una -dimensione superiore per un pathname, per cui non è detto che il buffer sia -sufficiente a contenere il nome del file, e questa è la ragione principale per -cui questa funzione è deprecata. +dimensione superiore per un \textit{pathname}, per cui non è detto che il +buffer sia sufficiente a contenere il nome del file, e questa è la ragione +principale per cui questa funzione è deprecata. Una seconda funzione simile è \code{char *get\_current\_dir\_name(void)} che è sostanzialmente equivalente ad una \code{getcwd(NULL, 0)}, con la sola differenza che essa ritorna il valore della variabile di ambiente \val{PWD}, -che essendo costruita dalla shell può contenere un pathname comprendente anche -dei link simbolici. Usando \func{getcwd} infatti, essendo il pathname ricavato -risalendo all'indietro l'albero della directory, si perderebbe traccia di ogni -passaggio attraverso eventuali link simbolici. +che essendo costruita dalla shell può contenere un \textit{pathname} +comprendente anche dei link simbolici. Usando \func{getcwd} infatti, essendo +il \textit{pathname} ricavato risalendo all'indietro l'albero della directory, +si perderebbe traccia di ogni passaggio attraverso eventuali link simbolici. Per cambiare la directory di lavoro si può usare la funzione \funcd{chdir} (equivalente del comando di shell \cmd{cd}) il cui nome sta appunto per @@ -1124,11 +1139,11 @@ Per cambiare la directory di lavoro si pu quale si hanno i permessi di accesso. Dato che anche le directory sono file, è possibile riferirsi ad esse anche -tramite il file descriptor, e non solo tramite il pathname, per fare questo si -usa \funcd{fchdir}, il cui prototipo è: +tramite il file descriptor, e non solo tramite il \textit{pathname}, per fare +questo si usa \funcd{fchdir}, il cui prototipo è: \begin{prototype}{unistd.h}{int fchdir(int fd)} Identica a \func{chdir}, ma usa il file descriptor \param{fd} invece del - pathname. + \textit{pathname}. \bodydesc{La funzione restituisce zero in caso di successo e -1 per un errore, in caso di errore \var{errno} assumerà i valori \errval{EBADF} o @@ -1140,6 +1155,8 @@ possibile (tutti gli altri sarebbero occorsi all'apertura di \param{fd}), quello in cui il processo non ha il permesso di accesso alla directory specificata da \param{fd}. +\itindend{pathname} + \subsection{I file temporanei} @@ -1150,7 +1167,7 @@ sembri semplice, in realt prima vista. Infatti anche se sembrerebbe banale generare un nome a caso e creare il file dopo aver controllato che questo non esista, nel momento fra il controllo e la creazione si ha giusto lo spazio per una possibile \textit{race - condition}\index{race condition} (si ricordi quanto visto in + condition}\itindex{race~condition} (si ricordi quanto visto in sez.~\ref{sec:proc_race_cond}). Le \acr{glibc} provvedono varie funzioni per generare nomi di file temporanei, @@ -1173,7 +1190,7 @@ massimo di \const{TMP\_MAX} volte. Al nome viene automaticamente aggiunto come prefisso la directory specificata da \const{P\_tmpdir}. Di questa funzione esiste una versione rientrante, \func{tmpnam\_r}, che non -fa nulla quando si passa \val{NULL} come parametro. Una funzione simile, +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{prototype}{stdio.h}{char *tempnam(const char *dir, const char *pfx)} @@ -1193,8 +1210,8 @@ directory per il file temporaneo (verificando che esista e sia accessibili), la prima valida delle seguenti: \begin{itemize*} \item La variabile di ambiente \const{TMPNAME} (non ha effetto se non è - definita o se il programma chiamante è \acr{suid} o \acr{sgid}, vedi - sez.~\ref{sec:file_suid_sgid}). + definita o se il programma chiamante è \itindex{suid~bit} \acr{suid} o + \itindex{sgid~bit} \acr{sgid}, vedi sez.~\ref{sec:file_suid_sgid}). \item il valore dell'argomento \param{dir} (se diverso da \val{NULL}). \item Il valore della costante \const{P\_tmpdir}. \item la directory \file{/tmp}. @@ -1210,7 +1227,7 @@ queste funzioni occorre sempre aprire il nuovo file in modalit esistente. Per evitare di dovere effettuare a mano tutti questi controlli, lo standard -POSIX definisce la funzione \funcd{tempfile}, il cui prototipo è: +POSIX definisce la funzione \funcd{tmpfile}, il cui prototipo è: \begin{prototype}{stdio.h}{FILE *tmpfile (void)} Restituisce un file temporaneo aperto in lettura/scrittura. @@ -1230,13 +1247,13 @@ automaticamente cancellato alla sua chiusura o all'uscita dal programma. Lo standard non specifica in quale directory verrà aperto il file, ma le \acr{glibc} prima tentano con \const{P\_tmpdir} e poi con \file{/tmp}. Questa funzione è rientrante e non soffre di problemi di \textit{race - condition}\index{race condition}. + condition}\itindex{race~condition}. Alcune versioni meno recenti di Unix non supportano queste funzioni; in questo caso si possono usare le vecchie funzioni \funcd{mktemp} e \func{mkstemp} che modificano una stringa di input che serve da modello e che deve essere conclusa da 6 caratteri \code{X} che verranno sostituiti da un codice -unico. La prima delle due è analoga a \funcd{tmpnam} e genera un nome casuale, +unico. La prima delle due è analoga a \func{tmpnam} e genera un nome casuale, il suo prototipo è: \begin{prototype}{stlib.h}{char *mktemp(char *template)} Genera un filename univoco sostituendo le \code{XXXXXX} finali di @@ -1251,7 +1268,7 @@ il suo prototipo \end{prototype} \noindent dato che \param{template} deve poter essere modificata dalla funzione non si può usare una stringa costante. Tutte le avvertenze riguardo -alle possibili \textit{race condition}\index{race condition} date per +alle possibili \textit{race condition}\itindex{race~condition} date per \func{tmpnam} continuano a valere; inoltre in alcune vecchie implementazioni il valore usato per sostituire le \code{XXXXXX} viene formato con il \acr{pid} del processo più una lettera, il che mette a disposizione solo 26 possibilità @@ -1300,12 +1317,12 @@ In OpenBSD più gli altri eventuali codici di errore di \func{mkdir}.} \end{prototype} \noindent la directory è creata con permessi \code{0700} (al solito si veda -cap.~\ref{cha:file_unix_interface} per i dettagli); dato che la creazione della -directory è sempre esclusiva i precedenti problemi di \textit{race - condition}\index{race condition} non si pongono. +cap.~\ref{cha:file_unix_interface} per i dettagli); dato che la creazione +della directory è sempre esclusiva i precedenti problemi di \textit{race + condition}\itindex{race~condition} non si pongono. -\section{La manipolazione delle caratteristiche dei files} +\section{La manipolazione delle caratteristiche dei file} \label{sec:file_infos} Come spiegato in sez.~\ref{sec:file_filesystem} tutte le informazioni generali @@ -1326,7 +1343,7 @@ sez.~\ref{sec:file_access_control}). La lettura delle informazioni relative ai file è fatta attraverso la famiglia delle funzioni \func{stat} (\funcd{stat}, \funcd{fstat} e \funcd{lstat}); questa è la funzione che ad esempio usa il comando \cmd{ls} per poter ottenere -e mostrare tutti i dati dei files. I prototipi di queste funzioni sono i +e mostrare tutti i dati dei file. I prototipi di queste funzioni sono i seguenti: \begin{functions} \headdecl{sys/types.h} @@ -1339,7 +1356,7 @@ seguenti: \funcdecl{int lstat(const char *file\_name, struct stat *buf)} Identica a \func{stat} eccetto che se il \param{file\_name} è un link simbolico vengono - lette le informazioni relativae ad esso e non al file a cui fa riferimento. + lette le informazioni relative ad esso e non al file a cui fa riferimento. \funcdecl{int fstat(int filedes, struct stat *buf)} Identica a \func{stat} eccetto che si usa con un file aperto, specificato tramite il suo file @@ -1441,9 +1458,9 @@ un'opportuna combinazione. \const{S\_IFCHR} & 0020000 & dispositivo a caratteri \\ \const{S\_IFIFO} & 0010000 & fifo \\ \hline - \const{S\_ISUID} & 0004000 & set UID bit \\ - \const{S\_ISGID} & 0002000 & set GID bit \\ - \const{S\_ISVTX} & 0001000 & sticky bit \\ + \const{S\_ISUID} & 0004000 & set UID bit \itindex{suid~bit} \\ + \const{S\_ISGID} & 0002000 & set GID bit \itindex{sgid~bit} \\ + \const{S\_ISVTX} & 0001000 & sticky bit \itindex{sticky~bit}\\ \hline % \const{S\_IRWXU} & 00700 & bitmask per i permessi del proprietario \\ \const{S\_IRUSR} & 00400 & il proprietario ha permesso di lettura \\ @@ -1479,7 +1496,7 @@ poi si effettua il confronto con la combinazione di tipi scelta. Il campo \var{st\_size} contiene la dimensione del file in byte (se si tratta di un file regolare, nel caso di un link simbolico la dimensione è quella del -pathname che contiene, per le fifo è sempre nullo). +\itindex{pathname}\textit{pathname} che contiene, per le fifo è sempre nullo). Il campo \var{st\_blocks} definisce la lunghezza del file in blocchi di 512 byte. Il campo \var{st\_blksize} infine definisce la dimensione preferita per @@ -1530,7 +1547,8 @@ dimensione si possono usare le due funzioni \funcd{truncate} e per \func{truncate} si hanno: \begin{errlist} \item[\errcode{EACCES}] il file non ha permesso di scrittura o non si ha il - permesso di esecuzione una delle directory del pathname. + permesso di esecuzione una delle directory del + \itindex{pathname}\textit{pathname}. \item[\errcode{ETXTBSY}] Il file è un programma in esecuzione. \end{errlist} ed anche \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT}, @@ -1713,7 +1731,7 @@ di \param{times}. Se questa \end{prototype} La funzione prende come argomento \param{times} una struttura -\struct{utimebuf}, la cui definizione è riportata in +\struct{utimbuf}, la cui definizione è riportata in fig.~\ref{fig:struct_utimebuf}, con la quale si possono specificare i nuovi valori che si vogliono impostare per tempi. @@ -1806,13 +1824,14 @@ rispettivamente al proprietario, al gruppo, a tutti gli altri. \centering \includegraphics[width=6cm]{img/fileperm} \caption{Lo schema dei bit utilizzati per specificare i permessi di un file - contenuti nel campo \var{st\_mode} di \struct{fstat}.} + contenuti nel campo \var{st\_mode} di \struct{stat}.} \label{fig:file_perm_bit} \end{figure} -I restanti tre bit (noti come \acr{suid}, \acr{sgid}, e \textsl{sticky}) sono -usati per indicare alcune caratteristiche più complesse del meccanismo del -controllo di accesso su cui torneremo in seguito (in +I restanti tre bit (noti come \itindex{suid~bit}\textit{suid bit}, +\itindex{sgid~bit}\textit{sgid bit}, e \itindex{sticky~bit} \textit{sticky + bit}) sono usati per indicare alcune caratteristiche più complesse del +meccanismo del controllo di accesso su cui torneremo in seguito (in sez.~\ref{sec:file_suid_sgid} e sez.~\ref{sec:file_sticky}); lo schema di allocazione dei bit è riportato in fig.~\ref{fig:file_perm_bit}. @@ -1862,14 +1881,16 @@ che si riferiscano a dei file, dei link simbolici o delle directory; qui ci limiteremo ad un riassunto delle regole generali, entrando nei dettagli più avanti. -La prima regola è che per poter accedere ad un file attraverso il suo pathname -occorre il permesso di esecuzione in ciascuna delle directory che compongono -il pathname; lo stesso vale per aprire un file nella directory corrente (per -la quale appunto serve il diritto di esecuzione). +La prima regola è che per poter accedere ad un file attraverso il suo +\itindex{pathname}\textit{pathname} occorre il permesso di esecuzione in +ciascuna delle directory che compongono il \textit{pathname}; lo stesso vale +per aprire un file nella directory corrente (per la quale appunto serve il +diritto di esecuzione). Per una directory infatti il permesso di esecuzione significa che essa può -essere attraversata nella risoluzione del pathname, ed è distinto dal permesso -di lettura che invece implica che si può leggere il contenuto della directory. +essere attraversata nella risoluzione del \itindex{pathname}\textit{pathname}, +ed è distinto dal permesso di lettura che invece implica che si può leggere il +contenuto della directory. Questo significa che se si ha il permesso di esecuzione senza permesso di lettura si potrà lo stesso aprire un file in una directory (se si hanno i @@ -1901,15 +1922,15 @@ fa riferimento; per questo in genere il comando \cmd{ls} riporta per un link simbolico tutti i permessi come concessi; utente e gruppo a cui esso appartiene vengono pure ignorati quando il link viene risolto, vengono controllati solo quando viene richiesta la rimozione del link e quest'ultimo è -in una directory con lo \textsl{sticky bit} impostato (si veda -sez.~\ref{sec:file_sticky}). +in una directory con lo \itindex{sticky~bit} \textit{sticky bit} impostato (si +veda sez.~\ref{sec:file_sticky}). La procedura con cui il kernel stabilisce se un processo possiede un certo permesso (di lettura, scrittura o esecuzione) si basa sul confronto fra l'utente e il gruppo a cui il file appartiene (i valori di \var{st\_uid} e \var{st\_gid} accennati in precedenza) e l'user-ID effettivo, il group-ID effettivo e gli eventuali group-ID supplementari del processo.\footnote{in - realtà Linux, per quanto riguarda l'accesso ai file, utilizza gli gli + realtà Linux, per quanto riguarda l'accesso ai file, utilizza gli identificatori del gruppo \textit{filesystem} (si ricordi quanto esposto in sez.~\ref{sec:proc_perms}), ma essendo questi del tutto equivalenti ai primi, eccetto il caso in cui si voglia scrivere un server NFS, ignoreremo questa @@ -1935,7 +1956,7 @@ di accesso sono i seguenti: \begin{itemize*} \item se il relativo\footnote{per relativo si intende il bit di user-read se il processo vuole accedere in scrittura, quello di user-write per - l'accesso in scrittura, etc.} bit dei permessi d'accesso dell'utente è + l'accesso in scrittura, ecc.} bit dei permessi d'accesso dell'utente è impostato, l'accesso è consentito \item altrimenti l'accesso è negato \end{itemize*} @@ -1961,6 +1982,9 @@ tutti gli altri non vengono controllati. \subsection{I bit \acr{suid} e \acr{sgid}} \label{sec:file_suid_sgid} +\itindbeg{suid~bit} +\itindbeg{sgid~bit} + Come si è accennato (in sez.~\ref{sec:file_perm_overview}) nei dodici bit del campo \var{st\_mode} di \struct{stat} che vengono usati per il controllo di accesso oltre ai bit dei permessi veri e propri, ci sono altri tre bit che @@ -2015,27 +2039,32 @@ proposito). Infine Linux utilizza il bit \acr{sgid} per una ulteriore estensione mutuata da SVr4. Il caso in cui un file ha il bit \acr{sgid} impostato senza che lo sia anche il corrispondente bit di esecuzione viene utilizzato per attivare -per quel file il \textit{mandatory locking} (affronteremo questo argomento in -dettaglio più avanti, in sez.~\ref{sec:file_mand_locking}). +per quel file il \itindex{mandatory~locking} \textit{mandatory locking} +(affronteremo questo argomento in dettaglio più avanti, in +sez.~\ref{sec:file_mand_locking}). +\itindend{suid~bit} +\itindend{sgid~bit} \subsection{Il bit \textsl{sticky}} \label{sec:file_sticky} +\itindbeg{sticky~bit} + L'ultimo dei bit rimanenti, identificato dalla costante \const{S\_ISVTX}, è in parte un rimasuglio delle origini dei sistemi Unix. A quell'epoca infatti la -memoria virtuale e l'accesso ai files erano molto meno sofisticati e per +memoria virtuale e l'accesso ai file erano molto meno sofisticati e per ottenere la massima velocità possibile per i programmi usati più comunemente si poteva impostare questo bit. -L'effetto di questo bit era che il segmento di testo del programma (si veda -sez.~\ref{sec:proc_mem_layout} per i dettagli) veniva scritto nella swap la -prima volta che questo veniva lanciato, e vi permaneva fino al riavvio della -macchina (da questo il nome di \textsl{sticky bit}); essendo la swap un file -continuo indicizzato direttamente in questo modo si poteva risparmiare in -tempo di caricamento rispetto alla ricerca del file su disco. Lo -\textsl{sticky bit} è indicato usando la lettera \cmd{t} al posto della -\cmd{x} nei permessi per gli altri. +L'effetto di questo bit era che il \index{segmento!testo} segmento di testo +del programma (si veda sez.~\ref{sec:proc_mem_layout} per i dettagli) veniva +scritto nella swap la prima volta che questo veniva lanciato, e vi permaneva +fino al riavvio della macchina (da questo il nome di \textsl{sticky bit}); +essendo la swap un file continuo o una partizione indicizzata direttamente si +poteva risparmiare in tempo di caricamento rispetto alla ricerca attraverso la +struttura del filesystem. Lo \textsl{sticky bit} è indicato usando la lettera +\texttt{t} al posto della \texttt{x} nei permessi per gli altri. Ovviamente per evitare che gli utenti potessero intasare la swap solo l'amministratore era in grado di impostare questo bit, che venne chiamato @@ -2043,8 +2072,8 @@ anche con il nome di \textit{saved text bit}, da cui deriva quello della costante. Le attuali implementazioni di memoria virtuale e filesystem rendono sostanzialmente inutile questo procedimento. -Benché ormai non venga più utilizzato per i file, lo \textsl{sticky bit} ha -invece assunto un uso importante per le directory;\footnote{lo \textsl{sticky +Benché ormai non venga più utilizzato per i file, lo \textit{sticky bit} ha +invece assunto un uso importante per le directory;\footnote{lo \textit{sticky bit} per le directory è un'estensione non definita nello standard POSIX, Linux però la supporta, così come BSD e SVr4.} in questo caso se tale bit è impostato un file potrà essere rimosso dalla directory soltanto se l'utente ha @@ -2061,13 +2090,15 @@ permessi infatti di solito sono i seguenti: $ ls -ld /tmp drwxrwxrwt 6 root root 1024 Aug 10 01:03 /tmp \end{verbatim}%$ -quindi con lo \textsl{sticky bit} bit impostato. In questo modo qualunque +quindi con lo \textit{sticky bit} bit impostato. In questo modo qualunque utente nel sistema può creare dei file in questa directory (che, come suggerisce il nome, è normalmente utilizzata per la creazione di file temporanei), ma solo l'utente che ha creato un certo file potrà cancellarlo o rinominarlo. In questo modo si evita che un utente possa, più o meno consapevolmente, cancellare i file temporanei creati degli altri utenti. +\itindend{sticky~bit} + \subsection{La titolarità di nuovi file e directory} \label{sec:file_ownership} @@ -2173,8 +2204,8 @@ contrario (o di errore) ritorna -1. Un esempio tipico per l'uso di questa funzione è quello di un processo che sta eseguendo un programma coi privilegi di un altro utente (ad esempio attraverso -l'uso del \acr{suid} bit) che vuole controllare se l'utente originale ha i -permessi per accedere ad un certo 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. \subsection{Le funzioni \func{chmod} e \func{fchmod}} @@ -2218,9 +2249,9 @@ file. \textbf{\param{mode}} & \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \const{S\_ISUID} & 04000 & set user ID \\ - \const{S\_ISGID} & 02000 & set group ID \\ - \const{S\_ISVTX} & 01000 & sticky bit \\ + \const{S\_ISUID} & 04000 & set user ID \itindex{suid~bit} \\ + \const{S\_ISGID} & 02000 & set group ID \itindex{sgid~bit}\\ + \const{S\_ISVTX} & 01000 & sticky bit \itindex{sticky~bit}\\ \hline \const{S\_IRWXU} & 00700 & l'utente ha tutti i permessi \\ \const{S\_IRUSR} & 00400 & l'utente ha il permesso di lettura \\ @@ -2256,7 +2287,7 @@ Ad esempio i permessi standard assegnati ai nuovi file (lettura e scrittura per il proprietario, sola lettura per il gruppo e gli altri) sono corrispondenti al valore ottale $0644$, un programma invece avrebbe anche il bit di esecuzione attivo, con un valore di $0755$, se si volesse attivare il -bit \acr{suid} il valore da fornire sarebbe $4755$. +bit \itindex{suid~bit} \acr{suid} il valore da fornire sarebbe $4755$. Il cambiamento dei permessi di un file eseguito attraverso queste funzioni ha comunque alcune limitazioni, previste per motivi di sicurezza. L'uso delle @@ -2269,28 +2300,30 @@ limitazioni ulteriori. Per questo motivo, anche se si non tutti i valori possibili di \param{mode} sono permessi o hanno effetto; in particolare accade che: \begin{enumerate} -\item siccome solo l'amministratore può impostare lo \textit{sticky bit}, se - l'user-ID effettivo del processo non è zero esso viene automaticamente - cancellato (senza notifica di errore) qualora sia stato indicato in - \param{mode}. +\item siccome solo l'amministratore può impostare lo \itindex{sticky~bit} + \textit{sticky bit}, se l'user-ID effettivo del processo non è zero esso + viene automaticamente cancellato (senza notifica di errore) qualora sia + stato indicato in \param{mode}. \item per quanto detto in sez.~\ref{sec:file_ownership} riguardo la creazione dei nuovi file, si può avere il caso in cui il file creato da un processo è assegnato a un gruppo per il quale il processo non ha privilegi. Per evitare - che si possa assegnare il bit \acr{sgid} ad un file appartenente a un gruppo - per cui non si hanno diritti, questo viene automaticamente cancellato da - \param{mode} (senza notifica di errore) qualora il gruppo del file non - corrisponda a quelli associati al processo (la cosa non avviene quando - l'user-ID effettivo del processo è zero). + che si possa assegnare il bit \itindex{sgid~bit} \acr{sgid} ad un file + appartenente a un gruppo per cui non si hanno diritti, questo viene + automaticamente cancellato da \param{mode} (senza notifica di errore) + qualora il gruppo del file non corrisponda a quelli associati al processo + (la cosa non avviene quando l'user-ID effettivo del processo è zero). \end{enumerate} -Per alcuni filesystem\footnote{il filesystem \acr{ext2} supporta questa - caratteristica, che è mutuata da BSD.} è inoltre prevista una ulteriore -misura di sicurezza, volta a scongiurare l'abuso dei bit \acr{suid} e -\acr{sgid}; essa consiste nel cancellare automaticamente questi bit dai -permessi di un file qualora un processo che non appartenga all'amministratore -effettui una scrittura. In questo modo anche se un utente malizioso scopre un -file \acr{suid} su cui può scrivere, un'eventuale modifica comporterà la -perdita di questo privilegio. +Per alcuni filesystem\footnote{i filesystem più comuni (\textsl{ext2}, + \textsl{ext3}, \textsl{reiser}) supportano questa caratteristica, che è + mutuata da BSD.} è inoltre prevista una ulteriore misura di sicurezza, volta +a scongiurare l'abuso dei \itindex{suid~bit} bit \acr{suid} e \acr{sgid}; essa +consiste nel cancellare automaticamente questi bit dai permessi di un file +qualora un processo che non appartenga all'amministratore\footnote{per la + precisione un processo che non dispone della capability + \const{CAP\_FSETID}.} effettui una scrittura. In questo modo anche se un +utente malizioso scopre un file \acr{suid} su cui può scrivere, un'eventuale +modifica comporterà la perdita di questo privilegio. \subsection{La funzione \func{umask}} \label{sec:file_umask} @@ -2366,12 +2399,13 @@ sono: \errval{EACCES}, \errval{ELOOP}; \func{fchown} anche \errval{EBADF}.} \end{functions} -In Linux soltanto l'amministratore può cambiare il proprietario di un file, -seguendo la semantica di BSD che non consente agli utenti di assegnare i loro -file ad altri (per evitare eventuali aggiramenti delle quote). -L'amministratore può cambiare il gruppo di un file, il proprietario può -cambiare il gruppo dei file che gli appartengono solo se il nuovo gruppo è il -suo gruppo primario o uno dei gruppi a cui appartiene. +In Linux soltanto l'amministratore (in sostanza un processo con la +\itindex{capabilities} capability \const{CAP\_CHOWN}) può cambiare il +proprietario di un file, seguendo la semantica di BSD che non consente agli +utenti di assegnare i loro file ad altri (per evitare eventuali aggiramenti +delle quote). L'amministratore può cambiare il gruppo di un file, il +proprietario può cambiare il gruppo dei file che gli appartengono solo se il +nuovo gruppo è il suo gruppo primario o uno dei gruppi di cui fa parte. La funzione \func{chown} segue i link simbolici, per operare direttamente su un link simbolico si deve usare la funzione \func{lchown}.\footnote{fino alla @@ -2384,16 +2418,11 @@ Un'altra estensione rispetto allo standard POSIX valore per \param{owner} e \param{group} i valori restano immutati. Quando queste funzioni sono chiamate con successo da un processo senza i -privilegi di root entrambi i bit \acr{suid} e \acr{sgid} vengono -cancellati. Questo non avviene per il bit \acr{sgid} nel caso in cui esso -sia usato (in assenza del corrispondente permesso di esecuzione) per indicare -che per il file è attivo il \textit{mandatory locking}. - -%La struttura fondamentale che contiene i dati essenziali relativi ai file è il -%cosiddetto \textit{inode}; questo conterrà informazioni come il -%tipo di file (file di dispositivo, directory, file di dati, per un elenco -%completo vedi \ntab), i permessi (vedi sez.~\ref{sec:file_perms}), le date (vedi -%sez.~\ref{sec:file_times}). +privilegi di root entrambi i bit \itindex{suid~bit} \acr{suid} e +\itindex{sgid~bit} \acr{sgid} vengono cancellati. Questo non avviene per il +bit \acr{sgid} nel caso in cui esso sia usato (in assenza del corrispondente +permesso di esecuzione) per indicare che per il file è attivo il +\itindex{mandatory~locking} \textit{mandatory locking}. \subsection{Un quadro d'insieme sui permessi} @@ -2426,7 +2455,8 @@ ha alcun effetto qualora il processo possieda i privilegi di amministratore. \hline 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario\\ -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario\\ - -&1&-&-&-&0&-&-&-&-&-&-&Il \textit{mandatory locking} è abilitato\\ + -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking} + \textit{mandatory locking} è abilitato\\ -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato\\ -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario\\ -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario\\ @@ -2444,14 +2474,16 @@ ha alcun effetto qualora il processo possieda i privilegi di amministratore. \label{tab:file_fileperm_bits} \end{table} -Per compattezza, nella tabella si sono specificati i bit di \acr{suid}, -\acr{sgid} e \acr{sticky} con la notazione illustrata anche in -fig.~\ref{fig:file_perm_bit}. +Per compattezza, nella tabella si sono specificati i bit di \itindex{suid~bit} +\textit{suid}, \itindex{sgid~bit} \textit{sgid} e \textit{sticky} +\itindex{sticky~bit} con la notazione illustrata anche in +fig.~\ref{fig:file_perm_bit}. In tab.~\ref{tab:file_dirperm_bits} si sono invece riassunti gli effetti dei vari bit dei permessi per una directory; anche in questo caso si sono -specificati i bit di \acr{suid}, \acr{sgid} e \acr{sticky} con la notazione -compatta illustrata in fig.~\ref{fig:file_perm_bit}. +specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit} +\textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la notazione compatta +illustrata in fig.~\ref{fig:file_perm_bit}. \begin{table}[!htb] \centering @@ -2500,25 +2532,27 @@ Bench programma ad una sezione limitata del filesystem, per cui ne parleremo in questa sezione. -Come accennato in sez.~\ref{sec:proc_fork} ogni processo oltre ad una directory -di lavoro, ha anche una directory \textsl{radice}\footnote{entrambe sono - contenute in due campi (rispettivamente \var{pwd} e \var{root}) di +Come accennato in sez.~\ref{sec:proc_fork} ogni processo oltre ad una +directory di lavoro, ha anche una directory \textsl{radice}\footnote{entrambe + sono contenute in due campi (rispettivamente \var{pwd} e \var{root}) di \struct{fs\_struct}; vedi fig.~\ref{fig:proc_task_struct}.} che, pur essendo di norma corrispondente alla radice dell'albero di file e directory come visto dal kernel (ed illustrato in sez.~\ref{sec:file_organization}), ha per il processo il significato specifico di directory rispetto alla quale vengono -risolti i pathname assoluti.\footnote{cioè quando un processo chiede la - risoluzione di un 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 -pathname assoluti da parte di un processo cambiando questa directory, così -come si fa coi pathname relativi cambiando la directory di lavoro. +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 +\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. Normalmente la directory radice di un processo coincide anche con la radice del filesystem usata dal kernel, e dato che il suo valore viene ereditato dal -padre da ogni processo figlio, in generale i processi risolvono i pathname -assoluti a partire sempre dalla stessa directory, che corrisponde alla -\file{/} del sistema. +padre da ogni processo figlio, in generale i processi risolvono i +\itindsub{pathname}{assoluto}\textit{pathname} assoluti a partire sempre dalla +stessa directory, che corrisponde alla \file{/} del sistema. In certe situazioni però, per motivi di sicurezza, è utile poter impedire che un processo possa accedere a tutto il filesystem; per far questo si può @@ -2538,11 +2572,12 @@ prototipo \errval{EROFS} e \errval{EIO}.} \end{prototype} \noindent in questo modo la directory radice del processo diventerà -\param{path} (che ovviamente deve esistere) ed ogni 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 +\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 \textsl{imprigionato}. Solo un processo con i privilegi di amministratore può usare questa funzione, @@ -2554,10 +2589,10 @@ cambia la directory di lavoro, che potrebbe restare fuori dalla \textit{chroot Questo è il motivo per cui la funzione è efficace solo se dopo averla eseguita si cedono i privilegi di root. Infatti se per un qualche motivo il processo resta con la directory di lavoro fuori dalla \textit{chroot jail}, potrà -comunque accedere a tutto il resto del filesystem usando pathname relativi, i -quali, partendo dalla directory di lavoro che è fuori della \textit{chroot - jail}, potranno (con l'uso di \texttt{..}) risalire fino alla radice -effettiva del filesystem. +comunque accedere a tutto il resto del filesystem usando +\itindsub{pathname}{relativo}\textit{pathname} relativi, i quali, partendo +dalla directory di lavoro che è fuori della \textit{chroot jail}, potranno +(con l'uso di \texttt{..}) risalire fino alla radice effettiva del filesystem. Ma se ad un processo restano i privilegi di amministratore esso potrà comunque portare la sua directory di lavoro fuori dalla \textit{chroot jail} in cui si @@ -2577,3 +2612,34 @@ programmi e librerie) di cui il server potrebbe avere bisogno. %%% mode: latex %%% TeX-master: "gapil" %%% End: + +% LocalWords: sez like filesystem unlink MacOS Windows VMS inode kernel unistd +% LocalWords: un'etichetta int const char oldpath newpath errno EXDEV EPERM st +% LocalWords: EEXIST EMLINK EACCES ENAMETOOLONG ENOTDIR EFAULT ENOMEM EROFS ls +% LocalWords: ELOOP ENOSPC EIO pathname nlink stat vfat fsck EISDIR ENOENT cap +% LocalWords: POSIX socket fifo sticky root nell'inode system call count crash +% LocalWords: all'inode descriptor remove rename rmdir stdio glibc libc NFS DT +% LocalWords: ENOTEMPTY EBUSY mount point EINVAL soft symbolic tab symlink fig +% LocalWords: dangling access chdir chmod chown creat exec lchown lstat mkdir +% LocalWords: mkfifo mknod opendir pathconf readlink truncate path buff size +% LocalWords: grub bootloader grep linux MAXSYMLINKS cat VFS sys dirname fcntl +% LocalWords: dev l'inode umask IFREG IFBLK IFCHR IFIFO SVr sgid BSD SVID NULL +% LocalWords: stream dirent EMFILE ENFILE dirfd SOURCE fchdir readdir struct +% LocalWords: EBADF namlen HAVE thread entry result value argument fileno ino +% LocalWords: name TYPE OFF RECLEN UNKNOWN REG SOCK CHR BLK type IFTODT DTTOIF +% LocalWords: DTYPE off reclen seekdir telldir void rewinddir closedir select +% LocalWords: namelist compar malloc qsort alphasort versionsort strcoll myls +% LocalWords: strcmp DirScan direntry while current working home shell pwd get +% LocalWords: dell'inode getcwd ERANGE getwd change fd race condition tmpnam +% LocalWords: string tmpdir TMP tempnam pfx TMPNAME suid tmp EXCL tmpfile pid +% LocalWords: EINTR mktemp mkstemp stlib template filename XXXXXX OpenBSD buf +% LocalWords: mkdtemp fstat filedes nell'header padding ISREG ISDIR ISCHR IFMT +% LocalWords: ISBLK ISFIFO ISLNK ISSOCK IFSOCK IFLNK IFDIR ISUID UID ISGID GID +% LocalWords: ISVTX IRUSR IWUSR IXUSR IRGRP IWGRP IXGRP IROTH IWOTH IXOTH du +% LocalWords: blocks blksize holes lseek TRUNC ftruncate length lenght ETXTBSY +% LocalWords: hole atime read utime mtime write ctime modification leafnode cp +% LocalWords: make fchmod fchown utimbuf times actime modtime Mac owner uid fs +% LocalWords: gid Control List patch mandatory control execute group other all +% LocalWords: dell' effective passwd IGID locking swap saved text IRWXU IRWXG +% LocalWords: IRWXO ext reiser capability FSETID mask capabilities chroot jail +% LocalWords: FTP