qmail の POP3/SMTP over SSL 対応を行ったが、パスワードチェック用プログラムが、POP before SMTP 対応の checkpassword から、非対応の checkpw に変わったため、SSL 接続では /etc/tcp.smtp* ファイルが更新されず、外部からの利用ができなかった。(POP before SMTP が利用できなくなってしまった!!) 
 
そのため、手動で checkpassword へのパッチ内容を checkpw に当ててコンパイルしてみたところ通った。 
で、実際に接続して試してみたら、POP/SMTP over SSL 接続でもちゃんと /etc/tcp.smtp.filter.newer が更新されていた。 
 
ということで、今後同じ案件があった場合の対応方法は以下のとおり。 
 
============================================= 
 
パッチを当てて、checkpw をリコンパイル。 
 
www# pwd 
/usr/local/src/checkpw-1.01 
www# ls -la checkpw* 
-rwxr-xr-x  1 root  100  9016 Mar 29 12:51 checkpw 
-rw-r--r--  1 500   100  2488 Jan  7  2002 checkpw.c 
-rw-r--r--  1 root  100  3740 Mar 29 12:51 checkpw.o 
-rw-r--r--  1 500   100    58 Jun  4  2001 checkpw=x 
-rw-r--r--  1 root  100   878 Apr  2 12:55 checkpw_opensmtp.20040402.patch 
www# patch < checkpw_opensmtp.20040402.patch 
Hmm...  Looks like a new-style context diff to me... 
The text leading up to this was: 
-------------------------- 
|*** checkpw.c_org      Fri Apr  2 11:39:55 2004 
|--- checkpw.c  Fri Apr  2 12:11:10 2004 
-------------------------- 
Patching file checkpw.c using Plan A... 
Hunk #1 succeeded at 10. 
Hunk #2 succeeded at 99. 
done 
www# ls -la checkpw* 
-rwxr-xr-x  1 root  100    9016 Mar 29 12:51 checkpw 
-rw-r--r--  1 root  wheel  2841 Apr  2 12:56 checkpw.c 
-rw-r--r--  1 500   100    2488 Jan  7  2002 checkpw.c.orig 
-rw-r--r--  1 root  100    3740 Mar 29 12:51 checkpw.o 
-rw-r--r--  1 500   100      58 Jun  4  2001 checkpw=x 
-rw-r--r--  1 root  100     878 Apr  2 12:55 checkpw_opensmtp.20040402.patch 
www# make 
./compile checkpw.c 
./load checkpw auto_maildir.o auto_password.o auto_patrn.o unix.a byte.a 
 
これで、新しい checkpw が作られるので、任意のディレクトリにコピーしておく。 
オリジナルの checkpw が置いてある場所に、checkpw_opensmtp のような名前で作っておくのがよいだろう。 
 
www# cp -p /usr/local/src/checkpw-1.01/checkpw /bin/checkpw_opensmtp 
www# ls -la /bin/checkpw* 
-rwx------  1 root  wheel  9016 Mar 29 12:52 /bin/checkpw 
-rwxr-xr-x  1 root  100    9336 Apr  2 12:57 /bin/checkpw_opensmtp 
www# chmod 700 /bin/checkpw_opensmtp 
 
tcpserver 経由での qmail-pop3d 起動スクリプトを直す。 
(例:/usr/local/etc/rc.d/qmail-ssl.sh) 
 
/usr/local/bin/tcpserver_ssl -Rs \ 
-n /var/qmail/cert.pem 0 995 /var/qmail/bin/qmail-popup mx.fureai-ichiba.com \ 
/bin/checkpw_opensmtp  /var/qmail/bin/qmail-pop3d Maildir & 
  ↑このように、パスワードチェックプログラムを checkpw_opensmtp にする。 
 
で、tcpserver を起動しなおしてOK! 
 
 
<おまけ> 
checkpw_opensmtp.20040402.patch の中身。(TAB コードなどはスペースに変換されているので、実際に使用する時は、パッチファイルをダウンロードすること) 
 
*** checkpw.c_org	Fri Apr  2 11:39:55 2004 
--- checkpw.c	Fri Apr  2 12:11:10 2004 
*************** 
*** 10,15 **** 
--- 10,18 ---- 
  #include "auto_password.h" 
  #include "auto_patrn.h" 
   
+ #include <sys/types.h> 
+ #include <sys/wait.h> 
+  
  #include <pwd.h> 
  static struct passwd *pw; 
   
*************** 
*** 96,101 **** 
--- 99,118 ---- 
    stored.s[str_chr(stored.s,'\n')] = 0; 
    
    if (!*stored.s || strcmp(password,stored.s)) die(1); 
+  
+   if (1) { 
+     int child; 
+     int wstat; 
+     char *opensmtp = "/usr/local/bin/pop3-record"; 
+  
+     switch(child = fork()) 
+      { 
+       case -1: _exit(111); break; 
+       case 0: execl(opensmtp, opensmtp, 0); _exit(111); break; 
+      } 
+     waitpid(child, &wstat, 0); 
+     if (!WIFEXITED(wstat)) _exit(111); 
+    } 
    
    if (prot_gid((int) pw->pw_gid) == -1) die(1); 
    if (prot_uid((int) pw->pw_uid) == -1) die(1); 
 
 |   
 |