Journal InTime


2015-09-12 (Sat) [長年日記]

_ Net::FTP#mlst, mlsdの追加

RFC 3659で追加されたMLST/MLSD(機械処理用のリストコマンド)を実装してみた。 trunkでは以下のようなコードが動くはず。

ftp = Net::FTP.new
ftp.connect("localhost")
ftp.login
p ftp.mlst("welcome.msg")
#=> #<struct Net::FTP::MLSxEntry facts={"modify"=>2013-12-20 18:07:33 UTC, "perm"=>"adfr", "size"=>170, "type"=>"file", "unique"=>"FC00U1E554B", "unix.group"=>"0", "unix.mode"=>"0644", "unix.owner"=>"122"}, pathname="/welcome.msg">
p ftp.mlsd("/")
#=> [#<struct Net::FTP::MLSxEntry facts={"modify"=>2015-09-12 03:59:29 UTC, "perm"=>"flcdmpe", "type"=>"cdir", "unique"=>"FC00U1E554A", "unix.group"=>"65534", "unix.mode"=>"0755", "unix.owner"=>"122"}, pathname=".">, #<struct Net::FTP::MLSxEntry facts={"modify"=>2013-12-20 18:07:33 UTC, "perm"=>"adfr", "size"=>170, "type"=>"file", "unique"=>"FC00U1E554B", "unix.group"=>"0", "unix.mode"=>"0644", "unix.owner"=>"122"}, pathname="welcome.msg">, #<struct Net::FTP::MLSxEntry facts={"modify"=>2015-09-12 03:59:29 UTC, "perm"=>"flcdmpe", "type"=>"pdir", "unique"=>"FC00U1E554A", "unix.group"=>"65534", "unix.mode"=>"0755", "unix.owner"=>"122"}, pathname="..">]

LISTと違ってサーバから返される情報が環境に依存しないので幸せになれるはずだったけど、試してみると以下のような問題があった。

  • そもそもvsftpdでサポートされてない。例えばftp.ruby-lang.orgでは使えない。
  • ProFTPDのMLSTレスポンスの2行目はなぜか250-で始まる(RFC 3659では空白で始まるように規定されているのに)。
  • システム依存のfact(sizeなどのファイル属性)はIANAに登録されることになっているが、 IANAのサイトのOS Specific Fact Namesを見ると、Unix.ctimeとUnix.atimeしか登録されていない。 RFC 3659の例にあるUnix.modeさえ登録されてないのはどうなの?

まあ、そういう自分も2007年に出たRFCの実装を今ごろしているわけだけど。

Tags: Ruby