«前の日記(2009-09-30 [水]) 最新 次の日記(2009-12-03 [木])» 編集
RSS: href="http://endoh-namazu.tierra.ne.jp/diary/index.rdf"


半期 四半期 全カテゴリ

新・なまず日記


2009-12-02 [水]

_ [xfumble] Ubuntu 9.04で不具合対応(Xorg 1.6.x対応奮戦記)



ものすごく更新してませんでした。
全世界の極少数の遠藤なまずファンの皆さん、ごめんなさい。


これでも、ほとんど毎日、少しつづですが、課題解決に向けて検討してたんですよ。
ようやく目処がたってきたので、ここまでの奮戦を、覚書しときます。


(1)ChrisさんのAutoKeyのソースコードを読んで、linuxの場合は、/dev/inputの下のデバイス(Linux Input Subsystem)を直接読めば、任意の入力キーが確認できることがわかった。しかーし、ここのデバイスって、root権限をもった人じゃないと、オープンできないのね。うーん、ああ、suidってやつ?あれ立てれば誰でもxfumbleを実行した人はroot権限になれんじゃね?ということで、とりあえずsudo ./xfumbleでテストを進める。

(2)しかーし、Ubuntu 8.10(Xorg 1.5.x)では、ここのデバイスをオープンしても、なんのリターンも得られない。なんだよ絶望的じゃん!と思ったのだが、Ubuntu 9.04では、ちゃんと値が得られる。どうも、Xorg 1.5.xでは、排他オープンかなんかをかけてやがるのではないだろうか。まぁ、Xorg 1.5.xでは、RECORD extensionが使えるんだし、そっちはRECORDを使って、RECORDが使えなくなっちゃったXorg 1.6.xでは、/dev/inputをオープンすることにする。よかったよ。Ubuntu 9.04では/dev/inputが使えて。使えなかったら絶望的だった。

(3)xfumbleでは、xfumbleがタイプしたキーと指がタイプしたキーとを見極めるためなどに、キーイベントのタイムスタンプを比較している。だからタイムスタンプの正確性は非常に重要。しかし、/dev/inputからもらえるキーイベントにも、タイムスタンプは付いているのだが、Xorg(X Window System)からもらえるキーイベントのタイムスタンプとは、値がめちゃくちゃ違う...これは、/dev/inputについているタイムスタンプは、OSの起動からの時間を表しており、一方、Xorgからもらえるタイムスタンプは、Xorgの起動からの時間を表しているせいだ。両者を一貫して扱うために、OS時間とXorg時間とのオフセットを埋める変数を作って、難を逃れた。

(4)しかーし、xfumble起動中に、一度サスペンドして、そこから復帰した後の動作が、どうもおかしい。これも、タイムスタンプのせい。サスペンドしている間、OSの時計は動くが、Xorgの時計は止まったまま。だから、OS時間とXorg時間とのオフセット値が、サスペンドによってずれてしまう....こいつは弱った。しかし、10秒に一度、OS時間とXorg時間とをチェックし、差があまりにも離れすぎていた場合は、サスペンドが起こったんだな、と認識し、オフセットを自動補正するルーチンを加えて、難を逃れた。

(5)なんとか目処がついたので、そろそろ、sudo ./xfumbleをやめて、suidを試してみるか...と考えたのだが、これでオイラのセキュリティに対する勉強不足が露呈。xfumbleはRubyで書いているのだが、Rubyは、「スクリプト言語が使用者が意識することなくroot権限で実行される危険」をちゃんと認識しており、suid指定をサクっと無視するような仕様になっていた。ガーン。Rubyのスクリプトファイルそのものでなく、Cでバイナリのラッパーファイルを作って、そいつにsuidをつけてみると、とりあえずroot権限で実行できるのだが、スクリプトがrequireで呼ばれるたんびに、「危険なスクリプトがroot権限で実行されるかもしれないぞ!」とワーニングが出る。なんかゲッソリした。確かに、root権限でスクリプトを実行するのは、危険だよな。将来、xfumbleが原因でウイルスが蔓延とかしたら、タマランですたい。オイラ、このあいだ新型インフルエンザに感染したばっかなのに(これは関係ない)。ということで、やっぱり、/dev/inputをオープンする部分だけ、suidで動く別プロセスにして、xfumble本体は、普通のユーザ権限で実行させることにした。suidで動く別プロセスとのプロセス間通信のやり方としては、ソケットとかいろいろあるんだが、せっかくX Window Systemの上で動くアプリなんだから、ウインドウプロパティやXのクライアントメッセージで、キーイベントの受け渡しをすることにした。

と、いうことで、現在、(5)のデバッグ中です。

まるで亀の歩みのように進みが遅いけど、考えて考えて、課題を解決していくのは、やっぱりやめられんですよ。ソフトウエア開発は趣味の王様ったい。(長崎弁が最近のお気に入りたい)。
[]