先日、smf-spf を RPM でインストールしましたが、この作業でインストールされたsmf-spf 2.0.2 にはserver address が unknown な場合に segfault するというバグがあり、気づくとデーモンが落ちている場合があって困っていたので、これが fix されている v2.2 にアップデートしてみました。
導入は基本的に make , make install だけで大丈夫ですが、x86_64 なので libmilter の場所を合わせるために Makefile を少しいじらないとコンパイルが通りませんでした。また、ちょっと挙動が気にくわない部分があったので、その部分は C の該当部分を書き換えてあります。
比較的単純なプログラムなので、C言語の勉強としてもちょうど良い感じです。
wget https://github.com/jcbf/smf-spf/archive/v2.2.tar.gz -O smf-spf-2.2.tar.gztar zxvf smf-spf-2.2.tar.gzcd smf-spf-2.2# ここで以下の diff の内容を編集makemake install
diff -u smf-spf-2.2{.org,}
Common subdirectories: smf-spf-2.2.org/init and smf-spf-2.2/initdiff -u smf-spf-2.2.org/Makefile smf-spf-2.2/Makefile--- smf-spf-2.2.org/Makefile 2016-11-04 07:08:51.000000000 +0900+++ smf-spf-2.2/Makefile 2017-02-10 21:46:35.793337210 +0900@@ -5,10 +5,10 @@ CONFDIR = /etc/mail/smfs USER = smfs GROUP = smfs-CFLAGS = -O2 -D_REENTRANT -fomit-frame-pointer -I/usr/local/include+CFLAGS = -O2 -D_REENTRANT -fomit-frame-pointer -I/usr/local/include -I/usr/include/milter-manager/libmilter # Linux-LDFLAGS = -lmilter -lpthread -L/usr/lib/libmilter -L/usr/local/lib -lspf2+LDFLAGS = -lmilter -lpthread -L/usr/lib64 -lspf2 # FreeBSD #LDFLAGS = -lmilter -pthread -L/usr/local/lib -lspf2@@ -32,8 +32,10 @@ rm -f smf-spf.o smf-spf install:- @./install.sh @cp -f -p smf-spf $(SBINDIR)++install-conf:+ @./install.sh @if test ! -d $(DATADIR); then \ mkdir -m 700 $(DATADIR); \ chown $(USER):$(GROUP) $(DATADIR); \diff -u smf-spf-2.2.org/smf-spf.c smf-spf-2.2/smf-spf.c--- smf-spf-2.2.org/smf-spf.c 2016-11-04 07:08:51.000000000 +0900+++ smf-spf-2.2/smf-spf.c 2017-02-12 02:34:00.366461264 +0900@@ -884,7 +884,7 @@ authserv_id, "none", context->sender, context->helo); break; }- smfi_insheader(ctx, 1, "Authentication-Results", spf_hdr);+ smfi_addheader(ctx, "Authentication-Results", spf_hdr); free(spf_hdr); } }@@ -1004,7 +1004,7 @@ fprintf(stderr, "pthread_mutex_init failed\n"); goto done; }- umask(0177);+ umask(0117); if (conf.spf_ttl && !cache_init()) syslog(LOG_ERR, "[ERROR] cache engine init failed"); ret = smfi_main(); if (ret != MI_SUCCESS) syslog(LOG_ERR, "[ERROR] terminated due to a fatal error");