Snow Leopard 上の lex/yacc でハマった(1)

今日はいつもより 2時間以上も寝坊してしまいました(遅刻ではないです!!!)・・・

どうも iPhone はメールの着信を放置したままだとアラームが鳴らないような気がするのですが(同僚の証言もアリ)、

実際に検証してみたところ、問題なくアラームは鳴りました。

単純な寝坊のようです(笑)

さて、NCAD は数少ない国内の DHCPサーバのベンダーとして、

ProDHCP というソフトウェアを開発、販売しております。

ソリトンシステムズ 様のアプライアンスにエンジンをご採用いただいてから、お問い合わせも増え、現在も納入に向けた作業を行っている最中です。

「ソフト製品ならパッケージで売るだけではないか?」と、思われるかもしれませんが、

この製品には最近では付属していることが常識の設定ツールや、WebUI といったものが一切付属しておりませんので、

納入先のお客様がご希望された場合は、新たに開発して納品するということを行う必要があるのです。

今回のお客様は、WebUI をご希望されたので、Web関係が得意なメンバーが対応していたのですが、

意外と ProDHCPの設定ファイル(ISC社製 dhcpd とある程度互換性があります)をパースすることは簡単ではありません。

サンプル


shared-network nantara {
subnet 172.16.1.0 netmask 255.255.255.0 {
server-identifier 172.16.0.254;
real-server-identifier 172.16.0.254;
max-lease-time 7200;
default-lease-time 3600;
range 172.16.1.100 172.16.1.200;
option domain-name-servers 172.16.0.254;
option routers 172.16.1.254;
host kantara {
allow booting;
hardware ethernet 00:20:0c:05:05:be;
}
host pontara {
allow booting;
hardware ethernet 00:12:01:22:2c:c4;
}
}
}

ということで、私が lex/yacc で上記フォーマットの設定ファイルをウェブで扱いやすい形に変換するコンバータを書いたのですが、

Linux ではきちんと動くのに、Mac では何故か Segmentation Fault で動きません。

よくよく調べてみると、IPアドレス などをスキャンする際の定義が、


([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) yylval = (YYSTYPE) strdup(yytext); return ADDRESS;
と、なっていたことが原因でした。

詳しく説明しますと、Snow Leopard の /usr/bin/flex が生成する C言語のソースファイルで定義されている YYSTYPE は int 型です。

しかしながら、Snow Leopard では OSが 64bit化され、int 型は 32bit ですが、ポインタ型は 64bit になっているので、
yylval = strdup(yytext) で 32bit分のポインタ情報が欠落してしまっていたのです・・・

リリース環境は Linux なので、Mac での開発には取り急ぎ YYSTYPE を long にして凌ぎました。