sys-filesystem 1.2.0 → 1.3.0
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGES +4 -0
- data/README +2 -2
- data/lib/sys/filesystem.rb +1 -1
- data/lib/sys/unix/sys/filesystem.rb +48 -3
- data/lib/sys/unix/sys/filesystem/constants.rb +31 -0
- data/lib/sys/unix/sys/filesystem/functions.rb +12 -2
- data/lib/sys/windows/sys/filesystem.rb +29 -0
- data/lib/sys/windows/sys/filesystem/functions.rb +3 -0
- data/sys-filesystem.gemspec +3 -3
- data/test/test_sys_filesystem_unix.rb +10 -1
- data/test/test_sys_filesystem_windows.rb +12 -1
- metadata +18 -16
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f47e78baa2a2d0586d9dccbe36fc98a2683f0f0cc9828d70317ba7d2dc2aaa40
|
4
|
+
data.tar.gz: 8a887956f1a3c621057e93960e67871c646ae00f7cfe157d21ee0fd0f7d21bc7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66a048e0249d7147868c2a3a21468f5f292be47e82d19316d00d7dc5deab8a4c961bd363c55c55ac7e83d8992a0ecc71a3579ec4ca6e7a874308bd7f5e727aa7
|
7
|
+
data.tar.gz: 76ba77a00a187654367b01cacf2c282959fdbcaa3b2646075687a4f842ade1926bab0b38c51e60ac7b582f0633ce9ff27e32c349720788988a0e48cc5915c27a
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGES
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
== 1.3.0 - 3-Oct-2019
|
2
|
+
* Added the mount and umount singleton methods.
|
3
|
+
* Changed an internal class variable to a frozen constant.
|
4
|
+
|
1
5
|
== 1.2.0 - 1-Jan-2019
|
2
6
|
* Changed the license to Apache-2.0.
|
3
7
|
* Added the case_sensitive? and case_insensitive? instance methods to the
|
data/README
CHANGED
data/lib/sys/filesystem.rb
CHANGED
@@ -14,7 +14,7 @@ module Sys
|
|
14
14
|
private
|
15
15
|
|
16
16
|
# Readable versions of constant names
|
17
|
-
|
17
|
+
OPT_NAMES = {
|
18
18
|
MNT_RDONLY => 'read-only',
|
19
19
|
MNT_SYNCHRONOUS => 'synchronous',
|
20
20
|
MNT_NOEXEC => 'noexec',
|
@@ -35,7 +35,7 @@ module Sys
|
|
35
35
|
MNT_NOUSERXATTR => 'nouserxattr',
|
36
36
|
MNT_DEFWRITE => 'defwrite',
|
37
37
|
MNT_NOATIME => 'noatime'
|
38
|
-
}
|
38
|
+
}.freeze
|
39
39
|
|
40
40
|
# File used to read mount informtion from.
|
41
41
|
if File.exist?('/etc/mtab')
|
@@ -268,7 +268,7 @@ module Sys
|
|
268
268
|
string = ""
|
269
269
|
flags = mnt[:f_flags] & MNT_VISFLAGMASK
|
270
270
|
|
271
|
-
|
271
|
+
OPT_NAMES.each{ |key,val|
|
272
272
|
if flags & key > 0
|
273
273
|
if string.empty?
|
274
274
|
string << val
|
@@ -379,5 +379,50 @@ module Sys
|
|
379
379
|
|
380
380
|
val
|
381
381
|
end
|
382
|
+
|
383
|
+
# Attach the filesystem specified by +source+ to the location (a directory
|
384
|
+
# or file) specified by the pathname in +target+.
|
385
|
+
#
|
386
|
+
# Note that the +source+ is often a pathname referring to a device, but
|
387
|
+
# can also be the pathname of a directory or file, or a dummy string.
|
388
|
+
#
|
389
|
+
# By default this method will assume 'ext2' as the filesystem type, but
|
390
|
+
# you should update this as needed.
|
391
|
+
#
|
392
|
+
# Typically requires admin privileges.
|
393
|
+
#
|
394
|
+
# Example:
|
395
|
+
#
|
396
|
+
# Sys::Filesystem.mount('/dev/loop0', '/home/you/tmp', 'ext4', Sys::Filesystem::MNT_RDONLY)
|
397
|
+
#
|
398
|
+
def self.mount(source, target, fstype = 'ext2', flags = 0, data = nil)
|
399
|
+
if mount_c(source, target, fstype, flags, data) != 0
|
400
|
+
raise Error, 'mount() function failed: ' + strerror(FFI.errno)
|
401
|
+
end
|
402
|
+
|
403
|
+
self
|
404
|
+
end
|
405
|
+
|
406
|
+
# Removes the attachment of the (topmost) filesystem mounted on target.
|
407
|
+
# Additional flags may be provided for operating systems that support
|
408
|
+
# the umount2 function. Otherwise this argument is ignored.
|
409
|
+
#
|
410
|
+
# Typically requires admin privileges.
|
411
|
+
#
|
412
|
+
def self.umount(target, flags = nil)
|
413
|
+
if flags && respond_to?(:umount2)
|
414
|
+
function = 'umount2'
|
415
|
+
rv = umount2_c(target, flags)
|
416
|
+
else
|
417
|
+
function = 'umount'
|
418
|
+
rv = umount_c(target)
|
419
|
+
end
|
420
|
+
|
421
|
+
if rv != 0
|
422
|
+
raise Error, "#{function} function failed: " + strerror(FFI.errno)
|
423
|
+
end
|
424
|
+
|
425
|
+
self
|
426
|
+
end
|
382
427
|
end
|
383
428
|
end
|
@@ -36,6 +36,37 @@ module Sys
|
|
36
36
|
MNT_NOUSERXATTR | MNT_DEFWRITE | MNT_MULTILABEL |
|
37
37
|
MNT_NOATIME | MNT_CPROTECT
|
38
38
|
)
|
39
|
+
|
40
|
+
MS_RDONLY = 1
|
41
|
+
MS_NOSUID = 2
|
42
|
+
MS_NODEV = 4
|
43
|
+
MS_NOEXEC = 8
|
44
|
+
MS_SYNCHRONOUS = 16
|
45
|
+
MS_REMOUNT = 32
|
46
|
+
MS_MANDLOCK = 64
|
47
|
+
MS_DIRSYNC = 128
|
48
|
+
MS_NOATIME = 1024
|
49
|
+
MS_NODIRATIME = 2048
|
50
|
+
MS_BIND = 4096
|
51
|
+
MS_MOVE = 8192
|
52
|
+
MS_REC = 16384
|
53
|
+
MS_SILENT = 32768
|
54
|
+
MS_POSIXACL = 1 << 16
|
55
|
+
MS_UNBINDABLE = 1 << 17
|
56
|
+
MS_PRIVATE = 1 << 18
|
57
|
+
MS_SLAVE = 1 << 19
|
58
|
+
MS_SHARED = 1 << 20
|
59
|
+
MS_RELATIME = 1 << 21
|
60
|
+
MS_KERNMOUNT = 1 << 22
|
61
|
+
MS_I_VERSION = 1 << 23
|
62
|
+
MS_STRICTATIME = 1 << 24
|
63
|
+
MS_ACTIVE = 1 << 30
|
64
|
+
MS_NOUSER = 1 << 31
|
65
|
+
|
66
|
+
MNT_FORCE = 1
|
67
|
+
MNT_DETACH = 2
|
68
|
+
MNT_EXPIRE = 4
|
69
|
+
UMOUNT_NOFOLLOW = 8
|
39
70
|
end
|
40
71
|
end
|
41
72
|
end
|
@@ -14,8 +14,17 @@ module Sys
|
|
14
14
|
end
|
15
15
|
|
16
16
|
attach_function(:strerror, [:int], :string)
|
17
|
+
attach_function(:mount_c, :mount, [:string, :string, :string, :ulong, :string], :int)
|
17
18
|
|
18
|
-
|
19
|
+
begin
|
20
|
+
attach_function(:umount_c, :umount, [:string], :int)
|
21
|
+
rescue FFI::NotFoundError
|
22
|
+
if RbConfig::CONFIG['host_os'] =~ /darwin|osx|mach/i
|
23
|
+
attach_function(:umount_c, :unmount, [:string], :int)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private_class_method :statvfs, :strerror, :mount_c, :umount_c
|
19
28
|
|
20
29
|
begin
|
21
30
|
if RbConfig::CONFIG['host_os'] =~ /sunos|solaris/i
|
@@ -27,7 +36,8 @@ module Sys
|
|
27
36
|
attach_function(:getmntent, [:pointer], :pointer)
|
28
37
|
attach_function(:setmntent, [:string, :string], :pointer)
|
29
38
|
attach_function(:endmntent, [:pointer], :int)
|
30
|
-
|
39
|
+
attach_function(:umount2, [:string, :int], :int)
|
40
|
+
private_class_method :getmntent, :setmntent, :endmntent, :umount2
|
31
41
|
end
|
32
42
|
rescue FFI::NotFoundError
|
33
43
|
if RbConfig::CONFIG['host_os'] =~ /darwin|osx|mach/i
|
@@ -353,6 +353,35 @@ module Sys
|
|
353
353
|
stat_obj.freeze # Read-only object
|
354
354
|
end
|
355
355
|
|
356
|
+
# Associate a volume with a drive letter or a directory on another volume.
|
357
|
+
#
|
358
|
+
def self.mount(target, source)
|
359
|
+
targetw = target.to_s.wincode
|
360
|
+
sourcew = source.to_s.wincode
|
361
|
+
|
362
|
+
volume_namew = (0.chr * 256).wincode
|
363
|
+
|
364
|
+
unless GetVolumeNameForVolumeMountPointW(sourcew, volume_namew, volume_namew.size)
|
365
|
+
raise SystemCallError.new('GetVolumeNameForVolumeMountPoint', FFI.errno)
|
366
|
+
end
|
367
|
+
|
368
|
+
unless SetVolumeMountPointW(targetw, volume_namew)
|
369
|
+
raise SystemCallError.new('SetVolumeMountPoint', FFI.errno)
|
370
|
+
end
|
371
|
+
|
372
|
+
self
|
373
|
+
end
|
374
|
+
|
375
|
+
# Deletes a drive letter or mounted folder.
|
376
|
+
#
|
377
|
+
def self.umount(mount_point)
|
378
|
+
unless DeleteVolumeMountPoint(mount_point)
|
379
|
+
raise SystemCallError.new('DeleteVolumeMountPoint', FFI.errno)
|
380
|
+
end
|
381
|
+
|
382
|
+
self
|
383
|
+
end
|
384
|
+
|
356
385
|
private
|
357
386
|
|
358
387
|
# This method is used to get the boot time of the system, which is used
|
@@ -14,6 +14,7 @@ module Sys
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
attach_pfunc :DeleteVolumeMountPointA, [:string], :bool
|
17
18
|
attach_pfunc :GetDiskFreeSpaceW, [:buffer_in, :pointer, :pointer, :pointer, :pointer], :bool
|
18
19
|
attach_pfunc :GetDiskFreeSpaceExW, [:buffer_in, :pointer, :pointer, :pointer], :bool
|
19
20
|
attach_pfunc :GetLogicalDriveStringsA, [:ulong, :pointer], :ulong
|
@@ -26,7 +27,9 @@ module Sys
|
|
26
27
|
[:buffer_in, :pointer, :ulong, :pointer, :pointer, :pointer, :pointer, :ulong],
|
27
28
|
:bool
|
28
29
|
|
30
|
+
attach_pfunc :GetVolumeNameForVolumeMountPointW, [:buffer_in, :buffer_in, :ulong], :bool
|
29
31
|
attach_pfunc :QueryDosDeviceA, [:buffer_in, :buffer_out, :ulong], :ulong
|
32
|
+
attach_pfunc :SetVolumeMountPointW, [:buffer_in, :buffer_in], :bool
|
30
33
|
|
31
34
|
ffi_lib :shlwapi
|
32
35
|
|
data/sys-filesystem.gemspec
CHANGED
@@ -2,12 +2,12 @@ require 'rubygems'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'sys-filesystem'
|
5
|
-
spec.version = '1.
|
5
|
+
spec.version = '1.3.0'
|
6
6
|
spec.author = 'Daniel J. Berger'
|
7
7
|
spec.email = 'djberg96@gmail.com'
|
8
8
|
spec.homepage = 'https://github.com/djberg96/sys-filesystem'
|
9
9
|
spec.summary = 'A Ruby interface for getting file system information.'
|
10
|
-
spec.
|
10
|
+
spec.test_files = Dir['test/*.rb']
|
11
11
|
spec.license = 'Apache-2.0'
|
12
12
|
spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
|
13
13
|
spec.cert_chain = Dir['certs/*']
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.metadata = {
|
22
22
|
'homepage_uri' => 'https://github.com/djberg96/sys-filesystem',
|
23
23
|
'bug_tracker_uri' => 'https://github.com/djberg96/sys-filesystem/issues',
|
24
|
-
'changelog_uri' => 'https://github.com/djberg96/sys-filesystem/blob/
|
24
|
+
'changelog_uri' => 'https://github.com/djberg96/sys-filesystem/blob/ffi/CHANGES',
|
25
25
|
'documentation_uri' => 'https://github.com/djberg96/sys-filesystem/wiki',
|
26
26
|
'source_code_uri' => 'https://github.com/djberg96/sys-filesystem',
|
27
27
|
'wiki_uri' => 'https://github.com/djberg96/sys-filesystem/wiki'
|
@@ -25,7 +25,8 @@ class TC_Sys_Filesystem_Unix < Test::Unit::TestCase
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_version
|
28
|
-
assert_equal('1.
|
28
|
+
assert_equal('1.3.0', Filesystem::VERSION)
|
29
|
+
assert_true(Filesystem::VERSION.frozen?)
|
29
30
|
end
|
30
31
|
|
31
32
|
def test_stat_path
|
@@ -282,6 +283,14 @@ class TC_Sys_Filesystem_Unix < Test::Unit::TestCase
|
|
282
283
|
assert_false(Filesystem.methods.include?('strerror'))
|
283
284
|
end
|
284
285
|
|
286
|
+
def test_mount_singleton_method
|
287
|
+
assert_respond_to(Sys::Filesystem, :mount)
|
288
|
+
end
|
289
|
+
|
290
|
+
def test_umount_singleton_method
|
291
|
+
assert_respond_to(Sys::Filesystem, :umount)
|
292
|
+
end
|
293
|
+
|
285
294
|
def teardown
|
286
295
|
@dir = nil
|
287
296
|
@stat = nil
|
@@ -20,7 +20,8 @@ class TC_Sys_Filesystem_Windows < Test::Unit::TestCase
|
|
20
20
|
end
|
21
21
|
|
22
22
|
test "version number is set to the expected value" do
|
23
|
-
assert_equal('1.
|
23
|
+
assert_equal('1.3.0', Filesystem::VERSION)
|
24
|
+
assert_true(Filesystem::VERSION.frozen?)
|
24
25
|
end
|
25
26
|
|
26
27
|
test "stat path works as expected" do
|
@@ -275,6 +276,16 @@ class TC_Sys_Filesystem_Windows < Test::Unit::TestCase
|
|
275
276
|
assert_equal(0, @size.to_gb)
|
276
277
|
end
|
277
278
|
|
279
|
+
# Mount and Unmount
|
280
|
+
|
281
|
+
test "mount singleton method exists" do
|
282
|
+
assert_respond_to(Sys::Filesystem, :mount)
|
283
|
+
end
|
284
|
+
|
285
|
+
test "umount singleton method exists" do
|
286
|
+
assert_respond_to(Sys::Filesystem, :umount)
|
287
|
+
end
|
288
|
+
|
278
289
|
# FFI
|
279
290
|
|
280
291
|
test "internal ffi functions are not public" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sys-filesystem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Berger
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
|
36
36
|
WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2019-
|
38
|
+
date: 2019-10-03 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: ffi
|
@@ -91,20 +91,12 @@ extra_rdoc_files:
|
|
91
91
|
- MANIFEST
|
92
92
|
files:
|
93
93
|
- test
|
94
|
-
- test/test_sys_filesystem_windows.rb
|
95
|
-
- test/test_sys_filesystem_unix.rb
|
96
94
|
- test/test_sys_filesystem.rb
|
97
|
-
-
|
98
|
-
-
|
99
|
-
- README
|
100
|
-
- Rakefile
|
101
|
-
- sys-filesystem.gemspec
|
102
|
-
- certs
|
103
|
-
- certs/djberg96_pub.pem
|
95
|
+
- test/test_sys_filesystem_unix.rb
|
96
|
+
- test/test_sys_filesystem_windows.rb
|
104
97
|
- examples
|
105
98
|
- examples/example_stat.rb
|
106
99
|
- lib
|
107
|
-
- lib/sys-filesystem.rb
|
108
100
|
- lib/sys
|
109
101
|
- lib/sys/unix
|
110
102
|
- lib/sys/unix/sys
|
@@ -113,21 +105,29 @@ files:
|
|
113
105
|
- lib/sys/unix/sys/filesystem/constants.rb
|
114
106
|
- lib/sys/unix/sys/filesystem/functions.rb
|
115
107
|
- lib/sys/unix/sys/filesystem.rb
|
116
|
-
- lib/sys/filesystem.rb
|
117
108
|
- lib/sys/windows
|
118
109
|
- lib/sys/windows/sys
|
119
110
|
- lib/sys/windows/sys/filesystem
|
120
|
-
- lib/sys/windows/sys/filesystem/helper.rb
|
121
111
|
- lib/sys/windows/sys/filesystem/constants.rb
|
112
|
+
- lib/sys/windows/sys/filesystem/helper.rb
|
122
113
|
- lib/sys/windows/sys/filesystem/functions.rb
|
123
114
|
- lib/sys/windows/sys/filesystem.rb
|
115
|
+
- lib/sys/filesystem.rb
|
116
|
+
- lib/sys-filesystem.rb
|
117
|
+
- MANIFEST
|
118
|
+
- README
|
119
|
+
- Rakefile
|
120
|
+
- certs
|
121
|
+
- certs/djberg96_pub.pem
|
122
|
+
- CHANGES
|
123
|
+
- sys-filesystem.gemspec
|
124
124
|
homepage: https://github.com/djberg96/sys-filesystem
|
125
125
|
licenses:
|
126
126
|
- Apache-2.0
|
127
127
|
metadata:
|
128
128
|
homepage_uri: https://github.com/djberg96/sys-filesystem
|
129
129
|
bug_tracker_uri: https://github.com/djberg96/sys-filesystem/issues
|
130
|
-
changelog_uri: https://github.com/djberg96/sys-filesystem/blob/
|
130
|
+
changelog_uri: https://github.com/djberg96/sys-filesystem/blob/ffi/CHANGES
|
131
131
|
documentation_uri: https://github.com/djberg96/sys-filesystem/wiki
|
132
132
|
source_code_uri: https://github.com/djberg96/sys-filesystem
|
133
133
|
wiki_uri: https://github.com/djberg96/sys-filesystem/wiki
|
@@ -147,9 +147,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
147
|
version: '0'
|
148
148
|
requirements: []
|
149
149
|
rubyforge_project:
|
150
|
-
rubygems_version: 2.7.6
|
150
|
+
rubygems_version: 2.7.6.2
|
151
151
|
signing_key:
|
152
152
|
specification_version: 4
|
153
153
|
summary: A Ruby interface for getting file system information.
|
154
154
|
test_files:
|
155
155
|
- test/test_sys_filesystem.rb
|
156
|
+
- test/test_sys_filesystem_unix.rb
|
157
|
+
- test/test_sys_filesystem_windows.rb
|
metadata.gz.sig
CHANGED
Binary file
|