ブルウィンクル: やあ、ロッキー。帽子からウサギを出すから見ててくれよ。
ロッキー: でも、うまくいったことなんかないじゃん。
ブルウィンクル: 今度こそうまくいくよ。
それっ!
うーん、あとちょっとだね。
ロッキー: ということはそろそろ別の特殊機能を用意しなきゃね。
--- 「ロッキーとその仲間たち」より
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 デーモンを連続的に 監視するので、このプロセスではなく chat や ppp に対 応するプロセスをポーリングするように動作を変えてやる必要があります。
ソースファイルは 1 つだけですし、幸いなことに詳しいコメントが付けられ
ています。xmdipmon.c
を眺めてみると getProcFile とい
う関数がありますが、その先頭には以下のように書いてあります。
/*****
* Name: getProcFile
* Return Type: Boolean
* Description: dip の pid ファイルから読み出した /proc エントリのオープンを試みる
<snip>
*****/
ここは頑張って調べるところです。関数の中身を読んでみましょう…。
/* 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';
問題になるのは 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 から入手できます。