Eximのlocal_scan動的読込み機能 その2
前回はEximには独自にコンテンツスキャンを拡張する仕組みがあること、Debian版Eximはソースコードからビルドしなくても利用できることを説明しました。今回は実際にどうやって作るのかを説明したいと思います。
Exim本体のリビルドは不要ですが、機能拡張部分のC言語で書かなければならない事は変わりありません。オリジナルで有ればlocal_scanという名前のC言語関数を書いてリビルドするだけですが、Exim版ではもう一手間かけてダイナミックリンクライブラリにする必要があります。
ただしlocal_scan関数だけでは動作しません。src/local_scan.c
を読めば分かるのですがABIの互換性チェックのための関数が必要です。
local_scan版Hello Worldの作成(hello-exim.c)
さっそくソースコード見て下さい。二つ関数が追加されていますが、これが先ほど出てきたABIに関連する関数で、それぞれメジャーとマイナーのバージョン番号を返すだけの簡単な関数です。
#include <local_scan.h>
int local_scan_version_major(void)
{
eturn LOCAL_SCAN_ABI_VERSION_MAJOR;
}
int local_scan_version_minor(void)
{
return LOCAL_SCAN_ABI_VERSION_MINOR;
}
int local_scan(int fd, uschar **return_text)
{
fd = fd; /* Keep picky compilers happy */
return_text = return_text;
/* 最後に改行コード入れないとヘッダーが壊れるので注意! */
header_add((int)' ', "X-Hello-Exim: Hello !!\n");
return LOCAL_SCAN_ACCEPT;
}
コンパイルするために必要なパッケージを入れます。
sudo aptitude install exim4-dev
コンパイルして配置します。
gcc -Wall -I/usr/include/exim4 -fPIC -c hello-exim.c
gcc -shared -export-dynamic -ldl -Wl,-soname,libHelloExim.so.1 -olibHelloExim.so.1.0 hello-exim.o
sudo cp libHelloExim.so.1.0 /usr/lib/exim4/local_scan/
cd /usr/lib/exim4/local_scan/
sudo ln -s libHelloExim.so.1.0 libHelloExim.so
Eximに設定を追加して再起動します。
local_scan_path = /usr/lib/exim4/local_sacn/libHelloExim.so
届いたメールにヘッダーX-Hello-Exim
が追加されていればオッケーです。ここまで出来たら後はデータベースでもなんでも、お好きな機能を実装して下さい。ただし実行時間が長すぎるとタイムアウトしますのでご注意を。
注意!!気楽に導入するとエライことになります
この記事の対象者に改めて書く必要もないとは思いますが、まるっきりプリミティブなC言語処理なので、書き方によってはメールが壊れて、全てスプール行きなどの事態を引き起こします。くれぐれもテスト無しで実動中のサーバーに入れるような勇敢(無謀)な行為はしないで下さい。