win32-file-stat 1.4.3 → 1.5.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
- data/CHANGES +5 -0
- data/README +8 -0
- data/lib/win32/file/stat.rb +35 -8
- data/lib/win32/file/windows/constants.rb +2 -0
- data/lib/win32/file/windows/functions.rb +5 -0
- data/lib/win32/file/windows/structs.rb +26 -1
- data/test/test_file_stat.rb +10 -1
- data/win32-file-stat.gemspec +1 -2
- metadata +14 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 570cfbe24ce0b82de003f94d55e00b53dff39c77
|
4
|
+
data.tar.gz: 36cebc20ffc58f5ac96b8daad1558cd48a121f3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d573af01f22041b8c4b89512865a74e25e93c87a9b3d4450af2e6143a5d405322e506bd26d4ebe12c40e0af64fc218ec481fdce4e87017ba6145727cbd4a813
|
7
|
+
data.tar.gz: 9208feadbeec27b4add065953b2bc35469bf41fa2bf417a606be7688acf71cd1b80bb4eeb76923e16aeab0ea114da2cc3dc73d2a9fea2af6fb9016860cd3ff72
|
data/CHANGES
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 1.5.0 - 10-Nov-2014
|
2
|
+
* Added the #streams method, which shows alt streams for the file.
|
3
|
+
* Use require_relative where appropriate.
|
4
|
+
* Removed reference to rubyforge_project in gemspec.
|
5
|
+
|
1
6
|
== 1.4.3 - 8-May-2014
|
2
7
|
* The #writable? method now ignores the readonly attribute if it's a directory.
|
3
8
|
* Replaced File.exists? with File.exist? to avoid warnings in Ruby 2.1.x.
|
data/README
CHANGED
@@ -17,6 +17,7 @@
|
|
17
17
|
p stat.readonly?
|
18
18
|
p stat.hidden?
|
19
19
|
p stat.uid
|
20
|
+
p stat.streams
|
20
21
|
|
21
22
|
== Differences between Ruby's File::Stat and this version:
|
22
23
|
* The File::Stat#blksize method returns a meaningful value.
|
@@ -36,6 +37,7 @@
|
|
36
37
|
* The File::Stat#grpowned? method now works properly.
|
37
38
|
* The File::Stat#rdev method returns the volume serial number.
|
38
39
|
* The inspect and pretty print output has been customized.
|
40
|
+
* The File::Stat#streams was added. Returns an array of alt streams.
|
39
41
|
|
40
42
|
== Changes between this version and the previous versions.
|
41
43
|
* The File::Stat#dev method has reverted to returning a drive number by
|
@@ -69,6 +71,12 @@
|
|
69
71
|
has a builtin pretty_print method for File::Stat. If I didn't do this
|
70
72
|
you would end up using the pretty_print in pp.rb, which would break.
|
71
73
|
|
74
|
+
== Contributions
|
75
|
+
Although this library is free, please consider having your company
|
76
|
+
setup a gittip if used by your company professionally.
|
77
|
+
|
78
|
+
http://www.gittip.com/djberg96/
|
79
|
+
|
72
80
|
== Copyright
|
73
81
|
(C) 2003-2014, Daniel J. Berger, All Rights Reserved.
|
74
82
|
|
data/lib/win32/file/stat.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
require_relative 'windows/helper'
|
2
|
+
require_relative 'windows/constants'
|
3
|
+
require_relative 'windows/structs'
|
4
|
+
require_relative 'windows/functions'
|
5
5
|
require 'pp'
|
6
6
|
|
7
7
|
class File::Stat
|
@@ -54,8 +54,11 @@ class File::Stat
|
|
54
54
|
# Nil on Windows
|
55
55
|
attr_reader :dev_major, :dev_minor, :rdev_major, :rdev_minor
|
56
56
|
|
57
|
+
# Alternate streams
|
58
|
+
attr_reader :streams
|
59
|
+
|
57
60
|
# The version of the win32-file-stat library
|
58
|
-
WIN32_FILE_STAT_VERSION = '1.
|
61
|
+
WIN32_FILE_STAT_VERSION = '1.5.0'
|
59
62
|
|
60
63
|
# Creates and returns a File::Stat object, which encapsulate common status
|
61
64
|
# information for File objects on MS Windows sytems. The information is
|
@@ -86,6 +89,7 @@ class File::Stat
|
|
86
89
|
|
87
90
|
if handle
|
88
91
|
@filetype = get_filetype(handle)
|
92
|
+
@streams = get_streams(handle)
|
89
93
|
@chardev = @filetype == FILE_TYPE_CHAR
|
90
94
|
@regular = @filetype == FILE_TYPE_DISK
|
91
95
|
@pipe = @filetype == FILE_TYPE_PIPE
|
@@ -506,8 +510,8 @@ class File::Stat
|
|
506
510
|
members = %w[
|
507
511
|
archive? atime blksize blockdev? blocks compressed? ctime dev
|
508
512
|
encrypted? gid hidden? indexed? ino mode mtime rdev nlink normal?
|
509
|
-
offline? readonly? reparse_point? size sparse? system?
|
510
|
-
uid
|
513
|
+
offline? readonly? reparse_point? size sparse? system? streams
|
514
|
+
temporary? uid
|
511
515
|
]
|
512
516
|
|
513
517
|
str = "#<#{self.class}"
|
@@ -533,7 +537,7 @@ class File::Stat
|
|
533
537
|
members = %w[
|
534
538
|
archive? atime blksize blockdev? blocks compressed? ctime dev
|
535
539
|
encrypted? gid hidden? indexed? ino mode mtime rdev nlink normal?
|
536
|
-
offline? readonly? reparse_point? size sparse? system? temporary?
|
540
|
+
offline? readonly? reparse_point? size sparse? streams system? temporary?
|
537
541
|
uid
|
538
542
|
]
|
539
543
|
|
@@ -713,6 +717,29 @@ class File::Stat
|
|
713
717
|
file_type
|
714
718
|
end
|
715
719
|
|
720
|
+
def get_streams(handle)
|
721
|
+
io_status = IO_STATUS_BLOCK.new
|
722
|
+
ptr = FFI::MemoryPointer.new(:uchar, 1024 * 64)
|
723
|
+
|
724
|
+
NtQueryInformationFile(handle, io_status, ptr, ptr.size, FileStreamInformation)
|
725
|
+
|
726
|
+
if FFI.errno != 0
|
727
|
+
raise SystemCallError.new('NtQueryInformationFile', FFI.errno)
|
728
|
+
end
|
729
|
+
|
730
|
+
arr = []
|
731
|
+
|
732
|
+
while true
|
733
|
+
info = FILE_STREAM_INFORMATION.new(ptr)
|
734
|
+
break if info[:StreamNameLength] == 0
|
735
|
+
arr << info[:StreamName].to_ptr.read_bytes(info[:StreamNameLength]).delete(0.chr)
|
736
|
+
break if info[:NextEntryOffset] == 0
|
737
|
+
info = FILE_STREAM_INFORMATION.new(ptr += info[:NextEntryOffset])
|
738
|
+
end
|
739
|
+
|
740
|
+
arr
|
741
|
+
end
|
742
|
+
|
716
743
|
# Return a sid of the file's owner.
|
717
744
|
#
|
718
745
|
def get_file_sid(file, info)
|
@@ -16,6 +16,7 @@ module Windows
|
|
16
16
|
typedef :pointer, :ptr
|
17
17
|
typedef :buffer_in, :buf_in
|
18
18
|
typedef :string, :str
|
19
|
+
typedef :long, :ntstatus
|
19
20
|
|
20
21
|
ffi_convention :stdcall
|
21
22
|
|
@@ -52,6 +53,10 @@ module Windows
|
|
52
53
|
attach_pfunc :BuildTrusteeWithSid, :BuildTrusteeWithSidW, [:ptr, :ptr], :void
|
53
54
|
attach_pfunc :GetSecurityDescriptorDacl, [:ptr, :ptr, :ptr, :ptr], :bool
|
54
55
|
attach_pfunc :GetEffectiveRightsFromAcl, :GetEffectiveRightsFromAclW, [:ptr, :ptr, :ptr], :dword
|
56
|
+
|
57
|
+
ffi_lib :ntdll
|
58
|
+
|
59
|
+
attach_pfunc :NtQueryInformationFile, [:handle, :pointer, :pointer, :ulong, :int], :ntstatus
|
55
60
|
end
|
56
61
|
end
|
57
62
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative 'constants'
|
2
2
|
|
3
3
|
require 'ffi'
|
4
4
|
|
@@ -9,6 +9,31 @@ module Windows
|
|
9
9
|
|
10
10
|
private
|
11
11
|
|
12
|
+
class LowHighLarge < FFI::Struct
|
13
|
+
layout(:LowPart, :ulong, :HighPart, :long)
|
14
|
+
end
|
15
|
+
|
16
|
+
class LARGE_INTEGER < FFI::Union
|
17
|
+
layout(:u, LowHighLarge, :QuadPart, :long_long)
|
18
|
+
end
|
19
|
+
|
20
|
+
class FILE_STREAM_INFORMATION < FFI::Struct
|
21
|
+
layout(
|
22
|
+
:NextEntryOffset, :ulong,
|
23
|
+
:StreamNameLength, :ulong,
|
24
|
+
:StreamSize, LARGE_INTEGER,
|
25
|
+
:StreamAllocateSize, LARGE_INTEGER,
|
26
|
+
:StreamName, [:uchar, 256]
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
class IO_STATUS_BLOCK < FFI::Struct
|
31
|
+
layout(
|
32
|
+
:union, Class.new(FFI::Union){ layout(:Status, :long, :Pointer, :pointer) },
|
33
|
+
:Information, :uintptr_t
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
12
37
|
class LowHigh < FFI::Struct
|
13
38
|
layout(:LowPart, :ulong, :HighPart, :ulong)
|
14
39
|
end
|
data/test/test_file_stat.rb
CHANGED
@@ -54,7 +54,7 @@ class TC_Win32_File_Stat < Test::Unit::TestCase
|
|
54
54
|
end
|
55
55
|
|
56
56
|
test "version is set to expected value" do
|
57
|
-
assert_equal('1.
|
57
|
+
assert_equal('1.5.0', File::Stat::WIN32_FILE_STAT_VERSION)
|
58
58
|
end
|
59
59
|
|
60
60
|
test "constructor does not modify argument" do
|
@@ -529,6 +529,15 @@ class TC_Win32_File_Stat < Test::Unit::TestCase
|
|
529
529
|
assert_false(@stat.sticky?)
|
530
530
|
end
|
531
531
|
|
532
|
+
test "streams basic functionality" do
|
533
|
+
assert_respond_to(@stat, :streams)
|
534
|
+
assert_kind_of(Array, @stat.streams)
|
535
|
+
end
|
536
|
+
|
537
|
+
test "streams returns expected value" do
|
538
|
+
assert_equal("::$DATA", @stat.streams[0])
|
539
|
+
end
|
540
|
+
|
532
541
|
test "symlink? basic functionality" do
|
533
542
|
assert_respond_to(@stat, :symlink?)
|
534
543
|
assert_boolean(@stat.symlink?)
|
data/win32-file-stat.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = 'win32-file-stat'
|
3
|
-
spec.version = '1.
|
3
|
+
spec.version = '1.5.0'
|
4
4
|
spec.authors = ['Daniel J. Berger', 'Park Heesob']
|
5
5
|
spec.license = 'Artistic 2.0'
|
6
6
|
spec.email = 'djberg96@gmail.com'
|
@@ -9,7 +9,6 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.test_file = 'test/test_file_stat.rb'
|
10
10
|
spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
|
11
11
|
|
12
|
-
spec.rubyforge_project = 'Win32Utils'
|
13
12
|
spec.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
|
14
13
|
spec.required_ruby_version = ">= 1.9.0"
|
15
14
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: win32-file-stat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Berger
|
@@ -9,62 +9,62 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-11-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: test-unit
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '0'
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: win32-security
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rake
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
description: |2
|
@@ -102,17 +102,17 @@ require_paths:
|
|
102
102
|
- lib
|
103
103
|
required_ruby_version: !ruby/object:Gem::Requirement
|
104
104
|
requirements:
|
105
|
-
- -
|
105
|
+
- - ">="
|
106
106
|
- !ruby/object:Gem::Version
|
107
107
|
version: 1.9.0
|
108
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
109
|
requirements:
|
110
|
-
- -
|
110
|
+
- - ">="
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: '0'
|
113
113
|
requirements: []
|
114
|
-
rubyforge_project:
|
115
|
-
rubygems_version: 2.
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 2.4.2
|
116
116
|
signing_key:
|
117
117
|
specification_version: 4
|
118
118
|
summary: A File::Stat class tailored to MS Windows
|