def self.mounts
array = block_given? ? nil : []
if respond_to?(:getmntinfo, true)
buf = FFI::MemoryPointer.new(:pointer)
num = getmntinfo(buf, 2)
if num == 0
raise Error, 'getmntinfo() function failed: ' + strerror(FFI.errno)
end
ptr = buf.get_pointer(0)
num.times{ |i|
mnt = Statfs.new(ptr)
obj = Sys::Filesystem::Mount.new
obj.name = mnt[:f_mntfromname].to_s
obj.mount_point = mnt[:f_mntonname].to_s
obj.mount_type = mnt[:f_fstypename].to_s
string = ""
flags = mnt[:f_flags] & MNT_VISFLAGMASK
@@opt_names.each{ |key,val|
if flags & key > 0
if string.empty?
string << val
else
string << ", #{val}"
end
end
flags &= ~key
}
obj.options = string
if block_given?
yield obj.freeze
else
array << obj.freeze
end
ptr += Statfs.size
}
else
begin
if respond_to?(:setmntent, true)
fp = setmntent(MOUNT_FILE, 'r')
else
fp = fopen(MOUNT_FILE, 'r')
end
if RbConfig::CONFIG['host_os'] =~ /sunos|solaris/i
mt = Mnttab.new
while getmntent(fp, mt) == 0
obj = Sys::Filesystem::Mount.new
obj.name = mt[:mnt_special].to_s
obj.mount_point = mt[:mnt_mountp].to_s
obj.mount_type = mt[:mnt_fstype].to_s
obj.options = mt[:mnt_mntopts].to_s
obj.mount_time = Time.at(Integer(mt[:mnt_time]))
if block_given?
yield obj.freeze
else
array << obj.freeze
end
end
else
while ptr = getmntent(fp)
break if ptr.null?
mt = Mntent.new(ptr)
obj = Sys::Filesystem::Mount.new
obj.name = mt[:mnt_fsname]
obj.mount_point = mt[:mnt_dir]
obj.mount_type = mt[:mnt_type]
obj.options = mt[:mnt_opts]
obj.mount_time = nil
obj.dump_frequency = mt[:mnt_freq]
obj.pass_number = mt[:mnt_passno]
if block_given?
yield obj.freeze
else
array << obj.freeze
end
end
end
ensure
if fp && !fp.null?
if respond_to?(:endmntent, true)
endmntent(fp)
else
fclose(fp)
end
end
end
end
array
end