Hi,

I'm trying to use getmntinfo on OSX (Snow leopard), but I can't seem to 
get meaningful data. The char fields tend to be blank or just not what I 
would expect.

I *think* I have the statfs struct declared properly, but it's possible 
I made a mistake somewhere. It's the same size at least. Any ideas?

Regards,

Dan

# getmntinfo.rb
require 'ffi'
require 'mkmf/lite'

class Filesystem
   extend FFI::Library
   extend Mkmf::Lite
   ffi_lib FFI::Library::LIBC

   attach_function(:getmntinfo, [:pointer, :int], :int)
   attach_function(:strerror, [:int], :string)

   class Statfs < FFI::Struct
     layout(
       :f_bsize, :uint32,
       :f_iosize, :int32,
       :f_blocks, :uint64,
       :f_bfree, :uint64,
       :f_bavail, :uint64,
       :f_files, :uint64,
       :f_ffree, :uint64,
       :f_fsid, [:int32,2],
       :f_owner, :int32,
       :f_type, :uint32,
       :f_flags, :uint32,
       :f_fssubtype, :uint32,
       :f_fstypename, [:char, 16],
       :f_mntonname, [:char, 1024],
       :f_mntfromname, [:char, 1024],
       :f_reserved, [:uint32, 8]
     )
   end

   # Both say 2168
   #p Statfs.size
   #p check_sizeof('struct statfs', 'sys/mount.h')

   def self.mounts
     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)

     0.upto(num-1){ |i|
       mnt = Statfs.new(ptr)
       #p mnt[:f_bsize]
       #p mnt[:f_iosize]
       #p mnt[:f_blocks]
       #p mnt[:f_bfree]
       #p mnt[:f_bavail]
       #p mnt[:f_files]
       #p mnt[:f_ffree]
       #p mnt[:f_fsid]
       #p mnt[:f_owner]
       #p mnt[:f_type]
       #p mnt[:f_flags]
       #p mnt[:f_fssubtype]
       p mnt[:f_fstypename]
       p mnt[:f_mntonname]
       p mnt[:f_mntfromname]
       p "=" * 40
       ptr += buf.size
     }
   end
end

Filesystem.mounts