|
Questo esempio richiede qualche conoscenza di programmazione in C. La maggioranza del software UNIX/Linux è scritta in C, e imparare almeno un po' di C sarebbe certamente un bene per chiunque sia seriamente interessato all'installazione del software.
Il famoso programma fortune mostra una frase umoristica, un "biscotto della fortuna", ad ogni avvio di Linux. Sfortunatamente (il gioco di parole è intenzionale), provare a costruir fortuna su una distribuzione Red Hat con un kernel 2.0.30 provoca degli errori fatali. (N.d.T: in inglese "build fortune" significa sia "far fortuna" che "compilare il programma fortune")
~/fortune# make all
gcc -O2 -Wall -fomit-frame-pointer -pipe -c fortune.c -o
fortune.o
fortune.c: In function `add_dir':
fortune.c:551: structure has no member named `d_namlen'
fortune.c:553: structure has no member named `d_namlen'
make[1]: *** [fortune.o] Error 1
make[1]: Leaving directory `/home/thegrendel/for/fortune/fortune'
make: *** [fortune-bin] Error 2
Guardando fortune.c
, le linee pertinenti sono queste.
if (dirent->d_namlen == 0)
continue;
name = copy(dirent->d_name, dirent->d_namlen);
Ci serve di trovare la struttura dirent
, ma essa non
è dichiarata nel file fortune.c, e nemmeno un grep
dirent la mostra in nessuno dei file sorgenti. Tuttavia, all'inizio
di fortune.c, c'è la seguente linea.
#include <dirent.h>
Questo sembra essere un file include per la libreria di sistema, perciò,
il posto più logico dove cercare dirent.h è in
/usr/include. Effettivamente esiste un file dirent.h in
/usr/include, ma quel file non contiene la dichiarazione della
struttura dirent
. C'è, però, un riferimento ad un altro
file dirent.h.
#include <linux/dirent.h>
Alla fine, andando in /usr/include/linux/dirent.h, troviamo la dichiarazione della struttura che ci serve.
struct dirent {
long d_ino;
__kernel_off_t d_off;
unsigned short d_reclen;
char d_name[256]; /* We must not include
limits.h! */
};
Poco ma sicuro, la dichiarazione della struttura non contiene nessun d_namelen, ma ci sono un paio di "candidati" come suo equivalente. Il più probabile di essi è d_reclen, poiché questo membro della struttura probabilmente rappresenta la lunghezza di qualcosa ed è uno short integer. L'altra possibilità, d_ino, potrebbe essere un numero di inode, a giudicare dal suo nome e tipo. A quanto pare, stiamo probabilmente trattando con una struttura di "registrazione delle directory", e questi elementi rappresentano gli attributi di un file, il suo nome, il suo inode, e la sua lunghezza (in blocchi). Ciò sembrerebbe convalidare la nostra scelta.
Editiamo il file fortune.c
e cambiamo i due riferimenti alle
linee 551 e 553 da d_namelen a d_reclen. Proviamo di
nuovo un make all. Successo. La compilazione finisce senza
errori. Ora possiamo prenderci i nostri "brividi a buon mercato" da fortune.
Hosting by: hurra.com
Generated: 2007-01-26 17:56:18