2013/12/27(Fri)mod_uploaderをFedora20 + Apache2.4系で動作させるパッチ

2013/12/27 23:14 Software::Linux
Fedora17以降、あるいはApacheを2.4系にアップデートした辺りから、mod_uploader 1.3.1が動作しなくなっていた。
以前、コンパイルを試みるも失敗していたが、その後どうですか?とコメントを頂いたのでじっくり読んでみて、パッチを作りFedora20 + Apache2.4.6環境で動作することを確認したのでメモ。

追記:v3.2.0でApache 2.4.xがサポートされました 2014/09/30

2014年8月にリリースされた、mod_uploader v3.2.0でApache 2.4.xの動作がサポートされたようです。
公式サイトからソースをダウンロードしてmakeすればよいですが、例によってrpmを作りました。ダウンロードはこちらより。

環境

$ cat /etc/fedora-release

Fedora release 20 (Heisenbug)

$ uname -r

3.12.5-302.fc20.i686+PAE

$ httpd -V

Server version: Apache/2.4.6 (Fedora)
Server built:   Oct 31 2013 17:11:43
Server's Module Magic Number: 20120211:23
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   32-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

$ g++ --version

g++ (GCC) 4.8.2 20131212 (Red Hat 4.8.2-7)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

準備

rpmbuild用のディレクトリを作っておき、まずSourceForgeからダウンロードできるmod_uploader-3.1.1-1.src.rpmを準備。
$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

$ cd ~/rpmbuild/SRPMS

$ rpm2cpio mod_uploader-3.1.1-1.src.rpm | cpio -i

$ mv mod_uploader.spec ../SPECS/

$ mv mod_uploader-3.1.1.tgz ../SOURCES/
そしてこのパッチを当ててからビルドするように変更する。
$ ls ~/rpmbuild/SOURCES/

mod_uploader-3.1.1.tgz
mod_uploader-3.1.1-f20fix.patch

$ vi ~/rpmbuild/SPECS/mod_uploader.spec
--- mod_uploader_org.spec       2013-01-02 15:20:06.958564998 +0900
+++ mod_uploader.spec   2013-12-27 16:59:39.862748811 +0900
@@ -17,6 +17,8 @@
 BuildRequires: gcc-c++, make, libtool, httpd-devel, ImageMagick-c++-devel
 Requires: httpd, ImageMagick-c++

+Patch1: mod_uploader-3.1.1-f20fix.patch
+
 %description
 mod_uploader is a file upload application works as Apache module.
 The following features are provided:
@@ -28,6 +30,7 @@

 %prep
 %setup -q -n %{name}-%{version}
+%patch1 -p1

 %{__cat} <<EOF >uploader.conf
 LoadModule uploader_module modules/mod_uploader.so

リビルド

$  cd ~/rpmbuild/SPECS/

$  rpmbuild -bb mod_uploader.spec

(略)
書き込み完了: /home/kero/rpmbuild/RPMS/i686/mod_uploader-3.1.1-1.i686.rpm
書き込み完了: /home/kero/rpmbuild/RPMS/i686/mod_uploader-debuginfo-3.1.1-1.i686.rpm
(略)

$  sudo rpm -e mod_uploader-3.1.1-1.i686

警告: /etc/httpd/conf.d/uploader.conf は /etc/httpd/conf.d/uploader.conf.rpmsave として保存されました。

$  sudo rpm -ivh ~/rpmbuild/RPMS/i686/mod_uploader-3.1.1-1.i686.rpm

ダウンロード

x86_64などはご自身でビルド下さい。なお、パッチ及びRPMバイナリの動作は保証しません。自己責任にてご使用下さい。
mod_uploader-3.1.1-f20fix.patch
mod_uploader-3.1.1-1.i686.rpm

パッチ内容

ちょっとパッチ箇所に自信がないので、軽く説明。間違ってたり、改善提案があればコメント下さい。
ApacheResponse.h
struct conn_rec構造体の通信先IPアドレスを格納するメンバー名がs/remote/client/
File.h
未使用変数の削除
uploader_util.h
三項演算子の書き方が変なような?不要な代入文を削除
ApacheLogger.cpp
Apache 2.2->2.4のAPI変更点にまとめられているログ周りの変更を反映
新たにhttp_log.hをincludeし、APLOG_USE_MODULE(foo)*1
そして、ap_log_*関数の第3引数にAPLOG_MODULE_INDEXを追加
ApacheRequestReader.cpp, ApacheResponseWriter.cpp
キャスト警告の抑制(もうちょっとうまい手がありそうな気はするが、Apache Moduleの作り方を勉強しないといけなさそうなのでパス…)
Auxiliary.cpp, RFC1867Parser.cpp, RFC2822Parser.cpp
this->の追加、キャストの調整

*1 : mod_uploaderの場合のmodule名は"uploader"なので、"foo"は"uploader"で読み替える

追記:mod_uploader 3.2.0 2014/09/30

mod_uploader 3.2.0のRPMと、それを作るためのSPECファイルはこちら。
mod_uploader-3.2.0-1.i686.rpm
mod_uploader_3.2.0.spec