selinux が原因だったので、 is_writable の実装探しの旅に出ても結局分からなかったと思われる。
が、気になったので、実装探しの旅に出てみることにした。
emacs + cscope で読むことにする。
php のソースコードを展開して、cscope のファイルを作成。
1 2 3 | $ cd php-5.3.8 $ find ./ -name "*.h" -or -name "*.c" > cscope.files $ cscope -b -q -k |
まぁそう簡単には見つからない。M-x cscope-find-this-symbol is_writable でいくつか候補が。
その中でそれっぽいのが、
1 2 3 4 5 | *** ext/standard/php_filestat.h: <global>[39] PHP_FUNCTION(is_writable); ... *** ext/standard/basic_functions.c: ZEND_END_ARG_INFO[3194] PHP_FE(is_writable, arginfo_is_writable) |
宣言っぽいほうを追っていくと
1 | #define ZEND_FN(name) zif_##name |
次に定義っぽい方を追っていくと、
1 2 3 | const zend_function_entry basic_functions[] = { /* {{{ */ [snip] PHP_FE(is_writable, arginfo_is_writable) |
関数ポインタを持った構造体の配列?これを追うのは大変そうだ・・・そもそもの仕組み知らないし・・・呼び出し元が探せない・・・
という訳で、GDB でステップ実行してみることに。
http://d.hatena.ne.jp/anatoo/20111117/1321463886
を参考にまず、まずコンパイル。
1 2 | $ ./configure --disable-all --enable-debug $ make |
1 2 | <?php echo is_writable ( '/usr/local/etc/pgpool.conf' ); |
1 2 3 4 | $ gdb sapi/cli/php (gdb) break zif_is_writable Breakpoint 1 at 0x509b30: file /usr/local/src/php-5.3.8/ext/standard/filestat.c, line 1092. (gdb) run ~/test_is_writable.php |
ext/standard/filestat.c:782 の php_stat が実装のようだ。
さらに入っていくと、
1 2 | eck_open_basedir_ex (path=0xb03350 "/usr/local/etc/pgpool.conf", warn=1) at /usr/local/src/php-5.3.8/main/fopen_wrappers.c:297 |
1 | if (PG(open_basedir) && *PG(open_basedir)) { |
PG の定義は、
1 2 | # define PG(v) (core_globals.v) extern ZEND_API struct _php_core_globals core_globals; |
が、open_basedir が分からない。
ググッて見ると、php.ini にそういう項目があるようだ。
このあたりをいじればいけるかと思ったがそうでもなかった。
テストスクリプトだと true となるのでこのあたりで断念。
結局追えなかった・・・
0 件のコメント:
コメントを投稿