[ruby/fileutils] Make copy methods handle FIFOs and UNIX sockets
Previously, this was broken. Trying to copy a FIFO would raise a NoMethodError if File.mkfifo was defined. Trying to copy a UNIX socket would raise a RuntimeError as File.mknod is not something Ruby defines. Handle the FIFO issue using File.mkfifo instead of mkfifo. Handle the UNIX Socket issue by creating a unix socket. Continue to not support character or block devices, raising a RuntimeError for both. Add tests for FIFO, UNIX Socket, and character/block devices. https://github.com/ruby/fileutils/commit/123903532d
This commit is contained in:
parent
366dd9d803
commit
1d99163aa5
@ -1383,18 +1383,21 @@ module FileUtils
|
|||||||
end
|
end
|
||||||
when symlink?
|
when symlink?
|
||||||
File.symlink File.readlink(path()), dest
|
File.symlink File.readlink(path()), dest
|
||||||
when chardev?
|
when chardev?, blockdev?
|
||||||
raise "cannot handle device file" unless File.respond_to?(:mknod)
|
raise "cannot handle device file"
|
||||||
mknod dest, ?c, 0666, lstat().rdev
|
|
||||||
when blockdev?
|
|
||||||
raise "cannot handle device file" unless File.respond_to?(:mknod)
|
|
||||||
mknod dest, ?b, 0666, lstat().rdev
|
|
||||||
when socket?
|
when socket?
|
||||||
raise "cannot handle socket" unless File.respond_to?(:mknod)
|
begin
|
||||||
mknod dest, nil, lstat().mode, 0
|
require 'socket'
|
||||||
|
rescue LoadError
|
||||||
|
raise "cannot handle socket"
|
||||||
|
else
|
||||||
|
raise "cannot handle socket" unless defined?(UNIXServer)
|
||||||
|
end
|
||||||
|
UNIXServer.new(dest).close
|
||||||
|
File.chmod lstat().mode, dest
|
||||||
when pipe?
|
when pipe?
|
||||||
raise "cannot handle FIFO" unless File.respond_to?(:mkfifo)
|
raise "cannot handle FIFO" unless File.respond_to?(:mkfifo)
|
||||||
mkfifo dest, 0666
|
File.mkfifo dest, lstat().mode
|
||||||
when door?
|
when door?
|
||||||
raise "cannot handle door: #{path()}"
|
raise "cannot handle door: #{path()}"
|
||||||
else
|
else
|
||||||
|
@ -440,6 +440,34 @@ class TestFileUtils < Test::Unit::TestCase
|
|||||||
}
|
}
|
||||||
end if have_symlink? and !no_broken_symlink?
|
end if have_symlink? and !no_broken_symlink?
|
||||||
|
|
||||||
|
def test_cp_r_fifo
|
||||||
|
Dir.mkdir('tmp/cpr_src')
|
||||||
|
File.mkfifo 'tmp/cpr_src/fifo', 0600
|
||||||
|
cp_r 'tmp/cpr_src', 'tmp/cpr_dest'
|
||||||
|
assert_equal(true, File.pipe?('tmp/cpr_dest/fifo'))
|
||||||
|
end if File.respond_to?(:mkfifo)
|
||||||
|
|
||||||
|
def test_cp_r_dev
|
||||||
|
devs = Dir['/dev/*']
|
||||||
|
chardev = Dir['/dev/*'].find{|f| File.chardev?(f)}
|
||||||
|
blockdev = Dir['/dev/*'].find{|f| File.blockdev?(f)}
|
||||||
|
Dir.mkdir('tmp/cpr_dest')
|
||||||
|
assert_raise(RuntimeError) { cp_r chardev, 'tmp/cpr_dest/cd' }
|
||||||
|
assert_raise(RuntimeError) { cp_r blockdev, 'tmp/cpr_dest/bd' }
|
||||||
|
end
|
||||||
|
|
||||||
|
begin
|
||||||
|
require 'socket'
|
||||||
|
rescue LoadError
|
||||||
|
else
|
||||||
|
def test_cp_r_socket
|
||||||
|
Dir.mkdir('tmp/cpr_src')
|
||||||
|
UNIXServer.new('tmp/cpr_src/socket').close
|
||||||
|
cp_r 'tmp/cpr_src', 'tmp/cpr_dest'
|
||||||
|
assert_equal(true, File.socket?('tmp/cpr_dest/socket'))
|
||||||
|
end if defined?(UNIXServer)
|
||||||
|
end
|
||||||
|
|
||||||
def test_cp_r_pathname
|
def test_cp_r_pathname
|
||||||
# pathname
|
# pathname
|
||||||
touch 'tmp/cprtmp'
|
touch 'tmp/cprtmp'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user