====== Esercitazione 4 ======
Questa esercitazione tratta le //system call// che operano su file.
L'accesso ai file ed alle directory deve essere effettuato **esclusivamente** utilizzando le system call viste a lezione. La soluzione //deve// includere la gestione degli arrori con una delle tecniche discusse.
====== Esercizio 0: perror() ======
Usare la perror() per stampare i messaggi di errore relativi a ENOENT, EIO ed EPERM.
====== Esercizio 1: mycat ======
Scrivere un programma C che implementa l'utility ''mycat'', con il seguente comportamento
bash:~$ mycat file
prova ad aprire //file// e, se ci riesce, stampa il suo contenuto sullo standard output.
Se attivata in modo errato, ''mycat'' stampa un breve messaggio di uso, ad es.
bash:~$ mycat file1 file2
Uso: mycat file
Stampa il contenuto di un singolo file su stdout
====== Esercizio 2: mycat (2) ======
Estendere ''mycat'' (Esercizio 1) in modo da accettare una lista di file
bash:~$ mycat file1..fileN
per ogni file che riesce ad aprire, ''mycat'' stampa il contenuto
su stdout preceduto da una breve intestazione es.
**************************
* filek *
**************************
Per ogni file che non riesce ad aprire, ''mycat'' stampa un messaggio di errore sullo standard error.
Inoltre si implementi l'opzione ''[-o fileout]'' che permette di specificare un file (''fileout'') di
output diverso dallo standard output. \\
NOTA: L'opzione ''-o'' puo' essere specificata in una posizione arbitraria della lista degli argomenti, per il parsing della linea di comando e' possibile utilizzare la funzione di libreria ''getopt'' (vedi man 3).
====== Esercizio 3 : mystat ======
Realizzare il comando ''mystat''
mystat file1 ... fileN
che stampa vari attributi contenuti nell'i-node dei file con path //file1 ... fileN//.
In particolare, devono essere stampati almeno : il numero di i-nodo,
il tipo del file (regolare, directory etc.) , la maschera di protezione, (es. ''rw-r--r--''),
l'user identifier (''uid''), il group identifier (''gid'') ed il tempo dell'ultima modifica.
\\
//Suggerimenti//: fare qualche esperimento con il comando `stat' (man 1),
usare la system call ''stat'', convertire il tempo di accesso in una stringa
stampabile con la funzione di libreria ''ctime()'', in ''time.h'', usare ''getpwid()''
e ''getgrgid()'' per convertire ''uid'' e ''gid'' nei nomi corrispondenti.
\\
//Estensione//: (compilazione separata e make)
Suddividere il programma sviluppato su due file :
uno contenente un main minimale che chiama una funzione per stampare gli attributi definita nell'altro file.
Scrivere il relativo ''makefile''. Usare ''objdump/readelf'' per esplorare le varie
parti dei moduli oggetto generati. Cosa contiene l'eseguibile?