X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filedir.tex;h=00ea801fa27a88149109b387f762efa063bda381;hp=7627aaf2e1cda708f1e31cd6cdbffff6e36af997;hb=5004c32d8c64a4911159fa119bbe21cc2eae1ac3;hpb=88fefd4ca97449596a2b8689e89de5e66d9d6758 diff --git a/filedir.tex b/filedir.tex index 7627aaf..00ea801 100644 --- a/filedir.tex +++ b/filedir.tex @@ -5,7 +5,7 @@ In questo capitolo tratteremo in dettaglio le modalit file e directory, iniziando dalle funzioni di libreria che si usano per copiarli, spostarli e cambiarne i nomi. Esamineremo poi l'interfaccia che permette la manipolazione dei vari attributi di file e directory ed alla -finefaremo una trattazione dettagliata su come è strutturato il sistema base +fine faremo una trattazione dettagliata su come è strutturato il sistema base di protezioni e controllo di accesso ai file e sulle funzioni che ne permettono la gestione. Tutto quello che riguarda invece la manipolazione del contenuto dei file è lasciato ai capitoli successivi. @@ -29,7 +29,7 @@ capitolo precedente. Una caratteristica comune a diversi sistemi operativi è quella di poter creare dei nomi fittizi (come gli alias del MacOS o i collegamenti di Windows) che -permettono di fare riferiremento allo stesso file chiamandolo con nomi diversi +permettono di fare riferimento allo stesso file chiamandolo con nomi diversi o accedendovi da directory diverse. Questo è possibile anche in ambiente unix, dove tali collegamenti sono @@ -57,23 +57,23 @@ principali, come risultano dalla man page, sono le seguenti: Crea un nuovo collegamento diretto al file indicato da \var{oldpath} dandogli nome \var{newpath}. - La funzione restituisce zero in caso di successo e -1 in caso di errore. La - variabile \var{errno} viene settata opportunamente, i principali codici di - errore sono: + \bodydesc{La funzione restituisce zero in caso di successo e -1 in + caso di errore. La variabile \var{errno} viene settata + opportunamente, i principali codici di errore sono: \begin{errlist} - \item \macro{EXDEV} \var{oldpath} e \var{newpath} non sono sullo + \item[\macro{EXDEV}] \var{oldpath} e \var{newpath} non sono sullo stesso filesystem. - \item \macro{EPERM} il filesystem che contiene \var{oldpath} e + \item[\macro{EPERM}] il filesystem che contiene \var{oldpath} e \macro{newpath} non supporta i link diretti o è una directory. - \item \macro{EEXIST} un file (o una directory) con quel nome esiste di + \item[\macro{EEXIST}] un file (o una directory) con quel nome esiste di già. - \item \macro{EMLINK} ci sono troppi link al file \var{oldpath} (il + \item[\macro{EMLINK}] ci sono troppi link al file \var{oldpath} (il numero massimo è specificato dalla variabile \macro{LINK\_MAX}, vedi - \secref{sec:xxx_limits}). + \secref{sec:sys_limits}). \end{errlist} ed inoltre \macro{EACCES}, \macro{ENAMETOOLONG}, \macro{ENOTDIR}, \macro{EFAULT}, \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP}, - \macro{ENOSPC}, \macro{EIO}. + \macro{ENOSPC}, \macro{EIO}.} \end{prototype} La creazione di un nuovo collegamento diretto non copia il contenuto del file, @@ -86,7 +86,7 @@ essere cos Per quanto dicevamo in \secref{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 -mneccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di +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 @@ -115,21 +115,21 @@ suo prototipo dispositivo rimuove il nome, ma come per i file i processi che hanno aperto uno di questi oggetti possono continuare ad utilizzarlo. - La funzione restituisce zero in caso di successo e -1 per un errore, nel - qual caso il file non viene toccato. La variabile \var{errno} viene - settata secondo i seguenti codici di errore: + \bodydesc{La funzione restituisce zero in caso di successo e -1 per un + errore, nel qual caso il file non viene toccato. La variabile + \var{errno} viene settata secondo i seguenti codici di errore: \begin{errlist} - \item \macro{EISDIR} \var{pathname} si riferisce ad una directory + \item[\macro{EISDIR}] \var{pathname} si riferisce ad una directory (valore specifico ritornato da Linux che non consente l'uso di \var{unlink} con le directory, e non conforme allo standard POSIX, che prescrive invece l'uso di \macro{EPERM} in caso l'operazione non sia consentita o il processo non abbia privilegi sufficienti). - \item \macro{EROFS} \var{pathname} è su un filesystem montato in sola + \item[\macro{EROFS}] \var{pathname} è su un filesystem montato in sola lettura. - \item \macro{EISDIR} \var{pathname} fa riferimento a una directory. + \item[\macro{EISDIR}] \var{pathname} fa riferimento a una directory. \end{errlist} ed inoltre: \macro{EACCES}, \macro{EFAULT}, \macro{ENOENT}, \macro{ENOTDIR}, - \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP}, \macro{EIO}. + \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP}, \macro{EIO}.} \end{prototype} Per cancellare una voce in una directory è necessario avere il permesso di @@ -142,9 +142,9 @@ restrizioni Una delle caratteristiche di queste funzioni è che la creazione/rimozione della nome dalla directory e l'incremento/decremento del numero di riferimenti -nell'inode deve essere una operazione atomica (cioè non interrompibile da -altri processi), per questo entrambe queste funzioni sono realizzate tramite -una singola system call. +nell'inode deve essere una operazione atomica (si veda +\secref{sec:proc_atom_oper}), per questo entrambe queste funzioni sono +realizzate tramite una singola system call. Si ricordi infine che il file non viene eliminato dal disco fintanto che tutti i riferimenti ad esso sono stati cancellati, solo quando il \textit{link @@ -176,9 +176,10 @@ directory Cancella un nome dal filesystem. Usa \func{unlink} per i file e \func{rmdir} per le directory. - La funzione restituisce zero in caso di successo e -1 per un errore, nel - qual caso il file non viene toccato. Per i codici di errore vedi quanto - riportato nelle descrizioni di \func{unlink} e \func{rmdir}. + \bodydesc{La funzione restituisce zero in caso di successo e -1 per un + errore, nel qual caso il file non viene toccato. Per i codici di + errore vedi quanto riportato nelle descrizioni di \func{unlink} e + \func{rmdir}.} \end{prototype} Per cambiare nome ad un file o a una directory (che devono comunque essere @@ -188,32 +189,32 @@ nello stesso filesystem) si usa invece la funzione \func{rename}\footnote{la \begin{prototype}{stdio.h} {int rename(const char *oldpath, const char *newpath)} - Rinomina \var{oldpath} in \var{newpth}, eseguendo se necessario lo + Rinomina \var{oldpath} in \var{newpath}, eseguendo se necessario lo spostamento di un file fra directory diverse. Eventuali altri link diretti allo stesso file non vengono influenzati. - La funzione restituisce zero in caso di successo e -1 per un errore, nel - qual caso il file non viene toccato. La variabile \var{errno} viene settata - secondo i seguenti codici di errore: + \bodydesc{La funzione restituisce zero in caso di successo e -1 per un + errore, nel qual caso il file non viene toccato. La variabile + \var{errno} viene settata secondo i seguenti codici di errore: \begin{errlist} - \item \macro{EISDIR} \var{newpath} è una directory mentre \var{oldpath} non + \item[\macro{EISDIR}] \var{newpath} è una directory mentre \var{oldpath} non è una directory. - \item \macro{EXDEV} \var{oldpath} e \var{newpath} non sono sullo stesso + \item[\macro{EXDEV}] \var{oldpath} e \var{newpath} non sono sullo stesso filesystem. - \item \macro{ENOTEMPTY} \var{newpath} è una directory già esistente e non + \item[\macro{ENOTEMPTY}] \var{newpath} è una directory già esistente e non vuota. - \item \macro{EBUSY} o \var{oldpath} o \var{newpath} sono in uso da parte di + \item[\macro{EBUSY}] o \var{oldpath} o \var{newpath} sono in uso da parte di qualche processo (come directory di lavoro o come radice) o del sistema (come mount point). - \item \macro{EINVAL} \var{newpath} contiene un prefisso di \var{oldpath} o + \item[\macro{EINVAL}] \var{newpath} contiene un prefisso di \var{oldpath} o più in generale si è cercato di creare una directory come sottodirectory di se stessa. - \item \macro{ENOTDIR} Uno dei componenti dei pathname non è una directory o + \item[\macro{ENOTDIR}] Uno dei componenti dei pathname non è una directory o \var{oldpath} è una directory e \var{newpath} esiste e non è una directory. \end{errlist} ed inoltre \macro{EACCESS}, \macro{EPERM}, \macro{EMLINK}, \macro{ENOENT}, - \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP} e \macro{ENOSPC}. + \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP} e \macro{ENOSPC}.} \end{prototype} Il comportamento della funzione è diverso a seconda che si voglia rinominare @@ -255,7 +256,7 @@ riferimento allo stesso file. Come abbiamo visto in \secref{sec:file_link} la funzione \func{link} crea riferimenti agli inodes, pertanto può funzionare soltanto per file che -risiedono sullo stesso filesysteme e solo per un filesystem di tipo unix. +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. @@ -278,19 +279,20 @@ specificato. La funzione che permette di creare un nuovo link simbolico Crea un nuovo link simbolico di nome \func{newpath} il cui contenuto è \func{oldpath}. - La funzione restituisce zero in caso di successo e -1 per un errore, nel - qual caso la variabile \var{errno} restituisce i valori: + \bodydesc{La funzione restituisce zero in caso di successo e -1 per un + errore, nel qual caso la variabile \var{errno} restituisce i valori: \begin{errlist} - \item \macro{EPERM} il filesystem che contiene \var{newpath} non supporta i + \item[\macro{EPERM}] il filesystem che contiene \var{newpath} non supporta i link simbolici. - \item \macro{ENOENT} una componente di \var{newpath} non esiste o + \item[\macro{ENOENT}] una componente di \var{newpath} non esiste o \func{oldpath} è una stringa vuota. - \item \macro{EEXIST} esiste già un file \var{newpath}. - \item \macro{EROFS} \var{newpath} è su un filesystem montato in sola lettura. + \item[\macro{EEXIST}] esiste già un file \var{newpath}. + \item[\macro{EROFS}] \var{newpath} è su un filesystem montato in sola + lettura. \end{errlist} ed inoltre \macro{EFAULT}, \macro{EACCES}, \macro{ENAMETOOLONG}, \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP}, \macro{ENOSPC} e - \macro{EIO}. + \macro{EIO}.} \end{prototype} Si tenga presente che la funzione non effettua nessun controllo sull'esistenza @@ -356,18 +358,20 @@ la funzione \func{readlink}, il cui prototipo Legge il contenuto del link simbolico indicato da \var{path} nel buffer \var{buff} di dimensione \var{size}. - La funzione restituisce il numero di caratteri letti dentro \var{buff} o -1 - per un errore, nel qual caso la variabile \var{errno} viene settata a: + \bodydesc{La funzione restituisce il numero di caratteri letti dentro + \var{buff} o -1 per un errore, nel qual caso la variabile + \var{errno} viene settata a: \begin{errlist} - \item \macro{EINVAL} \var{file} non è un link simbolico o \var{size} non è + \item[\macro{EINVAL}] \var{file} non è un link simbolico o \var{size} non è positiva. - \item \macro{EROFS} La directory su cui si vuole inserire il nuovo link è + \item[\macro{EROFS}] La directory su cui si vuole inserire il nuovo link è su un filesystem montato in sola lettura. - \item \macro{ENOSPC} La directory o il filesystem in cui si vuole creare il + \item[\macro{ENOSPC}] La directory o il filesystem in cui si vuole creare il link è piena e non c'è ulteriore spazio disponibile. \end{errlist} ed inoltre \macro{ENOTDIR}, \macro{ENAMETOOLONG}, \macro{ENOENT}, - \macro{EACCES}, \macro{ELOOP}, \macro{EIO}, \macro{EFAULT} e \macro{ENOMEM}. + \macro{EACCES}, \macro{ELOOP}, \macro{EIO}, \macro{EFAULT} e + \macro{ENOMEM}.} \end{prototype} La funzione apre il link simbolico, ne legge il contenuto, lo scrive nel @@ -378,7 +382,7 @@ stringa con un carattere nullo e la tronca alla dimensione specificata da \begin{figure}[htb] \centering - \includegraphics[width=5cm]{img/link_loop.eps} + \includegraphics[width=5cm]{img/link_loop} \caption{Esempio di loop nel filesystem creato con un link simbolico.} \label{fig:file_link_loop} \end{figure} @@ -437,24 +441,24 @@ prototipo della prima assegnandole i permessi indicati da \var{mode}. Il nome può essere indicato con il pathname assoluto o relativo. - La funzione restituisce zero in caso di successo e -1 per un errore, nel - qual caso \var{errno} assumerà i valori: + \bodydesc{La funzione restituisce zero in caso di successo e -1 per un + errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item \macro{EEXIST} Un file (o una directory) con quel nome esiste di già. - \item \macro{EACCESS} + \item[\macro{EEXIST}] Un file (o una directory) con quel nome esiste di già. + \item[\macro{EACCESS}] Non c'è il permesso di scrittura per la directory in cui si vuole inserire la nuova directory. - \item \macro{EMLINK} La directory in cui si vuole creare la nuova directory + \item[\macro{EMLINK}] La directory in cui si vuole creare la nuova directory contiene troppi file. Sotto Linux questo normalmente non avviene perché il filesystem standard consente la creazione di un numero di file maggiore di - quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che + quelli che possono essere contenuti nel disco, ma potendo avere a che fare anche con filesystem di altri sistemi questo errore può presentarsi. - \item \macro{ENOSPC} Non c'è abbastanza spazio sul file system per creare + \item[\macro{ENOSPC}] Non c'è abbastanza spazio sul file system per creare la nuova directory o si è esaurita la quota disco dell'utente. \end{errlist} ed inoltre anche \macro{EPERM}, \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP}, - \macro{EROFS}. + \macro{EROFS}.} \end{prototype} La funzione crea una nuova directory vuota (che contiene solo le due voci @@ -473,23 +477,23 @@ suo prototipo deve essere vuota. Il nome può essere indicato con il pathname assoluto o relativo. - La funzione restituisce zero in caso di successo e -1 per un errore, nel - qual caso \var{errno} assumerà i valori: + \bodydesc{La funzione restituisce zero in caso di successo e -1 per un + errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item \macro{EPERM} Il filesystem non supporta la cancellazione di + \item[\macro{EPERM}] Il filesystem non supporta la cancellazione di directory, oppure la directory che contiene \var{dirname} ha lo sticky bit settato e l'\textit{effective user id} del processo non corrisponde al proprietario della directory. - \item \macro{EACCESS} Non c'è il permesso di scrittura per la directory che + \item[\macro{EACCESS}] 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 \var{dirname}. - \item \macro{EBUSY} La directory specificata è la directory di lavoro o la + \item[\macro{EBUSY}] La directory specificata è la directory di lavoro o la radice di qualche processo. - \item \macro{ENOTEMPTY} La directory non è vuota. + \item[\macro{ENOTEMPTY}] La directory non è vuota. \end{errlist} ed inoltre anche \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT}, - \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP}, \macro{EROFS}. + \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP}, \macro{EROFS}.} \end{prototype} La modalità con cui avviene la cancellazione è analoga a quella di @@ -546,23 +550,23 @@ apposita funzione di libreria, \func{getcwd}, il cui prototipo stringa puntata da \var{buffer}, che deve essere precedentemente allocata, per una dimensione massima di \var{size}. - La funzione restituisce il puntatore \var{buffer} se riesce, \macro{NULL} se - fallisce, in quest'ultimo caso la variabile \var{errno} è settata con i - seguenti codici di errore: + \bodydesc{La funzione restituisce il puntatore \var{buffer} se riesce, + \macro{NULL} se fallisce, in quest'ultimo caso la variabile + \var{errno} è settata con i seguenti codici di errore: \begin{errlist} - \item \macro{EINVAL} L'argomento \var{size} è zero e \var{buffer} non + \item[\macro{EINVAL}] L'argomento \var{size} è zero e \var{buffer} non è nullo. - \item \macro{ERANGE} L'argomento \var{size} è più piccolo della + \item[\macro{ERANGE}] L'argomento \var{size} è più piccolo della lunghezza del pathname. - \item \macro{EACCESS} Manca il permesso di lettura o di ricerca su uno dei + \item[\macro{EACCESS}] Manca il permesso di lettura o di ricerca su uno dei componenti del pathname (cioè su una delle directory superiori alla corrente). - \end{errlist} + \end{errlist}} \end{prototype} 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 \var{size} la funzione restituiece un errore. Si +dimensioni specificate con \var{size} la funzione restituisce un errore. Si può anche specificare un puntatore nullo come \var{buffer}\footnote{questa è una estensione allo standard POSIX.1, supportata da Linux}, nel qual caso la stringa sarà allocata automaticamente per una dimensione pari a \var{size} @@ -574,7 +578,7 @@ Di questa funzione esiste una versione \func{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 \macro{PATH\_MAX} (di solito 256 byte, vedi -\secref{sec:xxx_limits}); il problema è che in Linux non esiste una dimensione +\secref{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. @@ -601,17 +605,17 @@ non solo tramite il filename, i prototipi di queste funzioni sono: \funcdecl{int fchdir (int fd)} Analoga alla precedente, ma usa un file descriptor invece del pathname. - Entrambe le funzioni restituiscono zero in caso di successo e -1 per un - errore, in caso di errore \var{errno} viene settata per \func{chdir} ai - valori: + \bodydesc{Entrambe le funzioni restituiscono zero in caso di successo + e -1 per un errore, in caso di errore \var{errno} viene settata per + \func{chdir} ai valori: \begin{errlist} - \item \macro{ENOTDIR} Uno dei componenti di \var{path} non è una directory. - \item \macro{EACCESS} Manca il permesso di ricerca su uno dei componenti di + \item[\macro{ENOTDIR}] Uno dei componenti di \var{path} non è una directory. + \item[\macro{EACCESS}] Manca il permesso di ricerca su uno dei componenti di \func{path}. \end{errlist} ed inoltre \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOMEM}, \macro{ELOOP} e \macro{EIO}. Per \func{fchdir} invece gli - errori sono \macro{EBADF} e \macro{EACCES}. + errori sono \macro{EBADF} e \macro{EACCES}.} \end{functions} @@ -654,10 +658,11 @@ queste funzioni sono i seguenti: eccetto che si usa con un file aperto, specificato tramite il suo file descriptor \var{filedes}. - Le funzioni restituiscono zero in caso di successo e -1 per un errore, in - caso di errore \var{errno} può assumere uno dei valori: \macro{EBADF}, - \macro{ENOENT}, \macro{ENOTDIR}, \macro{ELOOP}, \macro{EFAULT}, - \macro{EACCESS}, \macro{ENOMEM}, \macro{ENAMETOOLONG}. + \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per + un errore, in caso di errore \var{errno} può assumere uno dei + valori: \macro{EBADF}, \macro{ENOENT}, \macro{ENOTDIR}, + \macro{ELOOP}, \macro{EFAULT}, \macro{EACCESS}, \macro{ENOMEM}, + \macro{ENAMETOOLONG}.} \end{functions} La struttura \var{stat} è definita nell'header \file{sys/stat.h} e in @@ -835,22 +840,22 @@ dimensione si possono usare le due funzioni: eccetto che si usa con un file aperto, specificato tramite il suo file descriptor \var{fd}. - Le funzioni restituiscono zero in caso di successo e -1 per un errore, nel - qual caso \var{errno} viene settato opportunamente; per \func{ftruncate} si - hanno i valori: + \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per + un errore, nel qual caso \var{errno} viene settato opportunamente; + per \func{ftruncate} si hanno i valori: \begin{errlist} - \item \macro{EBADF} \var{fd} non è un file descriptor. - \item \macro{EINVAL} \var{fd} è un riferimento ad un socket, non a un file + \item[\macro{EBADF}] \var{fd} non è un file descriptor. + \item[\macro{EINVAL}] \var{fd} è un riferimento ad un socket, non a un file o non è aperto in scrittura. \end{errlist} per \func{truncate} si hanno: \begin{errlist} - \item \macro{EACCES} il file non ha permesso di scrittura o non si ha il + \item[\macro{EACCES}] il file non ha permesso di scrittura o non si ha il permesso di esecuzione una delle directory del pathname. - \item \macro{ETXTBSY} Il file è un programma in esecuzione. + \item[\macro{ETXTBSY}] Il file è un programma in esecuzione. \end{errlist} ed anche \macro{ENOTDIR}, \macro{ENAMETOOLONG}, \macro{ENOENT}, - \macro{EROFS}, \macro{EIO}, \macro{EFAULT}, \macro{ELOOP}. + \macro{EROFS}, \macro{EIO}, \macro{EFAULT}, \macro{ELOOP}.} \end{functions} Se il file è più lungo della lunghezza specificata i dati in eccesso saranno @@ -867,7 +872,8 @@ Il sistema mantiene per ciascun file tre tempi. Questi sono registrati nell'inode insieme agli altri attributi del file e possono essere letti tramite la funzione \func{stat}, che li restituisce attraverso tre campi della struttura \var{stat} di \figref{fig:file_stat_struct}. Il significato di detti -tempi e dei relativi campi è riportato nello schema in \ntab: +tempi e dei relativi campi è riportato nello schema in \ntab, dove si è anche +riportato un esempio delle funzioni che effettuano cambiamenti su di essi. \begin{table}[htb] \centering @@ -878,8 +884,10 @@ tempi e dei relativi campi & \textbf{Opzione} \\ \hline \hline - \var{st\_atime}& ultimo accesso ai dati del file &\func{read}& \cmd{-u}\\ - \var{st\_mtime}& ultima modifica ai dati del file &\func{write}& default\\ + \var{st\_atime}& ultimo accesso ai dati del file &\func{read}, + \func{utime} & \cmd{-u}\\ + \var{st\_mtime}& ultima modifica ai dati del file &\func{write}, + \func{utime} & default\\ \var{st\_ctime}& ultima modifica ai dati dell'inode&\func{chmod}, \func{utime} & \cmd{-c} \\ \hline @@ -997,7 +1005,9 @@ quest'ultimo. Si noti infine come \var{st\_ctime} non abbia nulla a che fare con il tempo di creazione del file, usato in molti altri sistemi operativi, ma che in unix non -esiste. +esiste. Per questo motivo quando si copia un file, a meno di preservare +esplicitamente i tempi (ad esempio con l'opzione \cmd{-p} di \cmd{cp}) esso +avrà sempre il tempo corrente come data di ultima modifica. \subsection{La funzione \func{utime}} @@ -1012,12 +1022,12 @@ Cambia i tempi di ultimo accesso e modifica dell'inode specificato da \var{filename} secondo i campi \var{actime} e \var{modtime} di \var{times}. Se questa è \macro{NULL} allora viene usato il tempo corrente. -La funzione restituisce zero in caso di successo e -1 in caso di errore, nel -qual caso \var{errno} è settata opportunamente. +\bodydesc{La funzione restituisce zero in caso di successo e -1 in caso + di errore, nel qual caso \var{errno} è settata opportunamente. \begin{errlist} -\item \macro{EACCESS} non si ha il permesso di scrittura sul file. -\item \macro{ENOENT} \var{filename} non esiste. -\end{errlist} +\item[\macro{EACCESS}] non si ha il permesso di scrittura sul file. +\item[\macro{ENOENT}] \var{filename} non esiste. +\end{errlist}} \end{prototype} La struttura \var{utimebuf} usata da \func{utime} è definita come: @@ -1249,19 +1259,19 @@ corrispondono dell'utente con cui si Se però il file del programma\footnote{per motivi di sicurezza il kernel ignora i bit \acr{suid} e \acr{sgid} per gli script eseguibili} (che ovviamente deve essere eseguibile) ha il bit \acr{suid} settato, il kernel -assegnerà come \textit{effective user id} al nuovo processo l'uid del -proprietario del file al posto dell'uid del processo originario. Avere il bit -\acr{sgid} settato ha lo stesso effetto sull'\textit{effective group id} del -processo. - -I bit \acr{suid} e \acr{sgid} vengono usati per permettere agli utenti -normali di usare programmi che abbisognano di privilegi speciali; l'esempio -classico è il comando \cmd{passwd} che ha la necessità di modificare il file -delle password, quest'ultimo ovviamente può essere scritto solo -dall'amministratore, ma non è necessario chiamare l'amministratore per -cambiare la propria password. Infatti il comando \cmd{passwd} appartiene a -root ma ha il bit suid settato per cui quando viene lanciato da un utente -normale parte con i privilegi di root. +assegnerà come \textit{effective user id} al nuovo processo l'\acr{uid} del +proprietario del file al posto dell'\acr{uid} del processo originario. Avere +il bit \acr{sgid} settato ha lo stesso effetto sull'\textit{effective group + id} del processo. + +I bit \acr{suid} e \acr{sgid} vengono usati per permettere agli utenti normali +di usare programmi che abbisognano di privilegi speciali; l'esempio classico è +il comando \cmd{passwd} che ha la necessità di modificare il file delle +password, quest'ultimo ovviamente può essere scritto solo dall'amministratore, +ma non è necessario chiamare l'amministratore per cambiare la propria +password. Infatti il comando \cmd{passwd} appartiene a root ma ha il bit +\acr{suid} settato per cui quando viene lanciato da un utente normale parte +con i privilegi di root. Chiaramente avere un processo che ha privilegi superiori a quelli che avrebbe normalmente l'utente che lo ha lanciato comporta vari rischi, e questo tipo di @@ -1288,7 +1298,7 @@ Infine Linux utilizza il bit \acr{sgid} per una ulteriore estensione mutuata da SVR4. Il caso in cui il file abbia il bit \acr{sgid} settato ma non il corrispondente bit di esecuzione viene utilizzato per attivare per quel file il \textit{mandatory locking} (argomento che affronteremo nei -dettagli in \secref{sec:xxx_mandatory_lock}). +dettagli in \secref{sec:file_mand_locking}). \subsection{Il bit \textsl{sticky}} @@ -1353,11 +1363,11 @@ invece prevede due diverse possibilit \begin{itemize} \item il \acr{gid} del file corrisponde all'\textit{effective group id} del processo. -\item il \acr{gid} del file corrisponde al gid della directory in cui esso è - creato. +\item il \acr{gid} del file corrisponde al \acr{gid} della directory in cui + esso è creato. \end{itemize} in genere BSD usa sempre la seconda possibilità, che viene per questo chiamata -semantica BSD. Linux invece segue quella che viene chiamata semantica SVR4; di +semantica BSD. Linux invece segue quella che viene chiamata semantica SVr4; di norma cioè il nuovo file viene creato, seguendo la prima opzione, con il \acr{gid} del processo, se però la directory in cui viene creato il file ha il bit \acr{sgid} settato allora viene usata la seconda opzione. @@ -1386,14 +1396,14 @@ la funzione \func{access}, il cui prototipo \begin{prototype}{unistd.h} {int access(const char *pathname, int mode)} - La funzione verifica i permessi di accesso, indicati da \var{mode}, per il - file indicato da \var{pathname}. +Verifica i permessi di accesso, indicati da \var{mode}, per il file indicato +da \var{pathname}. - La funzione ritorna 0 se l'accesso è consentito, -1 altrimenti; in - quest'ultimo caso la variabile \var{errno} viene settata secondo i codici - di errore: \macro{EACCES}, \macro{EROFS}, \macro{EFAULT}, \macro{EINVAL}, +\bodydesc{La funzione ritorna 0 se l'accesso è consentito, -1 altrimenti; in + quest'ultimo caso la variabile \var{errno} viene settata secondo i codici di + errore: \macro{EACCES}, \macro{EROFS}, \macro{EFAULT}, \macro{EINVAL}, \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOTDIR}, \macro{ELOOP}, - \macro{EIO}. + \macro{EIO}.} \end{prototype} I valori possibili per il parametro \var{mode} sono esprimibili come @@ -1450,16 +1460,16 @@ i loro prototipi sono: \funcdecl{int fchmod(int fd, mode\_t mode)} Analoga alla precedente, ma usa il file descriptor \var{fd} per indicare il file. - Le funzioni restituiscono zero in caso di successo e -1 per un errore, in - caso di errore \var{errno} può assumere i valori: + \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per + un errore, in caso di errore \var{errno} può assumere i valori: \begin{errlist} - \item \macro{EPERM} L'\textit{effective user id} non corrisponde a quello + \item[\macro{EPERM}] L'\textit{effective user id} non corrisponde a quello del proprietario del file o non è zero. \end{errlist} ed inoltre \macro{EROFS} e \macro{EIO}; \func{chmod} restituisce anche \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOMEM}, \macro{ENOTDIR}, \macro{EACCES}, \macro{ELOOP}; \func{fchmod} anche - \macro{EBADF}. + \macro{EBADF}.} \end{functions} I valori possibili per \var{mode} sono indicati in \ntab. I valori possono @@ -1470,7 +1480,7 @@ divisibili in gruppi di tre). 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 suid il valore da fornire sarebbe $4755$. +si volesse attivare il bit \acr{suid} il valore da fornire sarebbe $4755$. \begin{table}[!htb] \centering @@ -1544,8 +1554,8 @@ funzione \func{umask}, il cui prototipo Setta la maschera dei permessi dei bit al valore specificato da \var{mask} (di cui vengono presi solo i 9 bit meno significativi). - La funzione ritorna il precedente valore della maschera. È una delle poche - funzioni che non restituisce codici di errore. + \bodydesc{La funzione ritorna il precedente valore della maschera. È una + delle poche funzioni che non restituisce codici di errore.} \end{prototype} Questa maschera è una caratteristica di ogni processo e viene utilizzata per @@ -1568,6 +1578,7 @@ login a $022$, e di norma gli utenti non hanno motivi per modificarlo. Se per si vuole che un processo possa creare un file che chiunque possa leggere allora occorrerà cambiare il valore di \func{umask}. + \subsection{Le funzioni \func{chown}, \func{fchown} e \func{lchown}} \label{sec:file_chown} @@ -1584,17 +1595,17 @@ sono tre e i loro prototipi sono i seguenti: Le funzioni cambiano utente e gruppo di appartenenza di un file ai valori specificati dalle variabili \var{owner} e \var{group}. - - Le funzioni restituiscono zero in caso di successo e -1 per un errore, in - caso di errore \texttt{errno} viene settato ai valori: + + \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per + un errore, in caso di errore \texttt{errno} viene settato ai valori: \begin{errlist} - \item \macro{EPERM} L'\textit{effective user id} non corrisponde a quello + \item[\macro{EPERM}] L'\textit{effective user id} non corrisponde a quello del proprietario del file o non è zero, o utente e gruppo non sono validi \end{errlist} Oltre a questi entrambe restituiscono gli errori \macro{EROFS} e \macro{EIO}; \func{chown} restituisce anche \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOMEM}, \macro{ENOTDIR}, - \macro{EACCES}, \macro{ELOOP}; \func{fchown} anche \macro{EBADF}. + \macro{EACCES}, \macro{ELOOP}; \func{fchown} anche \macro{EBADF}.} \end{functions} In Linux soltanto l'amministratore può cambiare il proprietario di un file,