2008年11月12日
まくおをFreeBSDやMacOSXでも動くようにしました
先日公開したまくおさんですが、 Linux以外の環境では全然ビルドが通らないことに公開後に気がつきました。 気になって気になって夜も寝れなかったので(笑)、手元にあったFreeBSD7.0とMacOSX10.4でも動くようにしてみました。
また、specファイルと起動スクリプトを頂きました
ので同梱しておきます。
これは、とても助かります!、ありがとうございます!>Naoyaさん
というわけで、今回は「LinuxではビルドできるけどFreeBSDではエラーになる点」をいくつか紹介したいと思います。
ftime を gettimeofday に変更
何を血迷っていたのか、現在時刻を取得するためにftimeを使っている箇所がありました。 マニュアルにもきちんと「この関数は古いものである。使ってはならない。秒単位の時間で十分なら、 time(2) が利用できる。 gettimeofday(2) でマイクロ秒が得られる」って書いてありますね。
tzset 後のtimezone参照をやめて localtime を使うようにした
makuosan はベースディレクトリにchrootする機能があります(-c オプション)また、makuosan のログはsyslog に出力していますが、chrootすると/etc/localtime が見えなくなるため、syslogに記録される 時間が9時間ほどタイムスリップしてしまいます。(たしかproftpdのchroot機能などでも似たような問題があったと思います)
しかし、chroot先に/etc/localtimeを勝手にコピーするわけにもいかな いので、環境変数の"TZ"に"JST-9"のような文字列で時差を設定します。すると、/etc/localtime がなくても日本標準時で ログが記録されるようになります。
問題は、環境変数の"TZ"に設定する文字列をどのように生成するかですが、それを以下のようなコードで実装していました。extern char *tzname[2]; extern long timezone; void settzenv() { char TZ[256]; tzset(); sprintf(TZ,"%s%+ld",tzname[0],timezone); setenv("TZ",TZ,0); }tzset するだけで必要な値がグローバル変数に入るので便利だなーなんて軽く考えていましたが、FreeBSDでは同名の関数が あるのでエラーになってしまいます。
そのため、localtime 関数を使ってtm 構造体をセットし、tm_gmtoff メンバとtm_zone メンバを利用して文字列を生成するようにしました。
time_t ttime; struct tm *t; char tz[256]; time(&ttime); tzset(); t = localtime(&ttime); sprintf(tz, "%s%+ld", t->tm_zone, -(t->tm_gmtoff/3600)); setenv("TZ", tz, 0);
おまけ: libcryptが必要な理由
最後に少しだけ、プロジェクトサイトに書いていなかったことを書いておきます。
(もちろん後で追記しますが(^^;
makuosanではファイルの同一性をチェックする機能でmd5を使っています。
$ msync --check
また、ネットワークに流れるデータを暗号化するためにblowfishを使っています。
$ echo himitsu > keyfile $ chmod 400 keyfile $ makuosan -b dokka -k keyfileこれらの機能は、opensslのライブラリを利用しているので、ビルドにはopensslの ヘッダファイルとライブラリが必要です。