110 lines
2.3 KiB
Ruby
110 lines
2.3 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Zip
|
||
|
module FileSystem
|
||
|
class File # :nodoc:all
|
||
|
class Stat # :nodoc:all
|
||
|
class << self
|
||
|
def delegate_to_fs_file(*methods)
|
||
|
methods.each do |method|
|
||
|
class_eval <<-END_EVAL, __FILE__, __LINE__ + 1
|
||
|
def #{method} # def file?
|
||
|
@zip_fs_file.#{method}(@entry_name) # @zip_fs_file.file?(@entry_name)
|
||
|
end # end
|
||
|
END_EVAL
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def initialize(zip_fs_file, entry_name)
|
||
|
@zip_fs_file = zip_fs_file
|
||
|
@entry_name = entry_name
|
||
|
end
|
||
|
|
||
|
def kind_of?(type)
|
||
|
super || type == ::File::Stat
|
||
|
end
|
||
|
|
||
|
delegate_to_fs_file :file?, :directory?, :pipe?, :chardev?, :symlink?,
|
||
|
:socket?, :blockdev?, :readable?, :readable_real?, :writable?, :ctime,
|
||
|
:writable_real?, :executable?, :executable_real?, :sticky?, :owned?,
|
||
|
:grpowned?, :setuid?, :setgid?, :zero?, :size, :size?, :mtime, :atime
|
||
|
|
||
|
def blocks
|
||
|
nil
|
||
|
end
|
||
|
|
||
|
def get_entry
|
||
|
@zip_fs_file.__send__(:get_entry, @entry_name)
|
||
|
end
|
||
|
private :get_entry
|
||
|
|
||
|
def gid
|
||
|
e = get_entry
|
||
|
if e.extra.member? 'IUnix'
|
||
|
e.extra['IUnix'].gid || 0
|
||
|
else
|
||
|
0
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def uid
|
||
|
e = get_entry
|
||
|
if e.extra.member? 'IUnix'
|
||
|
e.extra['IUnix'].uid || 0
|
||
|
else
|
||
|
0
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def ino
|
||
|
0
|
||
|
end
|
||
|
|
||
|
def dev
|
||
|
0
|
||
|
end
|
||
|
|
||
|
def rdev
|
||
|
0
|
||
|
end
|
||
|
|
||
|
def rdev_major
|
||
|
0
|
||
|
end
|
||
|
|
||
|
def rdev_minor
|
||
|
0
|
||
|
end
|
||
|
|
||
|
def ftype
|
||
|
if file?
|
||
|
'file'
|
||
|
elsif directory?
|
||
|
'directory'
|
||
|
else
|
||
|
raise StandardError, 'Unknown file type'
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def nlink
|
||
|
1
|
||
|
end
|
||
|
|
||
|
def blksize
|
||
|
nil
|
||
|
end
|
||
|
|
||
|
def mode
|
||
|
e = get_entry
|
||
|
if e.fstype == 3
|
||
|
e.external_file_attributes >> 16
|
||
|
else
|
||
|
33_206 # 33206 is equivalent to -rw-rw-rw-
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|