Avanti Indietro Indice

13. Quinto esempio: XmDipmon

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"

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 dip, il che lo rende inutile per tutti quelli, la maggioranza, che usano chat per collegarsi.

Compilare XmDipmon non è un problema. XmDipmon si linka con le librerie Motif, ma può essere compilato, e funziona bene, anche con le Lesstif. La sfida è di modificare il pacchetto per farlo funzionare con chat. Ciò in pratica richiede di armeggiare con il codice sorgente ed è quindi necessario avere delle conoscenze di programmazione.

        "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

Usando l'opzione -pidfile, il programma può essere indotto, al suo avvio, a cercare un altro file, uno che esista solo dopo che un login con chat è stato effettuato con successo. Il candidato più ovvio è il file di lock del modem. Potremmo quindi provare a lanciare il programma con xmdipmon -pidfile /var/lock/LCK..ttyS3 (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 demone dip e dobbiamo invece fare in modo che controlli un processo che sia associato a chat o a ppp.

C'è un solo file sorgente e fortunatamente è ben commentato. Scorrendo il file xmdipmon.c troviamo la funzione getProcFile, la cui descrizione, all'inizio, riporta quanto segue:

/*****
* Name:                 getProcFile
* Return Type:  Boolean
* Description:  tries to open the /proc entry as read from the dip pid file.
<snip>
*****/

(Traducendo la descrizione: prova ad aprire l'elemento di /proc secondo quanto letto dal file pid di dip)

Siamo sulla pista giusta. Guardando nel corpo della funzione...

                        /* 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';

Il colpevole è la linea 2383:

                        sprintf(buf, "/proc/%i/status", pid);
                                      ^^^^^^^^^^^^^^^^^^^^^

Questo controlla se il processo demone dip è in esecuzione. Quindi, come possiamo cambiarlo in modo che controlli il demone pppd?

Guardando sulla pagina di manuale di pppd:

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.

Cambiamo la linea 2383 di xmdipmon.c in:

                        sprintf(buf, "/var/run/ppp0.pid" );

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 ppp con l'ISP e lampeggia e suona quando la connessione si interrompe. Ora abbiamo un monitor per chat pienamente funzionante.

XmDipmon può essere scaricato da Ripley Linux Tools.


Avanti Indietro Indice