From: nobu@... Date: 2016-06-27T12:02:22+00:00 Subject: [ruby-dev:49691] [Ruby trunk Bug#12520] CIFS raises Errno::EACCES for chown while UID not found in remote system Issue #12520 has been updated by Nobuyoshi Nakada. まぁそれはそれとして入れといていいんじゃないでしょうか。 そういう環境があるということであれば。 ---------------------------------------- Bug #12520: CIFS raises Errno::EACCES for chown while UID not found in remote system https://bugs.ruby-lang.org/issues/12520#change-59367 * Author: Akio Tajima * Status: Feedback * Priority: Normal * Assignee: Akio Tajima * ruby -v: * Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN ---------------------------------------- `FileUtils`を利用した`:preserve => true`の`cp_r`中に例外となります。(題名が真の原因かは不明。それ以外に思い当たる点がない) システムはDebian jessieです。 ~~~ Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) ~~~ 具体的には以下のようになりました。 ~~~ /usr/local/lib/ruby/2.3.0/fileutils.rb:1411:in `chown': Permission denied @ chown_internal - /mnt/media/Music2/iTunes/iTunes Music/Jeanette/Porque Te Vas/02 Porqué Te Vas_.m4a (Errno::EACCES) from /usr/local/lib/ruby/2.3.0/fileutils.rb:1411:in `copy_metadata' from /usr/local/lib/ruby/2.3.0/fileutils.rb:475:in `block in copy_entry' from /usr/local/lib/ruby/2.3.0/fileutils.rb:1504:in `wrap_traverse' from /usr/local/lib/ruby/2.3.0/fileutils.rb:1501:in `block in wrap_traverse' from /usr/local/lib/ruby/2.3.0/fileutils.rb:1500:in `each' from /usr/local/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse' from /usr/local/lib/ruby/2.3.0/fileutils.rb:1501:in `block in wrap_traverse' from /usr/local/lib/ruby/2.3.0/fileutils.rb:1500:in `each' from /usr/local/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse' from /usr/local/lib/ruby/2.3.0/fileutils.rb:469:in `copy_entry' from /usr/local/lib/ruby/2.3.0/fileutils.rb:444:in `block in cp_r' from /usr/local/lib/ruby/2.3.0/fileutils.rb:1571:in `block in fu_each_src_dest' ~~~ やりたいことはmtimeのコピーですが、`FileUtils.cp_r`では`:mtime`を個々のファイルごとに指定できないので`:preserve`を利用する以外に方法がありません(ここに別解があればそれでも良いのでBUGではなくMiscにしています)。 リファレンスによれば、`:preserve`は、 > ~~~ :preserve 真を指定すると更新時刻と、可能なら所有ユーザ・所有グループもコピーします。 ~~~ と、`chown`については努力目標となっています。 というわけで、以下のように`Errno::EACCES`も救済したいです。 ~~~diff --- devl/ruby-2.3.1/lib/fileutils.rb 2015-12-16 14:07:31.000000000 +0900 +++ /usr/local/lib/ruby/2.3.0/fileutils.rb 2016-06-26 20:24:57.552398812 +0900 @@ -1410,7 +1410,7 @@ module FileUtils else File.chown st.uid, st.gid, path end - rescue Errno::EPERM + rescue Errno::EPERM, Errno::EACCES # clear setuid/setgid if st.symlink? begin ~~~ よろしくお願いします。 -- https://bugs.ruby-lang.org/