rbmount 0.0.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.
- data/lib/rbmount.rb +28 -0
- data/lib/rbmount/c.rb +399 -0
- data/lib/rbmount/cache.rb +76 -0
- data/lib/rbmount/context.rb +343 -0
- data/lib/rbmount/fs.rb +234 -0
- data/lib/rbmount/iterator.rb +48 -0
- data/lib/rbmount/lock.rb +51 -0
- data/lib/rbmount/mount.rb +103 -0
- data/lib/rbmount/string.rb +166 -0
- data/lib/rbmount/table.rb +188 -0
- data/lib/rbmount/update.rb +73 -0
- metadata +86 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft shura. [ shura1991@gmail.com ]
|
3
|
+
#
|
4
|
+
# This file is part of rbmount.
|
5
|
+
#
|
6
|
+
# rbmount is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# rbmount is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with rbmount. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
require 'rbmount/c'
|
21
|
+
|
22
|
+
module Mount
|
23
|
+
class Iterator
|
24
|
+
def initialize (direction)
|
25
|
+
@pointer = Mount::C.mnt_new_iter(direction)
|
26
|
+
raise if @pointer.null?
|
27
|
+
|
28
|
+
ObjectSpace.define_finalizer(self, method(:finalize))
|
29
|
+
end
|
30
|
+
|
31
|
+
def direction
|
32
|
+
Mount::C.mnt_iter_get_direction(@pointer)
|
33
|
+
end
|
34
|
+
|
35
|
+
def reset
|
36
|
+
Mount::C.mnt_reset_iter(@pointer)
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def finalize (id=nil)
|
41
|
+
Mount::C.mnt_free_iter(@pointer)
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_c
|
45
|
+
@pointer
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/rbmount/lock.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft shura. [ shura1991@gmail.com ]
|
3
|
+
#
|
4
|
+
# This file is part of rbmount.
|
5
|
+
#
|
6
|
+
# rbmount is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# rbmount is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with rbmount. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
require 'rbmount/c'
|
21
|
+
|
22
|
+
module Mount
|
23
|
+
class Lock
|
24
|
+
def initialize (datafile, id)
|
25
|
+
@pointer = Mount::C.mnt_new_lock(datafile, id)
|
26
|
+
raise unless @pointer
|
27
|
+
|
28
|
+
ObjectSpace.define_finalizer(self, method(:finalize))
|
29
|
+
end
|
30
|
+
|
31
|
+
def lock_file
|
32
|
+
Mount::C.mnt_lock_file(@pointer)
|
33
|
+
end
|
34
|
+
|
35
|
+
def unlock_file
|
36
|
+
Mount::C.mnt_unlock_file(@pointer)
|
37
|
+
end
|
38
|
+
|
39
|
+
def block_signals
|
40
|
+
Mount::C.mnt_lock_block_signals(@pointer)
|
41
|
+
end
|
42
|
+
|
43
|
+
def finalize
|
44
|
+
Mount::C.mnt_free_lock(@pointer)
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_c
|
48
|
+
@pointer
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft shura. [ shura1991@gmail.com ]
|
3
|
+
#
|
4
|
+
# This file is part of rbmount.
|
5
|
+
#
|
6
|
+
# rbmount is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# rbmount is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with rbmount. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
require 'rbmount/c'
|
21
|
+
|
22
|
+
module Mount
|
23
|
+
MNT_MS_COMMENT = (1 << 8)
|
24
|
+
MNT_MS_GROUP = (1 << 6)
|
25
|
+
MNT_MS_HELPER = (1 << 12)
|
26
|
+
MNT_MS_LOOP = (1 << 9)
|
27
|
+
MNT_MS_NETDEV = (1 << 7)
|
28
|
+
MNT_MS_NOAUTO = (1 << 2)
|
29
|
+
MNT_MS_NOFAIL = (1 << 10)
|
30
|
+
MNT_MS_OFFSET = (1 << 14)
|
31
|
+
MNT_MS_OWNER = (1 << 5)
|
32
|
+
MNT_MS_SIZELIMIT = (1 << 15)
|
33
|
+
MNT_MS_UHELPER = (1 << 11)
|
34
|
+
MNT_MS_USER = (1 << 3)
|
35
|
+
MNT_MS_USERS = (1 << 4)
|
36
|
+
MNT_MS_XCOMMENT = (1 << 13)
|
37
|
+
MS_BIND = 0x1000
|
38
|
+
MS_DIRSYNC = 128
|
39
|
+
MS_I_VERSION = (1<<23)
|
40
|
+
MS_MANDLOCK = 64
|
41
|
+
MS_MGC_MSK = 0xffff0000
|
42
|
+
MS_MGC_VAL = 0xC0ED0000
|
43
|
+
MS_MOVE = 0x2000
|
44
|
+
MS_NOATIME = 0x400
|
45
|
+
MS_NODEV = 4
|
46
|
+
MS_NODIRATIME = 0x800
|
47
|
+
MS_NOEXEC = 8
|
48
|
+
MS_NOSUID = 2
|
49
|
+
MS_PRIVATE = (1<<18)
|
50
|
+
MS_SHARED = (1<<20)
|
51
|
+
MS_RDONLY = 1
|
52
|
+
MS_REC = 0x4000
|
53
|
+
MS_RELATIME = 0x200000
|
54
|
+
MS_REMOUNT = 32
|
55
|
+
MS_SILENT = 0x8000
|
56
|
+
MS_SLAVE = (1<<19)
|
57
|
+
MS_STRICTATIME = (1<<24)
|
58
|
+
MS_SYNCHRONOUS = 16
|
59
|
+
MS_UNBINDABLE = (1<<17)
|
60
|
+
MS_PROPAGATION = (MS_SHARED|MS_SLAVE|MS_UNBINDABLE|MS_PRIVATE)
|
61
|
+
MS_SECURE = (MS_NOEXEC|MS_NOSUID|MS_NODEV)
|
62
|
+
MS_OWNERSECURE = (MS_NOSUID|MS_NODEV)
|
63
|
+
|
64
|
+
MNT_INVERT = (1 << 1)
|
65
|
+
MNT_NOMTAB = (1 << 2)
|
66
|
+
MNT_PREFIX = (1 << 3)
|
67
|
+
|
68
|
+
MNT_ITER_FORWARD = 0
|
69
|
+
MNT_ITER_BACKWARD = 1
|
70
|
+
|
71
|
+
VERSION = "2.19.0"
|
72
|
+
|
73
|
+
class OptMap < Struct.new(:name, :id, :mask)
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def self.fs_type (devname, amb=false)
|
78
|
+
ambi = amb ? FFI::MemoryPointer.new(:int) : nil
|
79
|
+
fs = Mount::C.mnt_get_fstype(devname, ambi, nil)
|
80
|
+
|
81
|
+
amb ? [fs, ambi.read_int] : fs
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.pretty_path (devname)
|
85
|
+
Mount::C.mnt_pretty_path(devname, nil)
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.resolve_path (path)
|
89
|
+
Mount::C.mnt_resolve_path(path, nil)
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.resolve_tag (token, value)
|
93
|
+
Mount::C.mnt_resolve_tag(token, value, nil)
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.init_debug (mask)
|
97
|
+
Mount::C.mnt_init_debug(mask)
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.builtin_optmap (id)
|
101
|
+
Mount::C.mnt_get_builtin_optmap(1).read_array_of_libmnt_optmap
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft shura. [ shura1991@gmail.com ]
|
3
|
+
#
|
4
|
+
# This file is part of rbmount.
|
5
|
+
#
|
6
|
+
# rbmount is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# rbmount is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with rbmount. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
require 'rbmount/c'
|
21
|
+
|
22
|
+
module Mount
|
23
|
+
module OptionString
|
24
|
+
class << self
|
25
|
+
def append_option (optstr=nil, name, value)
|
26
|
+
sptr = optstr.is_a?(::String) ? FFI::MemoryPointer.from_string(optstr) : FFI::MemoryPointer.new(:string)
|
27
|
+
ptr = FFI::MemoryPointer.new(:pointer).write_pointer(sptr)
|
28
|
+
|
29
|
+
raise unless Mount::C.mnt_optstr_append_option(ptr, name, value)
|
30
|
+
ptr.read_pointer.read_string
|
31
|
+
end
|
32
|
+
|
33
|
+
def apply_flags (optstr=nil, flags, map)
|
34
|
+
sptr = optstr.is_a?(::String) ? FFI::MemoryPointer.from_string(optstr) : FFI::MemoryPointer.new(:string)
|
35
|
+
ptr = FFI::MemoryPointer.new(:pointer).write_pointer(sptr)
|
36
|
+
|
37
|
+
raise unless Mount::C.mnt_optstr_apply_flags(ptr, flags, FFI::MemoryPointer.from_array_of_libmnt_optmap(map))
|
38
|
+
ptr.read_pointer.read_string
|
39
|
+
end
|
40
|
+
|
41
|
+
def flags (optstr, map)
|
42
|
+
optstr = FFI::MemoryPointer.new(:string).write_string(optstr)
|
43
|
+
ptr = FFI::MemoryPointer.new(:ulong)
|
44
|
+
|
45
|
+
raise unless Mount::C.mnt_optstr_get_flags(optstr, ptr, FFI::MemoryPointer.from_array_of_libmnt_optmap(map))
|
46
|
+
ptr.read_ulong
|
47
|
+
end
|
48
|
+
|
49
|
+
def option (optstr, name)
|
50
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
51
|
+
ol = FFI::MemoryPointer.new(:ulong)
|
52
|
+
|
53
|
+
raise unless Mount::C.mnt_optstr_get_option(optstr, name, ptr, ol)
|
54
|
+
ptr.read_pointer.read_string[0, ol.read_ulong]
|
55
|
+
end
|
56
|
+
|
57
|
+
def options (optstr, map, ignore=0)
|
58
|
+
ptr = FFI::MemoryPointer.new(:pointer)
|
59
|
+
|
60
|
+
raise unless Mount::C.mnt_optstr_get_options(optstr, ptr, FFI::MemoryPointer.from_array_of_libmnt_optmap(map), ignore)
|
61
|
+
ptr.read_pointer.read_string
|
62
|
+
end
|
63
|
+
|
64
|
+
def each_option (optstr)
|
65
|
+
optstr = FFI::MemoryPointer.new(:pointer).write_pointer(FFI::MemoryPointer.from_string(optstr))
|
66
|
+
|
67
|
+
Enumerator.new {|y|
|
68
|
+
loop {
|
69
|
+
res = Mount::String.next_option(optstr)
|
70
|
+
break unless res
|
71
|
+
y << res
|
72
|
+
}
|
73
|
+
}.each {|args|
|
74
|
+
yield *args if block_given?
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def prepend_option (optstr=nil, name, value)
|
79
|
+
sptr = optstr.is_a?(::String) ? FFI::MemoryPointer.from_string(optstr) : FFI::MemoryPointer.new(:string)
|
80
|
+
ptr = FFI::MemoryPointer.new(:pointer).write_pointer(sptr)
|
81
|
+
|
82
|
+
raise unless Mount::C.mnt_optstr_prepend_option(ptr, name, value)
|
83
|
+
ptr.read_pointer.read_string
|
84
|
+
end
|
85
|
+
|
86
|
+
def remove_option (optstr=nil, name)
|
87
|
+
sptr = optstr.is_a?(::String) ? FFI::MemoryPointer.from_string(optstr) : FFI::MemoryPointer.new(:string)
|
88
|
+
ptr = FFI::MemoryPointer.new(:pointer).write_pointer(sptr)
|
89
|
+
|
90
|
+
raise unless Mount::C.mnt_optstr_remove_option(ptr, name)
|
91
|
+
ptr.read_pointer.read_string
|
92
|
+
end
|
93
|
+
|
94
|
+
def set_option (optstr, name, value=nil)
|
95
|
+
sptr = optstr.is_a?(::String) ? FFI::MemoryPointer.from_string(optstr) : FFI::MemoryPointer.new(:string)
|
96
|
+
ptr = FFI::MemoryPointer.new(:pointer).write_pointer(sptr)
|
97
|
+
|
98
|
+
raise unless Mount::C.mnt_optstr_set_option(ptr, name, value)
|
99
|
+
ptr.read_pointer.read_string
|
100
|
+
end
|
101
|
+
|
102
|
+
def split_optstr (optstr, ignore_user=0, ignore_vfs=0)
|
103
|
+
pi = (1..3).map { FFI::MemoryPointer.new(:pointer).write_pointer(FFI::MemoryPointer.new(:string)) }
|
104
|
+
raise unless Mount::C.mnt_split_optstr(optstr, *pi, ignore_user, ignore_vfs)
|
105
|
+
pi.map {|x| x.read_pointer.read_string }
|
106
|
+
end
|
107
|
+
|
108
|
+
protected
|
109
|
+
def next_option (optstr)
|
110
|
+
name = FFI::MemoryPointer.new(:pointer)
|
111
|
+
ns = FFI::MemoryPointer.new(:ulong)
|
112
|
+
value = FFI::MemoryPointer.new(:pointer)
|
113
|
+
vs = FFI::MemoryPointer.new(:ulong)
|
114
|
+
|
115
|
+
case Mount::C.mnt_optstr_next_option(optstr, name, ns, value, vs)
|
116
|
+
when true
|
117
|
+
[[name, ns], [value, vs]].map {|x, i| x.read_pointer.read_string[0, i.read_ulong] }
|
118
|
+
when false
|
119
|
+
raise
|
120
|
+
else
|
121
|
+
nil
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def append_option (name, value)
|
127
|
+
self.replace(Mount::OptionString.append_option(self, name, value))
|
128
|
+
end
|
129
|
+
|
130
|
+
def apply_flags (flags, map)
|
131
|
+
self.replace(Mount::OptionString.apply_flags(self, flags, map))
|
132
|
+
end
|
133
|
+
|
134
|
+
def flags (map)
|
135
|
+
Mount::OptionString.flags(self, map)
|
136
|
+
end
|
137
|
+
|
138
|
+
def option (name)
|
139
|
+
Mount::OptionString.option(self, name)
|
140
|
+
end
|
141
|
+
|
142
|
+
def options (map, ignore=0)
|
143
|
+
Mount::OptionString.options(self, map, ignore)
|
144
|
+
end
|
145
|
+
|
146
|
+
def each_option (&blk)
|
147
|
+
Mount::OptionString.each_option(self, &blk)
|
148
|
+
end
|
149
|
+
|
150
|
+
def prepend_option (name, value)
|
151
|
+
self.replace(Mount::OptionString.prepend_option(self, name, value))
|
152
|
+
end
|
153
|
+
|
154
|
+
def remove_option (name)
|
155
|
+
self.replace(Mount::OptionString.remove_option(self, name))
|
156
|
+
end
|
157
|
+
|
158
|
+
def set_option (name, value=nil)
|
159
|
+
self.replace(Mount::OptionString.set_option(self, name, value))
|
160
|
+
end
|
161
|
+
|
162
|
+
def split_optstr (ignore_user=0, ignore_vfs=0)
|
163
|
+
Mount::OptionString.split_optstr(self, ignore_user, ignore_vfs)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,188 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft shura. [ shura1991@gmail.com ]
|
3
|
+
#
|
4
|
+
# This file is part of rbmount.
|
5
|
+
#
|
6
|
+
# rbmount is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# rbmount is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with rbmount. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
require 'rbmount/c'
|
21
|
+
require 'rbmount/iterator'
|
22
|
+
require 'rbmount/cache'
|
23
|
+
require 'rbmount/fs'
|
24
|
+
|
25
|
+
module Mount
|
26
|
+
class Table
|
27
|
+
DIRECTION = Hash.new {|*|
|
28
|
+
:forward
|
29
|
+
}.merge({
|
30
|
+
forward: Mount::MNT_ITER_FORWARD,
|
31
|
+
'forward' => Mount::MNT_ITER_FORWARD,
|
32
|
+
backward: Mount::MNT_ITER_BACKWARD,
|
33
|
+
'backward' => Mount::MNT_ITER_BACKWARD,
|
34
|
+
|
35
|
+
Mount::MNT_ITER_FORWARD => Mount::MNT_ITER_FORWARD,
|
36
|
+
Mount::MNT_ITER_BACKWARD => Mount::MNT_ITER_BACKWARD,
|
37
|
+
}).freeze
|
38
|
+
|
39
|
+
def initialize (path=nil)
|
40
|
+
@pointer = Mount::C.mnt_new_table unless path
|
41
|
+
if File.directory?(path)
|
42
|
+
@pointer = Mount::C.mnt_new_table_from_dir(path)
|
43
|
+
elsif File.file?(path)
|
44
|
+
@pointer = Mount::C.mnt_new_table_from_file(path)
|
45
|
+
else
|
46
|
+
raise ArgumentError
|
47
|
+
end
|
48
|
+
|
49
|
+
raise if !@pointer or @pointer.null?
|
50
|
+
|
51
|
+
ObjectSpace.define_finalizer(self, method(:finalize))
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_fs (fs)
|
55
|
+
Mount::C.mnt_table_add_fs(@pointer, fs.to_c)
|
56
|
+
end
|
57
|
+
|
58
|
+
def next_fs (direction=:forward)
|
59
|
+
Mount::FS.new.tap {|fs|
|
60
|
+
ptr = FFI::MemoryPointer.new(:pointer).write_pointer(fs.to_c)
|
61
|
+
|
62
|
+
res = Mount::C.mnt_table_next_fs(@pointer, Mount::Iter.new(DIRECTION[direction]).to_c, ptr)
|
63
|
+
raise unless res
|
64
|
+
break nil if res == 1
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
def each_fs (direction=:forward, &blk)
|
69
|
+
Enumerator.new {|y|
|
70
|
+
loop {
|
71
|
+
res = next_fs(direction)
|
72
|
+
break unless res
|
73
|
+
y << res
|
74
|
+
}
|
75
|
+
}.each(&blk)
|
76
|
+
end
|
77
|
+
|
78
|
+
def find_pair (source, target, direction=:forward)
|
79
|
+
Mount::FS.new(Mount::C.mnt_table_find_pair(@pointer, source, target, DIRECTION[direction]))
|
80
|
+
end
|
81
|
+
|
82
|
+
def find_source (source, direction=:forward)
|
83
|
+
Mount::FS.new(Mount::C.mnt_table_find_source(@pointer, source, DIRECTION[direction]))
|
84
|
+
end
|
85
|
+
|
86
|
+
def find_srcpath (path, direction=:forward)
|
87
|
+
Mount::FS.new(Mount::C.mnt_table_find_srcpath(@pointer, source, DIRECTION[direction]))
|
88
|
+
end
|
89
|
+
|
90
|
+
def find_tag (tag, val, direction=:forward)
|
91
|
+
Mount::FS.new(Mount::C.mnt_table_find_tag(@pointer, tag, val, DIRECTION[direction]))
|
92
|
+
end
|
93
|
+
|
94
|
+
def find_target (path, direction=:forward)
|
95
|
+
Mount::FS.new(Mount::C.mnt_table_find_target(@pointer, path, DIRECTION[direction]))
|
96
|
+
end
|
97
|
+
|
98
|
+
def cache
|
99
|
+
Mount::Cache.new(Mount::C.mnt_table_get_cache(@pointer))
|
100
|
+
end
|
101
|
+
|
102
|
+
def name
|
103
|
+
Mount::C.mnt_table_get_name(@pointer)
|
104
|
+
end
|
105
|
+
|
106
|
+
def nents
|
107
|
+
Mount::C.mnt_table_get_nents(@pointer)
|
108
|
+
end
|
109
|
+
|
110
|
+
def root_fs
|
111
|
+
Mount::FS.new.tap {|fs|
|
112
|
+
ptr = FFI::MemoryPointer.new(:pointer).write_pointer(fs.to_c)
|
113
|
+
raise unless Mount::C.mnt_table_get_root_fs(@pointer, ptr)
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
def fs_mounted?(fstab_fs)
|
118
|
+
Mount::C.mnt_table_is_fs_mounted(@pointer, fstab_fs.to_c)
|
119
|
+
end
|
120
|
+
|
121
|
+
def next_child_fs (parent, direction=:forward)
|
122
|
+
Mount::FS.new.tap {|fs|
|
123
|
+
ptr = FFI::MemoryPointer.new(:pointer).write_pointer(fs.to_c)
|
124
|
+
|
125
|
+
res = Mount::C.mnt_table_next_child_fs(@pointer, Mount::Iter.new(DIRECTION[direction]).to_c,
|
126
|
+
parent.to_c, ptr)
|
127
|
+
raise unless res
|
128
|
+
break nil if res == 1
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
132
|
+
def each_child_fs (parent, direction=:forward, &blk)
|
133
|
+
Enumerator.new {|y|
|
134
|
+
loop {
|
135
|
+
res = next_child_fs(parent, direction)
|
136
|
+
break unless res
|
137
|
+
y << res
|
138
|
+
}
|
139
|
+
}.each(&blk)
|
140
|
+
end
|
141
|
+
|
142
|
+
def parse_file (path)
|
143
|
+
Mount::C.mnt_table_parse_file(@pointer, path)
|
144
|
+
end
|
145
|
+
|
146
|
+
def parse_fstab (path=nil)
|
147
|
+
Mount::C.mnt_table_parse_fstab(@pointer, path)
|
148
|
+
end
|
149
|
+
|
150
|
+
def parse_mtab (path=nil)
|
151
|
+
Mount::C.mnt_table_parse_mtab(@pointer, path)
|
152
|
+
end
|
153
|
+
|
154
|
+
def parse_stream (io, filename)
|
155
|
+
Mount::C.mnt_table_parse_stream(@pointer, io, filename)
|
156
|
+
end
|
157
|
+
|
158
|
+
def remove_fs (fs)
|
159
|
+
Mount::C.mnt_table_remove_fs(@pointer, fs.to_c)
|
160
|
+
end
|
161
|
+
|
162
|
+
def cache= (mpc)
|
163
|
+
Mount::C.mnt_table_set_cache(@pointer, mpc.to_c)
|
164
|
+
end
|
165
|
+
|
166
|
+
def set_iter (fs, direction=:forward)
|
167
|
+
Mount::C.mnt_table_set_iter(@pointer, Mount::Iter.new(DIRECTION[direction]).to_c, fs.to_c)
|
168
|
+
end
|
169
|
+
|
170
|
+
def on_error (&blk)
|
171
|
+
if blk.arity == 3
|
172
|
+
Mount::C.mnt_table_set_iter(@pointer, blk)
|
173
|
+
true
|
174
|
+
else
|
175
|
+
false
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def reset!
|
180
|
+
raise unless Mount::C.mnt_reset_table(@pointer)
|
181
|
+
self
|
182
|
+
end
|
183
|
+
|
184
|
+
def finalize
|
185
|
+
Mount::C.mnt_free_table(@pointer)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|