sys-filesystem 1.3.3 → 1.4.2
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.rdoc → CHANGES.md} +44 -24
- data/Gemfile +3 -0
- data/LICENSE +177 -0
- data/{MANIFEST.rdoc → MANIFEST.md} +3 -1
- data/README.md +89 -0
- data/Rakefile +14 -24
- data/examples/example_mount.rb +3 -2
- data/lib/sys/filesystem.rb +1 -1
- data/lib/sys/unix/sys/filesystem.rb +53 -33
- data/lib/sys/unix/sys/filesystem/constants.rb +2 -4
- data/lib/sys/unix/sys/filesystem/functions.rb +16 -10
- data/lib/sys/unix/sys/filesystem/structs.rb +47 -14
- data/lib/sys/windows/sys/filesystem.rb +43 -29
- data/lib/sys/windows/sys/filesystem/functions.rb +10 -10
- data/lib/sys/windows/sys/filesystem/helper.rb +1 -1
- data/spec/spec_helper.rb +6 -0
- data/spec/sys_filesystem_unix_spec.rb +392 -0
- data/spec/sys_filesystem_windows_spec.rb +344 -0
- data/sys-filesystem.gemspec +6 -8
- metadata +38 -51
- metadata.gz.sig +0 -0
- data/README.rdoc +0 -77
- data/test/test_sys_filesystem.rb +0 -7
- data/test/test_sys_filesystem_unix.rb +0 -329
- data/test/test_sys_filesystem_windows.rb +0 -303
data/Rakefile
CHANGED
@@ -1,34 +1,16 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/clean'
|
3
|
-
require '
|
3
|
+
require 'rspec/core/rake_task'
|
4
4
|
|
5
|
-
CLEAN.include('**/*.gem', '**/*.rbc', '**/*.rbx')
|
6
|
-
|
7
|
-
desc "Run the test suite"
|
8
|
-
Rake::TestTask.new("test") do |t|
|
9
|
-
if File::ALT_SEPARATOR
|
10
|
-
t.libs << 'lib/windows'
|
11
|
-
else
|
12
|
-
t.libs << 'lib/unix'
|
13
|
-
end
|
14
|
-
|
15
|
-
t.warning = true
|
16
|
-
t.verbose = true
|
17
|
-
t.test_files = FileList['test/test_sys_filesystem.rb']
|
18
|
-
end
|
19
|
-
|
20
|
-
desc "Run the example program"
|
21
|
-
task :example do |t|
|
22
|
-
sh "ruby -Ilib -Ilib/unix -Ilib/windows examples/example_stat.rb"
|
23
|
-
end
|
5
|
+
CLEAN.include('**/*.gem', '**/*.rbc', '**/*.rbx', '**/*.lock')
|
24
6
|
|
25
7
|
namespace :gem do
|
26
8
|
desc "Build the sys-filesystem gem"
|
27
|
-
task :create => [:clean] do
|
9
|
+
task :create => [:clean] do
|
28
10
|
require 'rubygems/package'
|
29
|
-
spec =
|
11
|
+
spec = Gem::Specification.load('sys-filesystem.gemspec')
|
30
12
|
spec.signing_key = File.join(Dir.home, '.ssh', 'gem-private_key.pem')
|
31
|
-
Gem::Package.build(spec
|
13
|
+
Gem::Package.build(spec)
|
32
14
|
end
|
33
15
|
|
34
16
|
desc "Install the sys-filesystem gem"
|
@@ -38,4 +20,12 @@ namespace :gem do
|
|
38
20
|
end
|
39
21
|
end
|
40
22
|
|
41
|
-
|
23
|
+
desc "Run the example program"
|
24
|
+
task :example do
|
25
|
+
sh "ruby -Ilib -Ilib/unix -Ilib/windows examples/example_stat.rb"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Run the test suite"
|
29
|
+
RSpec::Core::RakeTask.new(:spec)
|
30
|
+
|
31
|
+
task :default => :spec
|
data/examples/example_mount.rb
CHANGED
@@ -7,11 +7,12 @@
|
|
7
7
|
require 'optparse'
|
8
8
|
|
9
9
|
options = {:mount_options => []}
|
10
|
+
|
10
11
|
OptionParser.new do |opts|
|
11
12
|
opts.banner = "Usage: #$0 [-o options] [-t external_type] special node"
|
12
13
|
|
13
|
-
opts.on("-o=OPTIONS", "Set one or many mount options (comma delimited)") do |
|
14
|
-
options[:mount_options] +=
|
14
|
+
opts.on("-o=OPTIONS", "Set one or many mount options (comma delimited)") do |cli_opts|
|
15
|
+
options[:mount_options] += cli_opts.split(',')
|
15
16
|
end
|
16
17
|
|
17
18
|
opts.on("-r", "Set readonly flag") do
|
data/lib/sys/filesystem.rb
CHANGED
@@ -11,44 +11,44 @@ module Sys
|
|
11
11
|
include Sys::Filesystem::Structs
|
12
12
|
extend Sys::Filesystem::Functions
|
13
13
|
|
14
|
-
private
|
15
|
-
|
16
14
|
# Readable versions of constant names
|
17
15
|
OPT_NAMES = {
|
18
|
-
MNT_RDONLY
|
19
|
-
MNT_SYNCHRONOUS
|
20
|
-
MNT_NOEXEC
|
21
|
-
MNT_NOSUID
|
22
|
-
MNT_NODEV
|
23
|
-
MNT_UNION
|
24
|
-
MNT_ASYNC
|
25
|
-
MNT_CPROTECT
|
26
|
-
MNT_EXPORTED
|
27
|
-
MNT_QUARANTINE
|
28
|
-
MNT_LOCAL
|
29
|
-
MNT_QUOTA
|
30
|
-
MNT_ROOTFS
|
31
|
-
MNT_DONTBROWSE
|
16
|
+
MNT_RDONLY => 'read-only',
|
17
|
+
MNT_SYNCHRONOUS => 'synchronous',
|
18
|
+
MNT_NOEXEC => 'noexec',
|
19
|
+
MNT_NOSUID => 'nosuid',
|
20
|
+
MNT_NODEV => 'nodev',
|
21
|
+
MNT_UNION => 'union',
|
22
|
+
MNT_ASYNC => 'asynchronous',
|
23
|
+
MNT_CPROTECT => 'content-protection',
|
24
|
+
MNT_EXPORTED => 'exported',
|
25
|
+
MNT_QUARANTINE => 'quarantined',
|
26
|
+
MNT_LOCAL => 'local',
|
27
|
+
MNT_QUOTA => 'quotas',
|
28
|
+
MNT_ROOTFS => 'rootfs',
|
29
|
+
MNT_DONTBROWSE => 'nobrowse',
|
32
30
|
MNT_IGNORE_OWNERSHIP => 'noowners',
|
33
|
-
MNT_AUTOMOUNTED
|
34
|
-
MNT_JOURNALED
|
35
|
-
MNT_NOUSERXATTR
|
36
|
-
MNT_DEFWRITE
|
37
|
-
MNT_NOATIME
|
31
|
+
MNT_AUTOMOUNTED => 'automounted',
|
32
|
+
MNT_JOURNALED => 'journaled',
|
33
|
+
MNT_NOUSERXATTR => 'nouserxattr',
|
34
|
+
MNT_DEFWRITE => 'defwrite',
|
35
|
+
MNT_NOATIME => 'noatime'
|
38
36
|
}.freeze
|
39
37
|
|
38
|
+
private_constant :OPT_NAMES
|
39
|
+
|
40
40
|
# File used to read mount informtion from.
|
41
41
|
if File.exist?('/etc/mtab')
|
42
|
-
MOUNT_FILE = '/etc/mtab'
|
42
|
+
MOUNT_FILE = '/etc/mtab'.freeze
|
43
43
|
elsif File.exist?('/etc/mnttab')
|
44
|
-
MOUNT_FILE = '/etc/mnttab'
|
44
|
+
MOUNT_FILE = '/etc/mnttab'.freeze
|
45
45
|
elsif File.exist?('/proc/mounts')
|
46
|
-
MOUNT_FILE = '/proc/mounts'
|
46
|
+
MOUNT_FILE = '/proc/mounts'.freeze
|
47
47
|
else
|
48
|
-
MOUNT_FILE = 'getmntinfo'
|
48
|
+
MOUNT_FILE = 'getmntinfo'.freeze
|
49
49
|
end
|
50
50
|
|
51
|
-
|
51
|
+
private_constant :MOUNT_FILE
|
52
52
|
|
53
53
|
# The error raised if any of the Filesystem methods fail.
|
54
54
|
class Error < StandardError; end
|
@@ -198,7 +198,27 @@ module Sys
|
|
198
198
|
# Returns a Sys::Filesystem::Stat object containing information about the
|
199
199
|
# +path+ on the filesystem.
|
200
200
|
#
|
201
|
+
# Examples:
|
202
|
+
#
|
203
|
+
# # path
|
204
|
+
# Sys::Filesystem.stat("path")
|
205
|
+
#
|
206
|
+
# # Pathname
|
207
|
+
# pathname = Pathname.new("path")
|
208
|
+
# Sys::Filesystem.stat(pathname)
|
209
|
+
#
|
210
|
+
# # File
|
211
|
+
# file = File.open("file", "r")
|
212
|
+
# Sys::Filesystem.stat(file)
|
213
|
+
#
|
214
|
+
# # Dir
|
215
|
+
# dir = Dir.open("/")
|
216
|
+
# Sys::Filesystem.stat(dir)
|
217
|
+
#
|
201
218
|
def self.stat(path)
|
219
|
+
path = path.path if path.respond_to?(:path) # File, Dir
|
220
|
+
path = path.to_s if path.respond_to?(:to_s) # Pathname
|
221
|
+
|
202
222
|
fs = Statvfs.new
|
203
223
|
|
204
224
|
if statvfs(path, fs) < 0
|
@@ -258,17 +278,17 @@ module Sys
|
|
258
278
|
|
259
279
|
ptr = buf.get_pointer(0)
|
260
280
|
|
261
|
-
num.times
|
281
|
+
num.times do
|
262
282
|
mnt = Statfs.new(ptr)
|
263
283
|
obj = Sys::Filesystem::Mount.new
|
264
284
|
obj.name = mnt[:f_mntfromname].to_s
|
265
285
|
obj.mount_point = mnt[:f_mntonname].to_s
|
266
286
|
obj.mount_type = mnt[:f_fstypename].to_s
|
267
287
|
|
268
|
-
string =
|
288
|
+
string = ''
|
269
289
|
flags = mnt[:f_flags] & MNT_VISFLAGMASK
|
270
290
|
|
271
|
-
OPT_NAMES.each
|
291
|
+
OPT_NAMES.each do |key, val|
|
272
292
|
if flags & key > 0
|
273
293
|
if string.empty?
|
274
294
|
string << val
|
@@ -277,7 +297,7 @@ module Sys
|
|
277
297
|
end
|
278
298
|
end
|
279
299
|
flags &= ~key
|
280
|
-
|
300
|
+
end
|
281
301
|
|
282
302
|
obj.options = string
|
283
303
|
|
@@ -288,7 +308,7 @@ module Sys
|
|
288
308
|
end
|
289
309
|
|
290
310
|
ptr += Statfs.size
|
291
|
-
|
311
|
+
end
|
292
312
|
else
|
293
313
|
begin
|
294
314
|
if respond_to?(:setmntent, true)
|
@@ -365,7 +385,7 @@ module Sys
|
|
365
385
|
dev = File.stat(file).dev
|
366
386
|
val = file
|
367
387
|
|
368
|
-
|
388
|
+
mounts.each do |mnt|
|
369
389
|
mp = mnt.mount_point
|
370
390
|
begin
|
371
391
|
if File.stat(mp).dev == dev
|
@@ -375,7 +395,7 @@ module Sys
|
|
375
395
|
rescue Errno::EACCES
|
376
396
|
next
|
377
397
|
end
|
378
|
-
|
398
|
+
end
|
379
399
|
|
380
400
|
val
|
381
401
|
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
module Sys
|
2
2
|
class Filesystem
|
3
3
|
module Constants
|
4
|
-
private
|
5
|
-
|
6
4
|
MNT_RDONLY = 0x00000001 # read only filesystem
|
7
5
|
MNT_SYNCHRONOUS = 0x00000002 # file system written synchronously
|
8
6
|
MNT_NOEXEC = 0x00000004 # can't exec from filesystem
|
@@ -33,7 +31,7 @@ module Sys
|
|
33
31
|
MNT_LOCAL | MNT_QUOTA |
|
34
32
|
MNT_ROOTFS | MNT_DOVOLFS | MNT_DONTBROWSE |
|
35
33
|
MNT_IGNORE_OWNERSHIP | MNT_AUTOMOUNTED | MNT_JOURNALED |
|
36
|
-
MNT_NOUSERXATTR | MNT_DEFWRITE
|
34
|
+
MNT_NOUSERXATTR | MNT_DEFWRITE | MNT_MULTILABEL |
|
37
35
|
MNT_NOATIME | MNT_CPROTECT
|
38
36
|
)
|
39
37
|
|
@@ -58,7 +56,7 @@ module Sys
|
|
58
56
|
MS_SHARED = 1 << 20
|
59
57
|
MS_RELATIME = 1 << 21
|
60
58
|
MS_KERNMOUNT = 1 << 22
|
61
|
-
MS_I_VERSION =
|
59
|
+
MS_I_VERSION = 1 << 23
|
62
60
|
MS_STRICTATIME = 1 << 24
|
63
61
|
MS_ACTIVE = 1 << 30
|
64
62
|
MS_NOUSER = 1 << 31
|
@@ -7,14 +7,16 @@ module Sys
|
|
7
7
|
|
8
8
|
ffi_lib FFI::Library::LIBC
|
9
9
|
|
10
|
-
if RbConfig::CONFIG['host_os'] =~ /sunos|solaris
|
11
|
-
attach_function(:statvfs, :statvfs64, [
|
10
|
+
if RbConfig::CONFIG['host_os'] =~ /sunos|solaris/i
|
11
|
+
attach_function(:statvfs, :statvfs64, %i[string pointer], :int)
|
12
|
+
elsif RbConfig::CONFIG['host_os'] =~ /linux/i && RbConfig::CONFIG['arch'] =~ /64/
|
13
|
+
attach_function(:statvfs, :statvfs64, %i[string pointer], :int)
|
12
14
|
else
|
13
|
-
attach_function(:statvfs, [
|
15
|
+
attach_function(:statvfs, %i[string pointer], :int)
|
14
16
|
end
|
15
17
|
|
16
18
|
attach_function(:strerror, [:int], :string)
|
17
|
-
attach_function(:mount_c, :mount, [
|
19
|
+
attach_function(:mount_c, :mount, %i[string string string ulong string], :int)
|
18
20
|
|
19
21
|
begin
|
20
22
|
attach_function(:umount_c, :umount, [:string], :int)
|
@@ -28,22 +30,26 @@ module Sys
|
|
28
30
|
|
29
31
|
begin
|
30
32
|
if RbConfig::CONFIG['host_os'] =~ /sunos|solaris/i
|
31
|
-
attach_function(:fopen, [
|
33
|
+
attach_function(:fopen, %i[string string], :pointer)
|
32
34
|
attach_function(:fclose, [:pointer], :int)
|
33
|
-
attach_function(:getmntent, [
|
35
|
+
attach_function(:getmntent, %i[pointer pointer], :int)
|
34
36
|
private_class_method :fopen, :fclose, :getmntent
|
35
37
|
else
|
36
38
|
attach_function(:getmntent, [:pointer], :pointer)
|
37
|
-
attach_function(:setmntent, [
|
39
|
+
attach_function(:setmntent, %i[string string], :pointer)
|
38
40
|
attach_function(:endmntent, [:pointer], :int)
|
39
|
-
attach_function(:umount2, [
|
41
|
+
attach_function(:umount2, %i[string int], :int)
|
40
42
|
private_class_method :getmntent, :setmntent, :endmntent, :umount2
|
41
43
|
end
|
42
44
|
rescue FFI::NotFoundError
|
43
45
|
if RbConfig::CONFIG['host_os'] =~ /darwin|osx|mach/i
|
44
|
-
|
46
|
+
begin
|
47
|
+
attach_function(:getmntinfo, :getmntinfo64, %i[pointer int], :int)
|
48
|
+
rescue FFI::NotFoundError
|
49
|
+
attach_function(:getmntinfo, %i[pointer int], :int) # Big Sur and later
|
50
|
+
end
|
45
51
|
else
|
46
|
-
attach_function(:getmntinfo, [
|
52
|
+
attach_function(:getmntinfo, %i[pointer int], :int)
|
47
53
|
end
|
48
54
|
private_class_method :getmntinfo
|
49
55
|
end
|
@@ -40,20 +40,37 @@ module Sys
|
|
40
40
|
:f_mntonname, [:char, MNAMELEN]
|
41
41
|
)
|
42
42
|
elsif RbConfig::CONFIG['host_os'] =~ /linux/i
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
43
|
+
if RbConfig::CONFIG['arch'] =~ /64/
|
44
|
+
layout(
|
45
|
+
:f_type, :ulong,
|
46
|
+
:f_bsize, :ulong,
|
47
|
+
:f_blocks, :uint64,
|
48
|
+
:f_bfree, :uint64,
|
49
|
+
:f_bavail, :uint64,
|
50
|
+
:f_files, :uint64,
|
51
|
+
:f_ffree, :uint64,
|
52
|
+
:f_fsid, [:int, 2],
|
53
|
+
:f_namelen, :ulong,
|
54
|
+
:f_frsize, :ulong,
|
55
|
+
:f_flags, :ulong,
|
56
|
+
:f_spare, [:ulong, 4]
|
57
|
+
)
|
58
|
+
else
|
59
|
+
layout(
|
60
|
+
:f_type, :ulong,
|
61
|
+
:f_bsize, :ulong,
|
62
|
+
:f_blocks, :uint32,
|
63
|
+
:f_bfree, :uint32,
|
64
|
+
:f_bavail, :uint32,
|
65
|
+
:f_files, :uint32,
|
66
|
+
:f_ffree, :uint32,
|
67
|
+
:f_fsid, [:int, 2],
|
68
|
+
:f_namelen, :ulong,
|
69
|
+
:f_frsize, :ulong,
|
70
|
+
:f_flags, :ulong,
|
71
|
+
:f_spare, [:ulong, 4]
|
72
|
+
)
|
73
|
+
end
|
57
74
|
else
|
58
75
|
layout(
|
59
76
|
:f_bsize, :uint32,
|
@@ -123,6 +140,22 @@ module Sys
|
|
123
140
|
:f_fstr, [:char, 32],
|
124
141
|
:f_filler, [:ulong, 16]
|
125
142
|
)
|
143
|
+
elsif RbConfig::CONFIG['host'] =~ /i686/i
|
144
|
+
layout(
|
145
|
+
:f_bsize, :ulong,
|
146
|
+
:f_frsize, :ulong,
|
147
|
+
:f_blocks, :uint,
|
148
|
+
:f_bfree, :uint,
|
149
|
+
:f_bavail, :uint,
|
150
|
+
:f_files, :uint,
|
151
|
+
:f_ffree, :uint,
|
152
|
+
:f_favail, :uint,
|
153
|
+
:f_fsid, :ulong,
|
154
|
+
:f_unused, :int,
|
155
|
+
:f_flag, :ulong,
|
156
|
+
:f_namemax, :ulong,
|
157
|
+
:f_spare, [:int, 6]
|
158
|
+
)
|
126
159
|
else
|
127
160
|
layout(
|
128
161
|
:f_bsize, :ulong,
|
@@ -181,7 +181,7 @@ module Sys
|
|
181
181
|
|
182
182
|
boot_time = get_boot_time
|
183
183
|
|
184
|
-
drives.each
|
184
|
+
drives.each do |drive|
|
185
185
|
mount = Mount.new
|
186
186
|
volume = FFI::MemoryPointer.new(:char, MAXPATH)
|
187
187
|
fsname = FFI::MemoryPointer.new(:char, MAXPATH)
|
@@ -206,7 +206,7 @@ module Sys
|
|
206
206
|
|
207
207
|
# Skip unmounted floppies or cd-roms, or inaccessible drives
|
208
208
|
unless bool
|
209
|
-
if [5,21].include?(FFI.errno) # ERROR_NOT_READY or ERROR_ACCESS_DENIED
|
209
|
+
if [5, 21].include?(FFI.errno) # ERROR_NOT_READY or ERROR_ACCESS_DENIED
|
210
210
|
next
|
211
211
|
else
|
212
212
|
raise SystemCallError.new('GetVolumeInformation', FFI.errno)
|
@@ -218,7 +218,7 @@ module Sys
|
|
218
218
|
|
219
219
|
name = 0.chr * MAXPATH
|
220
220
|
|
221
|
-
if QueryDosDeviceA(drive[0,2], name, name.size) == 0
|
221
|
+
if QueryDosDeviceA(drive[0, 2], name, name.size) == 0
|
222
222
|
raise SystemCallError.new('QueryDosDevice', FFI.errno)
|
223
223
|
end
|
224
224
|
|
@@ -231,7 +231,7 @@ module Sys
|
|
231
231
|
else
|
232
232
|
mounts << mount
|
233
233
|
end
|
234
|
-
|
234
|
+
end
|
235
235
|
|
236
236
|
mounts # Nil if the block form was used.
|
237
237
|
end
|
@@ -259,10 +259,25 @@ module Sys
|
|
259
259
|
#
|
260
260
|
# Examples:
|
261
261
|
#
|
262
|
+
# # Regular directory
|
262
263
|
# Sys::Filesystem.stat("C:\\")
|
263
264
|
# Sys::Filesystem.stat("C:\\Documents and Settings\\some_user")
|
264
265
|
#
|
266
|
+
# # Pathname
|
267
|
+
# pathname = Pathname.new("C:\\")
|
268
|
+
# Sys::Filesystem.stat(pathname)
|
269
|
+
#
|
270
|
+
# # Dir
|
271
|
+
# dir = Dir.open("C:\\")
|
272
|
+
# Sys::Filesystem.stat(dir)
|
273
|
+
#
|
274
|
+
# Note that on Windows you cannot stat a regular file because
|
275
|
+
# Windows won't like it. It must be a directory in some form.
|
276
|
+
#
|
265
277
|
def self.stat(path)
|
278
|
+
path = path.path if path.respond_to?(:path) # Dir
|
279
|
+
path = path.to_s if path.respond_to?(:to_s) # Pathname
|
280
|
+
|
266
281
|
bytes_avail = FFI::MemoryPointer.new(:ulong_long)
|
267
282
|
bytes_free = FFI::MemoryPointer.new(:ulong_long)
|
268
283
|
total_bytes = FFI::MemoryPointer.new(:ulong_long)
|
@@ -270,7 +285,7 @@ module Sys
|
|
270
285
|
mpoint = mount_point(path).to_s
|
271
286
|
mpoint << '/' unless mpoint.end_with?('/')
|
272
287
|
|
273
|
-
wpath
|
288
|
+
wpath = path.to_s.wincode
|
274
289
|
|
275
290
|
# We need this call for the 64 bit support
|
276
291
|
unless GetDiskFreeSpaceExW(wpath, bytes_avail, total_bytes, bytes_free)
|
@@ -382,8 +397,6 @@ module Sys
|
|
382
397
|
self
|
383
398
|
end
|
384
399
|
|
385
|
-
private
|
386
|
-
|
387
400
|
# This method is used to get the boot time of the system, which is used
|
388
401
|
# for the mount_time attribute within the File.mounts method.
|
389
402
|
#
|
@@ -396,36 +409,37 @@ module Sys
|
|
396
409
|
raise Error, e
|
397
410
|
else
|
398
411
|
query = 'select LastBootupTime from Win32_OperatingSystem'
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
return Time.mktime(*time_array)
|
403
|
-
}
|
412
|
+
ole = wmi.ExecQuery(query).ItemIndex(0)
|
413
|
+
time_array = Time.parse(ole.LastBootupTime.split('.').first)
|
414
|
+
Time.mktime(*time_array)
|
404
415
|
end
|
405
416
|
end
|
406
417
|
|
418
|
+
private_class_method :get_boot_time
|
419
|
+
|
407
420
|
# Private method that converts filesystem flags into a comma separated
|
408
421
|
# list of strings. The presentation is meant as a rough analogue to the
|
409
422
|
# way options are presented for Unix filesystems.
|
410
423
|
#
|
411
424
|
def self.get_options(flags)
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
str
|
425
|
+
str = ''
|
426
|
+
str << ' casepres' if CASE_PRESERVED_NAMES & flags > 0
|
427
|
+
str << ' casesens' if CASE_SENSITIVE_SEARCH & flags > 0
|
428
|
+
str << ' compression' if FILE_COMPRESSION & flags > 0
|
429
|
+
str << ' namedstreams' if NAMED_STREAMS & flags > 0
|
430
|
+
str << ' pacls' if PERSISTENT_ACLS & flags > 0
|
431
|
+
str << ' ro' if READ_ONLY_VOLUME & flags > 0
|
432
|
+
str << ' encryption' if SUPPORTS_ENCRYPTION & flags > 0
|
433
|
+
str << ' objids' if SUPPORTS_OBJECT_IDS & flags > 0
|
434
|
+
str << ' rpoints' if SUPPORTS_REPARSE_POINTS & flags > 0
|
435
|
+
str << ' sparse' if SUPPORTS_SPARSE_FILES & flags > 0
|
436
|
+
str << ' unicode' if UNICODE_ON_DISK & flags > 0
|
437
|
+
str << ' compressed' if VOLUME_IS_COMPRESSED & flags > 0
|
438
|
+
|
439
|
+
str.tr!(' ', ',')
|
440
|
+
str[1..-1] # Ignore the first comma
|
429
441
|
end
|
442
|
+
|
443
|
+
private_class_method :get_options
|
430
444
|
end
|
431
445
|
end
|