ruby-libvirt 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,75 @@
1
+ /*
2
+ * common.c: Common utilities for the ruby libvirt bindings
3
+ *
4
+ * Copyright (C) 2007,2010 Red Hat Inc.
5
+ *
6
+ * This library is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * This library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with this library; if not, write to the Free Software
18
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
+ */
20
+
21
+ #include <ruby.h>
22
+ #include <libvirt/libvirt.h>
23
+ #include <libvirt/virterror.h>
24
+
25
+ /* Error handling */
26
+ VALUE create_error(VALUE error, const char* method, const char* msg,
27
+ virConnectPtr conn) {
28
+ VALUE ruby_errinfo;
29
+ virErrorPtr err;
30
+
31
+ if (msg == NULL || strlen(msg) == 0) {
32
+ char *defmsg;
33
+ size_t len;
34
+ len = snprintf(NULL, 0, "Call to function %s failed", method) + 1;
35
+ defmsg = ALLOC_N(char, len);
36
+ snprintf(defmsg, len, "Call to function %s failed", method);
37
+ ruby_errinfo = rb_exc_new2(error, defmsg);
38
+ free(defmsg);
39
+ } else {
40
+ ruby_errinfo = rb_exc_new2(error, msg);
41
+ }
42
+ rb_iv_set(ruby_errinfo, "@libvirt_function_name", rb_str_new2(method));
43
+
44
+ if (conn == NULL)
45
+ err = virGetLastError();
46
+ else
47
+ err = virConnGetLastError(conn);
48
+
49
+ if (err != NULL) {
50
+ rb_iv_set(ruby_errinfo, "@libvirt_code", INT2FIX(err->code));
51
+ if (err->message != NULL)
52
+ rb_iv_set(ruby_errinfo, "@libvirt_message", rb_str_new2(err->message));
53
+ }
54
+
55
+ return ruby_errinfo;
56
+ };
57
+
58
+ char *get_string_or_nil(VALUE arg)
59
+ {
60
+ if (TYPE(arg) == T_NIL)
61
+ return NULL;
62
+ else if (TYPE(arg) == T_STRING)
63
+ return StringValueCStr(arg);
64
+ else
65
+ rb_raise(rb_eTypeError, "wrong argument type (expected String or nil)"); return NULL;
66
+ }
67
+
68
+ VALUE generic_new(VALUE klass, void *ptr, VALUE conn,
69
+ RUBY_DATA_FUNC free_func) {
70
+ VALUE result;
71
+ result = Data_Wrap_Struct(klass, NULL, free_func, ptr);
72
+ rb_iv_set(result, "@connection", conn);
73
+ return result;
74
+ }
75
+
@@ -0,0 +1,155 @@
1
+ #ifndef COMMON_H
2
+ #define COMMON_H
3
+
4
+ /* Macros to ease some of the boilerplate */
5
+ VALUE generic_new(VALUE klass, void *ptr, VALUE conn,
6
+ RUBY_DATA_FUNC free_func);
7
+
8
+ #define generic_get(kind, v) \
9
+ do { \
10
+ vir##kind##Ptr ptr; \
11
+ Data_Get_Struct(v, vir##kind, ptr); \
12
+ if (!ptr) \
13
+ rb_raise(rb_eArgError, #kind " has been freed"); \
14
+ return ptr; \
15
+ } while (0);
16
+
17
+ #define generic_free(kind, p) \
18
+ do { \
19
+ int r; \
20
+ r = vir##kind##Free((vir##kind##Ptr) p); \
21
+ if (r < 0) \
22
+ rb_raise(rb_eSystemCallError, # kind " free failed"); \
23
+ } while(0);
24
+
25
+ VALUE create_error(VALUE error, const char* method, const char* msg,
26
+ virConnectPtr conn);
27
+
28
+ /*
29
+ * Code generating macros.
30
+ *
31
+ * We only generate function bodies, not the whole function
32
+ * declaration.
33
+ */
34
+
35
+ /* Generate a call to a function FUNC which returns a string. The Ruby
36
+ * function will return the string on success and throw an exception on
37
+ * error. The string returned by FUNC is freed if dealloc is true.
38
+ */
39
+ #define gen_call_string(func, conn, dealloc, args...) \
40
+ do { \
41
+ const char *str; \
42
+ VALUE result; \
43
+ \
44
+ str = func(args); \
45
+ _E(str == NULL, create_error(e_Error, # func, "", conn)); \
46
+ \
47
+ result = rb_str_new2(str); \
48
+ if (dealloc) \
49
+ free((void *) str); \
50
+ return result; \
51
+ } while(0)
52
+
53
+ /* Generate a call to vir##KIND##Free and return Qnil. Set the the embedded
54
+ * vir##KIND##Ptr to NULL. If that pointer is already NULL, do nothing.
55
+ */
56
+ #define gen_call_free(kind, s) \
57
+ do { \
58
+ vir##kind##Ptr ptr; \
59
+ Data_Get_Struct(s, vir##kind, ptr); \
60
+ if (ptr != NULL) { \
61
+ int r = vir##kind##Free(ptr); \
62
+ _E(r < 0, create_error(e_Error, "vir" #kind "Free", "", conn(s))); \
63
+ DATA_PTR(s) = NULL; \
64
+ } \
65
+ return Qnil; \
66
+ } while (0)
67
+
68
+ /* Generate a call to a function FUNC which returns an int error, where -1
69
+ * indicates error and 0 success. The Ruby function will return Qnil on
70
+ * success and throw an exception on error.
71
+ */
72
+ #define gen_call_void(func, conn, args...) \
73
+ do { \
74
+ int _r_##func; \
75
+ _r_##func = func(args); \
76
+ _E(_r_##func < 0, create_error(e_Error, #func, "", conn)); \
77
+ return Qnil; \
78
+ } while(0)
79
+
80
+ /*
81
+ * Generate a call to a virConnectNumOf... function. C is the Ruby VALUE
82
+ * holding the connection and OBJS is a token indicating what objects to
83
+ * get the number of, e.g. 'Domains'
84
+ */
85
+ #define gen_conn_num_of(c, objs) \
86
+ do { \
87
+ int result; \
88
+ virConnectPtr conn = connect_get(c); \
89
+ \
90
+ result = virConnectNumOf##objs(conn); \
91
+ _E(result < 0, create_error(e_RetrieveError, "virConnectNumOf" # objs, "", conn)); \
92
+ \
93
+ return INT2NUM(result); \
94
+ } while(0)
95
+
96
+ /*
97
+ * Generate a call to a virConnectList... function. S is the Ruby VALUE
98
+ * holding the connection and OBJS is a token indicating what objects to
99
+ * get the number of, e.g. 'Domains' The list function must return an array
100
+ * of strings, which is returned as a Ruby array
101
+ */
102
+ #define gen_conn_list_names(s, objs) \
103
+ do { \
104
+ int i, r, num; \
105
+ char **names; \
106
+ virConnectPtr conn = connect_get(s); \
107
+ VALUE result; \
108
+ \
109
+ num = virConnectNumOf##objs(conn); \
110
+ _E(num < 0, create_error(e_RetrieveError, "virConnectNumOf" # objs, "", conn)); \
111
+ if (num == 0) { \
112
+ /* if num is 0, don't call virConnectList* function */ \
113
+ result = rb_ary_new2(num); \
114
+ return result; \
115
+ } \
116
+ names = ALLOC_N(char *, num); \
117
+ r = virConnectList##objs(conn, names, num); \
118
+ if (r < 0) { \
119
+ free(names); \
120
+ _E(r < 0, create_error(e_RetrieveError, "virConnectList" # objs, "", conn)); \
121
+ } \
122
+ \
123
+ result = rb_ary_new2(num); \
124
+ for (i=0; i<num; i++) { \
125
+ rb_ary_push(result, rb_str_new2(names[i])); \
126
+ free(names[i]); \
127
+ } \
128
+ free(names); \
129
+ return result; \
130
+ } while(0)
131
+
132
+ /* Generate a call to a function FUNC which returns an int; -1 indicates
133
+ * error, 0 indicates Qfalse, and 1 indicates Qtrue.
134
+ */
135
+ #define gen_call_truefalse(func, conn, args...) \
136
+ do { \
137
+ int _r_##func; \
138
+ _r_##func = func(args); \
139
+ _E(_r_##func < 0, create_error(e_Error, #func, "", conn)); \
140
+ return _r_##func ? Qtrue : Qfalse; \
141
+ } while(0)
142
+
143
+ /* Error handling */
144
+ #define _E(cond, excep) \
145
+ do { if (cond) rb_exc_raise(excep); } while(0)
146
+
147
+ extern VALUE e_RetrieveError;
148
+ extern VALUE e_Error;
149
+ extern VALUE e_DefinitionError;
150
+
151
+ extern VALUE m_libvirt;
152
+
153
+ char *get_string_or_nil(VALUE arg);
154
+
155
+ #endif
@@ -0,0 +1,392 @@
1
+ /*
2
+ * connect.c: virConnect methods
3
+ *
4
+ * Copyright (C) 2007,2010 Red Hat Inc.
5
+ *
6
+ * This library is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * This library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with this library; if not, write to the Free Software
18
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
+ */
20
+
21
+ #include <ruby.h>
22
+ #include <libvirt/libvirt.h>
23
+ #include <libvirt/virterror.h>
24
+ #include "extconf.h"
25
+ #include "common.h"
26
+
27
+ VALUE c_connect;
28
+ static VALUE c_node_security_model;
29
+ static VALUE c_node_info;
30
+
31
+ static void connect_close(void *p) {
32
+ int r;
33
+
34
+ if (!p)
35
+ return;
36
+ r = virConnectClose((virConnectPtr) p);
37
+ _E(r < 0, create_error(rb_eSystemCallError, "virConnectClose",
38
+ "Connection close failed", p));
39
+ }
40
+
41
+ VALUE connect_new(virConnectPtr p) {
42
+ return Data_Wrap_Struct(c_connect, NULL, connect_close, p);
43
+ }
44
+
45
+ virConnectPtr connect_get(VALUE s) {
46
+ generic_get(Connect, s);
47
+ }
48
+
49
+ VALUE conn_attr(VALUE s) {
50
+ if (rb_obj_is_instance_of(s, c_connect) != Qtrue) {
51
+ s = rb_iv_get(s, "@connection");
52
+ }
53
+ if (rb_obj_is_instance_of(s, c_connect) != Qtrue) {
54
+ rb_raise(rb_eArgError, "Expected Connection object");
55
+ }
56
+ return s;
57
+ }
58
+
59
+ virConnectPtr conn(VALUE s) {
60
+ virConnectPtr conn;
61
+
62
+ s = conn_attr(s);
63
+ Data_Get_Struct(s, virConnect, conn);
64
+ if (!conn)
65
+ rb_raise(rb_eArgError, "Connection has been closed");
66
+ return conn;
67
+ }
68
+
69
+ /*
70
+ * call-seq:
71
+ * conn.close -> nil
72
+ *
73
+ * Close the connection
74
+ */
75
+ static VALUE libvirt_conn_close(VALUE s) {
76
+ virConnectPtr conn;
77
+ Data_Get_Struct(s, virConnect, conn);
78
+ if (conn) {
79
+ connect_close(conn);
80
+ DATA_PTR(s) = NULL;
81
+ }
82
+ return Qnil;
83
+ }
84
+
85
+ /*
86
+ * call-seq:
87
+ * conn.closed? -> [True|False]
88
+ *
89
+ * Return +true+ if the connection is closed, +false+ if it is open
90
+ */
91
+ static VALUE libvirt_conn_closed_p(VALUE s) {
92
+ virConnectPtr conn;
93
+
94
+ Data_Get_Struct(s, virConnect, conn);
95
+ return (conn==NULL) ? Qtrue : Qfalse;
96
+ }
97
+
98
+ /*
99
+ * call-seq:
100
+ * conn.type -> string
101
+ *
102
+ * Call +virConnectGetType+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetType]
103
+ */
104
+ static VALUE libvirt_conn_type(VALUE s) {
105
+ gen_call_string(virConnectGetType, conn(s), 0, connect_get(s));
106
+ }
107
+
108
+ /*
109
+ * call-seq:
110
+ * conn.version -> fixnum
111
+ *
112
+ * Call +virConnectGetVersion+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetVersion]
113
+ */
114
+ static VALUE libvirt_conn_version(VALUE s) {
115
+ int r;
116
+ unsigned long v;
117
+ virConnectPtr conn = connect_get(s);
118
+
119
+ r = virConnectGetVersion(conn, &v);
120
+ _E(r < 0, create_error(e_RetrieveError, "virConnectGetVersion", "", conn));
121
+
122
+ return ULONG2NUM(v);
123
+ }
124
+
125
+ #if HAVE_VIRCONNECTGETLIBVERSION
126
+ /*
127
+ * call-seq:
128
+ * conn.libversion -> fixnum
129
+ *
130
+ * Call +virConnectGetLibVersion+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetLibVersion]
131
+ */
132
+ static VALUE libvirt_conn_libversion(VALUE s) {
133
+ int r;
134
+ unsigned long v;
135
+ virConnectPtr conn = connect_get(s);
136
+
137
+ r = virConnectGetLibVersion(conn, &v);
138
+ _E(r < 0, create_error(e_RetrieveError, "virConnectGetLibVersion",
139
+ "", conn));
140
+
141
+ return ULONG2NUM(v);
142
+ }
143
+ #endif
144
+
145
+ /*
146
+ * call-seq:
147
+ * conn.hostname -> string
148
+ *
149
+ * Call +virConnectGetHostname+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetHostname]
150
+ */
151
+ static VALUE libvirt_conn_hostname(VALUE s) {
152
+ gen_call_string(virConnectGetHostname, conn(s), 1, connect_get(s));
153
+ }
154
+
155
+ /*
156
+ * call-seq:
157
+ * conn.uri -> string
158
+ *
159
+ * Call +virConnectGetURI+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetURI]
160
+ */
161
+ static VALUE libvirt_conn_uri(VALUE s) {
162
+ gen_call_string(virConnectGetURI, conn(s), 1, connect_get(s));
163
+ }
164
+
165
+ /*
166
+ * call-seq:
167
+ * conn.max_vcpus -> fixnum
168
+ *
169
+ * Call +virConnectGetMaxVcpus+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetMaxVcpus]
170
+ */
171
+ static VALUE libvirt_conn_max_vcpus(int argc, VALUE *argv, VALUE s) {
172
+ int result;
173
+ virConnectPtr conn = connect_get(s);
174
+ VALUE type;
175
+
176
+ rb_scan_args(argc, argv, "01", &type);
177
+
178
+ result = virConnectGetMaxVcpus(conn, get_string_or_nil(type));
179
+ _E(result < 0, create_error(e_RetrieveError, "virConnectGetMaxVcpus",
180
+ "", conn));
181
+
182
+ return INT2NUM(result);
183
+ }
184
+
185
+ /*
186
+ * call-seq:
187
+ * conn.node_get_info -> Libvirt::Connect::Nodeinfo
188
+ *
189
+ * Call +virNodeGetInfo+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeGetInfo]
190
+ */
191
+ static VALUE libvirt_conn_node_get_info(VALUE s) {
192
+ int r;
193
+ virConnectPtr conn = connect_get(s);
194
+ virNodeInfo nodeinfo;
195
+ VALUE result;
196
+
197
+ r = virNodeGetInfo(conn, &nodeinfo);
198
+ _E(r < 0, create_error(e_RetrieveError, "virNodeGetInfo", "", conn));
199
+
200
+ result = rb_class_new_instance(0, NULL, c_node_info);
201
+ rb_iv_set(result, "@model", rb_str_new2(nodeinfo.model));
202
+ rb_iv_set(result, "@memory", ULONG2NUM(nodeinfo.memory));
203
+ rb_iv_set(result, "@cpus", UINT2NUM(nodeinfo.cpus));
204
+ rb_iv_set(result, "@mhz", UINT2NUM(nodeinfo.mhz));
205
+ rb_iv_set(result, "@nodes", UINT2NUM(nodeinfo.nodes));
206
+ rb_iv_set(result, "@sockets", UINT2NUM(nodeinfo.sockets));
207
+ rb_iv_set(result, "@cores", UINT2NUM(nodeinfo.cores));
208
+ rb_iv_set(result, "@threads", UINT2NUM(nodeinfo.threads));
209
+
210
+ return result;
211
+ }
212
+
213
+ /*
214
+ * call-seq:
215
+ * conn.node_free_memory -> fixnum
216
+ *
217
+ * Call +virNodeGetFreeMemory+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeGetFreeMemory]
218
+ */
219
+ static VALUE libvirt_conn_node_free_memory(VALUE s) {
220
+ virConnectPtr conn = connect_get(s);
221
+ unsigned long long freemem;
222
+
223
+ freemem = virNodeGetFreeMemory(conn);
224
+ _E(freemem == 0, create_error(e_RetrieveError, "virNodeGetFreeMemory",
225
+ "", conn));
226
+
227
+ return ULL2NUM(freemem);
228
+ }
229
+
230
+ /*
231
+ * call-seq:
232
+ * conn.node_cells_free_memory -> list
233
+ *
234
+ * Call +virNodeGetCellsFreeMemory+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeGetCellsFreeMemory]
235
+ */
236
+ static VALUE libvirt_conn_node_cells_free_memory(int argc, VALUE *argv, VALUE s) {
237
+ int r;
238
+ virConnectPtr conn = connect_get(s);
239
+ VALUE cells;
240
+ VALUE startCell, maxCells;
241
+ unsigned long long *freeMems;
242
+ virNodeInfo nodeinfo;
243
+ int i;
244
+
245
+ rb_scan_args(argc, argv, "02", &startCell, &maxCells);
246
+
247
+ if (NIL_P(startCell))
248
+ startCell = INT2FIX(0);
249
+ if (NIL_P(maxCells)) {
250
+ r = virNodeGetInfo(conn, &nodeinfo);
251
+ _E(r < 0, create_error(e_RetrieveError, "virNodeGetInfo", "", conn));
252
+ freeMems = ALLOC_N(unsigned long long, nodeinfo.nodes);
253
+ maxCells = INT2FIX(nodeinfo.nodes);
254
+ }
255
+ else
256
+ freeMems = ALLOC_N(unsigned long long, NUM2UINT(maxCells));
257
+
258
+ r = virNodeGetCellsFreeMemory(conn, freeMems, NUM2INT(startCell),
259
+ NUM2INT(maxCells));
260
+ _E(r < 0, create_error(e_RetrieveError, "virNodeGetCellsFreeMemory", "", conn));
261
+
262
+ cells = rb_ary_new2(r);
263
+ for (i = 0; i < r; i++)
264
+ rb_ary_push(cells, ULL2NUM(freeMems[i]));
265
+ free(freeMems);
266
+
267
+ return cells;
268
+ }
269
+
270
+ /*
271
+ * call-seq:
272
+ * conn.node_get_security_model -> Libvirt::Connect::NodeSecurityModel
273
+ *
274
+ * Call +virNodeGetSecurityInfo+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeGetSecurityInfo]
275
+ */
276
+ static VALUE libvirt_conn_node_get_security_model(VALUE s) {
277
+ virSecurityModel secmodel;
278
+ virConnectPtr conn = connect_get(s);
279
+ int r;
280
+ VALUE result;
281
+
282
+ r = virNodeGetSecurityModel(conn, &secmodel);
283
+ _E(r < 0, create_error(e_RetrieveError, "virNodeGetSecurityModel", "", conn));
284
+
285
+ result = rb_class_new_instance(0, NULL, c_node_security_model);
286
+ rb_iv_set(result, "@model", rb_str_new2(secmodel.model));
287
+ rb_iv_set(result, "@doi", rb_str_new2(secmodel.doi));
288
+
289
+ return result;
290
+ }
291
+
292
+ #if HAVE_VIRCONNECTISENCRYPTED
293
+ /*
294
+ * call-seq:
295
+ * conn.encrypted?
296
+ *
297
+ * Return +true+ if the connection is encrypted, +false+ if it is not
298
+ */
299
+ static VALUE libvirt_conn_encrypted_p(VALUE s) {
300
+ gen_call_truefalse(virConnectIsEncrypted, conn(s), connect_get(s));
301
+ }
302
+ #endif
303
+
304
+ #if HAVE_VIRCONNECTISSECURE
305
+ /*
306
+ * call-seq:
307
+ * conn.secure?
308
+ *
309
+ * Return +true+ if the connection is secure, +false+ if it is not
310
+ */
311
+ static VALUE libvirt_conn_secure_p(VALUE s) {
312
+ gen_call_truefalse(virConnectIsSecure, conn(s), connect_get(s));
313
+ }
314
+ #endif
315
+
316
+ /*
317
+ * call-seq:
318
+ * conn.capabilities -> string
319
+ *
320
+ * Call +virConnectGetCapabilities+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetCapabilities]
321
+ */
322
+ static VALUE libvirt_conn_capabilities(VALUE s) {
323
+ gen_call_string(virConnectGetCapabilities, conn(s), 1, connect_get(s));
324
+ }
325
+
326
+ /*
327
+ * Class Libvirt::Connect
328
+ */
329
+ void init_connect()
330
+ {
331
+ c_connect = rb_define_class_under(m_libvirt, "Connect", rb_cObject);
332
+
333
+ /*
334
+ * Class Libvirt::Connect::Nodeinfo
335
+ */
336
+ c_node_info = rb_define_class_under(c_connect, "Nodeinfo", rb_cObject);
337
+ rb_define_attr(c_node_info, "model", 1, 0);
338
+ rb_define_attr(c_node_info, "memory", 1, 0);
339
+ rb_define_attr(c_node_info, "cpus", 1, 0);
340
+ rb_define_attr(c_node_info, "mhz", 1, 0);
341
+ rb_define_attr(c_node_info, "nodes", 1, 0);
342
+ rb_define_attr(c_node_info, "sockets", 1, 0);
343
+ rb_define_attr(c_node_info, "cores", 1, 0);
344
+ rb_define_attr(c_node_info, "threads", 1, 0);
345
+
346
+ /*
347
+ * Class Libvirt::Connect::NodeSecurityModel
348
+ */
349
+ c_node_security_model = rb_define_class_under(c_connect,
350
+ "NodeSecurityModel",
351
+ rb_cObject);
352
+ rb_define_attr(c_node_security_model, "model", 1, 0);
353
+ rb_define_attr(c_node_security_model, "doi", 1, 0);
354
+
355
+ rb_define_method(c_connect, "close", libvirt_conn_close, 0);
356
+ rb_define_method(c_connect, "closed?", libvirt_conn_closed_p, 0);
357
+ rb_define_method(c_connect, "type", libvirt_conn_type, 0);
358
+ rb_define_method(c_connect, "version", libvirt_conn_version, 0);
359
+ #if HAVE_VIRCONNECTGETLIBVERSION
360
+ rb_define_method(c_connect, "libversion", libvirt_conn_libversion, 0);
361
+ #endif
362
+ rb_define_method(c_connect, "hostname", libvirt_conn_hostname, 0);
363
+ rb_define_method(c_connect, "uri", libvirt_conn_uri, 0);
364
+ rb_define_method(c_connect, "max_vcpus", libvirt_conn_max_vcpus, -1);
365
+ rb_define_method(c_connect, "node_get_info", libvirt_conn_node_get_info, 0);
366
+ rb_define_method(c_connect, "node_free_memory",
367
+ libvirt_conn_node_free_memory, 0);
368
+ rb_define_method(c_connect, "node_cells_free_memory",
369
+ libvirt_conn_node_cells_free_memory, -1);
370
+ rb_define_method(c_connect, "node_get_security_model",
371
+ libvirt_conn_node_get_security_model, 0);
372
+ #if HAVE_VIRCONNECTISENCRYPTED
373
+ rb_define_method(c_connect, "encrypted?", libvirt_conn_encrypted_p, 0);
374
+ #endif
375
+ #if HAVE_VIRCONNECTISSECURE
376
+ rb_define_method(c_connect, "secure?", libvirt_conn_secure_p, 0);
377
+ #endif
378
+ rb_define_method(c_connect, "capabilities", libvirt_conn_capabilities, 0);
379
+
380
+ /* FIXME: implement these */
381
+ //rb_define_method(c_connect, "domain_event_register",
382
+ // libvirt_conn_domain_event_register", -1);
383
+ //rb_define_method(c_connect, "Domain_event_deregister",
384
+ // libvirt_conn_domain_event_deregister, -1);
385
+ //rb_define_method(c_connect, "domain_event_register_any",
386
+ // libvirt_conn_domain_event_register_any, -1);
387
+ //rb_define_method(c_connect, "domain_event_deregister_any",
388
+ // libvirt_conn_domain_event_deregister_any, -1);
389
+ //rb_define_method(c_connect, "baseline_cpu", libvirt_conn_baseline_cpu, -1);
390
+ //rb_define_method(c_connect, "compare_cpu", libvirt_conn_compare_cpu, -1);
391
+ //rb_define_method(c_connect, "event_register_impl", libvirt_conn_event_register_impl, -1);
392
+ }