<!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ì. Voilà! Beh, ci sono andato vicino. Rocky: Ed ora è il momento di un altro effetto speciale. --- "Rocky e i suoi amici" </PRE> </CODE></BLOCKQUOTE> <P>XmDipmon è 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 è un problema. XmDipmon si linka con le librerie <EM>Motif</EM>, ma può essere compilato, e funziona bene, anche con le <EM>Lesstif</EM>. La sfida è di modificare il pacchetto per farlo funzionare con <EM>chat</EM>. Ciò in pratica richiede di armeggiare con il codice sorgente ed è 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ò essere indotto, al suo avvio, a cercare un altro file, uno che esista solo dopo che un login con <EM>chat</EM> è stato effettuato con successo. Il candidato più ovvio è 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ì 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'è un solo file sorgente e fortunatamente è 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. <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 è la linea 2383: <BLOCKQUOTE><CODE> <PRE> sprintf(buf, "/proc/%i/status", pid); ^^^^^^^^^^^^^^^^^^^^^ </PRE> </CODE></BLOCKQUOTE> <P>Questo controlla se il processo demone dip è 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à 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ì modificato. Nessun problema con la compilazione. Ora proviamolo con il nuovo argomento della riga di comando. Funziona che è un incanto. Il bottoncino blu indica quando è 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ò 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>