vhd 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile +2 -0
- data/Gemfile.lock +20 -19
- data/fixed_footer.bin +0 -0
- data/lib/vhd.rb +4 -1
- data/lib/vhd/footer.rb +31 -0
- data/lib/vhd/library.rb +78 -14
- data/lib/vhd/version.rb +1 -1
- data/spec/vhd_tests.rb +5 -10
- data/{vhd-ruby.gemspec → vhd.gemspec} +1 -2
- metadata +6 -5
- data/lib/libvhd.so.0.1.1 +0 -0
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NTBlMjI2MjFlMGFkNWZlODViODg5ZGJmYjIxYmMwN2JjYzg5ZTRlNQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NWU1N2VmNGU0Mjc4MDc4NmMyYWNlZjliYWE1ODQ2ZmQ5ZjUyMGU1ZQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YTMzOTdiNWZkMThjYmRhZGExODZhMmE0OTA1MTM4Yzg3YTFjMzk2OGRmYTc4
|
10
|
+
MWY5YTcxMDI1N2MzZGUyODYyNGU5YzUyNjg4NzhhNmZmNjgzMGU2YjhiNGYx
|
11
|
+
MzdkOGU4NzI1MjY3MmQ3ZTdkYzkzZjAwODkwY2I0YmE5ODA4MTY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YjY0YTRkMzAzNzMyYzkyMzM4NjBkNWFhZDNlNzU1OTk3ZTNmN2Q0MGJlNmMw
|
14
|
+
ZTUyMTZlMzIyYjFlN2IyNGEyZjYwZGQzNzU3MjQwMzkxODgwMDI0MmUwMjA2
|
15
|
+
MDkwN2U4N2U0MjY5MjUxMzkwOWQ5YjRjOThhMWI0NmZkMDVjY2M=
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,32 +1,33 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
vhd
|
5
|
-
|
4
|
+
vhd (0.0.2)
|
5
|
+
bit-struct
|
6
6
|
|
7
7
|
GEM
|
8
|
+
remote: https://rubygems.org/
|
8
9
|
specs:
|
9
|
-
awesome_print (1.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
method_source (0.8.
|
15
|
-
pry (0.9.12)
|
16
|
-
coderay (~> 1.0
|
10
|
+
awesome_print (1.2.0)
|
11
|
+
bit-struct (0.15.0)
|
12
|
+
coderay (1.1.0)
|
13
|
+
diff-lcs (1.2.5)
|
14
|
+
ffaker (1.23.0)
|
15
|
+
method_source (0.8.2)
|
16
|
+
pry (0.9.12.4)
|
17
|
+
coderay (~> 1.0)
|
17
18
|
method_source (~> 0.8)
|
18
19
|
slop (~> 3.4)
|
19
20
|
pry-nav (0.2.3)
|
20
21
|
pry (~> 0.9.10)
|
21
|
-
rspec (2.
|
22
|
-
rspec-core (~> 2.
|
23
|
-
rspec-expectations (~> 2.
|
24
|
-
rspec-mocks (~> 2.
|
25
|
-
rspec-core (2.
|
26
|
-
rspec-expectations (2.
|
22
|
+
rspec (2.14.1)
|
23
|
+
rspec-core (~> 2.14.0)
|
24
|
+
rspec-expectations (~> 2.14.0)
|
25
|
+
rspec-mocks (~> 2.14.0)
|
26
|
+
rspec-core (2.14.7)
|
27
|
+
rspec-expectations (2.14.4)
|
27
28
|
diff-lcs (>= 1.1.3, < 2.0)
|
28
|
-
rspec-mocks (2.
|
29
|
-
slop (3.4.
|
29
|
+
rspec-mocks (2.14.4)
|
30
|
+
slop (3.4.7)
|
30
31
|
|
31
32
|
PLATFORMS
|
32
33
|
ruby
|
@@ -37,4 +38,4 @@ DEPENDENCIES
|
|
37
38
|
pry
|
38
39
|
pry-nav
|
39
40
|
rspec
|
40
|
-
vhd
|
41
|
+
vhd!
|
data/fixed_footer.bin
ADDED
Binary file
|
data/lib/vhd.rb
CHANGED
data/lib/vhd/footer.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
class Vhd::Footer < BitStruct
|
2
|
+
unsigned :cookie , 8 , "Cookie"
|
3
|
+
unsigned :features , 4 , "Features"
|
4
|
+
unsigned :ff , 4 , "File Format"
|
5
|
+
unsigned :data_offset , 8 , "Data Offset"
|
6
|
+
unsigned :timestamp , 4 , "Timestamp"
|
7
|
+
unsigned :creator_app , 4 , "Creator Application"
|
8
|
+
unsigned :creator_ver , 4 , "Creator Version"
|
9
|
+
unsigned :creator_host , 4 , "Creator Host OS"
|
10
|
+
unsigned :original_size , 8 , "Original Size"
|
11
|
+
unsigned :current_size , 8 , "Current Size"
|
12
|
+
unsigned :geometry , 4 , "Disk Geometry"
|
13
|
+
unsigned :type , 4 , "Disk Type"
|
14
|
+
unsigned :checksum , 4 , "Footer Checksum"
|
15
|
+
unsigned :uuid , 16 , "Unique Id"
|
16
|
+
unsigned :saved_state , 1 , "Saved State"
|
17
|
+
unsigned :reserved , 427 , "Reserved Space"
|
18
|
+
|
19
|
+
initial_value.cookie = "conectix"
|
20
|
+
initial_value.features = 2
|
21
|
+
initial_value.ff = 65536
|
22
|
+
initial_value.offset = 18446744073709551615
|
23
|
+
initial_value.timestamp = (Time.now - Time.parse("Jan 1, 2000 12:00:00 AM GMT")).to_i
|
24
|
+
initial_value.creator_app = "rvhd"
|
25
|
+
initial_value.creator_ver = 0
|
26
|
+
initial_value.creator_host = "Wi2k"
|
27
|
+
initial_value.type = 2
|
28
|
+
initial_value.uuid = SecureRandom.uuid.delete('-')
|
29
|
+
initial_value.saved_state = 0
|
30
|
+
initial_value.reserved = 0
|
31
|
+
end
|
data/lib/vhd/library.rb
CHANGED
@@ -1,24 +1,88 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
ffi_lib "libvhd.so.0.1.1"
|
4
|
-
attach_function :vhd_create, [ :string, :uint64, :int, :uint64, :uint ], :int
|
1
|
+
class Vhd::Library
|
2
|
+
VALID_TYPES = [:fixed]
|
5
3
|
|
6
|
-
|
7
|
-
HD_TYPE_DYNAMIC = 3
|
4
|
+
attr_reader :name, :footer, :size
|
8
5
|
|
9
|
-
def
|
10
|
-
|
6
|
+
def initialize(options={})
|
7
|
+
raise "Invalid vhd type" unless VALID_TYPES.include?(options[:type])
|
8
|
+
raise "Name is required" unless options[:name]
|
9
|
+
raise "Size is required" unless options[:size]
|
10
|
+
@name = options[:name]
|
11
|
+
@footer = {}
|
12
|
+
@size = options[:size]
|
11
13
|
|
12
|
-
|
14
|
+
self.generate_footer
|
13
15
|
end
|
14
16
|
|
15
|
-
def
|
16
|
-
|
17
|
+
def create
|
18
|
+
File.open(@name, "wb") { |f| f.print @footer.values.join }
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_footer(options={})
|
22
|
+
@footer[:cookie] = "conectix".force_encoding("BINARY")
|
23
|
+
@footer[:features] = ["00000002"].pack("H*")
|
24
|
+
@footer[:ff] = ["00010000"].pack("H*")
|
25
|
+
@footer[:offset] = ["FFFFFFFFFFFFFFFF"].pack("H*")
|
26
|
+
@footer[:time] = [(Time.now - Time.parse("Jan 1, 2000 12:00:00 AM GMT")).to_i.to_s(16)].pack("H*")
|
27
|
+
@footer[:creator_app] = "rvhd".force_encoding("UTF-8")
|
28
|
+
@footer[:creator_ver] = ["00060002"].pack("H*")
|
29
|
+
@footer[:creator_host] = "Wi2k".force_encoding("UTF-8")
|
30
|
+
@footer[:orig_size] = size_in_hex
|
31
|
+
@footer[:curr_size] = size_in_hex
|
32
|
+
@footer[:geometry] = nil
|
33
|
+
@footer[:disk_type] = ["00000002"].pack("H*")
|
34
|
+
@footer[:checksum] = nil
|
35
|
+
@footer[:uuid] = SecureRandom.hex.scan(/../).map { |c| c.hex.chr.force_encoding("BINARY") }.join
|
36
|
+
@footer[:state] = ["0"].pack("H*")
|
37
|
+
@footer[:reserved] = Array("00"*427).pack("H*")
|
38
|
+
|
39
|
+
self.geometry
|
40
|
+
self.checksum
|
41
|
+
end
|
17
42
|
|
18
|
-
|
43
|
+
def size_in_bytes
|
44
|
+
(((@size * 1024) * 1024) * 1024).to_i
|
19
45
|
end
|
20
46
|
|
21
|
-
def
|
22
|
-
|
47
|
+
def size_in_hex
|
48
|
+
hex_size = size_in_bytes.to_s(16)
|
49
|
+
hex_size = "0" + hex_size until hex_size.length == 16
|
50
|
+
[hex_size].pack("H*")
|
51
|
+
end
|
52
|
+
|
53
|
+
def geometry
|
54
|
+
max_size = 65535 * 16 * 255 * 512
|
55
|
+
capacity = size_in_bytes > max_size ? max_size : size_in_bytes
|
56
|
+
total_sectors = capacity / 512
|
57
|
+
|
58
|
+
if total_sectors > (65535 * 16 * 63)
|
59
|
+
sectors_per_track = 255
|
60
|
+
heads_per_cylinder = 16
|
61
|
+
else
|
62
|
+
sectors_per_track = 17
|
63
|
+
cylinders_times_heads = total_sectors / sectors_per_track
|
64
|
+
heads_per_cylinder = (cylinders_times_heads + 1023) / 1024
|
65
|
+
heads_per_cylinder = 4 if heads_per_cylinder < 4
|
66
|
+
|
67
|
+
cylinders_times_heads >= ((heads_per_cylinder * 1024) or (heads_per_cylinder > 16))
|
68
|
+
sectors_per_track = 63
|
69
|
+
heads_per_cylinder = 16
|
70
|
+
end
|
71
|
+
|
72
|
+
cylinders = (total_sectors / sectors_per_track) / heads_per_cylinder
|
73
|
+
|
74
|
+
@footer[:geometry] = [cylinders, heads_per_cylinder, sectors_per_track].pack("SCC")
|
75
|
+
end
|
76
|
+
|
77
|
+
def checksum
|
78
|
+
checksum = 0
|
79
|
+
|
80
|
+
@footer.each do |k,v|
|
81
|
+
next if k == :checksum
|
82
|
+
|
83
|
+
checksum += v.codepoints.inject(0) { |r,c| r += c }
|
84
|
+
end
|
85
|
+
|
86
|
+
@footer[:checksum] = ["%08x" % ((~checksum).abs ^ 0xFFFFFFFF)].pack("H*")
|
23
87
|
end
|
24
88
|
end
|
data/lib/vhd/version.rb
CHANGED
data/spec/vhd_tests.rb
CHANGED
@@ -2,22 +2,17 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "vhds" do
|
4
4
|
before(:each) do
|
5
|
-
@
|
5
|
+
@file = Tempfile.new(Faker::Name.first_name.downcase)
|
6
6
|
end
|
7
7
|
|
8
|
-
let(:file_name) { @
|
9
|
-
|
10
|
-
it "should create a dynamic vhd" do
|
11
|
-
Vhd::Library.create_dynamic_disk(file_name, 0.1)
|
12
|
-
File.size(file_name).should == 3584
|
13
|
-
end
|
8
|
+
let(:file_name) { @file.path }
|
14
9
|
|
15
10
|
it "should create a fixed vhd" do
|
16
|
-
Vhd::Library.
|
17
|
-
|
11
|
+
disk = Vhd::Library.new(type: :fixed, size: 1, name: file_name)
|
12
|
+
disk.create
|
18
13
|
end
|
19
14
|
|
20
15
|
after(:each) do
|
21
|
-
|
16
|
+
@file.close
|
22
17
|
end
|
23
18
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
require File.expand_path('../lib/vhd/version', __FILE__)
|
3
|
-
require File.expand_path('../lib/vhd.rb', __FILE__)
|
4
3
|
|
5
4
|
Gem::Specification.new do |gem|
|
6
5
|
gem.authors = ["Eugene Howe"]
|
@@ -16,5 +15,5 @@ Gem::Specification.new do |gem|
|
|
16
15
|
gem.require_paths = ["lib"]
|
17
16
|
gem.version = Vhd::VERSION
|
18
17
|
|
19
|
-
gem.add_dependency "
|
18
|
+
gem.add_dependency "bit-struct"
|
20
19
|
end
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vhd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eugene Howe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bit-struct
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ! '>='
|
@@ -34,13 +34,14 @@ files:
|
|
34
34
|
- Gemfile
|
35
35
|
- Gemfile.lock
|
36
36
|
- README.md
|
37
|
-
-
|
37
|
+
- fixed_footer.bin
|
38
38
|
- lib/vhd.rb
|
39
|
+
- lib/vhd/footer.rb
|
39
40
|
- lib/vhd/library.rb
|
40
41
|
- lib/vhd/version.rb
|
41
42
|
- spec/spec_helper.rb
|
42
43
|
- spec/vhd_tests.rb
|
43
|
-
- vhd
|
44
|
+
- vhd.gemspec
|
44
45
|
homepage: ''
|
45
46
|
licenses: []
|
46
47
|
metadata: {}
|
data/lib/libvhd.so.0.1.1
DELETED
Binary file
|