ruby-libvirt 0.2.0 → 0.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.
- data/NEWS +43 -0
- data/README +40 -2
- data/README.rdoc +3 -1
- data/Rakefile +3 -25
- data/ext/libvirt/_libvirt.c +636 -35
- data/ext/libvirt/common.c +142 -16
- data/ext/libvirt/common.h +78 -22
- data/ext/libvirt/connect.c +1811 -95
- data/ext/libvirt/connect.h +0 -1
- data/ext/libvirt/domain.c +880 -424
- data/ext/libvirt/domain.h +4 -0
- data/ext/libvirt/extconf.rb +90 -0
- data/ext/libvirt/interface.c +40 -118
- data/ext/libvirt/network.c +22 -125
- data/ext/libvirt/network.h +1 -0
- data/ext/libvirt/nodedevice.c +27 -142
- data/ext/libvirt/nwfilter.c +10 -83
- data/ext/libvirt/secret.c +35 -113
- data/ext/libvirt/storage.c +125 -223
- data/tests/test_conn.rb +193 -43
- data/tests/test_domain.rb +1067 -102
- data/tests/test_interface.rb +156 -19
- data/tests/test_network.rb +237 -26
- data/tests/test_nodedevice.rb +103 -15
- data/tests/test_nwfilter.rb +97 -14
- data/tests/test_open.rb +186 -6
- data/tests/test_secret.rb +126 -14
- data/tests/test_storage.rb +513 -40
- data/tests/test_utils.rb +73 -0
- metadata +5 -6
- data/tests/node.xml +0 -110
- data/tests/tc_connect.rb +0 -178
data/NEWS
CHANGED
@@ -1,3 +1,46 @@
|
|
1
|
+
2010-12-12 0.3.0
|
2
|
+
* Implementation of Libvirt::open_auth, Libvirt::event_register_impl
|
3
|
+
* Updated Connect class, implementing conn.compare_cpu, conn.baseline_cpu,
|
4
|
+
conn.domain_event_register_any, conn.domain_event_deregister_any,
|
5
|
+
conn.domain_event_register, conn.domain_event_deregister, and
|
6
|
+
conn.create_domain_xml.
|
7
|
+
* Updated Domain class, implementing dom.get_vcpus, dom.update_device,
|
8
|
+
dom.scheduler_type, dom.scheduler_parameters, dom.scheduler_parameters=,
|
9
|
+
dom.num_vcpus, dom.vcpus_flags=, and dom.qemu_monitor_command.
|
10
|
+
* Updated Interface class, implementing interface.free
|
11
|
+
* Many potential memory leaks have been fixed.
|
12
|
+
* Many bugfixes.
|
13
|
+
* Documentation update of many methods, including all of the lookup methods
|
14
|
+
that were missing before.
|
15
|
+
|
16
|
+
2010-11-10
|
17
|
+
* Gem for version 0.2.0 pushed to rubygems.org
|
18
|
+
|
19
|
+
2010-07-01 0.2.0
|
20
|
+
* Updated Storage class, implementing pool.active?, pool.persistent?,
|
21
|
+
pool.vol_create_xml_from.
|
22
|
+
* Updated Connect class, implementing conn.node_free_memory,
|
23
|
+
conn.node_cells_free_memory, conn.node_get_security_model, conn.encrypted?,
|
24
|
+
conn.libversion, and conn.secure?
|
25
|
+
* Updated Network class, implementing network.active? and network.persistent?
|
26
|
+
* Update Domain class, implementing conn.domain_xml_from_native,
|
27
|
+
conn.domain_xml_to_native, dom.migrate_to_uri,
|
28
|
+
dom.migrate_set_max_downtime, dom.managed_save, dom.has_managed_save?,
|
29
|
+
dom.managed_save_remove, dom.security_label, dom.block_stats,
|
30
|
+
dom.memory_stats, dom.blockinfo, dom.block_peek, dom.memory_peek,
|
31
|
+
dom.active?, dom.persistent?, dom.snapshot_create_xml,
|
32
|
+
dom.num_of_snapshots, dom.list_snapshots, dom.lookup_snapshot_by_name,
|
33
|
+
dom.has_current_snapshot?, dom.revert_to_snapshot, dom.current_snapshot,
|
34
|
+
snapshot.xml_desc, snapshot.delete, dom.job_info, and dom.abort_job.
|
35
|
+
* Implementation of the NodeDevice class.
|
36
|
+
* Implementation of the Secret class.
|
37
|
+
* Implementation of the NWFilter class.
|
38
|
+
* Implementation of the Interface class.
|
39
|
+
* Conversion of the development tree to git.
|
40
|
+
* New maintainer (Chris Lalancette). David Lutterkort has agreed to transfer
|
41
|
+
maintainership since he is not actively involved in their development
|
42
|
+
anymore.
|
43
|
+
|
1
44
|
2008-11-18 0.1.0
|
2
45
|
* Add binding for virConnectFindStoragePoolSources (clalance)
|
3
46
|
* Fix dom_migrate (clalance)
|
data/README
CHANGED
@@ -7,7 +7,7 @@ Usage
|
|
7
7
|
-----
|
8
8
|
|
9
9
|
In your ruby code, do a "require 'libvirt'"; to obtain a connection, use
|
10
|
-
'Libvirt::open' or 'Libvirt::
|
10
|
+
'Libvirt::open' or 'Libvirt::open_read_only'. See tests/*.rb for more
|
11
11
|
examples.
|
12
12
|
|
13
13
|
Hacking
|
@@ -23,4 +23,42 @@ To run against the checkout, make sure you set RUBYLIB (assuming DIR is the
|
|
23
23
|
toplevel of your source checkout):
|
24
24
|
|
25
25
|
export RUBYLIB=$dir/lib:$dir/ext/libvirt
|
26
|
-
ruby -rlibvirt -e 'puts Libvirt::version
|
26
|
+
ruby -rlibvirt -e 'puts Libvirt::version[0]'
|
27
|
+
|
28
|
+
Notes
|
29
|
+
-----
|
30
|
+
As of December 12, 2010, the ruby-libvirt bindings support all of the libvirt
|
31
|
+
APIs up to libvirt commit hash e8d05c978da774b7abbbc38dfcc00b9b582fdf72
|
32
|
+
with the following exceptions:
|
33
|
+
|
34
|
+
- virConnectRef
|
35
|
+
- virDomainGetConnect
|
36
|
+
- virDomainRef
|
37
|
+
- virDomainSetMemoryParameters
|
38
|
+
- virDomainGetMemoryParameters
|
39
|
+
- virDomainIsUpdated
|
40
|
+
- virDomainOpenConsole
|
41
|
+
- virNetworkGetConnect
|
42
|
+
- virNetworkRef
|
43
|
+
- virInterfaceGetConnect
|
44
|
+
- virInterfaceRef
|
45
|
+
- virStoragePoolGetConnect
|
46
|
+
- virStoragePoolRef
|
47
|
+
- virStorageVolGetConnect
|
48
|
+
- virStorageVolRef
|
49
|
+
- virNodeDeviceRef
|
50
|
+
- virSecretGetConnect
|
51
|
+
- virSecretRef
|
52
|
+
- virStreamNew
|
53
|
+
- virStreamRef
|
54
|
+
- virStreamSend
|
55
|
+
- virStreamRecv
|
56
|
+
- virStreamSendAll
|
57
|
+
- virStreamRecvAll
|
58
|
+
- virStreamEventAddCallback
|
59
|
+
- virStreamEventUpdateCallback
|
60
|
+
- virStreamEventRemoveCallback
|
61
|
+
- virStreamFinish
|
62
|
+
- virStreamAbort
|
63
|
+
- virStreamFree
|
64
|
+
- virNWFilterRef
|
data/README.rdoc
CHANGED
@@ -5,6 +5,8 @@ The module Libvirt provides bindings to libvirt[http://libvirt.org]
|
|
5
5
|
The various *Ptr types in Libvirt map loosely to the following Ruby classes:
|
6
6
|
|
7
7
|
[virConnectPtr] Libvirt::Connect
|
8
|
+
[virNodeInfoPtr] Libvirt::Connect::Nodeinfo
|
9
|
+
[virSecurityModelPtr] Libvirt::Connect::NodeSecurityModel
|
8
10
|
[virDomainPtr] Libvirt::Domain
|
9
11
|
[virDomainInfoPtr] Libvirt::Domain::Info
|
10
12
|
[virDomainInterfaceStatsPtr] Libvirt::Domain::InterfaceInfo
|
@@ -13,6 +15,7 @@ The various *Ptr types in Libvirt map loosely to the following Ruby classes:
|
|
13
15
|
[virDomainMemoryStatPtr] Libvirt::Domain::MemoryStats
|
14
16
|
[virDomainBlockInfoPtr] Libvirt::Domain::BlockInfo
|
15
17
|
[virDomainSnapshotPtr] Libvirt::Domain::Snapshot
|
18
|
+
[virDomainJobInfoPtr] Libvirt::Domain::JobInfo
|
16
19
|
[virNetworkPtr] Libvirt::Network
|
17
20
|
[virNWFilterPtr] Libvirt::NWFilter
|
18
21
|
[virNodeDevicePtr] Libvirt::NodeDevice
|
@@ -20,6 +23,5 @@ The various *Ptr types in Libvirt map loosely to the following Ruby classes:
|
|
20
23
|
[virStoragePoolInfoPtr] Libvirt::StoragePoolInfo
|
21
24
|
[virStorageVolPtr] Libvirt::StorageVol
|
22
25
|
[virStorageVolInfoPtr] Libvirt::StorageVolInfo
|
23
|
-
[virNodeInfoPtr] Libvirt::Nodeinfo
|
24
26
|
[virSecretPtr] Libvirt::Secret
|
25
27
|
[virInterfacePtr] Libvirt::Interface
|
data/Rakefile
CHANGED
@@ -15,7 +15,7 @@ require 'rake/testtask'
|
|
15
15
|
require 'rake/gempackagetask'
|
16
16
|
|
17
17
|
PKG_NAME='ruby-libvirt'
|
18
|
-
PKG_VERSION='0.
|
18
|
+
PKG_VERSION='0.3.0'
|
19
19
|
|
20
20
|
EXT_CONF='ext/libvirt/extconf.rb'
|
21
21
|
MAKEFILE="ext/libvirt/Makefile"
|
@@ -31,14 +31,12 @@ LIBVIRT_SRC << MAKEFILE
|
|
31
31
|
CLEAN.include [ "ext/**/*.o", LIBVIRT_MODULE,
|
32
32
|
"ext/**/depend" ]
|
33
33
|
|
34
|
-
CLOBBER.include [ "config.save", "ext/**/mkmf.log",
|
34
|
+
CLOBBER.include [ "config.save", "ext/**/mkmf.log", "ext/**/extconf.h",
|
35
35
|
MAKEFILE ]
|
36
36
|
|
37
37
|
#
|
38
38
|
# Build locally
|
39
39
|
#
|
40
|
-
# FIXME: We can't get rid of install.rb yet, since there's no way
|
41
|
-
# to pass config options to extconf.rb
|
42
40
|
file MAKEFILE => EXT_CONF do |t|
|
43
41
|
Dir::chdir(File::dirname(EXT_CONF)) do
|
44
42
|
unless sh "ruby #{File::basename(EXT_CONF)}"
|
@@ -59,7 +57,7 @@ desc "Build the native library"
|
|
59
57
|
task :build => LIBVIRT_MODULE
|
60
58
|
|
61
59
|
Rake::TestTask.new(:test) do |t|
|
62
|
-
t.test_files =
|
60
|
+
t.test_files = [ 'tests/test_conn.rb', 'tests/test_domain.rb', 'tests/test_interface.rb', 'tests/test_network.rb', 'tests/test_nodedevice.rb', 'tests/test_nwfilter.rb', 'tests/test_open.rb', 'tests/test_secret.rb', 'tests/test_storage.rb' ]
|
63
61
|
t.libs = [ 'lib', 'ext/libvirt' ]
|
64
62
|
end
|
65
63
|
task :test => :build
|
@@ -107,14 +105,6 @@ Rake::GemPackageTask.new(SPEC) do |pkg|
|
|
107
105
|
pkg.need_zip = true
|
108
106
|
end
|
109
107
|
|
110
|
-
desc "Update the ruby-libvirt site"
|
111
|
-
task :site => [ :rdoc ] do |t|
|
112
|
-
system("rsync -av doc/site/ libvirt:/data/www/libvirt.org/ruby/")
|
113
|
-
if $? != 0
|
114
|
-
raise "rsync failed: #{$?}"
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
108
|
desc "Build (S)RPM for #{PKG_NAME}"
|
119
109
|
task :rpm => [ :package ] do |t|
|
120
110
|
system("sed -e 's/@VERSION@/#{PKG_VERSION}/' #{SPEC_FILE} > pkg/#{SPEC_FILE}")
|
@@ -126,15 +116,3 @@ task :rpm => [ :package ] do |t|
|
|
126
116
|
end
|
127
117
|
end
|
128
118
|
end
|
129
|
-
|
130
|
-
desc "Release a version to the site"
|
131
|
-
task :dist => [ :rpm ] do |t|
|
132
|
-
puts "Copying files"
|
133
|
-
unless sh "scp -p #{DIST_FILES.to_s} libvirt:/data/www/libvirt.org/ruby/download"
|
134
|
-
$stderr.puts "Copy to libvirt failed"
|
135
|
-
break
|
136
|
-
end
|
137
|
-
puts "Commit and tag #{PKG_VERSION}"
|
138
|
-
system "hg commit -m 'Released version #{PKG_VERSION}'"
|
139
|
-
system "hg tag -m 'Tag release #{PKG_VERSION}' #{PKG_NAME}-#{PKG_VERSION}"
|
140
|
-
end
|
data/ext/libvirt/_libvirt.c
CHANGED
@@ -38,22 +38,26 @@ static VALUE c_libvirt_version;
|
|
38
38
|
|
39
39
|
VALUE m_libvirt;
|
40
40
|
|
41
|
-
|
42
|
-
static VALUE e_ConnectionError;
|
41
|
+
/* define additional errors here */
|
42
|
+
static VALUE e_ConnectionError; /* ConnectionError - error during connection establishment */
|
43
43
|
VALUE e_DefinitionError;
|
44
44
|
VALUE e_RetrieveError;
|
45
45
|
VALUE e_Error;
|
46
|
+
VALUE e_NoSupportError;
|
47
|
+
|
48
|
+
/* custom error function to suppress libvirt printing to stderr */
|
49
|
+
static void rubyLibvirtErrorFunc(void *userdata, virErrorPtr err){
|
50
|
+
}
|
46
51
|
|
47
52
|
/*
|
48
53
|
* call-seq:
|
49
|
-
* Libvirt::version(type) -> [ libvirt_version, type_version ]
|
54
|
+
* Libvirt::version(type=nil) -> [ libvirt_version, type_version ]
|
50
55
|
*
|
51
56
|
* Call
|
52
57
|
* +virGetVersion+[http://www.libvirt.org/html/libvirt-libvirt.html#virGetVersion]
|
53
|
-
* to get the version of libvirt and of the hypervisor TYPE.
|
54
|
-
* array with two entries of type Libvirt::Version.
|
58
|
+
* to get the version of libvirt and of the hypervisor TYPE.
|
55
59
|
*/
|
56
|
-
VALUE libvirt_version(int argc, VALUE *argv, VALUE m) {
|
60
|
+
static VALUE libvirt_version(int argc, VALUE *argv, VALUE m) {
|
57
61
|
unsigned long libVer;
|
58
62
|
VALUE type;
|
59
63
|
unsigned long typeVer;
|
@@ -63,8 +67,7 @@ VALUE libvirt_version(int argc, VALUE *argv, VALUE m) {
|
|
63
67
|
rb_scan_args(argc, argv, "01", &type);
|
64
68
|
|
65
69
|
r = virGetVersion(&libVer, get_string_or_nil(type), &typeVer);
|
66
|
-
_E(r < 0, create_error(rb_eArgError, "virGetVersion",
|
67
|
-
"Failed to get version", NULL));
|
70
|
+
_E(r < 0, create_error(rb_eArgError, "virGetVersion", NULL));
|
68
71
|
|
69
72
|
result = rb_ary_new2(2);
|
70
73
|
rargv[0] = rb_str_new2("libvirt");
|
@@ -91,47 +94,625 @@ static VALUE internal_open(int argc, VALUE *argv, VALUE m, int readonly)
|
|
91
94
|
else
|
92
95
|
conn = virConnectOpen(uri_c);
|
93
96
|
|
94
|
-
|
95
|
-
|
97
|
+
_E(conn == NULL, create_error(e_ConnectionError,
|
98
|
+
readonly ? "virConnectOpenReadOnly" : "virConnectOpen",
|
99
|
+
NULL));
|
96
100
|
|
97
101
|
return connect_new(conn);
|
98
102
|
}
|
99
103
|
|
100
104
|
/*
|
101
105
|
* call-seq:
|
102
|
-
* Libvirt::open(
|
106
|
+
* Libvirt::open(uri=nil) -> Libvirt::Connect
|
103
107
|
*
|
104
108
|
* Call
|
105
109
|
* +virConnectOpen+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectOpen]
|
106
|
-
* to open a connection to a URL.
|
110
|
+
* to open a connection to a URL.
|
107
111
|
*/
|
108
|
-
VALUE libvirt_open(int argc, VALUE *argv, VALUE m) {
|
112
|
+
static VALUE libvirt_open(int argc, VALUE *argv, VALUE m) {
|
109
113
|
return internal_open(argc, argv, m, 0);
|
110
114
|
}
|
111
115
|
|
112
116
|
/*
|
113
117
|
* call-seq:
|
114
|
-
* Libvirt::
|
118
|
+
* Libvirt::open_read_only(uri=nil) -> Libvirt::Connect
|
115
119
|
*
|
116
120
|
* Call
|
117
121
|
* +virConnectOpenReadOnly+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectOpenReadOnly]
|
118
|
-
* to open a read-only connection to a URL.
|
119
|
-
* object.
|
122
|
+
* to open a read-only connection to a URL.
|
120
123
|
*/
|
121
|
-
VALUE libvirt_open_read_only(int argc, VALUE *argv, VALUE m) {
|
124
|
+
static VALUE libvirt_open_read_only(int argc, VALUE *argv, VALUE m) {
|
122
125
|
return internal_open(argc, argv, m, 1);
|
123
126
|
}
|
124
127
|
|
128
|
+
#if HAVE_VIRCONNECTOPENAUTH
|
129
|
+
static int libvirt_auth_callback_wrapper(virConnectCredentialPtr cred,
|
130
|
+
unsigned int ncred, void *cbdata) {
|
131
|
+
VALUE userdata;
|
132
|
+
VALUE newcred;
|
133
|
+
int i;
|
134
|
+
VALUE result;
|
135
|
+
|
136
|
+
userdata = (VALUE)cbdata;
|
137
|
+
|
138
|
+
if (!rb_block_given_p())
|
139
|
+
rb_raise(rb_eRuntimeError, "No block given, this should never happen!\n");
|
140
|
+
|
141
|
+
for (i = 0; i < ncred; i++) {
|
142
|
+
newcred = rb_hash_new();
|
143
|
+
|
144
|
+
rb_hash_aset(newcred, rb_str_new2("type"), INT2FIX(cred[i].type));
|
145
|
+
rb_hash_aset(newcred, rb_str_new2("prompt"),
|
146
|
+
rb_str_new2(cred[i].prompt));
|
147
|
+
if (cred[i].challenge)
|
148
|
+
rb_hash_aset(newcred, rb_str_new2("challenge"),
|
149
|
+
rb_str_new2(cred[i].challenge));
|
150
|
+
else
|
151
|
+
rb_hash_aset(newcred, rb_str_new2("challenge"), Qnil);
|
152
|
+
if (cred[i].defresult)
|
153
|
+
rb_hash_aset(newcred, rb_str_new2("defresult"),
|
154
|
+
rb_str_new2(cred[i].defresult));
|
155
|
+
else
|
156
|
+
rb_hash_aset(newcred, rb_str_new2("defresult"), Qnil);
|
157
|
+
rb_hash_aset(newcred, rb_str_new2("result"), Qnil);
|
158
|
+
rb_hash_aset(newcred, rb_str_new2("userdata"), userdata);
|
159
|
+
|
160
|
+
result = rb_yield(newcred);
|
161
|
+
if (NIL_P(result)) {
|
162
|
+
cred[i].result = NULL;
|
163
|
+
cred[i].resultlen = 0;
|
164
|
+
}
|
165
|
+
else {
|
166
|
+
cred[i].result = strdup(StringValueCStr(result));
|
167
|
+
cred[i].resultlen = strlen(cred[i].result);
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
return 0;
|
172
|
+
}
|
173
|
+
|
174
|
+
|
175
|
+
struct wrap_callout {
|
176
|
+
char *uri;
|
177
|
+
virConnectAuthPtr auth;
|
178
|
+
unsigned int flags;
|
179
|
+
};
|
180
|
+
|
181
|
+
static VALUE rb_open_auth_wrap(VALUE arg) {
|
182
|
+
struct wrap_callout *e = (struct wrap_callout *)arg;
|
183
|
+
|
184
|
+
return (VALUE)virConnectOpenAuth(e->uri, e->auth, e->flags);
|
185
|
+
}
|
186
|
+
|
187
|
+
static VALUE rb_num2int_wrap(VALUE arg) {
|
188
|
+
return NUM2INT(arg);
|
189
|
+
}
|
190
|
+
|
191
|
+
/*
|
192
|
+
* call-seq:
|
193
|
+
* Libvirt::open_auth(uri=nil, credlist=nil, userdata=nil, flags=0) {|...| authentication block} -> Libvirt::Connect
|
194
|
+
*
|
195
|
+
* Call
|
196
|
+
* +virConnectOpenAuth+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectOpenAuth]
|
197
|
+
* to open a connection to a libvirt URI, with a possible authentication block.
|
198
|
+
* If an authentication block is desired, then credlist should be an array that
|
199
|
+
* specifies which credentials the authentication block is willing to support;
|
200
|
+
* the full list is available at http://libvirt.org/html/libvirt-libvirt.html#virConnectCredentialType.
|
201
|
+
* If userdata is not nil and an authentication block is given, userdata will
|
202
|
+
* be passed unaltered into the authentication block. The flags parameter
|
203
|
+
* controls how to open connection. The only options currently available for
|
204
|
+
* flags are 0 for a read/write connection and Libvirt::CONNECT_RO for a
|
205
|
+
* read-only connection.
|
206
|
+
*
|
207
|
+
* If the credlist is not empty, and an authentication block is given, the
|
208
|
+
* authentication block will be called once for each credential necessary
|
209
|
+
* to complete the authentication. The authentication block will be passed a
|
210
|
+
* single parameter, which is a hash of values containing information necessary
|
211
|
+
* to complete authentication. This hash contains 5 elements:
|
212
|
+
*
|
213
|
+
* type - the type of credential to be examined
|
214
|
+
*
|
215
|
+
* prompt - a suggested prompt to show to the user
|
216
|
+
*
|
217
|
+
* challenge - any additional challenge information
|
218
|
+
*
|
219
|
+
* defresult - a default result to use if credentials could not be obtained
|
220
|
+
*
|
221
|
+
* userdata - the userdata passed into open_auth initially
|
222
|
+
*
|
223
|
+
* The authentication block should return the result of collecting the
|
224
|
+
* information; these results will then be sent to libvirt for authentication.
|
225
|
+
*/
|
226
|
+
static VALUE libvirt_open_auth(int argc, VALUE *argv, VALUE m) {
|
227
|
+
virConnectAuthPtr auth;
|
228
|
+
VALUE uri;
|
229
|
+
VALUE credlist;
|
230
|
+
VALUE userdata;
|
231
|
+
VALUE flags_val;
|
232
|
+
char *uri_c;
|
233
|
+
virConnectPtr conn = NULL;
|
234
|
+
unsigned int flags;
|
235
|
+
int auth_alloc;
|
236
|
+
int i;
|
237
|
+
VALUE tmp;
|
238
|
+
int exception = 0;
|
239
|
+
struct rb_ary_entry_arg args;
|
240
|
+
struct wrap_callout callargs;
|
241
|
+
|
242
|
+
rb_scan_args(argc, argv, "04", &uri, &credlist, &userdata, &flags_val);
|
243
|
+
|
244
|
+
/* handle the optional URI */
|
245
|
+
uri_c = get_string_or_nil(uri);
|
246
|
+
|
247
|
+
/* handle the optional flags */
|
248
|
+
if (NIL_P(flags_val))
|
249
|
+
flags = 0;
|
250
|
+
else
|
251
|
+
flags = NUM2UINT(flags_val);
|
252
|
+
|
253
|
+
if (rb_block_given_p()) {
|
254
|
+
auth = ALLOC(virConnectAuth);
|
255
|
+
auth_alloc = 1;
|
256
|
+
|
257
|
+
if (TYPE(credlist) == T_NIL)
|
258
|
+
auth->ncredtype = 0;
|
259
|
+
else if (TYPE(credlist) == T_ARRAY)
|
260
|
+
auth->ncredtype = RARRAY_LEN(credlist);
|
261
|
+
else
|
262
|
+
rb_raise(rb_eTypeError, "wrong argument type (expected Array or nil)");
|
263
|
+
auth->credtype = NULL;
|
264
|
+
if (auth->ncredtype > 0) {
|
265
|
+
/* we don't use ALLOC_N here because that can throw an exception,
|
266
|
+
* and leak the auth pointer. Instead we use normal malloc
|
267
|
+
* (which has a slightly higher chance of returning NULL), and
|
268
|
+
* then properly cleanup if it fails
|
269
|
+
*/
|
270
|
+
auth->credtype = malloc(sizeof(int) * auth->ncredtype);
|
271
|
+
if (auth->credtype == NULL) {
|
272
|
+
xfree(auth);
|
273
|
+
rb_memerror();
|
274
|
+
}
|
275
|
+
for (i = 0; i < auth->ncredtype; i++) {
|
276
|
+
args.arr = credlist;
|
277
|
+
args.elem = i;
|
278
|
+
tmp = rb_protect(rb_ary_entry_wrap, (VALUE)&args, &exception);
|
279
|
+
if (exception)
|
280
|
+
goto do_cleanup;
|
281
|
+
|
282
|
+
auth->credtype[i] = rb_protect(rb_num2int_wrap, tmp,
|
283
|
+
&exception);
|
284
|
+
if (exception)
|
285
|
+
goto do_cleanup;
|
286
|
+
}
|
287
|
+
}
|
288
|
+
|
289
|
+
auth->cb = libvirt_auth_callback_wrapper;
|
290
|
+
auth->cbdata = (void *)userdata;
|
291
|
+
}
|
292
|
+
else {
|
293
|
+
auth = virConnectAuthPtrDefault;
|
294
|
+
auth_alloc = 0;
|
295
|
+
}
|
296
|
+
|
297
|
+
callargs.uri = uri_c;
|
298
|
+
callargs.auth = auth;
|
299
|
+
callargs.flags = flags;
|
300
|
+
|
301
|
+
conn = (virConnectPtr)rb_protect(rb_open_auth_wrap, (VALUE)&callargs,
|
302
|
+
&exception);
|
303
|
+
|
304
|
+
do_cleanup:
|
305
|
+
if (auth_alloc) {
|
306
|
+
free(auth->credtype);
|
307
|
+
xfree(auth);
|
308
|
+
}
|
309
|
+
|
310
|
+
if (exception)
|
311
|
+
rb_jump_tag(exception);
|
312
|
+
|
313
|
+
_E(conn == NULL, create_error(e_ConnectionError, "virConnectOpenAuth",
|
314
|
+
NULL));
|
315
|
+
|
316
|
+
return connect_new(conn);
|
317
|
+
}
|
318
|
+
#endif
|
319
|
+
|
320
|
+
#if HAVE_VIREVENTREGISTERIMPL
|
321
|
+
static VALUE add_handle, update_handle, remove_handle;
|
322
|
+
static VALUE add_timeout, update_timeout, remove_timeout;
|
323
|
+
|
324
|
+
/*
|
325
|
+
* call-seq:
|
326
|
+
* Libvirt::event_invoke_handle_callback(handle, fd, events, opaque) -> Qnil
|
327
|
+
*
|
328
|
+
* Unlike most of the other functions in the ruby-libvirt bindings, this one
|
329
|
+
* does not directly correspond to a libvirt API function. Instead, this
|
330
|
+
* module method (and event_invoke_timeout_callback) are meant to be called
|
331
|
+
* when there is an event of interest to libvirt on one of the file descriptors
|
332
|
+
* that libvirt uses. The application is notified of the file descriptors
|
333
|
+
* that libvirt uses via the callbacks from Libvirt::event_register_impl. When
|
334
|
+
* there is an event of interest, the application must call
|
335
|
+
* event_invoke_timeout_callback to ensure proper operation.
|
336
|
+
*
|
337
|
+
* Libvirt::event_invoke_handle_callback takes 4 arguments:
|
338
|
+
*
|
339
|
+
* handle
|
340
|
+
* an application specific handle ID. This can be any integer, but
|
341
|
+
* must be unique from all other libvirt handles in the application.
|
342
|
+
* fd
|
343
|
+
* the file descriptor of interest. This was given to the application
|
344
|
+
* as a callback to add_handle of Libvirt::event_register_impl
|
345
|
+
* events
|
346
|
+
* the events that have occured on the fd. Note that the events are
|
347
|
+
* libvirt specific, and are some combination of
|
348
|
+
* Libvirt::EVENT_HANDLE_READABLE, Libvirt::EVENT_HANDLE_WRITABLE,
|
349
|
+
* Libvirt::EVENT_HANDLE_ERROR, Libvirt::EVENT_HANDLE_HANGUP. To
|
350
|
+
* notify libvirt of more than one event at a time, these values should
|
351
|
+
* be logically OR'ed together.
|
352
|
+
* opaque
|
353
|
+
* the opaque data passed from libvirt during the
|
354
|
+
* Libvirt::event_register_impl add_handle callback. To ensure proper
|
355
|
+
* operation this data must be passed through to
|
356
|
+
* event_invoke_handle_callback without modification.
|
357
|
+
*/
|
358
|
+
static VALUE libvirt_event_invoke_handle_callback(VALUE m, VALUE handle,
|
359
|
+
VALUE fd, VALUE events,
|
360
|
+
VALUE opaque) {
|
361
|
+
virEventHandleCallback cb;
|
362
|
+
void *op;
|
363
|
+
VALUE libvirt_cb;
|
364
|
+
VALUE libvirt_opaque;
|
365
|
+
|
366
|
+
if (TYPE(opaque) != T_HASH)
|
367
|
+
rb_raise(rb_eTypeError,
|
368
|
+
"wrong event callback argument type (expected Hash)");
|
369
|
+
|
370
|
+
libvirt_cb = rb_hash_aref(opaque, rb_str_new2("libvirt_cb"));
|
371
|
+
|
372
|
+
/* This is equivalent to Data_Get_Struct; I reproduce it here because
|
373
|
+
* I don't want the additional type-cast that Data_Get_Struct does
|
374
|
+
*/
|
375
|
+
Check_Type(libvirt_cb, T_DATA);
|
376
|
+
cb = DATA_PTR(libvirt_cb);
|
377
|
+
|
378
|
+
if (cb) {
|
379
|
+
libvirt_opaque = rb_hash_aref(opaque, rb_str_new2("opaque"));
|
380
|
+
Data_Get_Struct(libvirt_opaque, void *, op);
|
381
|
+
cb(NUM2INT(handle), NUM2INT(fd), NUM2INT(events), op);
|
382
|
+
}
|
383
|
+
|
384
|
+
return Qnil;
|
385
|
+
}
|
386
|
+
|
387
|
+
/*
|
388
|
+
* call-seq:
|
389
|
+
* Libvirt::event_invoke_timeout_callback(timer, opaque) -> Qnil
|
390
|
+
*
|
391
|
+
* Unlike most of the other functions in the ruby-libvirt bindings, this one
|
392
|
+
* does not directly correspond to a libvirt API function. Instead, this
|
393
|
+
* module method (and event_invoke_handle_callback) are meant to be called
|
394
|
+
* when there is a timeout of interest to libvirt. The application is
|
395
|
+
* notified of the timers that libvirt uses via the callbacks from
|
396
|
+
* Libvirt::event_register_impl. When a timeout expires, the application must
|
397
|
+
* call event_invoke_timeout_callback to ensure proper operation.
|
398
|
+
*
|
399
|
+
* Libvirt::event_invoke_timeout_callback takes 2 arguments:
|
400
|
+
*
|
401
|
+
* handle
|
402
|
+
* an application specific timer ID. This can be any integer, but
|
403
|
+
* must be unique from all other libvirt timers in the application.
|
404
|
+
* opaque
|
405
|
+
* the opaque data passed from libvirt during the
|
406
|
+
* Libvirt::event_register_impl add_handle callback. To ensure proper
|
407
|
+
* operation this data must be passed through to
|
408
|
+
* event_invoke_handle_callback without modification.
|
409
|
+
*/
|
410
|
+
static VALUE libvirt_event_invoke_timeout_callback(VALUE m, VALUE timer,
|
411
|
+
VALUE opaque) {
|
412
|
+
virEventTimeoutCallback cb;
|
413
|
+
void *op;
|
414
|
+
VALUE libvirt_cb;
|
415
|
+
VALUE libvirt_opaque;
|
416
|
+
|
417
|
+
if (TYPE(opaque) != T_HASH)
|
418
|
+
rb_raise(rb_eTypeError,
|
419
|
+
"wrong event callback argument type (expected Hash)");
|
420
|
+
|
421
|
+
libvirt_cb = rb_hash_aref(opaque, rb_str_new2("libvirt_cb"));
|
422
|
+
|
423
|
+
/* This is equivalent to Data_Get_Struct; I reproduce it here because
|
424
|
+
* I don't want the additional type-cast that Data_Get_Struct does
|
425
|
+
*/
|
426
|
+
Check_Type(libvirt_cb, T_DATA);
|
427
|
+
cb = DATA_PTR(libvirt_cb);
|
428
|
+
|
429
|
+
if (cb) {
|
430
|
+
libvirt_opaque = rb_hash_aref(opaque, rb_str_new2("opaque"));
|
431
|
+
Data_Get_Struct(libvirt_opaque, void *, op);
|
432
|
+
cb(NUM2INT(timer), op);
|
433
|
+
}
|
434
|
+
|
435
|
+
return Qnil;
|
436
|
+
}
|
437
|
+
|
438
|
+
static int internal_add_handle_func(int fd, int events,
|
439
|
+
virEventHandleCallback cb, void *opaque,
|
440
|
+
virFreeCallback ff) {
|
441
|
+
VALUE rubyargs;
|
442
|
+
VALUE res;
|
443
|
+
|
444
|
+
rubyargs = rb_hash_new();
|
445
|
+
rb_hash_aset(rubyargs, rb_str_new2("libvirt_cb"),
|
446
|
+
Data_Wrap_Struct(rb_class_of(add_handle), NULL, NULL, cb));
|
447
|
+
rb_hash_aset(rubyargs, rb_str_new2("opaque"),
|
448
|
+
Data_Wrap_Struct(rb_class_of(add_handle), NULL, NULL, opaque));
|
449
|
+
rb_hash_aset(rubyargs, rb_str_new2("free_func"),
|
450
|
+
Data_Wrap_Struct(rb_class_of(add_handle), NULL, NULL, ff));
|
451
|
+
|
452
|
+
/* call out to the ruby object */
|
453
|
+
if (strcmp(rb_obj_classname(add_handle), "Symbol") == 0)
|
454
|
+
res = rb_funcall(rb_class_of(add_handle), rb_to_id(add_handle), 3,
|
455
|
+
INT2FIX(fd), INT2FIX(events), rubyargs);
|
456
|
+
else if (strcmp(rb_obj_classname(add_handle), "Proc") == 0)
|
457
|
+
res = rb_funcall(add_handle, rb_intern("call"), 3, INT2FIX(fd),
|
458
|
+
INT2FIX(events), rubyargs);
|
459
|
+
else
|
460
|
+
rb_raise(rb_eTypeError,
|
461
|
+
"wrong add handle callback argument type (expected Symbol or Proc)");
|
462
|
+
|
463
|
+
if (TYPE(res) != T_FIXNUM)
|
464
|
+
rb_raise(rb_eTypeError,
|
465
|
+
"expected integer return from add_handle callback");
|
466
|
+
|
467
|
+
return NUM2INT(res);
|
468
|
+
}
|
469
|
+
|
470
|
+
static void internal_update_handle_func(int watch, int event) {
|
471
|
+
/* call out to the ruby object */
|
472
|
+
if (strcmp(rb_obj_classname(update_handle), "Symbol") == 0)
|
473
|
+
rb_funcall(rb_class_of(update_handle), rb_to_id(update_handle), 2,
|
474
|
+
INT2FIX(watch), INT2FIX(event));
|
475
|
+
else if (strcmp(rb_obj_classname(update_handle), "Proc") == 0)
|
476
|
+
rb_funcall(update_handle, rb_intern("call"), 2, INT2FIX(watch),
|
477
|
+
INT2FIX(event));
|
478
|
+
else
|
479
|
+
rb_raise(rb_eTypeError,
|
480
|
+
"wrong update handle callback argument type (expected Symbol or Proc)");
|
481
|
+
}
|
482
|
+
|
483
|
+
static int internal_remove_handle_func(int watch) {
|
484
|
+
VALUE res;
|
485
|
+
virFreeCallback ff_cb;
|
486
|
+
void *op;
|
487
|
+
VALUE libvirt_opaque;
|
488
|
+
VALUE ff;
|
489
|
+
|
490
|
+
/* call out to the ruby object */
|
491
|
+
if (strcmp(rb_obj_classname(remove_handle), "Symbol") == 0)
|
492
|
+
res = rb_funcall(rb_class_of(remove_handle), rb_to_id(remove_handle),
|
493
|
+
1, INT2FIX(watch));
|
494
|
+
else if (strcmp(rb_obj_classname(remove_handle), "Proc") == 0)
|
495
|
+
res = rb_funcall(remove_handle, rb_intern("call"), 1, INT2FIX(watch));
|
496
|
+
else
|
497
|
+
rb_raise(rb_eTypeError,
|
498
|
+
"wrong remove handle callback argument type (expected Symbol or Proc)");
|
499
|
+
|
500
|
+
if (TYPE(res) != T_HASH)
|
501
|
+
rb_raise(rb_eTypeError,
|
502
|
+
"expected opaque hash returned from remove_handle callback");
|
503
|
+
|
504
|
+
ff = rb_hash_aref(res, rb_str_new2("free_func"));
|
505
|
+
if (!NIL_P(ff)) {
|
506
|
+
/* This is equivalent to Data_Get_Struct; I reproduce it here because
|
507
|
+
* I don't want the additional type-cast that Data_Get_Struct does
|
508
|
+
*/
|
509
|
+
Check_Type(ff, T_DATA);
|
510
|
+
ff_cb = DATA_PTR(ff);
|
511
|
+
if (ff_cb) {
|
512
|
+
libvirt_opaque = rb_hash_aref(res, rb_str_new2("opaque"));
|
513
|
+
Data_Get_Struct(libvirt_opaque, void *, op);
|
514
|
+
|
515
|
+
(*ff_cb)(op);
|
516
|
+
}
|
517
|
+
}
|
518
|
+
|
519
|
+
return 0;
|
520
|
+
}
|
521
|
+
|
522
|
+
static int internal_add_timeout_func(int interval, virEventTimeoutCallback cb,
|
523
|
+
void *opaque, virFreeCallback ff) {
|
524
|
+
VALUE rubyargs;
|
525
|
+
VALUE res;
|
526
|
+
|
527
|
+
rubyargs = rb_hash_new();
|
528
|
+
|
529
|
+
rb_hash_aset(rubyargs, rb_str_new2("libvirt_cb"),
|
530
|
+
Data_Wrap_Struct(rb_class_of(add_timeout), NULL, NULL, cb));
|
531
|
+
rb_hash_aset(rubyargs, rb_str_new2("opaque"),
|
532
|
+
Data_Wrap_Struct(rb_class_of(add_timeout), NULL, NULL,
|
533
|
+
opaque));
|
534
|
+
rb_hash_aset(rubyargs, rb_str_new2("free_func"),
|
535
|
+
Data_Wrap_Struct(rb_class_of(add_timeout), NULL, NULL, ff));
|
536
|
+
|
537
|
+
/* call out to the ruby object */
|
538
|
+
if (strcmp(rb_obj_classname(add_timeout), "Symbol") == 0)
|
539
|
+
res = rb_funcall(rb_class_of(add_timeout), rb_to_id(add_timeout), 2,
|
540
|
+
INT2FIX(interval), rubyargs);
|
541
|
+
else if (strcmp(rb_obj_classname(add_timeout), "Proc") == 0)
|
542
|
+
res = rb_funcall(add_timeout, rb_intern("call"), 2, INT2FIX(interval),
|
543
|
+
rubyargs);
|
544
|
+
else
|
545
|
+
rb_raise(rb_eTypeError,
|
546
|
+
"wrong add timeout callback argument type (expected Symbol or Proc)");
|
547
|
+
|
548
|
+
if (TYPE(res) != T_FIXNUM)
|
549
|
+
rb_raise(rb_eTypeError,
|
550
|
+
"expected integer return from add_timeout callback");
|
551
|
+
|
552
|
+
return NUM2INT(res);
|
553
|
+
}
|
554
|
+
|
555
|
+
static void internal_update_timeout_func(int timer, int timeout) {
|
556
|
+
/* call out to the ruby object */
|
557
|
+
if (strcmp(rb_obj_classname(update_timeout), "Symbol") == 0)
|
558
|
+
rb_funcall(rb_class_of(update_timeout), rb_to_id(update_timeout), 2,
|
559
|
+
INT2FIX(timer), INT2FIX(timeout));
|
560
|
+
else if (strcmp(rb_obj_classname(update_timeout), "Proc") == 0)
|
561
|
+
rb_funcall(update_timeout, rb_intern("call"), 2, INT2FIX(timer),
|
562
|
+
INT2FIX(timeout));
|
563
|
+
else
|
564
|
+
rb_raise(rb_eTypeError,
|
565
|
+
"wrong update timeout callback argument type (expected Symbol or Proc)");
|
566
|
+
}
|
567
|
+
|
568
|
+
static int internal_remove_timeout_func(int timer) {
|
569
|
+
VALUE res;
|
570
|
+
virFreeCallback ff_cb;
|
571
|
+
void *op;
|
572
|
+
VALUE libvirt_opaque;
|
573
|
+
VALUE ff;
|
574
|
+
|
575
|
+
/* call out to the ruby object */
|
576
|
+
if (strcmp(rb_obj_classname(remove_timeout), "Symbol") == 0)
|
577
|
+
res = rb_funcall(rb_class_of(remove_timeout), rb_to_id(remove_timeout),
|
578
|
+
1, INT2FIX(timer));
|
579
|
+
else if (strcmp(rb_obj_classname(remove_timeout), "Proc") == 0)
|
580
|
+
res = rb_funcall(remove_timeout, rb_intern("call"), 1, INT2FIX(timer));
|
581
|
+
else
|
582
|
+
rb_raise(rb_eTypeError,
|
583
|
+
"wrong remove timeout callback argument type (expected Symbol or Proc)");
|
584
|
+
|
585
|
+
if (TYPE(res) != T_HASH)
|
586
|
+
rb_raise(rb_eTypeError,
|
587
|
+
"expected opaque hash returned from remove_timeout callback");
|
588
|
+
|
589
|
+
ff = rb_hash_aref(res, rb_str_new2("free_func"));
|
590
|
+
if (!NIL_P(ff)) {
|
591
|
+
/* This is equivalent to Data_Get_Struct; I reproduce it here because
|
592
|
+
* I don't want the additional type-cast that Data_Get_Struct does
|
593
|
+
*/
|
594
|
+
Check_Type(ff, T_DATA);
|
595
|
+
ff_cb = DATA_PTR(ff);
|
596
|
+
if (ff_cb) {
|
597
|
+
libvirt_opaque = rb_hash_aref(res, rb_str_new2("opaque"));
|
598
|
+
Data_Get_Struct(libvirt_opaque, void *, op);
|
599
|
+
|
600
|
+
(*ff_cb)(op);
|
601
|
+
}
|
602
|
+
}
|
603
|
+
|
604
|
+
return 0;
|
605
|
+
}
|
606
|
+
|
607
|
+
#define set_event_func_or_null(type) \
|
608
|
+
do { \
|
609
|
+
if (NIL_P(type)) \
|
610
|
+
type##_temp = NULL; \
|
611
|
+
else \
|
612
|
+
type##_temp = internal_##type##_func; \
|
613
|
+
} while(0)
|
614
|
+
|
615
|
+
static int is_symbol_proc_or_nil(VALUE handle) {
|
616
|
+
if (NIL_P(handle))
|
617
|
+
return 1;
|
618
|
+
return is_symbol_or_proc(handle);
|
619
|
+
}
|
620
|
+
|
621
|
+
/*
|
622
|
+
* call-seq:
|
623
|
+
* Libvirt::event_register_impl(add_handle=nil, update_handle=nil, remove_handle=nil, add_timeout=nil, update_timeout=nil, remove_timeout=nil) -> Qnil
|
624
|
+
*
|
625
|
+
* Call
|
626
|
+
* +virEventRegisterImpl+[http://www.libvirt.org/html/libvirt-libvirt.html#virEventRegisterImpl]
|
627
|
+
* to register callback handlers for handles and timeouts. These handles and
|
628
|
+
* timeouts are used as part of the libvirt infrastructure for generating
|
629
|
+
* domain events. Each callback must be a Symbol (that is the name of a
|
630
|
+
* method to callback), a Proc, or nil (to disable the callback). In the
|
631
|
+
* end-user application program, these callbacks are typically used to track
|
632
|
+
* the file descriptors or timers that libvirt is interested in (and is intended
|
633
|
+
* to be integrated into the "main loop" of a UI program). The individual
|
634
|
+
* callbacks will be given a certain number of arguments, and must return
|
635
|
+
* certain values. Those arguments and return types are:
|
636
|
+
*
|
637
|
+
* add_handle(fd, events, opaque) => Fixnum
|
638
|
+
*
|
639
|
+
* update_handle(handleID, event) => nil
|
640
|
+
*
|
641
|
+
* remove_handle(handleID) => opaque data from add_handle
|
642
|
+
*
|
643
|
+
* add_timeout(interval, opaque) => Fixnum
|
644
|
+
*
|
645
|
+
* update_timeout(timerID, timeout) => nil
|
646
|
+
*
|
647
|
+
* remove_timeout(timerID) => opaque data from add_timeout
|
648
|
+
*
|
649
|
+
* Any arguments marked as "opaque" must be accepted from the library and saved
|
650
|
+
* without modification. The values passed to the callbacks are meant to be
|
651
|
+
* passed to the event_invoke_handle_callback and event_invoke_timeout_callback
|
652
|
+
* module methods; see the documentation for those methods for more details.
|
653
|
+
*/
|
654
|
+
static VALUE libvirt_conn_event_register_impl(int argc, VALUE *argv, VALUE c) {
|
655
|
+
virEventAddHandleFunc add_handle_temp;
|
656
|
+
virEventUpdateHandleFunc update_handle_temp;
|
657
|
+
virEventRemoveHandleFunc remove_handle_temp;
|
658
|
+
virEventAddTimeoutFunc add_timeout_temp;
|
659
|
+
virEventUpdateTimeoutFunc update_timeout_temp;
|
660
|
+
virEventRemoveTimeoutFunc remove_timeout_temp;
|
661
|
+
|
662
|
+
/*
|
663
|
+
* subtle; we put the arguments (callbacks) directly into the global
|
664
|
+
* add_handle, update_handle, etc. variables. Then we register the
|
665
|
+
* internal functions as the callbacks with virEventRegisterImpl
|
666
|
+
*/
|
667
|
+
rb_scan_args(argc, argv, "06", &add_handle, &update_handle, &remove_handle,
|
668
|
+
&add_timeout, &update_timeout, &remove_timeout);
|
669
|
+
|
670
|
+
if (!is_symbol_proc_or_nil(add_handle) ||
|
671
|
+
!is_symbol_proc_or_nil(update_handle) ||
|
672
|
+
!is_symbol_proc_or_nil(remove_handle) ||
|
673
|
+
!is_symbol_proc_or_nil(add_timeout) ||
|
674
|
+
!is_symbol_proc_or_nil(update_timeout) ||
|
675
|
+
!is_symbol_proc_or_nil(remove_timeout))
|
676
|
+
rb_raise(rb_eTypeError,
|
677
|
+
"wrong argument type (expected Symbol, Proc, or nil)");
|
678
|
+
|
679
|
+
set_event_func_or_null(add_handle);
|
680
|
+
set_event_func_or_null(update_handle);
|
681
|
+
set_event_func_or_null(remove_handle);
|
682
|
+
set_event_func_or_null(add_timeout);
|
683
|
+
set_event_func_or_null(update_timeout);
|
684
|
+
set_event_func_or_null(remove_timeout);
|
685
|
+
|
686
|
+
/* virEventRegisterImpl returns void, so no error checking here */
|
687
|
+
virEventRegisterImpl(add_handle_temp, update_handle_temp,
|
688
|
+
remove_handle_temp, add_timeout_temp,
|
689
|
+
update_timeout_temp, remove_timeout_temp);
|
690
|
+
|
691
|
+
return Qnil;
|
692
|
+
}
|
693
|
+
#endif
|
694
|
+
|
125
695
|
/*
|
126
696
|
* Module Libvirt
|
127
697
|
*/
|
128
698
|
void Init__libvirt() {
|
129
|
-
int r;
|
130
|
-
|
131
699
|
m_libvirt = rb_define_module("Libvirt");
|
132
700
|
c_libvirt_version = rb_define_class_under(m_libvirt, "Version",
|
133
701
|
rb_cObject);
|
134
702
|
|
703
|
+
#if HAVE_VIRCONNECTOPENAUTH
|
704
|
+
rb_define_const(m_libvirt, "CONNECT_RO", INT2NUM(VIR_CONNECT_RO));
|
705
|
+
|
706
|
+
rb_define_const(m_libvirt, "CRED_USERNAME", INT2NUM(VIR_CRED_USERNAME));
|
707
|
+
rb_define_const(m_libvirt, "CRED_AUTHNAME", INT2NUM(VIR_CRED_AUTHNAME));
|
708
|
+
rb_define_const(m_libvirt, "CRED_LANGUAGE", INT2NUM(VIR_CRED_LANGUAGE));
|
709
|
+
rb_define_const(m_libvirt, "CRED_CNONCE", INT2NUM(VIR_CRED_CNONCE));
|
710
|
+
rb_define_const(m_libvirt, "CRED_PASSPHRASE", INT2NUM(VIR_CRED_PASSPHRASE));
|
711
|
+
rb_define_const(m_libvirt, "CRED_ECHOPROMPT", INT2NUM(VIR_CRED_ECHOPROMPT));
|
712
|
+
rb_define_const(m_libvirt, "CRED_NOECHOPROMPT", INT2NUM(VIR_CRED_NOECHOPROMPT));
|
713
|
+
rb_define_const(m_libvirt, "CRED_REALM", INT2NUM(VIR_CRED_REALM));
|
714
|
+
rb_define_const(m_libvirt, "CRED_EXTERNAL", INT2NUM(VIR_CRED_EXTERNAL));
|
715
|
+
#endif
|
135
716
|
|
136
717
|
/*
|
137
718
|
* Libvirt Errors
|
@@ -144,17 +725,45 @@ void Init__libvirt() {
|
|
144
725
|
e_Error);
|
145
726
|
e_RetrieveError = rb_define_class_under(m_libvirt, "RetrieveError",
|
146
727
|
e_Error);
|
728
|
+
e_NoSupportError = rb_define_class_under(m_libvirt, "NoSupportError",
|
729
|
+
e_Error);
|
147
730
|
|
148
|
-
// create 'libvirt_function_name' and 'vir_connect_ptr' attributes on e_Error class
|
149
731
|
rb_define_attr(e_Error, "libvirt_function_name", 1, 0);
|
150
732
|
rb_define_attr(e_Error, "libvirt_message", 1, 0);
|
151
733
|
|
152
734
|
rb_define_module_function(m_libvirt, "version", libvirt_version, -1);
|
153
|
-
|
154
|
-
|
735
|
+
rb_define_module_function(m_libvirt, "open", libvirt_open, -1);
|
736
|
+
rb_define_module_function(m_libvirt, "open_read_only",
|
155
737
|
libvirt_open_read_only, -1);
|
156
|
-
|
157
|
-
|
738
|
+
#if HAVE_VIRCONNECTOPENAUTH
|
739
|
+
rb_define_module_function(m_libvirt, "open_auth", libvirt_open_auth, -1);
|
740
|
+
#endif
|
741
|
+
|
742
|
+
#if HAVE_VIREVENTREGISTERIMPL
|
743
|
+
rb_define_const(m_libvirt, "EVENT_HANDLE_READABLE",
|
744
|
+
INT2NUM(VIR_EVENT_HANDLE_READABLE));
|
745
|
+
rb_define_const(m_libvirt, "EVENT_HANDLE_WRITABLE",
|
746
|
+
INT2NUM(VIR_EVENT_HANDLE_WRITABLE));
|
747
|
+
rb_define_const(m_libvirt, "EVENT_HANDLE_ERROR",
|
748
|
+
INT2NUM(VIR_EVENT_HANDLE_ERROR));
|
749
|
+
rb_define_const(m_libvirt, "EVENT_HANDLE_HANGUP",
|
750
|
+
INT2NUM(VIR_EVENT_HANDLE_HANGUP));
|
751
|
+
|
752
|
+
/* since we are using globals, we have to register with the gc */
|
753
|
+
rb_global_variable(&add_handle);
|
754
|
+
rb_global_variable(&update_handle);
|
755
|
+
rb_global_variable(&remove_handle);
|
756
|
+
rb_global_variable(&add_timeout);
|
757
|
+
rb_global_variable(&update_timeout);
|
758
|
+
rb_global_variable(&remove_timeout);
|
759
|
+
|
760
|
+
rb_define_module_function(m_libvirt, "event_register_impl",
|
761
|
+
libvirt_conn_event_register_impl, -1);
|
762
|
+
rb_define_module_function(m_libvirt, "event_invoke_handle_callback",
|
763
|
+
libvirt_event_invoke_handle_callback, 4);
|
764
|
+
rb_define_module_function(m_libvirt, "event_invoke_timeout_callback",
|
765
|
+
libvirt_event_invoke_timeout_callback, 2);
|
766
|
+
#endif
|
158
767
|
|
159
768
|
init_connect();
|
160
769
|
init_storage();
|
@@ -165,16 +774,8 @@ void Init__libvirt() {
|
|
165
774
|
init_interface();
|
166
775
|
init_domain();
|
167
776
|
|
168
|
-
|
169
|
-
|
777
|
+
virSetErrorFunc(NULL, rubyLibvirtErrorFunc);
|
778
|
+
|
779
|
+
if (virInitialize() < 0)
|
170
780
|
rb_raise(rb_eSystemCallError, "virInitialize failed");
|
171
781
|
}
|
172
|
-
|
173
|
-
/*
|
174
|
-
* Local variables:
|
175
|
-
* indent-tabs-mode: nil
|
176
|
-
* c-indent-level: 4
|
177
|
-
* c-basic-offset: 4
|
178
|
-
* tab-width: 4
|
179
|
-
* End:
|
180
|
-
*/
|