先日、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.gz
tar zxvf smf-spf-2.2.tar.gz
cd smf-spf-2.2
# ここで以下の diff の内容を編集
make
make install
diff -u smf-spf-2.2{.org,}
Common subdirectories: smf-spf-2.2.org/init and smf-spf-2.2/init
diff -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");