次のページ 前のページ 目次へ

13. 5 番目の例: XmDipmon

ブルウィンクル: やあ、ロッキー。帽子からウサギを出すから見ててくれよ。
ロッキー:       でも、うまくいったことなんかないじゃん。
ブルウィンクル: 今度こそうまくいくよ。
                それっ!
                うーん、あとちょっとだね。
ロッキー:       ということはそろそろ別の特殊機能を用意しなきゃね。
            --- 「ロッキーとその仲間たち」より

XmDipmon はインターネット接続の状態を表示するボタンを画面に出す気の利 いた小さなプログラムです。このプログラムは接続が切れると光ってビープ音 を出します。こういった事態は田舎の電話システムではとてもよく起こります。 残念ながら、XmDipmon は dip と組み合わせてしか使えないので、 接続に chat を使っている人達(こちらが多数派なのですが)の役に は立ちません。

XmDipmon の構築は難しくありません。XmDipmon は Motif ライブラリ をリンクしますが、Lesstif をリンクしてもうまく構築できます。 難しいのは chat を使っている時にもこのパッケージが動作するよ うに変えることです。これは実際のソースコードの改造を含むので、 プログラミングの知識がある程度必要です。

        「xmdipmon は起動時に /etc/dip.pid というファイルをチェックし
          ます(コマンドラインオプション -pidfile を使うと、別のファイ
          ルを参照させることもできます)。このファイルには dip デーモン
          のプロセス ID が入っています(dip はいったん接続が確立すると、
          自分自身をデーモンモードに切り替えます)」
                       --- XmDipmon の README ファイルより

-pidfile オプションを使うと、起動時に別のファイルをチェックす るようにプログラムに指示できます。このファイルは、chat ログイン が正常にできている間だけ存在するものでなければなりません。すぐ思い付く 候補としてはモデムのロックファイルがあります。したがって、 xmdipmon -pidfile /var/lock/LCK..ttyS3 としてプログラムを起動すればよいかもしれません(この例ではモデムは COM ポート 4 番、ttyS3 にあるものとしています)。しかし、この方法で解決する のは問題の一部分だけです。プログラムは dip デーモンを連続的に 監視するので、このプロセスではなく chatppp に対 応するプロセスをポーリングするように動作を変えてやる必要があります。

ソースファイルは 1 つだけですし、幸いなことに詳しいコメントが付けられ ています。xmdipmon.c を眺めてみると getProcFile とい う関数がありますが、その先頭には以下のように書いてあります。

/*****
* Name:                 getProcFile
* Return Type:  Boolean
* Description:  dip の pid ファイルから読み出した /proc エントリのオープンを試みる
<snip>
*****/

ここは頑張って調べるところです。関数の中身を読んでみましょう…。

                        /* we watch the status of the real dip daemon */
                        sprintf(buf, "/proc/%i/status", pid);
                        procfile = (String)XtMalloc(strlen(buf)*sizeof(char)+1);
                        strcpy(procfile, buf);
                        procfile[strlen(buf)] = '\0';

問題になるのは 2383 行目です:

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

このコードは dip デーモンのプロセスが動作中かどうかを調べています。 ここで、どうすれば dip でなく pppd デーモンを監視するように変更できる でしょうか?

pppd の man ページを読んでみましょう:

FILES
       /var/run/pppn.pid (BSD または Linux), /etc/ppp/pppn.pid (others)
                     ppp インタフェースユニット n の pppd プロセスのプロセス ID

そこで、xmdipmon.c の 2383 行目を以下のように変更します:

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

修正したパッケージを再構築します。構築は問題ないはずです。次に、新しい コマンドライン引数をテストします。これは見事に動作します。ISP への ppp 接続が確立すると小さな青いボタンがそれを示し、接続が切れ るとボタンが光り、ビープ音がします。これで chat を完璧に監視 できるツールができました。

XmDipmon は Ripley Linux Tools から入手できます。


次のページ 前のページ 目次へ