Sophie

Sophie

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

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: Quinto esempio: XmDipmon</TITLE>
 <LINK HREF="Software-Building-HOWTO-14.html" REL=next>
 <LINK HREF="Software-Building-HOWTO-12.html" REL=previous>
 <LINK HREF="Software-Building-HOWTO.html#toc13" REL=contents>
</HEAD>
<BODY>
<A HREF="Software-Building-HOWTO-14.html">Avanti</A>
<A HREF="Software-Building-HOWTO-12.html">Indietro</A>
<A HREF="Software-Building-HOWTO.html#toc13">Indice</A>
<HR>
<H2><A NAME="s13">13. Quinto esempio: XmDipmon</A></H2>

<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
Bullwinkle: Hey Rocky, guarda, tiro fuori un coniglio dal cappello.
Rocky:      Ma quel trucco non funziona mai.
Bullwinkle: Questa volta s&igrave;.
            Voil&agrave;!
            Beh, ci sono andato vicino.
Rocky:      Ed ora &egrave; il momento di un altro effetto speciale.
            --- "Rocky e i suoi amici"
</PRE>
</CODE></BLOCKQUOTE>
<P>XmDipmon &egrave; un'elegante applicazioncina che mostra un bottone 
indicante lo stato di una connessione Internet. Lampeggia e suona quando
la connessione si interrompe, come troppo spesso accade nelle linee 
telefoniche di campagna. Sfortunatamente XmDipmon funziona solo con 
<EM>dip</EM>, il che lo rende inutile per tutti quelli, la maggioranza,
che usano <EM>chat</EM> per collegarsi.
<P>Compilare XmDipmon non &egrave; un problema. XmDipmon si linka con le
librerie <EM>Motif</EM>, ma pu&ograve; essere compilato, e funziona bene,
anche con le <EM>Lesstif</EM>. La sfida &egrave; di modificare il pacchetto
per farlo funzionare con <EM>chat</EM>. Ci&ograve; in pratica richiede di
armeggiare con il codice sorgente ed &egrave; quindi necessario avere
delle conoscenze di programmazione.
<P>
<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
        "Quando xmdipmon parte, cerca un file chiamato /etc/dip.pid
         (potete fargli cercare un altro file usando l'opzione -pidfile
         dalla riga di comando). Tale file contiente il PID del demone
         dip (dip stesso si pone in modo demone, dopo che ha stabilito 
         una connessione)."
                       --- dal file README di XmDipmon
</PRE>
</CODE></BLOCKQUOTE>
         
<P>
<P>Usando l'opzione <EM>-pidfile</EM>, il programma pu&ograve; essere
indotto, al suo avvio, a cercare un altro file, uno che esista solo
dopo che un login con <EM>chat</EM> &egrave; stato effettuato con successo. 
Il candidato pi&ugrave; ovvio &egrave; il file di lock del modem. Potremmo 
quindi provare a lanciare il programma con <B>xmdipmon -pidfile 
/var/lock/LCK..ttyS3</B> (assumendo che il modem sia sulla porta com
numero 4, ttyS3). Comunque cos&igrave; si risolve solo una parte del
problema. Il programma osserva continuamente il <EM>demone dip</EM>
e dobbiamo invece fare in modo che controlli un processo che sia
associato a <EM>chat</EM> o a <EM>ppp</EM>.
<P>C'&egrave; un solo file sorgente e fortunatamente &egrave; ben commentato.
Scorrendo il file <CODE>xmdipmon.c</CODE> troviamo la funzione 
<EM>getProcFile</EM>, la cui descrizione, all'inizio, riporta quanto segue:
<P>
<BLOCKQUOTE><CODE>
<PRE>
/*****
* Name:                 getProcFile
* Return Type:  Boolean
* Description:  tries to open the /proc entry as read from the dip pid file.
&lt;snip>
*****/
</PRE>
</CODE></BLOCKQUOTE>
<P>(Traducendo la descrizione: prova ad aprire l'elemento di /proc secondo quanto 
letto dal file pid di dip)
<P>Siamo sulla pista giusta. Guardando nel corpo della funzione...
<P>
<BLOCKQUOTE><CODE>
<PRE>
                        /* we watch the status of the real dip deamon */
                        sprintf(buf, "/proc/%i/status", pid);
                        procfile = (String)XtMalloc(strlen(buf)*sizeof(char)+1);
                        strcpy(procfile, buf);
                        procfile[strlen(buf)] = '\0';
</PRE>
</CODE></BLOCKQUOTE>
<P>Il colpevole &egrave; la linea 2383:
<BLOCKQUOTE><CODE>
<PRE>
                        sprintf(buf, "/proc/%i/status", pid);
                                      ^^^^^^^^^^^^^^^^^^^^^
</PRE>
</CODE></BLOCKQUOTE>
<P>Questo controlla se il processo demone dip &egrave; in esecuzione. Quindi,
come possiamo cambiarlo in modo che controlli il demone pppd?
<P>Guardando sulla pagina di manuale di <EM>pppd</EM>:
<BLOCKQUOTE><CODE>
<PRE>
FILES
     /var/run/pppn.pid (BSD o Linux), /etc/ppp/pppn.pid (altri)
           Identificatore del processo (Process-ID) di pppd sull'unit&agrave;
           d'interfaccia n di ppp.
</PRE>
</CODE></BLOCKQUOTE>
<P>Cambiamo la linea 2383 di <CODE>xmdipmon.c</CODE> in:
<BLOCKQUOTE><CODE>
<PRE>
                        sprintf(buf, "/var/run/ppp0.pid" );
</PRE>
</CODE></BLOCKQUOTE>
<P>Ricompiliamo il pacchetto cos&igrave; modificato. Nessun problema con la
compilazione. Ora proviamolo con il nuovo argomento della riga di comando.
Funziona che &egrave; un incanto. Il bottoncino blu indica quando &egrave; 
stata stabilita una connessione <CODE>ppp</CODE> con l'ISP e lampeggia e suona
quando la connessione si interrompe. Ora abbiamo un monitor per 
<EM>chat</EM> pienamente funzionante.
<P>
<P>XmDipmon pu&ograve; essere scaricato da 
<A HREF="http://www.xs4all.nl/~ripley/RSD/linux.html">Ripley Linux Tools</A>.
<P>
<P>
<P>
<HR>
<A HREF="Software-Building-HOWTO-14.html">Avanti</A>
<A HREF="Software-Building-HOWTO-12.html">Indietro</A>
<A HREF="Software-Building-HOWTO.html#toc13">Indice</A>
</BODY>
</HTML>