Avanti Indietro Indice

11. Terzo esempio: Fortune

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.


Avanti Indietro Indice