<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9"> <TITLE>Building and Installing Software Packages for Linux: Terzo esempio: Fortune</TITLE> <LINK HREF="Software-Building-HOWTO-12.html" REL=next> <LINK HREF="Software-Building-HOWTO-10.html" REL=previous> <LINK HREF="Software-Building-HOWTO.html#toc11" REL=contents> </HEAD> <BODY> <A HREF="Software-Building-HOWTO-12.html">Avanti</A> <A HREF="Software-Building-HOWTO-10.html">Indietro</A> <A HREF="Software-Building-HOWTO.html#toc11">Indice</A> <HR> <H2><A NAME="s11">11. Terzo esempio: Fortune</A></H2> <P>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. <P>Il famoso programma <EM>fortune</EM> 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") <P> <BLOCKQUOTE><CODE> <PRE> ~/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 </PRE> </CODE></BLOCKQUOTE> <P> <P> <P> <P>Guardando <CODE>fortune.c</CODE>, le linee pertinenti sono queste. <P> <BLOCKQUOTE><CODE> <PRE> if (dirent->d_namlen == 0) continue; name = copy(dirent->d_name, dirent->d_namlen); </PRE> </CODE></BLOCKQUOTE> <P>Ci serve di trovare la struttura <CODE>dirent</CODE>, ma essa non è dichiarata nel file <EM>fortune.c</EM>, e nemmeno un <B>grep dirent</B> la mostra in nessuno dei file sorgenti. Tuttavia, all'inizio di <EM>fortune.c</EM>, c'è la seguente linea. <P> <BLOCKQUOTE><CODE> <PRE> #include <dirent.h> </PRE> </CODE></BLOCKQUOTE> <P>Questo sembra essere un file include per la libreria di sistema, perciò, il posto più logico dove cercare <EM>dirent.h</EM> è in <EM>/usr/include</EM>. Effettivamente esiste un file <EM>dirent.h</EM> in <EM>/usr/include</EM>, ma quel file non contiene la dichiarazione della struttura <CODE>dirent</CODE>. C'è, però, un riferimento ad un altro file <EM>dirent.h</EM>. <P> <BLOCKQUOTE><CODE> <PRE> #include <linux/dirent.h> </PRE> </CODE></BLOCKQUOTE> <P> <P>Alla fine, andando in <EM>/usr/include/linux/dirent.h</EM>, troviamo la dichiarazione della struttura che ci serve. <P> <BLOCKQUOTE><CODE> <PRE> struct dirent { long d_ino; __kernel_off_t d_off; unsigned short d_reclen; char d_name[256]; /* We must not include limits.h! */ }; </PRE> </CODE></BLOCKQUOTE> <P>Poco ma sicuro, la dichiarazione della struttura non contiene nessun <EM>d_namelen</EM>, ma ci sono un paio di "candidati" come suo equivalente. Il più probabile di essi è <EM>d_reclen</EM>, poiché questo membro della struttura probabilmente rappresenta la lunghezza di qualcosa ed è uno short integer. L'altra possibilità, <EM>d_ino</EM>, 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. <P>Editiamo il file <CODE>fortune.c</CODE> e cambiamo i due riferimenti alle linee 551 e 553 da <EM>d_namelen</EM> a <EM>d_reclen</EM>. Proviamo di nuovo un <EM>make all</EM>. <B>Successo.</B> La compilazione finisce senza errori. Ora possiamo prenderci i nostri "brividi a buon mercato" da fortune. <P> <P> <HR> <A HREF="Software-Building-HOWTO-12.html">Avanti</A> <A HREF="Software-Building-HOWTO-10.html">Indietro</A> <A HREF="Software-Building-HOWTO.html#toc11">Indice</A> </BODY> </HTML>