Sophie

Sophie

distrib > Mandriva > 9.1 > i586 > by-pkgid > f1098342ec4a2b28475e34123ce17201 > files > 1131

howto-html-it-9.1-0.5mdk.noarch.rpm

<!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 &egrave; 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 &egrave; 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
&egrave; 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'&egrave; la seguente linea.
<P>
<BLOCKQUOTE><CODE>
<PRE>
#include &lt;dirent.h>
</PRE>
</CODE></BLOCKQUOTE>
<P>Questo sembra essere un file include per la libreria di sistema, perci&ograve;,
il posto pi&ugrave; logico dove cercare <EM>dirent.h</EM> &egrave; 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'&egrave;, per&ograve;, un riferimento ad un altro
file <EM>dirent.h</EM>.
<P>
<BLOCKQUOTE><CODE>
<PRE>
#include &lt;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&ugrave; probabile di essi &egrave; <EM>d_reclen</EM>,
poich&eacute; questo membro della struttura probabilmente rappresenta la
lunghezza di qualcosa ed &egrave; uno short integer. L'altra possibilit&agrave;,
<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&ograve; 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>