libvirt_ffi 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +21 -0
- data/README.md +44 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/libvirt +3 -0
- data/lib/libvirt/connection.rb +107 -0
- data/lib/libvirt/domain.rb +29 -0
- data/lib/libvirt/error.rb +6 -0
- data/lib/libvirt/event.rb +124 -0
- data/lib/libvirt/ffi/common.rb +15 -0
- data/lib/libvirt/ffi/connection.rb +26 -0
- data/lib/libvirt/ffi/domain.rb +95 -0
- data/lib/libvirt/ffi/event.rb +104 -0
- data/lib/libvirt/ffi/libvirt.rb +20 -0
- data/lib/libvirt/lib_version.rb +13 -0
- data/lib/libvirt/util.rb +34 -0
- data/lib/libvirt/version.rb +5 -0
- data/lib/libvirt.rb +40 -0
- data/lib/libvirt_ffi.rb +1 -0
- data/libvirt.gemspec +28 -0
- data/test_usage/support/libvirt_async.rb +534 -0
- data/test_usage/support/log_formatter.rb +38 -0
- data/test_usage/test_event_loop.rb +60 -0
- metadata +89 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ffi'
|
4
|
+
require 'libvirt/util'
|
5
|
+
require 'libvirt/ffi/common'
|
6
|
+
|
7
|
+
module Libvirt
|
8
|
+
module FFI
|
9
|
+
module Event
|
10
|
+
extend ::FFI::Library
|
11
|
+
ffi_lib Util.library_path
|
12
|
+
|
13
|
+
# typedef void (*virEventHandleCallback) (
|
14
|
+
# int watch,
|
15
|
+
# int fd,
|
16
|
+
# int events,
|
17
|
+
# void * opaque
|
18
|
+
# )
|
19
|
+
EVENT_HANDLE_CALLBACK = callback :virEventHandleCallback, [:int, :int, :int, :pointer], :void
|
20
|
+
|
21
|
+
# typedef void (*virEventTimeoutCallback) (
|
22
|
+
# int timer,
|
23
|
+
# void * opaque
|
24
|
+
# )
|
25
|
+
EVENT_TIMEOUT_CALLBACK = callback :virEventTimeoutCallback, [:int, :pointer], :void
|
26
|
+
|
27
|
+
# typedef int (*virEventAddHandleFunc) (
|
28
|
+
# int fd,
|
29
|
+
# int event,
|
30
|
+
# virEventHandleCallback cb,
|
31
|
+
# void * opaque,
|
32
|
+
# virFreeCallback ff
|
33
|
+
# )
|
34
|
+
callback :virEventAddHandleFunc, [
|
35
|
+
:int,
|
36
|
+
:int,
|
37
|
+
:virEventHandleCallback,
|
38
|
+
:pointer,
|
39
|
+
FFI::Common::FREE_CALLBACK
|
40
|
+
], :int
|
41
|
+
|
42
|
+
# typedef void (*virEventUpdateHandleFunc) (
|
43
|
+
# int watch,
|
44
|
+
# int event
|
45
|
+
# )
|
46
|
+
callback :virEventUpdateHandleFunc, [:int, :int], :void
|
47
|
+
|
48
|
+
# typedef int (*virEventRemoveHandleFunc) (
|
49
|
+
# int watch
|
50
|
+
# )
|
51
|
+
callback :virEventRemoveHandleFunc, [:int], :int
|
52
|
+
|
53
|
+
# typedef int (*virEventAddTimeoutFunc) (
|
54
|
+
# int timeout,
|
55
|
+
# virEventTimeoutCallback cb,
|
56
|
+
# void * opaque,
|
57
|
+
# virFreeCallback ff
|
58
|
+
# )
|
59
|
+
callback :virEventAddTimeoutFunc, [
|
60
|
+
:int,
|
61
|
+
:virEventTimeoutCallback,
|
62
|
+
:pointer,
|
63
|
+
FFI::Common::FREE_CALLBACK
|
64
|
+
], :int
|
65
|
+
|
66
|
+
# typedef void (*virEventUpdateTimeoutFunc) (
|
67
|
+
# int timer,
|
68
|
+
# int timeout
|
69
|
+
# )
|
70
|
+
callback :virEventUpdateTimeoutFunc, [:int, :int], :void
|
71
|
+
|
72
|
+
# typedef int (*virEventRemoveTimeoutFunc) (
|
73
|
+
# int timer
|
74
|
+
# )
|
75
|
+
callback :virEventRemoveTimeoutFunc, [:int], :int
|
76
|
+
|
77
|
+
# void virEventRegisterImpl (
|
78
|
+
# virEventAddHandleFunc addHandle,
|
79
|
+
# virEventUpdateHandleFunc updateHandle,
|
80
|
+
# virEventRemoveHandleFunc removeHandle,
|
81
|
+
# virEventAddTimeoutFunc addTimeout,
|
82
|
+
# virEventUpdateTimeoutFunc updateTimeout,
|
83
|
+
# virEventRemoveTimeoutFunc removeTimeout
|
84
|
+
# )
|
85
|
+
attach_function :virEventRegisterImpl, [
|
86
|
+
:virEventAddHandleFunc,
|
87
|
+
:virEventUpdateHandleFunc,
|
88
|
+
:virEventRemoveHandleFunc,
|
89
|
+
:virEventAddTimeoutFunc,
|
90
|
+
:virEventUpdateTimeoutFunc,
|
91
|
+
:virEventRemoveTimeoutFunc
|
92
|
+
], :void
|
93
|
+
|
94
|
+
def self.event_add_handle_func(&block)
|
95
|
+
::FFI::Function.new(:int, [:int, :int, EVENT_HANDLE_CALLBACK, :pointer, FFI::Common::FREE_CALLBACK], &block)
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.event_add_timeout_func(&block)
|
99
|
+
::FFI::Function.new(:int, [:int, EVENT_TIMEOUT_CALLBACK, :pointer, FFI::Common::FREE_CALLBACK], &block)
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ffi'
|
4
|
+
require 'libvirt/util'
|
5
|
+
|
6
|
+
module Libvirt
|
7
|
+
module FFI
|
8
|
+
module Libvirt
|
9
|
+
extend ::FFI::Library
|
10
|
+
ffi_lib Util.library_path
|
11
|
+
|
12
|
+
# int virGetVersion (
|
13
|
+
# unsigned long *libVer,
|
14
|
+
# const char *type,
|
15
|
+
# unsigned long *typeVer
|
16
|
+
# )
|
17
|
+
attach_function :virGetVersion, [:pointer, :string, :pointer], :int
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/libvirt/util.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Libvirt
|
4
|
+
module Util
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def logger=(logger)
|
8
|
+
@logger = logger
|
9
|
+
end
|
10
|
+
|
11
|
+
def logger
|
12
|
+
@logger
|
13
|
+
end
|
14
|
+
|
15
|
+
def log(severity, prog = nil, &block)
|
16
|
+
return if @logger.nil?
|
17
|
+
@logger.public_send(severity, prog, &block)
|
18
|
+
end
|
19
|
+
|
20
|
+
def library_path
|
21
|
+
'libvirt'
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param [Integer] version_number ulong
|
25
|
+
def parse_version(version_number)
|
26
|
+
major = version_number / 1_000_000
|
27
|
+
minor = (version_number - major * 1_000_000) / 1_000
|
28
|
+
release = version_number - major * 1_000_000 - minor * 1_000
|
29
|
+
"#{major}.#{minor}.#{release}"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/libvirt.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ffi'
|
4
|
+
require 'libvirt/util'
|
5
|
+
require 'libvirt/error'
|
6
|
+
require 'libvirt/ffi/common'
|
7
|
+
require 'libvirt/ffi/connection'
|
8
|
+
require 'libvirt/ffi/domain'
|
9
|
+
require 'libvirt/lib_version'
|
10
|
+
require 'libvirt/event'
|
11
|
+
require 'libvirt/connection'
|
12
|
+
require 'libvirt/domain'
|
13
|
+
require 'libvirt/version'
|
14
|
+
|
15
|
+
module Libvirt
|
16
|
+
EVENT_HANDLE_READABLE = 1
|
17
|
+
EVENT_HANDLE_WRITABLE = 2
|
18
|
+
EVENT_HANDLE_ERROR = 4
|
19
|
+
EVENT_HANDLE_HANGUP = 8
|
20
|
+
|
21
|
+
DOMAIN_EVENT_ID_LIFECYCLE = 0
|
22
|
+
|
23
|
+
class << self
|
24
|
+
def lib_version
|
25
|
+
version_ptr = ::FFI::MemoryPointer.new(:ulong)
|
26
|
+
code = FFI::Libvirt.virGetVersion(version_ptr, nil, nil)
|
27
|
+
raise Error, 'failed to get version' if code < 0
|
28
|
+
version_number = version_ptr.get_ulong(0)
|
29
|
+
Libvirt::Util.parse_version(version_number)
|
30
|
+
end
|
31
|
+
|
32
|
+
def logger
|
33
|
+
Util.logger
|
34
|
+
end
|
35
|
+
|
36
|
+
def logger=(logger)
|
37
|
+
Util.logger = logger
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/libvirt_ffi.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'libvirt'
|
data/libvirt.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'lib/libvirt/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'libvirt_ffi'
|
5
|
+
spec.version = Libvirt::VERSION
|
6
|
+
spec.authors = ['Denis Talakevich']
|
7
|
+
spec.email = ['senid231@gmail.com']
|
8
|
+
|
9
|
+
spec.summary = 'Libvirt FFI'
|
10
|
+
spec.description = 'Libvirt FFI'
|
11
|
+
spec.homepage = 'https://github.com/senid231/libvirt_ffi'
|
12
|
+
spec.license = 'MIT'
|
13
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
14
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
15
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
16
|
+
spec.metadata['changelog_uri'] = spec.homepage
|
17
|
+
|
18
|
+
# Specify which files should be added to the gem when it is released.
|
19
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
21
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
|
+
end
|
23
|
+
spec.bindir = 'exe'
|
24
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
|
+
spec.require_paths = ['lib']
|
26
|
+
|
27
|
+
spec.add_dependency 'ffi', '>= 1.0'
|
28
|
+
end
|