HTTP_WebDAV_Client

今、構築しているシステムでWebDAVファイルサーバーに諸々のデータをおいてPHPからはPEAR:HTTP_WebDAV_Clientを使ってアクセスする仕組みを作っています。各メンバのローカルの開発環境やステージング環境でWebDAVサーバーを用意するのもなかなか面倒だなぁ。という事で、開発環境はローカルファイルシステム、ステージングと本番環境はWebDAVに同じI/Fでアクセス出来るようなラッパーを書きました。

で、ガリガリUTを書いてテストをしていた所、どうもUNLOCKが正常に動作していない様です。

HTTP_WebDAV_Clientのソースにログを仕込んだりして色々調べた所、flockのmodeにLOCK_UN(0x3)を指定しているにも関わらずstream_lockには0x8が渡ってきます。以下の様に直すと問題なくUNLOCK出来る様です。


PEAR/WebDAV/Client/Stream.php

//case LOCK_UN:
case 0x8:


とりあえず動く様にはなったのですが、気持ち悪いのでPHPのソースを追っかけてみた所、こんな記述が。。。


php-5.2.5/ext/standard/file.c

321 static int flock_values[] = { LOCK_SH, LOCK_EX, LOCK_UN };
322
323 PHP_FUNCTION(flock)
324 {
325 zval *arg1, *arg3 = NULL;
326 int act;
327 php_stream *stream;
328 long operation = 0;
329
snip...
347 /* flock_values contains all possible actions if (operation & 4) we won't block on the
lock */
348 act = flock_values[act - 1] | (operation & 4 ? LOCK_NB : 0);
349 if (php_stream_lock(stream, act)) {


なんと、stream_lockに渡すactはPHP内部で定義されているLOCK_UN(0x3)ではなくで定義されているLOCK_UN(0x08)に書き換えられています( ̄Д ̄;) ガーン

ひとまずHTTP_WebDAV_Clientにパッチをあてて対応しましたが、これってPHP本体の問題だよなぁ。。。
既知の問題なのかな?バグレポート上げるべきなのだろうか(^^;?