====== 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?