SVX日記
2005-03-16(Wed) ftpdにインネンつけつつ、USB-シリアル変換基板完成
ココんトコ、仕事でFTPクライアントをチョロチョロと作っているのだが、散々テストして出したコードが、出先で動かんとの報告。むぅ。最近、どうもツイとらん。しかし、絶対にFTPデーモン側に問題があるに決まっとる、と天をも恐れぬ決めつけをしつつ、問題を洗うのである。
コードはPerlでNet::FTPモジュールを使用したもの。テストは主にCygwin上で行い、仕上げにSolaris8上で動かしたが、特に問題が生じたことはなかった。話によると問題はSolaris9で起きているらしい。ふーむ。Solaris9だからといって、動かないなどということがあるとは考えにくいのだが……。
しかし、実はFTP関連のRFCの内容は非常に曖昧であるという事実がある。FTP接続を確立し、転送するファイルの一覧を得たい場合、クライアントはFTPデーモンに対してLISTコマンドを発行するのだが、それだとファイル名しか得られない。パーミッションとかファイルサイズ、タイムスタンプなどの情報を得たい場合、RFCには確立された方法は規定されていないのである。いくらファイルシステムがOSに依存するモノだとはいえ、ファイルサイズくらいは得られてもバチは当たらないと思うのだが……。
確立された方法は規定されていないが、確立されていない方法は規定されている。それがNLSTコマンドである。NLSTコマンドを発行すると相手OSは'/bin/ls'相当のコマンドを実行し、結果をそのまま返してくる。接続元からすれば、相手OSのlsコマンドのフォーマットなんぞ知ったこっちゃないのだが、そういうモンらしい。
結局、原因は'NLST -al .'を実行した場合のFTPデーモンの挙動の違いにあった。実はSolaris9からはwu-ftpdという、Solaris8までとは異なるftpデーモンが搭載されていたのだ。Solaris8までのftpdは'NLST -al .'に対し、内部で'ls -al .'を実行し、その結果を返してくるのだが、wu-ftpdは'NLST -al .'に対し、ナゼか'ls -al *'相当を実行し、その結果を返してくるのである。そんなコトされたら、ディレクトリの中のファイルが全て表に出てきてしまうではないか。ぱきゅーん。
最終的には'NLST -al .'を'NLST -al'に修正して解決となった。そもそもドットが必要だったのかという問題はあろうが、wu-ftpdには'NLST -al .'を'ls -al *'と解釈してしまう合理的な説明をいただきたいところではある。ふもふも。