ゆの in SystemTap - ゆの対応カーネルですよ!

Fedora 9のLinuxカーネルSystemTapでライブに改造して『ゆの』対応にしてみます。x / _ / x
#「ゆの in language」の趣旨とは申し訳ないくらいに違うかもだけど。。
元ネタ: ゆの in Ruby - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech


試すにはちょっと事前準備が要ります。

1. SystemTapと必要なモノをインストール。

# yum install kernel-devel systemtap
# debuginfo-install kernel

(Fedora9の場合。8ならyum -enablerepo=debuginfo install kernel-debuginfo とかかな?)

2. 以下のスクリプトをファイル「yuno.stp」に保存。

function memset(buf:long, src:string, size:long) %{ /* DANGER !! */
  char *buf = (void*)(long)THIS->buf;
  char *src = (void*)(long)THIS->src;
  memcpy(buf, src, (int)THIS->size);
%}

probe kernel.function("sys_read").return {
  if (execname() == "cat") {
    if ($count >= 4096 && $return < 1024) {
      x = "ひだまり"
      for (c = 0; c < $return; c++) {
	t = substr(user_string($buf), c, 1)
	if (t == "x") {
	  if (k)
	    x .= "x365"
	  k = 1
	} else if (t == "_") {
	  x .= "スケッチ"
	} else if (t == "<") {
	  x .= substr(user_string($buf), c+1, $return - c);
	} else if (t != " " && t != "/") {
	  // printf("%s\n", x)
	  memset($buf, x, strlen(x))
	  $return = strlen(x)
	  next;
	}
      }
    }
  }
}

3. 以下の内容の「ゆの」ファイルを作ります。

% cat yuno
x / _ / x < 来週も見てくださいね!

4. 別窓で実行開始(要root権限)。これだけでは何も起こりませんが…

# stap -vg yuno.stp
...
Pass 5: starting run.

5. catでyunoを読んでみると…

% cat yuno
ひだまりスケッチx365 来週も見てくださいね!

ファイルの中身が「ひだまりスケッチ×365」に変わった!?

いえいえ、tacとかlessで見てみればゆののままであることが分かります。

% tac yuno
x / _ / x < 来週も見てくださいね!

また、stapコマンドをCtrl-Cで止めると元に戻ります。

なお、正しいゆの以外を読ませると何が起こるか分からない(最悪カーネルがお亡くなりになる)のでやめた方が良いと思います。

解説 → id:NeoCat:20080713:1215944363