ffi-libfuse 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/ffi/accessors.rb +418 -106
- data/lib/ffi/devt.rb +33 -7
- data/lib/ffi/flock.rb +31 -27
- data/lib/ffi/libfuse/adapter/context.rb +1 -1
- data/lib/ffi/libfuse/adapter/debug.rb +1 -1
- data/lib/ffi/libfuse/adapter/fuse2_compat.rb +7 -7
- data/lib/ffi/libfuse/adapter/fuse3_support.rb +7 -7
- data/lib/ffi/libfuse/adapter/interrupt.rb +1 -1
- data/lib/ffi/libfuse/adapter/pathname.rb +1 -1
- data/lib/ffi/libfuse/adapter/ruby.rb +1 -1
- data/lib/ffi/libfuse/adapter/safe.rb +1 -1
- data/lib/ffi/libfuse/filesystem/virtual_dir.rb +2 -2
- data/lib/ffi/libfuse/filesystem/virtual_file.rb +1 -1
- data/lib/ffi/libfuse/filesystem/virtual_link.rb +1 -1
- data/lib/ffi/libfuse/fuse3.rb +5 -5
- data/lib/ffi/libfuse/fuse_args.rb +9 -19
- data/lib/ffi/libfuse/fuse_cmdline_opts.rb +19 -16
- data/lib/ffi/libfuse/fuse_config.rb +25 -22
- data/lib/ffi/libfuse/fuse_conn_info.rb +1 -1
- data/lib/ffi/libfuse/fuse_context.rb +2 -1
- data/lib/ffi/libfuse/fuse_loop_config.rb +68 -20
- data/lib/ffi/libfuse/main.rb +7 -3
- data/lib/ffi/libfuse/test_helper.rb +4 -6
- data/lib/ffi/libfuse/version.rb +1 -1
- data/lib/ffi/stat.rb +16 -9
- data/lib/ffi/stat_vfs.rb +1 -2
- data/lib/ffi/struct_wrapper.rb +6 -4
- metadata +2 -2
@@ -1,43 +1,91 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../accessors'
|
4
|
+
require_relative '../boolean_int'
|
4
5
|
|
5
6
|
module FFI
|
6
7
|
module Libfuse
|
7
|
-
#
|
8
|
-
# int clone_fd;
|
9
|
-
# unsigned int max_idle_threads;
|
10
|
-
# };
|
8
|
+
# For native fuse_loop_mt only
|
11
9
|
class FuseLoopConfig < FFI::Struct
|
12
10
|
include(FFI::Accessors)
|
13
11
|
|
14
|
-
|
15
|
-
clone_fd: :int,
|
16
|
-
max_idle: :int
|
17
|
-
)
|
18
|
-
|
19
|
-
# @!attribute [rw] clone_fd
|
12
|
+
# @!attribute [w] clone_fd?
|
20
13
|
# whether to use separate device fds for each thread (may increase performance)
|
21
14
|
# Unused by ffi-libfuse as we do not call fuse_loop_mt
|
22
15
|
# @return [Boolean]
|
23
|
-
ffi_attr_reader(:clone_fd) do |v|
|
24
|
-
v != 0
|
25
|
-
end
|
26
|
-
|
27
|
-
ffi_attr_writer(:clone_fd) do |v|
|
28
|
-
v ? 1 : 0
|
29
|
-
end
|
30
16
|
|
31
|
-
# @!attribute [
|
17
|
+
# @!attribute [w] max_idle_threads
|
32
18
|
# The maximum number of available worker threads before they start to get deleted when they become idle. If not
|
33
19
|
# specified, the default is 10.
|
34
20
|
#
|
35
21
|
# Adjusting this has performance implications; a very small number of threads in the pool will cause a lot of
|
36
22
|
# thread creation and deletion overhead and performance may suffer. When set to 0, a new thread will be created
|
37
23
|
# to service every operation.
|
38
|
-
#
|
24
|
+
# @deprecated at Fuse 3.12. Use max_threads instead
|
39
25
|
# @return [Integer] the maximum number of threads to leave idle
|
40
|
-
|
26
|
+
|
27
|
+
# @!attribute [w] max_threads
|
28
|
+
# @return [Integer]
|
29
|
+
# @since Fuse 3.12
|
30
|
+
|
31
|
+
if FUSE_VERSION >= 312
|
32
|
+
layout(
|
33
|
+
version_id: :int,
|
34
|
+
clone_fd: :bool_int,
|
35
|
+
max_idle_threads: :uint,
|
36
|
+
max_threads: :uint
|
37
|
+
)
|
38
|
+
|
39
|
+
Libfuse.attach_function :fuse_loop_cfg_create, [], by_ref
|
40
|
+
Libfuse.attach_function :fuse_loop_cfg_destroy, [:pointer], :void
|
41
|
+
|
42
|
+
ffi_attr_reader(:clone_fd?)
|
43
|
+
Libfuse.attach_function :fuse_loop_cfg_set_clone_fd, %i[pointer uint], :void
|
44
|
+
def clone_fd=(bool_val)
|
45
|
+
Libfuse.fuse_loop_cfg_set_clone_fd(to_ptr, bool_val ? 1 : 0)
|
46
|
+
end
|
47
|
+
|
48
|
+
ffi_attr_reader(:max_idle_threads)
|
49
|
+
Libfuse.attach_function :fuse_loop_cfg_set_idle_threads, %i[pointer uint], :uint
|
50
|
+
def max_idle_threads=(val)
|
51
|
+
Libfuse.fuse_loop_cfg_set_idle_threads(to_ptr, val) if val
|
52
|
+
end
|
53
|
+
|
54
|
+
Libfuse.attach_function :fuse_loop_cfg_set_max_threads, %i[pointer uint], :uint
|
55
|
+
ffi_attr_reader(:max_threads)
|
56
|
+
def max_threads=(val)
|
57
|
+
Libfuse.fuse_loop_cfg_set_max_threads(to_ptr, val) if val
|
58
|
+
end
|
59
|
+
|
60
|
+
class << self
|
61
|
+
def create(max_idle_threads: nil, max_threads: 10, clone_fd: false, **_)
|
62
|
+
cfg = Libfuse.fuse_loop_cfg_create
|
63
|
+
ObjectSpace.define_finalizer(cfg, finalizer(cfg.to_ptr))
|
64
|
+
cfg.clone_fd = clone_fd
|
65
|
+
cfg.max_idle_threads = max_idle_threads if max_idle_threads
|
66
|
+
cfg.max_threads = max_threads if max_threads
|
67
|
+
cfg
|
68
|
+
end
|
69
|
+
|
70
|
+
def finalizer(ptr)
|
71
|
+
proc { |_| Libfuse.fuse_loop_cfg_destroy(ptr) }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
else
|
75
|
+
layout(
|
76
|
+
clone_fd: :bool_int,
|
77
|
+
max_idle_threads: :uint
|
78
|
+
)
|
79
|
+
|
80
|
+
ffi_attr_accessor(:clone_fd?)
|
81
|
+
ffi_attr_accessor(:max_idle_threads)
|
82
|
+
|
83
|
+
class << self
|
84
|
+
def create(clone_fd: false, max_idle_threads: 10, **_)
|
85
|
+
new.fill(max_idle_threads: max_idle_threads, clone_fd: clone_fd)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
41
89
|
end
|
42
90
|
end
|
43
91
|
end
|
data/lib/ffi/libfuse/main.rb
CHANGED
@@ -189,12 +189,16 @@ module FFI
|
|
189
189
|
# @!method fuse_traps
|
190
190
|
# @abstract
|
191
191
|
# Passed to {FuseCommon#run} to allow filesystem to handle custom signal traps. These traps
|
192
|
-
# are merged over those from {FuseCommon#default_traps}
|
193
|
-
#
|
192
|
+
# are merged over those from {FuseCommon#default_traps}. A nil value can be used to avoid a default trap
|
193
|
+
# being set.
|
194
|
+
# @return [Hash<String|Symbol|Integer,String|Proc|nil>]
|
194
195
|
# map of signal name or number to signal handler as per Signal.trap
|
195
196
|
# @example
|
196
197
|
# def fuse_traps
|
197
|
-
# {
|
198
|
+
# {
|
199
|
+
# HUP: ->() { reload() },
|
200
|
+
# INT: nil
|
201
|
+
# }
|
198
202
|
# end
|
199
203
|
|
200
204
|
# @!method fuse_version
|
@@ -73,7 +73,7 @@ module FFI
|
|
73
73
|
return [o, e, s.exitstatus] unless err
|
74
74
|
|
75
75
|
warn "Errors\n#{e}" unless e.empty?
|
76
|
-
warn "Output\n#{o}" unless o.empty?
|
76
|
+
warn "Output\n#{o}" unless o.empty?
|
77
77
|
raise err
|
78
78
|
end
|
79
79
|
|
@@ -87,7 +87,7 @@ module FFI
|
|
87
87
|
if mac_fuse?
|
88
88
|
system("diskutil unmount force #{mnt} >/dev/null 2>&1")
|
89
89
|
else
|
90
|
-
system("fusermount -zu #{mnt} >/dev/null 2>&1")
|
90
|
+
system("fusermount#{FUSE_MAJOR_VERSION == 3 ? '3' : ''} -zu #{mnt} >/dev/null 2>&1")
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
@@ -107,10 +107,8 @@ module FFI
|
|
107
107
|
private
|
108
108
|
|
109
109
|
def open3_filesystem(args, env, filesystem, fsname, mnt)
|
110
|
-
if
|
111
|
-
|
112
|
-
Open3.capture3(env, 'bundle', 'exec', filesystem.to_s, mnt, "-ofsname=#{fsname}", *args, binmode: true)
|
113
|
-
end
|
110
|
+
if ENV['BUNDLER_GEMFILE']
|
111
|
+
Open3.capture3(env, 'bundle', 'exec', filesystem.to_s, mnt, "-ofsname=#{fsname}", *args, binmode: true)
|
114
112
|
else
|
115
113
|
Open3.capture3(env, filesystem.to_s, mnt, "-ofsname=#{fsname}", *args, binmode: true)
|
116
114
|
end
|
data/lib/ffi/libfuse/version.rb
CHANGED
data/lib/ffi/stat.rb
CHANGED
@@ -34,9 +34,9 @@ module FFI
|
|
34
34
|
int_members = Native
|
35
35
|
.members
|
36
36
|
.select { |m| m.to_s.start_with?('st_') && !m.to_s.end_with?('timespec') }
|
37
|
-
.
|
37
|
+
.to_h { |m| [:"#{m[3..]}", m] }
|
38
38
|
|
39
|
-
ffi_attr_accessor(
|
39
|
+
ffi_attr_accessor(**int_members)
|
40
40
|
|
41
41
|
# @!attribute [rw] atime
|
42
42
|
# @return [Time] time of last access
|
@@ -47,12 +47,13 @@ module FFI
|
|
47
47
|
# @!attribute [rw] ctime
|
48
48
|
# @return [Time] time of last status change
|
49
49
|
|
50
|
-
time_members = Native.members.select { |m| m.to_s =~ /^st_.*timespec$/ }.
|
50
|
+
time_members = Native.members.select { |m| m.to_s =~ /^st_.*timespec$/ }.to_h { |m| [:"#{m[3..-5]}", m] }
|
51
51
|
|
52
|
-
ffi_attr_reader(
|
52
|
+
ffi_attr_reader(**time_members, &:time)
|
53
53
|
|
54
|
-
|
55
|
-
|
54
|
+
ffi_attr_writer_method(**time_members) do |sec, nsec = 0|
|
55
|
+
_attr, member = ffi_attr_writer_member(__method__)
|
56
|
+
self[member].set_time(sec, nsec)
|
56
57
|
end
|
57
58
|
|
58
59
|
# Fill content for a regular file
|
@@ -164,16 +165,22 @@ module FFI
|
|
164
165
|
end
|
165
166
|
|
166
167
|
class << self
|
167
|
-
# @!method file(
|
168
|
+
# @!method file(**fields)
|
168
169
|
# @return [Stat]
|
169
170
|
# @raise [SystemCallError]
|
170
171
|
# @see Stat#file
|
171
172
|
|
172
|
-
# @!method dir(
|
173
|
+
# @!method dir(**fields)
|
173
174
|
# @return [Stat]
|
174
175
|
# @raise [SystemCallError]
|
175
176
|
# @see Stat#dir
|
176
|
-
|
177
|
+
|
178
|
+
# @!method symlink(**fields)
|
179
|
+
# @return [Stat]
|
180
|
+
# @raise [SystemCallError]
|
181
|
+
# @see Stat#symlink
|
182
|
+
|
183
|
+
%i[file dir symlink].each { |m| define_method(m) { |stat = new, **args| stat.send(m, **args) } }
|
177
184
|
alias directory dir
|
178
185
|
|
179
186
|
# @!method from(file, stat = new(), follow: false)
|
data/lib/ffi/stat_vfs.rb
CHANGED
@@ -75,8 +75,7 @@ module FFI
|
|
75
75
|
# @!attribute [rw] namemax
|
76
76
|
# @return [Integer] Maximum filename length
|
77
77
|
|
78
|
-
|
79
|
-
ffi_attr_accessor(*int_members, format: 'f_%s')
|
78
|
+
ffi_attr_accessor(**members.grep(/^f_/).to_h { |m| [m[2..].to_sym, m] })
|
80
79
|
|
81
80
|
extend FFI::Library
|
82
81
|
ffi_lib FFI::Library::LIBC
|
data/lib/ffi/struct_wrapper.rb
CHANGED
@@ -27,13 +27,13 @@ module FFI
|
|
27
27
|
return Pointer::NULL if value.nil?
|
28
28
|
|
29
29
|
value = value.native if value.is_a?(StructWrapper)
|
30
|
-
super
|
30
|
+
super
|
31
31
|
end
|
32
32
|
|
33
33
|
def from_native(value, ctx)
|
34
34
|
return nil if value.null?
|
35
35
|
|
36
|
-
native = super
|
36
|
+
native = super
|
37
37
|
@wrapper_class.new(native)
|
38
38
|
end
|
39
39
|
end
|
@@ -100,12 +100,14 @@ module FFI
|
|
100
100
|
|
101
101
|
# Get attribute
|
102
102
|
def [](member_or_attr)
|
103
|
-
|
103
|
+
_attr, member = ffi_attr_reader_member(member_or_attr, member_or_attr)
|
104
|
+
@native[member]
|
104
105
|
end
|
105
106
|
|
106
107
|
# Set attribute
|
107
108
|
def []=(member_or_attr, val)
|
108
|
-
|
109
|
+
_attr, member = ffi_attr_writer_member(member_or_attr, member_or_attr)
|
110
|
+
@native[member] = val
|
109
111
|
end
|
110
112
|
|
111
113
|
# Pass unimplemented methods on to {#native} underlying struct
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-libfuse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Grant Gardner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|