Apache2.2.6のmod_davを改造してシンボリックリンクを無理矢理使えるようにする

WebDAV(mod_dav)でシンボリックリンクを使う

ApacheのWebDAV(mod_dav)では,シンボリックリンクが使えない.

個人的に不便で困ったので,mod_davを改造して無理矢理シンボリックリンクを使えるようにした.

  • Apache 2.2.6

この改造で,私の環境では何となく動いているような気はしますが, 保証は致しかねますのでご注意下さい. 改造は,あくまで自己責任でお願いします.

対応策

mod_davのソースを改造する.

httpd-2.2.6/modules/dav/fs/repos.c を,以下のように変更する.

repos.c の1508行目に以下の内容を挿入する

/* 2008.01.04 enable access symlinks */
if (fsctx->info1.finfo.filetype == APR_LNK) {
	status = apr_stat(&fsctx->info1.finfo, fsctx->path1.buf,
					  APR_FINFO_NORM, pool);
	if (status != APR_SUCCESS && status != APR_INCOMPLETE) {
		err = dav_new_error(pool, HTTP_NOT_FOUND, 0, NULL);
		break;
	}
}
修正内容をパッチファイルとして作成してみた.

filerepos.c-2.2.6_patch

このパッチを使えば,以下のような手順でパッチ適用,コンパイルを行える.

cd httpd-2.2.6/modules/dav/fs
patch repos.c repos.c-2.2.6_patch
cd ../../..
make

簡単に説明すると,ここはディレクトリ内の各ファイルについてのループであり,この1508行目以降でファイルの種別(APR_REG:通常ファイル,APR_DIR:ディレクトリ)に応じたファイルの認識を行っているのだが,現状シンボリックリンク(APR_LNK)の場合はここで認識されずにスキップされるという状態を,apr_stat()を呼び出して認識対象(fsctx->info1.finfo)をシンボリックリンクではなくシンボリックリンク先の情報に置き換えることで,スキップされずにシンボリックリンク先の実体に応じた認識が行われるようにしようという感じ.

apr_stat()関数はソースを見た感じでは,第3引数にAPR_FINFO_LINKのビットが立っていなければ,シンボリックリンクはリンク先の情報を見て返してくれるようなので,そうなる.

しかしこれで本当に全体がうまくいくのかどうかは,正直良くわからん...


© 2024 KMIソフトウェア