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.
@@ -0,0 +1,343 @@
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/fs'
22
+ require 'rbmount/lock'
23
+ require 'rbmount/cache'
24
+ require 'rbmount/table'
25
+
26
+ module Mount
27
+ class Context
28
+ def finalize
29
+ Mount::C.mnt_free_context(@pointer)
30
+ end
31
+
32
+ def initialize
33
+ @pointer = Mount::C.mnt_new_context
34
+ raise if @pointer.null?
35
+
36
+ ObjectSpace.define_finalizer(self, method(:finalize))
37
+ end
38
+
39
+ def reset!
40
+ return false unless Mount::C.mnt_reset_context(@pointer)
41
+ self
42
+ end
43
+
44
+ def append_options (optstr)
45
+ Mount::C.mnt_context_append_options(@pointer, optstr)
46
+ end
47
+
48
+ def apply_fstab
49
+ Mount::C.mnt_context_apply_fstab(@pointer)
50
+ end
51
+
52
+ def canonicalize= (ok)
53
+ Mount::C.mnt_context_disable_canonicalize(@pointer, !ok)
54
+ end
55
+
56
+ def helpers= (ok)
57
+ Mount::C.mnt_context_disable_helpers(@pointer, !ok)
58
+ end
59
+
60
+ def mtab= (ok)
61
+ Mount::C.mnt_context_disable_mtab(@pointer, !ok)
62
+ end
63
+
64
+ def fake= (ok)
65
+ Mount::C.mnt_context_enable_fake(@pointer, !!ok)
66
+ end
67
+
68
+ def force= (ok)
69
+ Mount::C.mnt_context_enable_force(@pointer, !!ok)
70
+ end
71
+
72
+ def lazy= (ok)
73
+ Mount::C.mnt_context_enable_lazy(@pointer, !!ok)
74
+ end
75
+
76
+ def loopdel= (ok)
77
+ Mount::C.mnt_context_enable_loopdel(@pointer, !!ok)
78
+ end
79
+
80
+ def rdonly_umount= (ok)
81
+ Mount::C.mnt_context_enable_rdonly_umount(@pointer, !!ok)
82
+ end
83
+
84
+ def sloppy= (ok)
85
+ Mount::C.mnt_context_enable_sloppy(@pointer, !!ok)
86
+ end
87
+
88
+ def verbose= (ok)
89
+ Mount::C.mnt_context_enable_verbose(@pointer, !!ok)
90
+ end
91
+
92
+ def cache
93
+ Mount::Cache.new(Mount::C.mnt_context_get_cache(@pointer))
94
+ end
95
+
96
+ def fs
97
+ Mount::FS.new(Mount::C.mnt_context_get_fs(@pointer))
98
+ end
99
+
100
+ def fstab
101
+ Mount::Table.new.tap {|tab|
102
+ ptr = FFI::MemoryPointer.new(:pointer).write_pointer(tab.to_c)
103
+ raise unless Mount::C.mnt_context_get_fstab(@pointer, ptr)
104
+ }
105
+ end
106
+
107
+ def fstype
108
+ Mount::C.mnt_context_get_fstype(@pointer)
109
+ end
110
+
111
+ def lock
112
+ lk = Mount::C.mnt_context_get_lock(@pointer)
113
+ raise if lk.null?
114
+
115
+ Mount::Lock.allocate.tap {|lck|
116
+ lck.instance_eval {
117
+ @pointer = lk
118
+
119
+ ObjectSpace.define_finalizer(self, self.method(:finalize))
120
+ }
121
+ }
122
+ end
123
+
124
+ def mflags
125
+ ptr = FFI::MemoryPointer.new(:ulong)
126
+ raise unless Mount::C.mnt_context_get_mflags(@pointer, ptr)
127
+
128
+ ptr.read_ulong
129
+ end
130
+
131
+ def mtab
132
+ Mount::Table.new.tap {|tab|
133
+ ptr = FFI::MemoryPointer.new(:pointer).write_pointer(tab.to_c)
134
+ raise unless Mount::C.mnt_context_get_mtab(@pointer, ptr)
135
+ }
136
+ end
137
+
138
+ def optsmode
139
+ Mount::C.mnt_context_get_optsmode(@pointer)
140
+ end
141
+
142
+ def source
143
+ Mount::C.mnt_context_get_source(@pointer)
144
+ end
145
+
146
+ def status
147
+ Mount::C.mnt_context_get_status(@pointer)
148
+ end
149
+
150
+ def table (filename)
151
+ Mount::Table.new.tap {|tab|
152
+ ptr = FFI::MemoryPointer.new(:pointer).write_pointer(tab.to_c)
153
+ raise unless Mount::C.mnt_context_get_table(@pointer, filename, ptr)
154
+ }
155
+ end
156
+
157
+ def target
158
+ Mount::C.mnt_context_get_target(@pointer)
159
+ end
160
+
161
+ def user_mflags
162
+ ptr = FFI::MemoryPointer.new(:ulong)
163
+ raise unless Mount::C.mnt_context_get_user_mflags(@pointer, ptr)
164
+
165
+ ptr.read_ulong
166
+ end
167
+
168
+ def helper_setopt (c, arg)
169
+ Mount::C.mnt_context_helper_setopt(@pointer, c, arg)
170
+ end
171
+
172
+ def init_helper (action, flags=0)
173
+ Mount::C.mnt_context_init_helper(@pointer, action, flags)
174
+ end
175
+
176
+ def fake?
177
+ Mount::C.mnt_context_is_fake(@pointer)
178
+ end
179
+
180
+ def force?
181
+ Mount::C.mnt_context_is_force(@pointer)
182
+ end
183
+
184
+ def fs_mounted? (fs)
185
+ ptr = FFI::MemoryPointer.new(:int)
186
+ Mount::C.mnt_context_is_fs_mounted(@pointer, fs.to_c, ptr)
187
+
188
+ !ptr.read_int.zero?
189
+ end
190
+
191
+ def lazy?
192
+ Mount::C.mnt_context_is_lazy(@pointer)
193
+ end
194
+
195
+ def mtab?
196
+ !Mount::C.mnt_context_is_nomtab(@pointer)
197
+ end
198
+
199
+ def rdonly_umount?
200
+ Mount::C.mnt_context_is_rdonly_umount(@pointer)
201
+ end
202
+
203
+ def restricted?
204
+ Mount::C.mnt_context_is_restricted(@pointer)
205
+ end
206
+
207
+ def sloppy?
208
+ Mount::C.mnt_context_is_sloppy(@pointer)
209
+ end
210
+
211
+ def verbose?
212
+ Mount::C.mnt_context_is_verbose(@pointer)
213
+ end
214
+
215
+ def cache= (cache)
216
+ Mount::C.mnt_context_set_cache(@pointer, cache.to_c)
217
+ end
218
+
219
+ def fs= (fs)
220
+ Mount::C.mnt_context_set_fs(@pointer, fs.to_c)
221
+ end
222
+
223
+ def fstab= (tb)
224
+ Mount::C.mnt_context_set_fstab(@pointer, tb.to_c)
225
+ end
226
+
227
+ def fstype= (fstype)
228
+ Mount::C.mnt_context_set_fstype(@pointer, fstype)
229
+ end
230
+
231
+ def fstype_pattern= (pattern)
232
+ Mount::C.mnt_context_set_fstype_pattern(@pointer, pattern)
233
+ end
234
+
235
+ def mflags= (flags)
236
+ Mount::C.mnt_context_set_mflags(@pointer, flags)
237
+ end
238
+
239
+ def mountdata= (data)
240
+ Mount::C.mnt_context_set_mountdata(@pointer, data)
241
+ end
242
+
243
+ def options= (optstr)
244
+ Mount::C.mnt_context_set_options(@pointer, optstr)
245
+ end
246
+
247
+ def options_pattern= (pattern)
248
+ Mount::C.mnt_context_set_options_pattern(@pointer, pattern)
249
+ end
250
+
251
+ def optsmode= (mode)
252
+ Mount::C.mnt_context_set_optsmode(@pointer, mode)
253
+ end
254
+
255
+ def source= (src)
256
+ Mount::C.mnt_context_set_source(@pointer, src)
257
+ end
258
+
259
+ def syscall_status= (status)
260
+ Mount::C.mnt_context_set_syscall_status(@pointer, status)
261
+ end
262
+
263
+ def on_error (&blk)
264
+ if blk.arity == 3
265
+ Mount::C.mnt_context_set_tables_errcb(@pointer, blk)
266
+ true
267
+ else
268
+ false
269
+ end
270
+ end
271
+
272
+ def target= (target)
273
+ Mount::C.mnt_context_set_target(@pointer, target)
274
+ end
275
+
276
+ def user_mflags (flags)
277
+ Mount::C.mnt_context_set_user_mflags(@pointer, flags)
278
+ end
279
+
280
+ def strerror
281
+ ''
282
+ end
283
+
284
+ def do_mount
285
+ Mount::C.mnt_context_do_mount(@pointer)
286
+ end
287
+
288
+ def finalize_mount
289
+ Mount::C.mnt_context_finalize_mount(@pointer)
290
+ end
291
+
292
+ def mount
293
+ Mount::C.mnt_context_mount(@pointer)
294
+ end
295
+
296
+ def next_mount (direction=:forward)
297
+ fs = Mount::FS.new
298
+ fsptr = FFI::MemoryPointer.new(:pointer).write_pointer(fs.to_c)
299
+ rcptr = FFI::MemoryPointer.new(:int)
300
+ iptr = FFI::MemoryPointer.new(:int)
301
+
302
+ res = Mount::C.mnt_context_next_mount(@pointer, Mount::Iterator.new(Mount::Table::DIRECTION[direction]).to_c,
303
+ fsptr, rcptr, iptr)
304
+
305
+ return nil if res == 1
306
+ raise unless res
307
+
308
+ [fs, rcptr.read_int, iptr.read_int]
309
+ end
310
+
311
+ def each_mount
312
+ Enumerator.new {|y|
313
+ loop {
314
+ res = next_mount
315
+ break unless res
316
+ y << res
317
+ }.each {|args|
318
+ yield *args if block_given?
319
+ }
320
+ }
321
+ end
322
+
323
+ def prepare_mount
324
+ Mount::C.mnt_context_prepare_mount(@pointer)
325
+ end
326
+
327
+ def do_umount
328
+ Mount::C.mnt_context_do_umount(@pointer)
329
+ end
330
+
331
+ def finalize_umount
332
+ Mount::C.mnt_context_finalize_umount(@pointer)
333
+ end
334
+
335
+ def prepare_umount
336
+ Mount::C.mnt_context_prepare_umount(@pointer)
337
+ end
338
+
339
+ def umount
340
+ Mount::C.mnt_context_umount(@pointer)
341
+ end
342
+ end
343
+ end
@@ -0,0 +1,234 @@
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 FS
24
+ def initialize (ptr=nil)
25
+ @pointer= ptr
26
+ @pointer = Mount::C.mnt_new_fs unless @pointer
27
+ raise if @pointer.null?
28
+
29
+ ObjectSpace.define_finalizer(self, method(:finalize))
30
+ end
31
+
32
+ def append_attributes (optstr)
33
+ Mount::C.mnt_fs_append_attributes(@pointer, optstr)
34
+ end
35
+
36
+ def append_options (optstr)
37
+ Mount::C.mnt_fs_append_options(@pointer, optstr)
38
+ end
39
+
40
+ def attribute (key)
41
+ ptr = FFI::MemoryPointer.new(:pointer).write_pointer(FFI::MemoryPointer.new(:string))
42
+ plen = FFI::MemoryPointer.new(:ulong)
43
+
44
+ raise unless Mount::C.mnt_fs_get_attribute(@pointer, key, ptr, plen)
45
+ ptr.read_pointer.read_string[0, plen.read_ulong]
46
+ end
47
+
48
+ def attributes
49
+ Mount::C.mnt_fs_get_attributes(@pointer)
50
+ end
51
+
52
+ def bindsrc
53
+ Mount::C.mnt_fs_get_bindsrc(@pointer)
54
+ end
55
+
56
+ def devno
57
+ Mount::C.mnt_fs_get_devno(@pointer)
58
+ end
59
+
60
+ def freq
61
+ Mount::C.mnt_fs_get_freq(@pointer)
62
+ end
63
+
64
+ def fs_options
65
+ Mount::C.mnt_fs_get_fs_options(@pointer)
66
+ end
67
+
68
+ def fstype
69
+ Mount::C.mnt_fs_get_fstype(@pointer)
70
+ end
71
+
72
+ def id
73
+ Mount::C.mnt_fs_get_id(@pointer)
74
+ end
75
+
76
+ def option (key)
77
+ ptr = FFI::MemoryPointer.new(:pointer).write_pointer(FFI::MemoryPointer.new(:string))
78
+ plen = FFI::MemoryPointer.new(:ulong)
79
+
80
+ raise unless Mount::C.mnt_fs_get_option(@pointer, key, ptr, plen)
81
+ ptr.read_pointer.read_string[0, plen.read_ulong]
82
+ end
83
+
84
+ def options
85
+ Mount::C.mnt_fs_get_options(@pointer)
86
+ end
87
+
88
+ def parent_id
89
+ Mount::C.mnt_fs_get_parent_id(@pointer)
90
+ end
91
+
92
+ def passno
93
+ Mount::C.mnt_fs_get_passno(@pointer)
94
+ end
95
+
96
+ def root
97
+ Mount::C.mnt_fs_get_root(@pointer)
98
+ end
99
+
100
+ def source
101
+ Mount::C.mnt_fs_get_source(@pointer)
102
+ end
103
+
104
+ def srcpath
105
+ Mount::C.mnt_fs_get_srcpath(@pointer)
106
+ end
107
+
108
+ def tag
109
+ name = FFI::MemoryPointer.new(:pointer).write_pointer(FFI::MemoryPointer.new(:string))
110
+ value = FFI::MemoryPointer.new(:pointer).write_pointer(FFI::MemoryPointer.new(:string))
111
+
112
+ raise unless Mount::C.mnt_fs_get_tag(@pointer, name, value)
113
+ [name.read_pointer.read_string, value.read_pointer.read_string]
114
+ end
115
+
116
+ def target
117
+ Mount::C.mnt_fs_get_target(@pointer)
118
+ end
119
+
120
+ def userdata
121
+ Mount::C.mnt_fs_get_userdata(@pointer)
122
+ end
123
+
124
+ def user_options
125
+ Mount::C.mnt_fs_get_user_options(@pointer)
126
+ end
127
+
128
+ def vfs_options
129
+ Mount::C.mnt_fs_get_vfs_options(@pointer)
130
+ end
131
+
132
+ def kernel?
133
+ Mount::C.mnt_fs_is_kernel(@pointer)
134
+ end
135
+
136
+ def match_fstype (types)
137
+ Mount::C.mnt_fs_match_fstype(@pointer, types)
138
+ end
139
+
140
+ def match_options (options)
141
+ Mount::C.mnt_fs_match_options(@pointer, options)
142
+ end
143
+
144
+ def match_source (source=nil, cache=nil)
145
+ Mount::C.mnt_fs_match_source(@pointer, source, (cache ? cache.to_c : cache))
146
+ end
147
+
148
+ def match_target (source=nil, cache=nil)
149
+ Mount::C.mnt_fs_match_target(@pointer, source, (cache ? cache.to_c : cache))
150
+ end
151
+
152
+ def prepend_attributes (optstr)
153
+ Mount::C.mnt_fs_prepend_attributes(@pointer, optstr)
154
+ end
155
+
156
+ def prepend_options (optstr)
157
+ Mount::C.mnt_fs_prepend_options(@pointer, optstr)
158
+ end
159
+
160
+ def print_debug (io)
161
+ Mount::C.mnt_fs_print_debug(@pointer, io)
162
+ end
163
+
164
+ def attributes= (optstr)
165
+ Mount::C.mnt_fs_set_attributes(@pointer, optstr)
166
+ end
167
+
168
+ def bindsrc= (src)
169
+ Mount::C.mnt_fs_set_bindsrc(@pointer, src)
170
+ end
171
+
172
+ def freq= (f)
173
+ Mount::C.mnt_fs_set_freq(@pointer, f)
174
+ end
175
+
176
+ def fstype= (type)
177
+ Mount::C.mnt_fs_set_fstype(@pointer, type)
178
+ end
179
+
180
+ def options= (optstr)
181
+ Mount::C.mnt_fs_set_options(@pointer, optstr)
182
+ end
183
+
184
+ def passno= (passn)
185
+ Mount::C.mnt_fs_set_passno(@pointer, passn)
186
+ end
187
+
188
+ def root= (path)
189
+ Mount::C.mnt_fs_set_root(@pointer, path)
190
+ end
191
+
192
+ def source= (src)
193
+ Mount::C.mnt_fs_set_source(@pointer, src)
194
+ end
195
+
196
+ def target= (targ)
197
+ Mount::C.mnt_fs_set_target(@pointer, targ)
198
+ end
199
+
200
+ def userdata= (data)
201
+ Mount::C.mnt_fs_set_userdata(@pointer, data)
202
+ end
203
+
204
+ def options_dup
205
+ Mount::C.mnt_fs_strdup_options(@pointer)
206
+ end
207
+
208
+ def to_mntent
209
+ ptr = FFI::MemoryPointer.new(:pointer).write_pointer(FFI::MemoryPointer.new(:pointer))
210
+
211
+ raise unless Mount::C.mnt_fs_to_mntent(@pointer, ptr)
212
+
213
+ Mount::C::MntEnt.new(ptr.read_pointer)
214
+ end
215
+
216
+ def reset!
217
+ Mount::C.mnt_reset_fs(@pointer)
218
+ end
219
+
220
+ def finalize
221
+ Mount::C.mnt_free_fs(@pointer)
222
+ end
223
+
224
+ def dup
225
+ Mount::FS.new.tap {|d|
226
+ Mount::C.mnt_copy_fs(d.to_c, self.to_c)
227
+ }
228
+ end
229
+
230
+ def to_c
231
+ @pointer
232
+ end
233
+ end
234
+ end