放射状

勉強のメモ。

コードリーディング:ping 二日目

これまでのあらすじ~ 鼻息荒くlinuxソースコードを読んでしまうぞ! とpingソースコードsrpmから入手した我々だったが、「C言語プリミティブすぎね?」「依存関係わからなさすぎね?」「コンパイルできなくね? できないと読むとかきつくね?」と早速暗礁に乗り上げていたのだった。~

とりあえずmakeも知らないし

ソースコードディレクトリに移動して「make」とタイプするも、依存関係エラーがびっしりでコンパイルなぞ通らない。いつもの癖よろしく「./configure」なんて打ってみるけれど、そのあたりを担当しているのがsrpmのspecファイルだと思うので、configureファイル自体存在しないですわな。
で、現状の打開策を考えてみた。

  1. makeファイルを弄ってみる:意識の低いぬるましいプログラマにはmakeが分からぬ。遠い学生時代の記憶に書いた記憶がないでもないが。覚えておいて損はないというか、これからもっと高度なソースコードを読むのであれば必須かと思われるが、今すぐpingのためにネットで調べて勉強するのはだるい。ヤダヤダ、makeの勉強するならオライリーのちゃんとまとめてある教本がないとヤダヤダ(ぬるい)。
  2. srpm関係のファイルをいじって見る:rpmの仕組み自体いつまで使われるか分からないし、今から覚えるのもなー。
  3. 敵はたかがpingコマンド一つ。gccコマンド直打ちでコンパイルを通せばいいがな。:←もうこれしかない。

どれをコンパイルするべきか

ソースコードディレクトリの中身は↓のような感じ。

INSTALL   RELNOTES    arping.c     in6_flowlabel.h  ninfod   ping6_niquery.h  rarpd.c  tftpd.c     tracepath.c   traceroute6.c
Makefile  SNAPSHOT.h  clockdiff.c  ipg              ping.c   ping_common.c    rdisc.c  tftpsubs.c  tracepath.o
Modules   doc          iputils.spec     ping6.c  ping_common.h    tftp.h   tracepath   tracepath6.c

iputilsパッケージにはping以外のコマンドも含まれているため、全部コンパイルする必要はまったくないはず。とりあえずそれっぽいping.cをgccしてみる。gccコマンドに関してはここで最低限覚えた。
とりあえず、ping.cをgccしてみんとす。

[root@localhost ping]# gcc ping.c
/tmp/ccVQRSrR.o: 関数 `rcvd_clear' 内:
ping.c:(.text+0x25): `rcvd_tbl' に対する定義されていない参照で
ping.c:(.text+0x48): `rcvd_tbl' に対する定義されていない参照です
/tmp/ccVQRSrR.o: 関数 `acknowledge' 内:
ping.c:(.text+0xb5): `ntransmitted' に対する定義されていない参照で
ping.c:(.text+0xd3): `pipesize' に対する定義されていない参照です
ping.c:(.text+0xe4): `pipesize' に対する定義されていない参照で
ping.c:(.text+0xeb): `acked' に対する定義されていない参照で
ping.c:(.text+0xff): `ntransmitted' に対する定義されていない参照です
以下略

依存関係でエラーが出ている。ソースコードディレクトリ内を検索してみると、rcvd_clear関数はping_common.hで、rcvd_tblはping_common.cで定義されているようだ。つまり、最低でもping_common.cには依存していると最初の3行のエラーであたりをつける。(まあファイルの名前的にもそうだよね)
では、ファイルを追加して改めてgcc

[root@localhost ping]# gcc ping.c ping_common.c
[root@localhost ping]#

あっ通ったそんなあっけない。
a.outという実行ファイルが同じディレクトリに出来ているので、実行してみる。

[root@localhost ping]# ./a.out 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=128 time=3.28 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=128 time=1.42 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=128 time=1.44 ms

あっさり動いた。感動した。

というわけなので

pingコマンドに関係するファイルはping_common.h、ping.c、ping_common.cと言うことが分かったので、あとはこの三つのファイルからコマンドが最低限機能するところまで余計なものをガリガリ削れば本質的な部分のコードを読むことが出来そうですね。

でもなー

makeもかけないプログラマってかっこ悪いよなー

全然関係ない与太話

serial experiments lainlispのコードが載っていると知って吹く。しかもセル・オートマトンと聞いて二度吹く。BeOSと聞いて(略
プログラマは必視の名作なので見ていない関係者は見なさいね。