lib/ffi/stat/native.rb in ffi-libfuse-0.0.1.rctest12 vs lib/ffi/stat/native.rb in ffi-libfuse-0.1.0.rc20220550
- old
+ new
@@ -3,11 +3,10 @@
require 'ffi'
require_relative 'time_spec'
module FFI
class Stat
- # Native (and naked) stat from stat.h
# @!visibility private
class Native < Struct
case Platform::NAME
when 'x86_64-linux'
@@ -15,34 +14,65 @@
:st_ino, :ino_t,
:st_nlink, :nlink_t,
:st_mode, :mode_t,
:st_uid, :uid_t,
:st_gid, :gid_t,
- :__pad0, :int,
+ :__pad0, :uint,
:st_rdev, :dev_t,
:st_size, :off_t,
:st_blksize, :blksize_t,
:st_blocks, :blkcnt_t,
:st_atimespec, TimeSpec,
:st_mtimespec, TimeSpec,
- :st_ctimespec, TimeSpec
+ :st_ctimespec, TimeSpec,
+ :unused, [:long, 3]
- when 'x65_64-darwin'
+ [['', :string], ['l', :string], ['f', :int]].each do |(prefix, ftype)|
+ native_func = "native_#{prefix}stat".to_sym
+ lib_func = "#{prefix}stat".to_sym
+ begin
+ ::FFI::Stat.attach_function native_func, lib_func, [ftype, by_ref], :int
+ rescue FFI::NotFoundError
+ # gLibc 2.31 (Ubuntu focal) does not export these functions, it maps them to __xstat variants
+ native_xfunc = "native_#{prefix}xstat".to_sym
+ lib_xfunc = "__#{prefix}xstat".to_sym
+ ::FFI::Stat.attach_function native_xfunc, lib_xfunc, [:int, ftype, by_ref], :int
+ # 1 is 64 bit versions of struct stat, 3 is 32 bit
+ ::FFI::Stat.define_singleton_method(native_func) { |file, buf| send(native_xfunc, 1, file, buf) }
+ end
+ end
+
+ when 'x86_64-darwin', 'aarch64-darwin'
+ # man stat - this is stat with 64 bit inodes.
layout :st_dev, :dev_t,
- :st_ino, :uint32,
:st_mode, :mode_t,
:st_nlink, :nlink_t,
+ :st_ino, :ino_t,
:st_uid, :uid_t,
:st_gid, :gid_t,
:st_rdev, :dev_t,
:st_atimespec, TimeSpec,
:st_mtimespec, TimeSpec,
:st_ctimespec, TimeSpec,
+ :st_birthtimespec, TimeSpec,
:st_size, :off_t,
:st_blocks, :blkcnt_t,
:st_blksize, :blksize_t,
:st_flags, :uint32,
- :st_gen, :uint32
+ :st_gen, :uint32,
+ :st_lspare, :int32,
+ :st_gspare, :int64
+
+ begin
+ # TODO: these functions are deprecated, but at least on Cataline -> Monterey the old stat functions
+ # use the stat struct *without* 64 bit inodes, but macfuse is compiled with 64 bit inodes
+ ::FFI::Stat.attach_function :native_stat, :stat64, [:string, by_ref], :int
+ ::FFI::Stat.attach_function :native_lstat, :lstat64, [:string, by_ref], :int
+ ::FFI::Stat.attach_function :native_fstat, :fstat64, [:int, by_ref], :int
+ rescue FFI::NotFoundError
+ # these are only used in testing
+ end
+
else
raise NotImplementedError, "FFI::Stat not implemented for FFI::Platform #{Platform::NAME}"
end
end
end