ログをもらうとログイン、ファイル一覧の取得は「226 Transfer complete.」となっていて正常に完了した様子。
ブラウザからFTPプロトコルで接続してみるとファイル名が時刻や年と一緒になった「2007 hoge」のような名前になっている。
取得してきたファイル一覧をうまく解釈できていないよう。
そこで、正常にアクセスできる同環境のftpdとファイル一覧の形式を比べてみた。
問題になっているftpdは
-rw-r--r-- 1 root wheel 93 3 22 20:27 filename
という形式で、正常なftpdは
-rw-r--r-- 1 root wheel 93 Oct 23 2006 filename
という形式になっている。
もっと大胆に崩れているかと思ったけど、月の表示形式が名称の短縮名になっているか否かぐらいしか違いがない。
FTPのLISTコマンドはサーバ側の/bin/ls -lの出力に依存する。
サーバ側でls -lとすると月が数字で表示された。
これを短縮名で表示させるにはどうしたらいいだろうか。
ちょうどIRCで話していた経験者に聞くとローケルによって変わると教えてくれた。
そのときは一般ユーザからsuしたのでLC_ALL=ja_JP.eucJPになっていた。
# unsetenv LC_ALL && ls -l
としてみると短縮名で表示されるようになった。
と、そこで
# /etc/rc.d/inetd restart
としたことを思い出した。
つまり、環境変数は親プロセスから子プロセスに引き継がれるので、LC_ALLが一般ユーザ→ルート→inetd→ftpdと引き継がれて/bin/ls -lの出力をクライアントの対応していない形式にしてしまったということだった。
# (unsetenv LC_ALL; /etc/rc.d/inetd restart)
とすると問題は解決した。
]]>/libexec/ld-elf.so.1: /usr/local/lib/libsqlite3.so.8: Undefined symbol "pthread_create"
というエラーを吐いて先に進めない。
実行プログラムの形式にELFを採用しているOSではLD_PRELOADという環境変数を設定しておくと、
指定したライブラリを他のライブラリより先にロードしておくことができるらしい。
これを使って任意の関数を上書きしたりできるそう。
>setenv LD_PRELOAD /usr/lib/libpthread.so.2 >./mt-db2sql.cgi
とすると問題なく実行できた。
MovableTypeで使うデータベースをSQLiteに設定してブラウザからアクセスしてみると、
Internal Server Errorが。
エラーログをみると例のエラー、当然か。
CGI実行時にApacheから環境変数を設定できればいいんだろうなと思って調べてみると、
mod_envというのがあるらしい。Apacheを入れたときにデフォルトでロードするようになっていた。
httpd.confに
SetEnv LD_PRELOAD /usr/lib/libpthread.so.2
のようにSetEnvディレクトリを書く。
ブラウザからアクセスすると問題なく動いた。