_ ちょいと必要があって、DNS の RR を parse するスクリプトを書こうとした。…ら、意外とめんどくさいことに気がついてガクゼンとした。
_ RFC1035 によると、RR の形式は
となってる。つまり、RFC1035 にしたがうと、たとえば<domain-name><rr> [<comment>] <blank><rr> [<comment>] ... <rr> contents take one of the following forms: [<TTL>] [<class>] <type> <RDATA> [<class>] [<TTL>] <type> <RDATA>という RR はhoge 60 IN MX 10 fugaの2通りに解釈できることになる。正解はとーぜん前者なんだけど、文法上は後者も正しいわけで、これを正しく判別させるためには、IN は class であって type でないという知識が必要。
- TTL=60, class=IN, type=MX, RDATA=10 fuga
- class=(省略), TTL=60, TYPE=IN, RDATA=MX 10 fuga
_ つまり、正しく parse させるためには、単純にテキスト処理でマッチングさせるだけでは済まず、このへんの知識を教えこまなきゃいけないわけで、ちょーめんどくさい。今回の要件では RDATA の中身まで見る必要はなかったのでそんなに難しくはないだろうと思ってたんだけど、RDATA まで立ち入らなくても十分以上にめんどくさかった。
_ 以前からのこのフォーマットはクソだと思ってたんだけど(class と TTL をどっちを先に書いてもいいとか、そんな曖昧なの許すなや)、思ってた以上にはるかにクソだったようだ。