ProFTPD NLSTパッチ

※ ひととおり正常に動作することを確認していますが、このパッチは自己責任で使用してください。

ProFTPD バージョン1.2.10から、FFFTPでファイル一覧が見れない、という問題が発生するようになりました。
WEBで調べてみると、

・ProFTPD1.2.9までは、オプション付きの「NLST」コマンドをサポートしていたが、1.2.10からは規格(RFC959)に準拠するためNLSTのオプション指定をサポートしなくなった。
・FFFTPは標準設定では、「NLST -alL」を使用している。そのためファイル一覧が見れなくなる。
・FFFTPの設定を変更すれば、FFFTPでファイル一覧を見れるようになる。

とのことでした。
参考:http://www.itc.keio.ac.jp/ffftp.htm

いくら規格外とはいえ、大部分のユーザーが使用しているFFFTPを切り捨てるわけにはいきません。 また、いちいちユーザー側で設定を変更してもらうのも現実的ではありません。 WEBで調べてみたところ、http://blog.cles.jp/item/425 で、この問題を解決するパッチが紹介されていましたが、 すでにリンク切れだったので自分でパッチを作ることにしました。1.2.9以前のNLSTコマンドと同じ挙動をするようになります。

パッチのダウンロード
proftpd-1.2.10 用
proftpd-1.3.0rc1 用
proftpd-1.3.0rc2 用
proftpd-1.3.0rc3 用
proftpd-1.3.0rc4 用
proftpd-1.3.0rc5 用
proftpd-1.3.0 用
proftpd-1.3.0a 用
proftpd-1.3.1rc1 用
proftpd-1.3.1rc3 用
proftpd-1.3.1 用

使用法
# tar zxf proftpd-1.2.10.tar.gz
# patch -p0 < proftpd-1.2.10-nlst-ffftp.patch
# cd proftpd-1.2.10
# ./configure ・・・・

----------------------------------------------------------------------------------------------

さて、あまり評判が良くないProFTPD1.2.10ですが、色々調べているうちに分かったことを書きます。
まず、FTPでファイル一覧を取得するコマンドには、「LIST」と「NLST」があります。LISTは詳細なファイル一覧、NLSTはファイル名だけの一覧を返す、とされています。しかし、LISTに関してはどのようなファイル一覧を返すかは規格では定められていません。しかし一般的にUNIXの「ls -l」の形を返すようです。しかし、WindowsなどのOSでは「ls -l」に相当する情報を返せない場合もあるので、必要最低限の情報だけを返すNLSTというコマンドが用意されています。こちらはオプション無しの「ls」に相当します。
さて、問題となっているオプション付きのNLSTですが、たとえば「NLST -l」のようにNLSTコマンドにオプションをつけると、「ls -l」のように解釈しLISTと同様の詳細情報を返す、という動作が一般的のようです。FTPコマンドの解説などにもそう書かれているものがあります。しかしオプション付きのNLSTは、規格(RFC959)には準拠していないというのです。
ProFTPD1.2.10では、オプション付きNLSTはオプションが無視されるだけです。しかし、RC1まではオプション付きNLSTを使うと「501 NLST: Options not supported」というエラーが返ってくるようです。さすがに、規格外とはいえエラーはやりすぎだと思って修正したのでしょうか。しかし、FFFTPは「ls -l」のような詳細情報の形でないとファイル一覧が表示されないようです。
修正するファイルは、mod_ls.cです。このモジュールがLIST系のコマンドを担っているようです。まず、parse_list_opts関数を修正します。この関数がオプションを解析する部分のようですが、NLSTの場合はオプションフラグを1にしないようになっています。ここのifを取り除いてNLSTの場合でもフラグが立つようにします。次にls_nlst関数を修正します。この関数がNLSTコマンドで呼び出される本体のようです。1.2.9まではこの関数に、コマンドにオプションがある場合はgenericlist関数を呼び出す条件分岐がありましたが、1.2.10からは削除されています。1.2.9のls_nlstと見比べて同じ位置にgenericlist関数を呼び出す条件分岐を追加します。修正は以上です。とりあえず クライアントをFFFTPにした場合では正常に動作することを確認していますが、自己責任で使用してください。提案、問題報告などがありましたらご連絡してくれるとありがたいです。