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.
@@ -18,38 +18,113 @@
18
18
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
19
  */
20
20
 
21
+ #ifndef _GNU_SOURCE
22
+ #define _GNU_SOURCE 1
23
+ #endif
24
+ #include <stdio.h>
21
25
  #include <ruby.h>
22
26
  #include <libvirt/libvirt.h>
23
27
  #include <libvirt/virterror.h>
28
+ #include "common.h"
29
+
30
+ struct rb_exc_new2_arg {
31
+ VALUE error;
32
+ char *msg;
33
+ };
34
+
35
+ static VALUE rb_exc_new2_wrap(VALUE arg) {
36
+ struct rb_exc_new2_arg *e = (struct rb_exc_new2_arg *)arg;
37
+
38
+ return rb_exc_new2(e->error, e->msg);
39
+ }
40
+
41
+ VALUE rb_ary_new2_wrap(VALUE arg) {
42
+ return rb_ary_new2(*((int *)arg));
43
+ }
44
+
45
+ VALUE rb_ary_push_wrap(VALUE arg) {
46
+ struct rb_ary_push_arg *e = (struct rb_ary_push_arg *)arg;
47
+
48
+ return rb_ary_push(e->arr, e->value);
49
+ }
50
+
51
+ VALUE rb_str_new2_wrap(VALUE arg) {
52
+ char **str = (char **)arg;
53
+
54
+ return rb_str_new2(*str);
55
+ }
56
+
57
+ VALUE rb_ary_entry_wrap(VALUE arg) {
58
+ struct rb_ary_entry_arg *e = (struct rb_ary_entry_arg *)arg;
59
+
60
+ return rb_ary_entry(e->arr, e->elem);
61
+ }
62
+
63
+ VALUE rb_ary_new_wrap(VALUE arg) {
64
+ return rb_ary_new();
65
+ }
66
+
67
+ VALUE rb_str_new_wrap(VALUE arg) {
68
+ struct rb_str_new_arg *e = (struct rb_str_new_arg *)arg;
69
+
70
+ return rb_str_new(e->val, e->size);
71
+ }
72
+
73
+ VALUE rb_iv_set_wrap(VALUE arg) {
74
+ struct rb_iv_set_arg *e = (struct rb_iv_set_arg *)arg;
75
+
76
+ return rb_iv_set(e->klass, e->member, e->value);
77
+ }
78
+
79
+ VALUE rb_class_new_instance_wrap(VALUE arg) {
80
+ struct rb_class_new_instance_arg *e = (struct rb_class_new_instance_arg *)arg;
81
+
82
+ return rb_class_new_instance(e->argc, e->argv, e->klass);
83
+ }
84
+
85
+ VALUE rb_string_value_cstr_wrap(VALUE arg) {
86
+ return (VALUE)rb_string_value_cstr((VALUE *)arg);
87
+ }
24
88
 
25
89
  /* Error handling */
26
- VALUE create_error(VALUE error, const char* method, const char* msg,
27
- virConnectPtr conn) {
90
+ VALUE create_error(VALUE error, const char* method, virConnectPtr conn) {
28
91
  VALUE ruby_errinfo;
29
92
  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));
93
+ char *msg;
94
+ int rc;
95
+ struct rb_exc_new2_arg arg;
96
+ int exception = 0;
43
97
 
44
98
  if (conn == NULL)
45
99
  err = virGetLastError();
46
100
  else
47
101
  err = virConnGetLastError(conn);
48
102
 
103
+ if (err != NULL && err->message != NULL)
104
+ rc = asprintf(&msg, "Call to %s failed: %s", method, err->message);
105
+ else
106
+ rc = asprintf(&msg, "Call to %s failed", method);
107
+
108
+ if (rc < 0) {
109
+ /* there's not a whole lot we can do here; try to raise an
110
+ * out-of-memory message */
111
+ rb_memerror();
112
+ }
113
+
114
+ arg.error = error;
115
+ arg.msg = msg;
116
+ ruby_errinfo = rb_protect(rb_exc_new2_wrap, (VALUE)&arg, &exception);
117
+ free(msg);
118
+ if (exception)
119
+ rb_jump_tag(exception);
120
+
121
+ rb_iv_set(ruby_errinfo, "@libvirt_function_name", rb_str_new2(method));
122
+
49
123
  if (err != NULL) {
50
124
  rb_iv_set(ruby_errinfo, "@libvirt_code", INT2FIX(err->code));
51
125
  if (err->message != NULL)
52
- rb_iv_set(ruby_errinfo, "@libvirt_message", rb_str_new2(err->message));
126
+ rb_iv_set(ruby_errinfo, "@libvirt_message",
127
+ rb_str_new2(err->message));
53
128
  }
54
129
 
55
130
  return ruby_errinfo;
@@ -73,3 +148,54 @@ VALUE generic_new(VALUE klass, void *ptr, VALUE conn,
73
148
  return result;
74
149
  }
75
150
 
151
+ int is_symbol_or_proc(VALUE handle) {
152
+ return ((strcmp(rb_obj_classname(handle), "Symbol") == 0) ||
153
+ (strcmp(rb_obj_classname(handle), "Proc") == 0));
154
+ }
155
+
156
+ /* this is an odd function, because it has massive side-effects. The first
157
+ * tip that something is weird here should be the triple-starred list.
158
+ * The intended usage of this function is after a list has been collected
159
+ * from a libvirt list function, and now we want to make an array out of it.
160
+ * However, it is possible that the act of creating an array causes an
161
+ * exception, which would lead to a memory leak of the values we got from
162
+ * libvirt. Therefore, this function not only wraps all of the relevant
163
+ * calls with rb_protect, it also frees every individual entry in list
164
+ * along with list itself.
165
+ */
166
+ VALUE gen_list(int num, char ***list) {
167
+ VALUE result;
168
+ int exception = 0;
169
+ int i, j;
170
+ struct rb_ary_push_arg arg;
171
+
172
+ result = rb_protect(rb_ary_new2_wrap, (VALUE)&num, &exception);
173
+ if (exception) {
174
+ for (i = 0; i < num; i++)
175
+ free((*list)[i]);
176
+ xfree(*list);
177
+ rb_jump_tag(exception);
178
+ }
179
+ for (i = 0; i < num; i++) {
180
+ arg.arr = result;
181
+ arg.value = rb_protect(rb_str_new2_wrap, (VALUE)&((*list)[i]),
182
+ &exception);
183
+ if (exception) {
184
+ for (j = i; j < num; j++)
185
+ xfree((*list)[j]);
186
+ xfree(*list);
187
+ rb_jump_tag(exception);
188
+ }
189
+ rb_protect(rb_ary_push_wrap, (VALUE)&arg, &exception);
190
+ if (exception) {
191
+ for (j = i; j < num; j++)
192
+ xfree((*list)[j]);
193
+ xfree(*list);
194
+ rb_jump_tag(exception);
195
+ }
196
+ xfree((*list)[i]);
197
+ }
198
+ xfree(*list);
199
+
200
+ return result;
201
+ }
@@ -22,8 +22,7 @@ VALUE generic_new(VALUE klass, void *ptr, VALUE conn,
22
22
  rb_raise(rb_eSystemCallError, # kind " free failed"); \
23
23
  } while(0);
24
24
 
25
- VALUE create_error(VALUE error, const char* method, const char* msg,
26
- virConnectPtr conn);
25
+ VALUE create_error(VALUE error, const char* method, virConnectPtr conn);
27
26
 
28
27
  /*
29
28
  * Code generating macros.
@@ -42,11 +41,11 @@ VALUE create_error(VALUE error, const char* method, const char* msg,
42
41
  VALUE result; \
43
42
  \
44
43
  str = func(args); \
45
- _E(str == NULL, create_error(e_Error, # func, "", conn)); \
44
+ _E(str == NULL, create_error(e_Error, # func, conn)); \
46
45
  \
47
46
  result = rb_str_new2(str); \
48
47
  if (dealloc) \
49
- free((void *) str); \
48
+ xfree((void *) str); \
50
49
  return result; \
51
50
  } while(0)
52
51
 
@@ -59,7 +58,7 @@ VALUE create_error(VALUE error, const char* method, const char* msg,
59
58
  Data_Get_Struct(s, vir##kind, ptr); \
60
59
  if (ptr != NULL) { \
61
60
  int r = vir##kind##Free(ptr); \
62
- _E(r < 0, create_error(e_Error, "vir" #kind "Free", "", conn(s))); \
61
+ _E(r < 0, create_error(e_Error, "vir" #kind "Free", conn(s))); \
63
62
  DATA_PTR(s) = NULL; \
64
63
  } \
65
64
  return Qnil; \
@@ -73,7 +72,7 @@ VALUE create_error(VALUE error, const char* method, const char* msg,
73
72
  do { \
74
73
  int _r_##func; \
75
74
  _r_##func = func(args); \
76
- _E(_r_##func < 0, create_error(e_Error, #func, "", conn)); \
75
+ _E(_r_##func < 0, create_error(e_Error, #func, conn)); \
77
76
  return Qnil; \
78
77
  } while(0)
79
78
 
@@ -88,11 +87,14 @@ VALUE create_error(VALUE error, const char* method, const char* msg,
88
87
  virConnectPtr conn = connect_get(c); \
89
88
  \
90
89
  result = virConnectNumOf##objs(conn); \
91
- _E(result < 0, create_error(e_RetrieveError, "virConnectNumOf" # objs, "", conn)); \
90
+ _E(result < 0, create_error(e_RetrieveError, "virConnectNumOf" # objs, conn)); \
92
91
  \
93
92
  return INT2NUM(result); \
94
93
  } while(0)
95
94
 
95
+
96
+ VALUE gen_list(int num, char ***list);
97
+
96
98
  /*
97
99
  * Generate a call to a virConnectList... function. S is the Ruby VALUE
98
100
  * holding the connection and OBJS is a token indicating what objects to
@@ -101,32 +103,24 @@ VALUE create_error(VALUE error, const char* method, const char* msg,
101
103
  */
102
104
  #define gen_conn_list_names(s, objs) \
103
105
  do { \
104
- int i, r, num; \
106
+ int r, num; \
105
107
  char **names; \
106
108
  virConnectPtr conn = connect_get(s); \
107
- VALUE result; \
108
109
  \
109
110
  num = virConnectNumOf##objs(conn); \
110
- _E(num < 0, create_error(e_RetrieveError, "virConnectNumOf" # objs, "", conn)); \
111
+ _E(num < 0, create_error(e_RetrieveError, "virConnectNumOf" # objs, conn)); \
111
112
  if (num == 0) { \
112
113
  /* if num is 0, don't call virConnectList* function */ \
113
- result = rb_ary_new2(num); \
114
- return result; \
114
+ return rb_ary_new2(num); \
115
115
  } \
116
116
  names = ALLOC_N(char *, num); \
117
117
  r = virConnectList##objs(conn, names, num); \
118
118
  if (r < 0) { \
119
- free(names); \
120
- _E(r < 0, create_error(e_RetrieveError, "virConnectList" # objs, "", conn)); \
119
+ xfree(names); \
120
+ _E(r < 0, create_error(e_RetrieveError, "virConnectList" # objs, conn)); \
121
121
  } \
122
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; \
123
+ return gen_list(num, &names); \
130
124
  } while(0)
131
125
 
132
126
  /* Generate a call to a function FUNC which returns an int; -1 indicates
@@ -136,20 +130,82 @@ VALUE create_error(VALUE error, const char* method, const char* msg,
136
130
  do { \
137
131
  int _r_##func; \
138
132
  _r_##func = func(args); \
139
- _E(_r_##func < 0, create_error(e_Error, #func, "", conn)); \
133
+ _E(_r_##func < 0, create_error(e_Error, #func, conn)); \
140
134
  return _r_##func ? Qtrue : Qfalse; \
141
135
  } while(0)
142
136
 
137
+ /* Generate a call to a function FUNC which returns an int error, where -1
138
+ * indicates error and >= 0 success. The Ruby function will return the integer
139
+ * success and throw an exception on error.
140
+ */
141
+ #define gen_call_int(func, conn, args...) \
142
+ do { \
143
+ int _r_##func; \
144
+ _r_##func = func(args); \
145
+ _E(_r_##func < 0, create_error(e_RetrieveError, #func, conn)); \
146
+ return INT2NUM(_r_##func); \
147
+ } while(0)
148
+
143
149
  /* Error handling */
144
150
  #define _E(cond, excep) \
145
151
  do { if (cond) rb_exc_raise(excep); } while(0)
146
152
 
153
+ int is_symbol_or_proc(VALUE handle);
154
+
147
155
  extern VALUE e_RetrieveError;
148
156
  extern VALUE e_Error;
149
157
  extern VALUE e_DefinitionError;
158
+ extern VALUE e_NoSupportError;
150
159
 
151
160
  extern VALUE m_libvirt;
152
161
 
153
162
  char *get_string_or_nil(VALUE arg);
154
163
 
164
+ struct rb_ary_entry_arg {
165
+ VALUE arr;
166
+ int elem;
167
+ };
168
+ VALUE rb_ary_entry_wrap(VALUE arg);
169
+ VALUE rb_ary_new_wrap(VALUE arg);
170
+ struct rb_ary_push_arg {
171
+ VALUE arr;
172
+ VALUE value;
173
+ };
174
+ VALUE rb_ary_push_wrap(VALUE arg);
175
+ VALUE rb_ary_new2_wrap(VALUE arg);
176
+
177
+ VALUE rb_str_new2_wrap(VALUE arg);
178
+ struct rb_str_new_arg {
179
+ char *val;
180
+ size_t size;
181
+ };
182
+ VALUE rb_str_new_wrap(VALUE arg);
183
+ VALUE rb_string_value_cstr_wrap(VALUE arg);
184
+
185
+ struct rb_iv_set_arg {
186
+ VALUE klass;
187
+ char *member;
188
+ VALUE value;
189
+ };
190
+ VALUE rb_iv_set_wrap(VALUE arg);
191
+
192
+ struct rb_class_new_instance_arg {
193
+ int argc;
194
+ VALUE *argv;
195
+ VALUE klass;
196
+ };
197
+ VALUE rb_class_new_instance_wrap(VALUE arg);
198
+
199
+ #ifndef RARRAY_LEN
200
+ #define RARRAY_LEN(ar) (RARRAY(ar)->len)
201
+ #endif
202
+
203
+ #ifndef RSTRING_PTR
204
+ #define RSTRING_PTR(str) (RSTRING(str)->ptr)
205
+ #endif
206
+
207
+ #ifndef RSTRING_LEN
208
+ #define RSTRING_LEN(str) (RSTRING(str)->len)
209
+ #endif
210
+
155
211
  #endif
@@ -23,8 +23,15 @@
23
23
  #include <libvirt/virterror.h>
24
24
  #include "extconf.h"
25
25
  #include "common.h"
26
+ #include "domain.h"
27
+ #include "interface.h"
28
+ #include "network.h"
29
+ #include "nodedevice.h"
30
+ #include "nwfilter.h"
31
+ #include "secret.h"
32
+ #include "storage.h"
26
33
 
27
- VALUE c_connect;
34
+ static VALUE c_connect;
28
35
  static VALUE c_node_security_model;
29
36
  static VALUE c_node_info;
30
37
 
@@ -34,8 +41,7 @@ static void connect_close(void *p) {
34
41
  if (!p)
35
42
  return;
36
43
  r = virConnectClose((virConnectPtr) p);
37
- _E(r < 0, create_error(rb_eSystemCallError, "virConnectClose",
38
- "Connection close failed", p));
44
+ _E(r < 0, create_error(rb_eSystemCallError, "virConnectClose", p));
39
45
  }
40
46
 
41
47
  VALUE connect_new(virConnectPtr p) {
@@ -70,7 +76,8 @@ virConnectPtr conn(VALUE s) {
70
76
  * call-seq:
71
77
  * conn.close -> nil
72
78
  *
73
- * Close the connection
79
+ * Call +virConnectClose+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectClose]
80
+ * to close the connection.
74
81
  */
75
82
  static VALUE libvirt_conn_close(VALUE s) {
76
83
  virConnectPtr conn;
@@ -86,7 +93,7 @@ static VALUE libvirt_conn_close(VALUE s) {
86
93
  * call-seq:
87
94
  * conn.closed? -> [True|False]
88
95
  *
89
- * Return +true+ if the connection is closed, +false+ if it is open
96
+ * Return +true+ if the connection is closed, +false+ if it is open.
90
97
  */
91
98
  static VALUE libvirt_conn_closed_p(VALUE s) {
92
99
  virConnectPtr conn;
@@ -100,6 +107,7 @@ static VALUE libvirt_conn_closed_p(VALUE s) {
100
107
  * conn.type -> string
101
108
  *
102
109
  * Call +virConnectGetType+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetType]
110
+ * to retrieve the type of hypervisor for this connection.
103
111
  */
104
112
  static VALUE libvirt_conn_type(VALUE s) {
105
113
  gen_call_string(virConnectGetType, conn(s), 0, connect_get(s));
@@ -110,6 +118,7 @@ static VALUE libvirt_conn_type(VALUE s) {
110
118
  * conn.version -> fixnum
111
119
  *
112
120
  * Call +virConnectGetVersion+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetVersion]
121
+ * to retrieve the version of the hypervisor for this connection.
113
122
  */
114
123
  static VALUE libvirt_conn_version(VALUE s) {
115
124
  int r;
@@ -117,7 +126,7 @@ static VALUE libvirt_conn_version(VALUE s) {
117
126
  virConnectPtr conn = connect_get(s);
118
127
 
119
128
  r = virConnectGetVersion(conn, &v);
120
- _E(r < 0, create_error(e_RetrieveError, "virConnectGetVersion", "", conn));
129
+ _E(r < 0, create_error(e_RetrieveError, "virConnectGetVersion", conn));
121
130
 
122
131
  return ULONG2NUM(v);
123
132
  }
@@ -128,6 +137,7 @@ static VALUE libvirt_conn_version(VALUE s) {
128
137
  * conn.libversion -> fixnum
129
138
  *
130
139
  * Call +virConnectGetLibVersion+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetLibVersion]
140
+ * to retrieve the version of the libvirt library for this connection.
131
141
  */
132
142
  static VALUE libvirt_conn_libversion(VALUE s) {
133
143
  int r;
@@ -135,8 +145,7 @@ static VALUE libvirt_conn_libversion(VALUE s) {
135
145
  virConnectPtr conn = connect_get(s);
136
146
 
137
147
  r = virConnectGetLibVersion(conn, &v);
138
- _E(r < 0, create_error(e_RetrieveError, "virConnectGetLibVersion",
139
- "", conn));
148
+ _E(r < 0, create_error(e_RetrieveError, "virConnectGetLibVersion", conn));
140
149
 
141
150
  return ULONG2NUM(v);
142
151
  }
@@ -147,6 +156,7 @@ static VALUE libvirt_conn_libversion(VALUE s) {
147
156
  * conn.hostname -> string
148
157
  *
149
158
  * Call +virConnectGetHostname+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetHostname]
159
+ * to retrieve the hostname of the hypervisor for this connection.
150
160
  */
151
161
  static VALUE libvirt_conn_hostname(VALUE s) {
152
162
  gen_call_string(virConnectGetHostname, conn(s), 1, connect_get(s));
@@ -157,6 +167,7 @@ static VALUE libvirt_conn_hostname(VALUE s) {
157
167
  * conn.uri -> string
158
168
  *
159
169
  * Call +virConnectGetURI+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetURI]
170
+ * to retrieve the canonical URI for this connection.
160
171
  */
161
172
  static VALUE libvirt_conn_uri(VALUE s) {
162
173
  gen_call_string(virConnectGetURI, conn(s), 1, connect_get(s));
@@ -164,22 +175,19 @@ static VALUE libvirt_conn_uri(VALUE s) {
164
175
 
165
176
  /*
166
177
  * call-seq:
167
- * conn.max_vcpus -> fixnum
178
+ * conn.max_vcpus(type=nil) -> fixnum
168
179
  *
169
180
  * Call +virConnectGetMaxVcpus+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetMaxVcpus]
181
+ * to retrieve the maximum number of virtual cpus supported by the hypervisor
182
+ * for this connection.
170
183
  */
171
184
  static VALUE libvirt_conn_max_vcpus(int argc, VALUE *argv, VALUE s) {
172
- int result;
173
- virConnectPtr conn = connect_get(s);
174
185
  VALUE type;
175
186
 
176
187
  rb_scan_args(argc, argv, "01", &type);
177
188
 
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);
189
+ gen_call_int(virConnectGetMaxVcpus, conn(s), connect_get(s),
190
+ get_string_or_nil(type));
183
191
  }
184
192
 
185
193
  /*
@@ -187,6 +195,7 @@ static VALUE libvirt_conn_max_vcpus(int argc, VALUE *argv, VALUE s) {
187
195
  * conn.node_get_info -> Libvirt::Connect::Nodeinfo
188
196
  *
189
197
  * Call +virNodeGetInfo+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeGetInfo]
198
+ * to retrieve information about the node for this connection.
190
199
  */
191
200
  static VALUE libvirt_conn_node_get_info(VALUE s) {
192
201
  int r;
@@ -195,7 +204,7 @@ static VALUE libvirt_conn_node_get_info(VALUE s) {
195
204
  VALUE result;
196
205
 
197
206
  r = virNodeGetInfo(conn, &nodeinfo);
198
- _E(r < 0, create_error(e_RetrieveError, "virNodeGetInfo", "", conn));
207
+ _E(r < 0, create_error(e_RetrieveError, "virNodeGetInfo", conn));
199
208
 
200
209
  result = rb_class_new_instance(0, NULL, c_node_info);
201
210
  rb_iv_set(result, "@model", rb_str_new2(nodeinfo.model));
@@ -215,63 +224,78 @@ static VALUE libvirt_conn_node_get_info(VALUE s) {
215
224
  * conn.node_free_memory -> fixnum
216
225
  *
217
226
  * Call +virNodeGetFreeMemory+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeGetFreeMemory]
227
+ * to retrieve the amount of free memory available on the host for this
228
+ * connection.
218
229
  */
219
230
  static VALUE libvirt_conn_node_free_memory(VALUE s) {
220
231
  virConnectPtr conn = connect_get(s);
221
232
  unsigned long long freemem;
222
233
 
223
234
  freemem = virNodeGetFreeMemory(conn);
235
+
224
236
  _E(freemem == 0, create_error(e_RetrieveError, "virNodeGetFreeMemory",
225
- "", conn));
237
+ conn));
226
238
 
227
239
  return ULL2NUM(freemem);
228
240
  }
229
241
 
230
242
  /*
231
243
  * call-seq:
232
- * conn.node_cells_free_memory -> list
244
+ * conn.node_cells_free_memory(startCell=0, maxCells=#nodeCells) -> list
233
245
  *
234
246
  * Call +virNodeGetCellsFreeMemory+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeGetCellsFreeMemory]
247
+ * to retrieve the amount of free memory in each NUMA cell on the host for
248
+ * this connection.
235
249
  */
236
250
  static VALUE libvirt_conn_node_cells_free_memory(int argc, VALUE *argv, VALUE s) {
237
251
  int r;
238
252
  virConnectPtr conn = connect_get(s);
239
253
  VALUE cells;
240
- VALUE startCell, maxCells;
254
+ VALUE start, max;
241
255
  unsigned long long *freeMems;
242
256
  virNodeInfo nodeinfo;
243
257
  int i;
258
+ unsigned int startCell, maxCells;
259
+
260
+ rb_scan_args(argc, argv, "02", &start, &max);
244
261
 
245
- rb_scan_args(argc, argv, "02", &startCell, &maxCells);
262
+ if (NIL_P(start))
263
+ startCell = 0;
264
+ else
265
+ startCell = NUM2UINT(start);
246
266
 
247
- if (NIL_P(startCell))
248
- startCell = INT2FIX(0);
249
- if (NIL_P(maxCells)) {
267
+ if (NIL_P(max)) {
250
268
  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);
269
+ _E(r < 0, create_error(e_RetrieveError, "virNodeGetInfo", conn));
270
+ maxCells = nodeinfo.nodes;
254
271
  }
255
272
  else
256
- freeMems = ALLOC_N(unsigned long long, NUM2UINT(maxCells));
273
+ maxCells = NUM2UINT(max);
274
+
275
+ freeMems = ALLOC_N(unsigned long long, maxCells);
257
276
 
258
- r = virNodeGetCellsFreeMemory(conn, freeMems, NUM2INT(startCell),
259
- NUM2INT(maxCells));
260
- _E(r < 0, create_error(e_RetrieveError, "virNodeGetCellsFreeMemory", "", conn));
277
+ r = virNodeGetCellsFreeMemory(conn, freeMems, startCell, maxCells);
278
+ if (r < 0) {
279
+ xfree(freeMems);
280
+ rb_exc_raise(create_error(e_RetrieveError, "virNodeGetCellsFreeMemory",
281
+ conn));
282
+ }
261
283
 
262
284
  cells = rb_ary_new2(r);
263
285
  for (i = 0; i < r; i++)
264
286
  rb_ary_push(cells, ULL2NUM(freeMems[i]));
265
- free(freeMems);
287
+ xfree(freeMems);
266
288
 
267
289
  return cells;
268
290
  }
269
291
 
292
+ #if HAVE_VIRNODEGETSECURITYMODEL
270
293
  /*
271
294
  * call-seq:
272
295
  * conn.node_get_security_model -> Libvirt::Connect::NodeSecurityModel
273
296
  *
274
- * Call +virNodeGetSecurityInfo+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeGetSecurityInfo]
297
+ * Call +virNodeGetSecurityModel+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeGetSecurityModel]
298
+ * to retrieve the security model in use on the host for this connection.
275
299
  */
276
300
  static VALUE libvirt_conn_node_get_security_model(VALUE s) {
277
301
  virSecurityModel secmodel;
@@ -280,7 +304,7 @@ static VALUE libvirt_conn_node_get_security_model(VALUE s) {
280
304
  VALUE result;
281
305
 
282
306
  r = virNodeGetSecurityModel(conn, &secmodel);
283
- _E(r < 0, create_error(e_RetrieveError, "virNodeGetSecurityModel", "", conn));
307
+ _E(r < 0, create_error(e_RetrieveError, "virNodeGetSecurityModel", conn));
284
308
 
285
309
  result = rb_class_new_instance(0, NULL, c_node_security_model);
286
310
  rb_iv_set(result, "@model", rb_str_new2(secmodel.model));
@@ -288,13 +312,15 @@ static VALUE libvirt_conn_node_get_security_model(VALUE s) {
288
312
 
289
313
  return result;
290
314
  }
315
+ #endif
291
316
 
292
317
  #if HAVE_VIRCONNECTISENCRYPTED
293
318
  /*
294
319
  * call-seq:
295
- * conn.encrypted?
320
+ * conn.encrypted? -> [True|False]
296
321
  *
297
- * Return +true+ if the connection is encrypted, +false+ if it is not
322
+ * Call +virConnectIsEncrypted+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectIsEncrypted]
323
+ * to determine if the connection is encrypted.
298
324
  */
299
325
  static VALUE libvirt_conn_encrypted_p(VALUE s) {
300
326
  gen_call_truefalse(virConnectIsEncrypted, conn(s), connect_get(s));
@@ -304,9 +330,10 @@ static VALUE libvirt_conn_encrypted_p(VALUE s) {
304
330
  #if HAVE_VIRCONNECTISSECURE
305
331
  /*
306
332
  * call-seq:
307
- * conn.secure?
333
+ * conn.secure? -> [True|False]
308
334
  *
309
- * Return +true+ if the connection is secure, +false+ if it is not
335
+ * Call +virConnectIsSecure+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectIsSecure]
336
+ * to determine if the connection is secure.
310
337
  */
311
338
  static VALUE libvirt_conn_secure_p(VALUE s) {
312
339
  gen_call_truefalse(virConnectIsSecure, conn(s), connect_get(s));
@@ -318,75 +345,1764 @@ static VALUE libvirt_conn_secure_p(VALUE s) {
318
345
  * conn.capabilities -> string
319
346
  *
320
347
  * Call +virConnectGetCapabilities+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectGetCapabilities]
348
+ * to retrieve the capabilities XML for this connection.
321
349
  */
322
350
  static VALUE libvirt_conn_capabilities(VALUE s) {
323
351
  gen_call_string(virConnectGetCapabilities, conn(s), 1, connect_get(s));
324
352
  }
325
353
 
354
+ #if HAVE_VIRCONNECTCOMPARECPU
326
355
  /*
327
- * Class Libvirt::Connect
356
+ * call-seq:
357
+ * conn.compare_cpu(xml, flags=0) -> compareflag
358
+ *
359
+ * Call +virConnectCompareCPU+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectCompareCPU]
360
+ * to compare the host CPU with the XML contained in xml. Returns one of
361
+ * Libvirt::CPU_COMPARE_ERROR, Libvirt::CPU_COMPARE_INCOMPATIBLE,
362
+ * Libvirt::CPU_COMPARE_IDENTICAL, or Libvirt::CPU_COMPARE_SUPERSET.
328
363
  */
329
- void init_connect()
330
- {
331
- c_connect = rb_define_class_under(m_libvirt, "Connect", rb_cObject);
364
+ static VALUE libvirt_conn_compare_cpu(int argc, VALUE *argv, VALUE s) {
365
+ VALUE xml, flags;
332
366
 
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);
367
+ rb_scan_args(argc, argv, "11", &xml, &flags);
368
+ if (NIL_P(flags))
369
+ flags = INT2FIX(0);
345
370
 
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);
371
+ gen_call_int(virConnectCompareCPU, conn(s), connect_get(s),
372
+ StringValueCStr(xml), NUM2UINT(flags));
373
+ }
374
+ #endif
354
375
 
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);
376
+
377
+ #if HAVE_VIRCONNECTBASELINECPU
378
+ /*
379
+ * call-seq:
380
+ * conn.baseline_cpu([xml, xml2, ...], flags=0) -> XML
381
+ *
382
+ * Call +virConnectBaselineCPU+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectBaselineCPU]
383
+ * to compare the most feature-rich CPU which is compatible with all
384
+ * given host CPUs.
385
+ */
386
+ static VALUE libvirt_conn_baseline_cpu(int argc, VALUE *argv, VALUE s) {
387
+ VALUE xmlcpus, flags_val;
388
+ virConnectPtr conn = connect_get(s);
389
+ char *r;
390
+ VALUE retval;
391
+ unsigned int ncpus, flags;
392
+ VALUE entry;
393
+ const char **xmllist;
394
+ int i;
395
+ int exception = 0;
396
+ struct rb_ary_entry_arg arg;
397
+
398
+ rb_scan_args(argc, argv, "11", &xmlcpus, &flags_val);
399
+ if (NIL_P(flags_val))
400
+ flags = 0;
401
+ else
402
+ flags = NUM2UINT(flags_val);
403
+
404
+ Check_Type(xmlcpus, T_ARRAY);
405
+
406
+ if (RARRAY_LEN(xmlcpus) < 1)
407
+ rb_raise(rb_eArgError, "wrong number of cpu arguments (%d for 1 or more)",
408
+ RARRAY_LEN(xmlcpus));
409
+
410
+ ncpus = RARRAY_LEN(xmlcpus);
411
+ xmllist = ALLOC_N(const char *, ncpus);
412
+
413
+ for (i = 0; i < ncpus; i++) {
414
+ arg.arr = xmlcpus;
415
+ arg.elem = i;
416
+ entry = rb_protect(rb_ary_entry_wrap, (VALUE)&arg, &exception);
417
+ if (exception) {
418
+ xfree(xmllist);
419
+ rb_jump_tag(exception);
420
+ }
421
+
422
+ xmllist[i] = (char *)rb_protect(rb_string_value_cstr_wrap,
423
+ (VALUE)&entry, &exception);
424
+ if (exception) {
425
+ xfree(xmllist);
426
+ rb_jump_tag(exception);
427
+ }
428
+ }
429
+
430
+ r = virConnectBaselineCPU(conn, xmllist, ncpus, flags);
431
+ xfree(xmllist);
432
+ _E(r == NULL, create_error(e_RetrieveError, "virConnectBaselineCPU", conn));
433
+
434
+ retval = rb_protect(rb_str_new2_wrap, (VALUE)&r, &exception);
435
+ if (exception) {
436
+ free(r);
437
+ rb_jump_tag(exception);
438
+ }
439
+
440
+ free(r);
441
+
442
+ return retval;
443
+ }
361
444
  #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);
445
+
446
+ #if HAVE_VIRCONNECTDOMAINEVENTREGISTERANY || HAVE_VIRCONNECTDOMAINEVENTREGISTER
447
+ static int domain_event_lifecycle_callback(virConnectPtr conn,
448
+ virDomainPtr dom, int event,
449
+ int detail, void *opaque) {
450
+ VALUE passthrough = (VALUE)opaque;
451
+ VALUE cb;
452
+ VALUE cb_opaque;
453
+ VALUE newc;
454
+
455
+ if (TYPE(passthrough) != T_ARRAY)
456
+ rb_raise(rb_eTypeError,
457
+ "wrong domain event lifecycle callback argument type (expected Array)");
458
+
459
+ cb = rb_ary_entry(passthrough, 0);
460
+ cb_opaque = rb_ary_entry(passthrough, 1);
461
+
462
+ newc = connect_new(conn);
463
+ if (strcmp(rb_obj_classname(cb), "Symbol") == 0)
464
+ rb_funcall(rb_class_of(cb), rb_to_id(cb), 5, newc,
465
+ domain_new(dom, newc), INT2FIX(event), INT2FIX(detail),
466
+ cb_opaque);
467
+ else if (strcmp(rb_obj_classname(cb), "Proc") == 0)
468
+ rb_funcall(cb, rb_intern("call"), 5, newc, domain_new(dom, newc),
469
+ INT2FIX(event), INT2FIX(detail), cb_opaque);
470
+ else
471
+ rb_raise(rb_eTypeError,
472
+ "wrong domain event lifecycle callback (expected Symbol or Proc)");
473
+
474
+ return 0;
475
+ }
374
476
  #endif
375
- #if HAVE_VIRCONNECTISSECURE
376
- rb_define_method(c_connect, "secure?", libvirt_conn_secure_p, 0);
477
+
478
+ #if HAVE_VIRCONNECTDOMAINEVENTREGISTERANY
479
+ static int domain_event_reboot_callback(virConnectPtr conn, virDomainPtr dom,
480
+ void *opaque) {
481
+ VALUE passthrough = (VALUE)opaque;
482
+ VALUE cb;
483
+ VALUE cb_opaque;
484
+ VALUE newc;
485
+
486
+ if (TYPE(passthrough) != T_ARRAY)
487
+ rb_raise(rb_eTypeError,
488
+ "wrong domain event reboot callback argument type (expected Array)");
489
+
490
+ cb = rb_ary_entry(passthrough, 0);
491
+ cb_opaque = rb_ary_entry(passthrough, 1);
492
+
493
+ newc = connect_new(conn);
494
+ if (strcmp(rb_obj_classname(cb), "Symbol") == 0)
495
+ rb_funcall(rb_class_of(cb), rb_to_id(cb), 3, newc,
496
+ domain_new(dom, newc), cb_opaque);
497
+ else if (strcmp(rb_obj_classname(cb), "Proc") == 0)
498
+ rb_funcall(cb, rb_intern("call"), 3, newc, domain_new(dom, newc),
499
+ cb_opaque);
500
+ else
501
+ rb_raise(rb_eTypeError,
502
+ "wrong domain event reboot callback (expected Symbol or Proc)");
503
+
504
+ return 0;
505
+ }
506
+
507
+ static int domain_event_rtc_callback(virConnectPtr conn, virDomainPtr dom,
508
+ long long utc_offset, void *opaque) {
509
+ VALUE passthrough = (VALUE)opaque;
510
+ VALUE cb;
511
+ VALUE cb_opaque;
512
+ VALUE newc;
513
+
514
+ if (TYPE(passthrough) != T_ARRAY)
515
+ rb_raise(rb_eTypeError,
516
+ "wrong domain event rtc callback argument type (expected Array)");
517
+
518
+ cb = rb_ary_entry(passthrough, 0);
519
+ cb_opaque = rb_ary_entry(passthrough, 1);
520
+
521
+ newc = connect_new(conn);
522
+ if (strcmp(rb_obj_classname(cb), "Symbol") == 0)
523
+ rb_funcall(rb_class_of(cb), rb_to_id(cb), 4, newc,
524
+ domain_new(dom, newc), LL2NUM(utc_offset), cb_opaque);
525
+ else if (strcmp(rb_obj_classname(cb), "Proc") == 0)
526
+ rb_funcall(cb, rb_intern("call"), 4, newc, domain_new(dom, newc),
527
+ LL2NUM(utc_offset), cb_opaque);
528
+ else
529
+ rb_raise(rb_eTypeError,
530
+ "wrong domain event rtc callback (expected Symbol or Proc)");
531
+
532
+ return 0;
533
+ }
534
+
535
+ static int domain_event_watchdog_callback(virConnectPtr conn, virDomainPtr dom,
536
+ int action, void *opaque) {
537
+ VALUE passthrough = (VALUE)opaque;
538
+ VALUE cb;
539
+ VALUE cb_opaque;
540
+ VALUE newc;
541
+
542
+ if (TYPE(passthrough) != T_ARRAY)
543
+ rb_raise(rb_eTypeError,
544
+ "wrong domain event watchdog callback argument type (expected Array)");
545
+
546
+ cb = rb_ary_entry(passthrough, 0);
547
+ cb_opaque = rb_ary_entry(passthrough, 1);
548
+
549
+ newc = connect_new(conn);
550
+ if (strcmp(rb_obj_classname(cb), "Symbol") == 0)
551
+ rb_funcall(rb_class_of(cb), rb_to_id(cb), 4, newc,
552
+ domain_new(dom, newc), INT2FIX(action), cb_opaque);
553
+ else if (strcmp(rb_obj_classname(cb), "Proc") == 0)
554
+ rb_funcall(cb, rb_intern("call"), 4, newc, domain_new(dom, newc),
555
+ INT2FIX(action), cb_opaque);
556
+ else
557
+ rb_raise(rb_eTypeError,
558
+ "wrong domain event watchdog callback (expected Symbol or Proc)");
559
+
560
+ return 0;
561
+ }
562
+
563
+ static int domain_event_io_error_callback(virConnectPtr conn, virDomainPtr dom,
564
+ const char *src_path,
565
+ const char *dev_alias,
566
+ int action,
567
+ void *opaque) {
568
+ VALUE passthrough = (VALUE)opaque;
569
+ VALUE cb;
570
+ VALUE cb_opaque;
571
+ VALUE newc;
572
+
573
+ if (TYPE(passthrough) != T_ARRAY)
574
+ rb_raise(rb_eTypeError,
575
+ "wrong domain event IO error callback argument type (expected Array)");
576
+
577
+ cb = rb_ary_entry(passthrough, 0);
578
+ cb_opaque = rb_ary_entry(passthrough, 1);
579
+
580
+ newc = connect_new(conn);
581
+ if (strcmp(rb_obj_classname(cb), "Symbol") == 0)
582
+ rb_funcall(rb_class_of(cb), rb_to_id(cb), 6, newc,
583
+ domain_new(dom, newc), rb_str_new2(src_path),
584
+ rb_str_new2(dev_alias), INT2FIX(action), cb_opaque);
585
+ else if (strcmp(rb_obj_classname(cb), "Proc") == 0)
586
+ rb_funcall(cb, rb_intern("call"), 6, newc, domain_new(dom, newc),
587
+ rb_str_new2(src_path), rb_str_new2(dev_alias),
588
+ INT2FIX(action), cb_opaque);
589
+ else
590
+ rb_raise(rb_eTypeError,
591
+ "wrong domain event IO error callback (expected Symbol or Proc)");
592
+
593
+ return 0;
594
+ }
595
+
596
+ static int domain_event_io_error_reason_callback(virConnectPtr conn,
597
+ virDomainPtr dom,
598
+ const char *src_path,
599
+ const char *dev_alias,
600
+ int action,
601
+ const char *reason,
602
+ void *opaque) {
603
+ VALUE passthrough = (VALUE)opaque;
604
+ VALUE cb;
605
+ VALUE cb_opaque;
606
+ VALUE newc;
607
+
608
+ if (TYPE(passthrough) != T_ARRAY)
609
+ rb_raise(rb_eTypeError,
610
+ "wrong domain event IO error reason callback argument type (expected Array)");
611
+
612
+ cb = rb_ary_entry(passthrough, 0);
613
+ cb_opaque = rb_ary_entry(passthrough, 1);
614
+
615
+ newc = connect_new(conn);
616
+ if (strcmp(rb_obj_classname(cb), "Symbol") == 0)
617
+ rb_funcall(rb_class_of(cb), rb_to_id(cb), 7, newc,
618
+ domain_new(dom, newc), rb_str_new2(src_path),
619
+ rb_str_new2(dev_alias), INT2FIX(action),
620
+ rb_str_new2(reason), cb_opaque);
621
+ else if (strcmp(rb_obj_classname(cb), "Proc") == 0)
622
+ rb_funcall(cb, rb_intern("call"), 7, newc, domain_new(dom, newc),
623
+ rb_str_new2(src_path), rb_str_new2(dev_alias),
624
+ INT2FIX(action), rb_str_new2(reason), cb_opaque);
625
+ else
626
+ rb_raise(rb_eTypeError,
627
+ "wrong domain event IO error reason callback (expected Symbol or Proc)");
628
+
629
+ return 0;
630
+ }
631
+
632
+ static int domain_event_graphics_callback(virConnectPtr conn, virDomainPtr dom,
633
+ int phase,
634
+ virDomainEventGraphicsAddressPtr local,
635
+ virDomainEventGraphicsAddressPtr remote,
636
+ const char *authScheme,
637
+ virDomainEventGraphicsSubjectPtr subject,
638
+ void *opaque) {
639
+ VALUE passthrough = (VALUE)opaque;
640
+ VALUE cb;
641
+ VALUE cb_opaque;
642
+ VALUE newc;
643
+ VALUE local_hash;
644
+ VALUE remote_hash;
645
+ VALUE subject_array;
646
+ VALUE pair;
647
+ int i;
648
+
649
+ if (TYPE(passthrough) != T_ARRAY)
650
+ rb_raise(rb_eTypeError,
651
+ "wrong domain event graphics callback argument type (expected Array)");
652
+
653
+ cb = rb_ary_entry(passthrough, 0);
654
+ cb_opaque = rb_ary_entry(passthrough, 1);
655
+
656
+ local_hash = rb_hash_new();
657
+ rb_hash_aset(local_hash, rb_str_new2("family"), INT2FIX(local->family));
658
+ rb_hash_aset(local_hash, rb_str_new2("node"), rb_str_new2(local->node));
659
+ rb_hash_aset(local_hash, rb_str_new2("service"),
660
+ rb_str_new2(local->service));
661
+
662
+ remote_hash = rb_hash_new();
663
+ rb_hash_aset(remote_hash, rb_str_new2("family"), INT2FIX(remote->family));
664
+ rb_hash_aset(remote_hash, rb_str_new2("node"), rb_str_new2(remote->node));
665
+ rb_hash_aset(remote_hash, rb_str_new2("service"),
666
+ rb_str_new2(remote->service));
667
+
668
+ subject_array = rb_ary_new();
669
+ for (i = 0; i < subject->nidentity; i++) {
670
+ pair = rb_ary_new();
671
+ rb_ary_store(pair, 0, rb_str_new2(subject->identities[i].type));
672
+ rb_ary_store(pair, 1, rb_str_new2(subject->identities[i].name));
673
+
674
+ rb_ary_store(subject_array, i, pair);
675
+ }
676
+
677
+ newc = connect_new(conn);
678
+ if (strcmp(rb_obj_classname(cb), "Symbol") == 0)
679
+ rb_funcall(rb_class_of(cb), rb_to_id(cb), 8, newc,
680
+ domain_new(dom, newc), INT2FIX(phase), local_hash,
681
+ remote_hash, rb_str_new2(authScheme), subject_array,
682
+ cb_opaque);
683
+ else if (strcmp(rb_obj_classname(cb), "Proc") == 0)
684
+ rb_funcall(cb, rb_intern("call"), 8, newc, domain_new(dom, newc),
685
+ INT2FIX(phase), local_hash, remote_hash,
686
+ rb_str_new2(authScheme), subject_array, cb_opaque);
687
+ else
688
+ rb_raise(rb_eTypeError,
689
+ "wrong domain event graphics callback (expected Symbol or Proc)");
690
+
691
+ return 0;
692
+ }
693
+
694
+ /*
695
+ * call-seq:
696
+ * conn.domain_event_register_any(eventID, callback, dom=nil, opaque=nil) -> fixnum
697
+ *
698
+ * Call +virConnectDomainEventRegisterAny+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectDomainEventRegisterAny]
699
+ * to register callback for eventID with libvirt. The eventID must be one of
700
+ * the Libvirt::Connect::DOMAIN_EVENT_ID_* constants. The callback can either
701
+ * by a Symbol (that is the name of a method to callback) or a Proc. Note that
702
+ * the callback must accept different numbers of arguments depending on the
703
+ * eventID passed in. The arguments are as follows:
704
+ *
705
+ * - DOMAIN_EVENT_ID_LIFECYCLE: Libvirt::Connect, Libvirt::Domain, event, detail, opaque
706
+ * - DOMAIN_EVENT_ID_REBOOT: Libvirt::Connect, Libvirt::Domain, opaque
707
+ * - DOMAIN_EVENT_ID_RTC_CHANGE: Libvirt::Connect, Libvirt::Domain, utc_offset, opaque
708
+ * - DOMAIN_EVENT_ID_WATCHDOG: Libvirt::Connect, Libvirt::Domain, action, opaque
709
+ * - DOMAIN_EVENT_ID_IO_ERROR: Libvirt::Connect, Libvirt::Domain, src_path, dev_alias, action, opaque
710
+ * - DOMAIN_EVENT_ID_IO_ERROR_REASON: Libvirt::Connect, Libvirt::Domain, src_path, dev_alias, action, reason, opaque
711
+ * - DOMAIN_EVENT_ID_GRAPHICS: Libvirt::Connect, Libvirt::Domain, phase, local, remote, auth_scheme, subject, opaque
712
+
713
+ * If dom is a valid Libvirt::Domain object, then only events from that
714
+ * domain will be seen. The opaque parameter can be any valid ruby type, and
715
+ * will be passed into callback as "opaque". This method returns a
716
+ * libvirt-specific handle, which must be used by the application to
717
+ * deregister the callback later (see domain_event_deregister_any).
718
+ */
719
+ static VALUE libvirt_conn_domain_event_register_any(int argc, VALUE *argv,
720
+ VALUE c) {
721
+ VALUE eventID, cb, dom, opaque;
722
+ virDomainPtr domain;
723
+ virConnectDomainEventGenericCallback internalcb = NULL;
724
+ VALUE passthrough;
725
+
726
+ rb_scan_args(argc, argv, "22", &eventID, &cb, &dom, &opaque);
727
+
728
+ if (!is_symbol_or_proc(cb))
729
+ rb_raise(rb_eTypeError, "wrong argument type (expected Symbol or Proc)");
730
+
731
+ if (NIL_P(dom))
732
+ domain = NULL;
733
+ else
734
+ domain = domain_get(dom);
735
+
736
+ switch(NUM2INT(eventID)) {
737
+ case VIR_DOMAIN_EVENT_ID_LIFECYCLE:
738
+ internalcb = VIR_DOMAIN_EVENT_CALLBACK(domain_event_lifecycle_callback);
739
+ break;
740
+ case VIR_DOMAIN_EVENT_ID_REBOOT:
741
+ internalcb = VIR_DOMAIN_EVENT_CALLBACK(domain_event_reboot_callback);
742
+ break;
743
+ case VIR_DOMAIN_EVENT_ID_RTC_CHANGE:
744
+ internalcb = VIR_DOMAIN_EVENT_CALLBACK(domain_event_rtc_callback);
745
+ break;
746
+ case VIR_DOMAIN_EVENT_ID_WATCHDOG:
747
+ internalcb = VIR_DOMAIN_EVENT_CALLBACK(domain_event_watchdog_callback);
748
+ break;
749
+ case VIR_DOMAIN_EVENT_ID_IO_ERROR:
750
+ internalcb = VIR_DOMAIN_EVENT_CALLBACK(domain_event_io_error_callback);
751
+ break;
752
+ case VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON:
753
+ internalcb = VIR_DOMAIN_EVENT_CALLBACK(domain_event_io_error_reason_callback);
754
+ break;
755
+ case VIR_DOMAIN_EVENT_ID_GRAPHICS:
756
+ internalcb = VIR_DOMAIN_EVENT_CALLBACK(domain_event_graphics_callback);
757
+ break;
758
+ default:
759
+ rb_raise(rb_eArgError, "invalid eventID argument %d",
760
+ NUM2INT(eventID));
761
+ break;
762
+ }
763
+
764
+ passthrough = rb_ary_new();
765
+ rb_ary_store(passthrough, 0, cb);
766
+ rb_ary_store(passthrough, 1, opaque);
767
+
768
+ gen_call_int(virConnectDomainEventRegisterAny, conn(c), connect_get(c),
769
+ domain, NUM2INT(eventID), internalcb, (void *)passthrough,
770
+ NULL);
771
+ }
772
+
773
+ /*
774
+ * call-seq:
775
+ * conn.domain_event_deregister_any(callbackID) -> nil
776
+ *
777
+ * Call +virConnectDomainEventDeregisterAny+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectDomainEventDeregisterAny]
778
+ * to deregister a callback from libvirt. The callbackID must be a
779
+ * libvirt-specific handle returned by domain_event_register_any.
780
+ */
781
+ static VALUE libvirt_conn_domain_event_deregister_any(VALUE c,
782
+ VALUE callbackID) {
783
+ gen_call_void(virConnectDomainEventDeregisterAny, conn(c), connect_get(c),
784
+ NUM2INT(callbackID));
785
+ }
377
786
  #endif
378
- rb_define_method(c_connect, "capabilities", libvirt_conn_capabilities, 0);
379
787
 
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);
788
+ #if HAVE_VIRCONNECTDOMAINEVENTREGISTER
789
+ /*
790
+ * this is a bit of silliness. Because libvirt internals track the address
791
+ * of the function pointer, trying to use domain_event_lifecycle_callback
792
+ * for both register and register_any would mean that we could only register
793
+ * one or the other for lifecycle callbacks. Instead we do a simple wrapper
794
+ * so that the addresses are different
795
+ */
796
+ static int domain_event_callback(virConnectPtr conn,
797
+ virDomainPtr dom, int event,
798
+ int detail, void *opaque) {
799
+ return domain_event_lifecycle_callback(conn, dom, event, detail, opaque);
800
+ }
801
+ /*
802
+ * call-seq:
803
+ * conn.domain_event_register(callback, opaque=nil) -> nil
804
+ *
805
+ * Call +virConnectDomainEventRegister+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectDomainEventRegister]
806
+ * to register callback for domain lifecycle events with libvirt. The
807
+ * callback can either by a Symbol (that is the name of a method to callback)
808
+ * or a Proc. The callback must accept 5 parameters: Libvirt::Connect,
809
+ * Libvirt::Domain, event, detail, opaque. The opaque parameter to
810
+ * domain_event_register can be any valid ruby type, and will be passed into
811
+ * callback as "opaque". This method is deprecated in favor of
812
+ * domain_event_register_any.
813
+ */
814
+ static VALUE libvirt_conn_domain_event_register(int argc, VALUE *argv,
815
+ VALUE c) {
816
+ VALUE cb, opaque;
817
+ VALUE passthrough;
818
+
819
+ rb_scan_args(argc, argv, "11", &cb, &opaque);
820
+
821
+ if (!is_symbol_or_proc(cb))
822
+ rb_raise(rb_eTypeError, "wrong argument type (expected Symbol or Proc)");
823
+
824
+ passthrough = rb_ary_new();
825
+ rb_ary_store(passthrough, 0, cb);
826
+ rb_ary_store(passthrough, 1, opaque);
827
+
828
+ gen_call_void(virConnectDomainEventRegister, conn(c), connect_get(c),
829
+ domain_event_callback, (void *)passthrough, NULL);
830
+ }
831
+
832
+ /*
833
+ * call-seq:
834
+ * conn.domain_event_deregister(callback) -> nil
835
+ *
836
+ * Call +virConnectDomainEventDeregister+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectDomainEventDeregister]
837
+ * to deregister the event callback from libvirt. This method is deprecated
838
+ * in favor of domain_event_deregister_any (though they cannot be mixed; if
839
+ * the callback was registered with domain_event_register, it must be
840
+ * deregistered with domain_event_deregister).
841
+ */
842
+ static VALUE libvirt_conn_domain_event_deregister(VALUE c) {
843
+ gen_call_void(virConnectDomainEventDeregister, conn(c), connect_get(c),
844
+ domain_event_callback);
845
+ }
846
+ #endif
847
+
848
+ /*
849
+ * call-seq:
850
+ * conn.num_of_domains -> fixnum
851
+ *
852
+ * Call +virConnectNumOfDomains+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectNumOfDomains]
853
+ * to retrieve the number of active domains on this connection.
854
+ */
855
+ static VALUE libvirt_conn_num_of_domains(VALUE s) {
856
+ gen_conn_num_of(s, Domains);
857
+ }
858
+
859
+ /*
860
+ * call-seq:
861
+ * conn.list_domains -> list
862
+ *
863
+ * Call +virConnectListDomains+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectListDomains]
864
+ * to retrieve a list of active domain IDs on this connection.
865
+ */
866
+ static VALUE libvirt_conn_list_domains(VALUE s) {
867
+ int i, r, num, *ids;
868
+ virConnectPtr conn = connect_get(s);
869
+ VALUE result;
870
+ int exception = 0;
871
+ struct rb_ary_push_arg args;
872
+
873
+ num = virConnectNumOfDomains(conn);
874
+ _E(num < 0, create_error(e_RetrieveError, "virConnectNumOfDomains", conn));
875
+ if (num == 0) {
876
+ result = rb_ary_new2(num);
877
+ return result;
878
+ }
879
+
880
+ ids = ALLOC_N(int, num);
881
+ r = virConnectListDomains(conn, ids, num);
882
+ if (r < 0) {
883
+ xfree(ids);
884
+ rb_exc_raise(create_error(e_RetrieveError, "virConnectListDomains",
885
+ conn));
886
+ }
887
+
888
+ result = rb_protect(rb_ary_new2_wrap, (VALUE)&num, &exception);
889
+ if (exception) {
890
+ xfree(ids);
891
+ rb_jump_tag(exception);
892
+ }
893
+
894
+ for (i = 0; i < num; i++) {
895
+ args.arr = result;
896
+ args. value = INT2NUM(ids[i]);
897
+ rb_protect(rb_ary_push_wrap, (VALUE)&args, &exception);
898
+ if (exception) {
899
+ xfree(ids);
900
+ rb_jump_tag(exception);
901
+ }
902
+ }
903
+ xfree(ids);
904
+ return result;
905
+ }
906
+
907
+ /*
908
+ * call-seq:
909
+ * conn.num_of_defined_domains -> fixnum
910
+ *
911
+ * Call +virConnectNumOfDefinedDomains+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectNumOfDefinedDomains]
912
+ * to retrieve the number of inactive domains on this connection.
913
+ */
914
+ static VALUE libvirt_conn_num_of_defined_domains(VALUE s) {
915
+ gen_conn_num_of(s, DefinedDomains);
916
+ }
917
+
918
+ /*
919
+ * call-seq:
920
+ * conn.list_defined_domains -> list
921
+ *
922
+ * Call +virConnectListDefinedDomains+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectListDefinedDomains]
923
+ * to retrieve a list of inactive domain names on this connection.
924
+ */
925
+ static VALUE libvirt_conn_list_defined_domains(VALUE s) {
926
+ gen_conn_list_names(s, DefinedDomains);
927
+ }
928
+
929
+ /*
930
+ * call-seq:
931
+ * conn.create_domain_linux(xml, flags=0) -> Libvirt::Domain
932
+ *
933
+ * Call +virDomainCreateLinux+[http://www.libvirt.org/html/libvirt-libvirt.html#virDomainCreateLinux]
934
+ * to start a transient domain from the given XML. Deprecated; use
935
+ * dom.create_xml instead.
936
+ */
937
+ static VALUE libvirt_conn_create_linux(int argc, VALUE *argv, VALUE c) {
938
+ virDomainPtr dom;
939
+ virConnectPtr conn = connect_get(c);
940
+ VALUE flags, xml;
941
+
942
+ rb_scan_args(argc, argv, "11", &xml, &flags);
943
+
944
+ if (NIL_P(flags))
945
+ flags = INT2FIX(0);
946
+
947
+ dom = virDomainCreateLinux(conn, StringValueCStr(xml), NUM2UINT(flags));
948
+ _E(dom == NULL, create_error(e_Error, "virDomainCreateLinux", conn));
949
+
950
+ return domain_new(dom, c);
951
+ }
952
+
953
+ #if HAVE_VIRDOMAINCREATEXML
954
+ /*
955
+ * call-seq:
956
+ * conn.create_domain_xml(xml, flags=0) -> Libvirt::Domain
957
+ *
958
+ * Call +virDomainCreateXML+[http://www.libvirt.org/html/libvirt-libvirt.html#virDomainCreateXML]
959
+ * to start a transient domain from the given XML.
960
+ */
961
+ static VALUE libvirt_conn_create_xml(int argc, VALUE *argv, VALUE c) {
962
+ virDomainPtr dom;
963
+ virConnectPtr conn = connect_get(c);
964
+ VALUE flags, xml;
965
+
966
+ rb_scan_args(argc, argv, "11", &xml, &flags);
967
+
968
+ if (NIL_P(flags))
969
+ flags = INT2FIX(0);
970
+
971
+ dom = virDomainCreateXML(conn, StringValueCStr(xml), NUM2UINT(flags));
972
+ _E(dom == NULL, create_error(e_Error, "virDomainCreateXML", conn));
973
+
974
+ return domain_new(dom, c);
975
+ }
976
+ #endif
977
+
978
+ /*
979
+ * call-seq:
980
+ * conn.lookup_domain_by_name(name) -> Libvirt::Domain
981
+ *
982
+ * Call +virDomainLookupByName+[http://www.libvirt.org/html/libvirt-libvirt.html#virDomainLookupByName]
983
+ * to retrieve a domain object for name.
984
+ */
985
+ static VALUE libvirt_conn_lookup_domain_by_name(VALUE c, VALUE name) {
986
+ virDomainPtr dom;
987
+ virConnectPtr conn = connect_get(c);
988
+
989
+ dom = virDomainLookupByName(conn, StringValueCStr(name));
990
+ _E(dom == NULL, create_error(e_RetrieveError, "virDomainLookupByName",
991
+ conn));
992
+
993
+ return domain_new(dom, c);
994
+ }
995
+
996
+ /*
997
+ * call-seq:
998
+ * conn.lookup_domain_by_id(id) -> Libvirt::Domain
999
+ *
1000
+ * Call +virDomainLookupByID+[http://www.libvirt.org/html/libvirt-libvirt.html#virDomainLookupByID]
1001
+ * to retrieve a domain object for id.
1002
+ */
1003
+ static VALUE libvirt_conn_lookup_domain_by_id(VALUE c, VALUE id) {
1004
+ virDomainPtr dom;
1005
+ virConnectPtr conn = connect_get(c);
1006
+
1007
+ dom = virDomainLookupByID(conn, NUM2INT(id));
1008
+ _E(dom == NULL, create_error(e_RetrieveError, "virDomainLookupByID",
1009
+ conn));
1010
+
1011
+ return domain_new(dom, c);
1012
+ }
1013
+
1014
+ /*
1015
+ * call-seq:
1016
+ * conn.lookup_domain_by_uuid(uuid) -> Libvirt::Domain
1017
+ *
1018
+ * Call +virDomainLookupByUUIDString+[http://www.libvirt.org/html/libvirt-libvirt.html#virDomainLookupByUUIDString]
1019
+ * to retrieve a domain object for uuid.
1020
+ */
1021
+ static VALUE libvirt_conn_lookup_domain_by_uuid(VALUE c, VALUE uuid) {
1022
+ virDomainPtr dom;
1023
+ virConnectPtr conn = connect_get(c);
1024
+
1025
+ dom = virDomainLookupByUUIDString(conn, StringValueCStr(uuid));
1026
+ _E(dom == NULL, create_error(e_RetrieveError, "virDomainLookupByUUID",
1027
+ conn));
1028
+
1029
+ return domain_new(dom, c);
1030
+ }
1031
+
1032
+ /*
1033
+ * call-seq:
1034
+ * conn.define_domain_xml(xml) -> Libvirt::Domain
1035
+ *
1036
+ * Call +virDomainDefineXML+[http://www.libvirt.org/html/libvirt-libvirt.html#virDomainDefineXML]
1037
+ * to define a permanent domain on this connection.
1038
+ */
1039
+ static VALUE libvirt_conn_define_domain_xml(VALUE c, VALUE xml) {
1040
+ virDomainPtr dom;
1041
+ virConnectPtr conn = connect_get(c);
1042
+
1043
+ dom = virDomainDefineXML(conn, StringValueCStr(xml));
1044
+ _E(dom == NULL, create_error(e_DefinitionError, "virDomainDefineXML",
1045
+ conn));
1046
+
1047
+ return domain_new(dom, c);
1048
+ }
1049
+
1050
+ #if HAVE_VIRCONNECTDOMAINXMLFROMNATIVE
1051
+ /*
1052
+ * call-seq:
1053
+ * conn.domain_xml_from_native(nativeFormat, xml, flags=0) -> string
1054
+ *
1055
+ * Call +virConnectDomainXMLFromNative+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectDomainXMLFromNative]
1056
+ * to convert a native hypervisor domain representation to libvirt XML.
1057
+ */
1058
+ static VALUE libvirt_conn_domain_xml_from_native(int argc, VALUE *argv, VALUE s) {
1059
+ VALUE nativeFormat, xml, flags;
1060
+ char *ret;
1061
+ VALUE result;
1062
+
1063
+ rb_scan_args(argc, argv, "21", &nativeFormat, &xml, &flags);
1064
+
1065
+ if (NIL_P(flags))
1066
+ flags = INT2FIX(0);
1067
+
1068
+ ret = virConnectDomainXMLFromNative(conn(s), StringValueCStr(nativeFormat),
1069
+ StringValueCStr(xml), NUM2UINT(flags));
1070
+ _E(ret == NULL, create_error(e_Error, "virConnectDomainXMLFromNative",
1071
+ conn(s)));
1072
+
1073
+ result = rb_str_new2(ret);
1074
+
1075
+ free(ret);
1076
+
1077
+ return result;
1078
+ }
1079
+ #endif
1080
+
1081
+ #if HAVE_VIRCONNECTDOMAINXMLTONATIVE
1082
+ /*
1083
+ * call-seq:
1084
+ * conn.domain_xml_to_native(nativeFormat, xml, flags=0) -> string
1085
+ *
1086
+ * Call +virConnectDomainXMLToNative+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectDomainXMLToNative]
1087
+ * to convert libvirt XML to a native domain hypervisor representation.
1088
+ */
1089
+ static VALUE libvirt_conn_domain_xml_to_native(int argc, VALUE *argv, VALUE s) {
1090
+ VALUE nativeFormat, xml, flags;
1091
+ char *ret;
1092
+ VALUE result;
1093
+
1094
+ rb_scan_args(argc, argv, "21", &nativeFormat, &xml, &flags);
1095
+
1096
+ if (NIL_P(flags))
1097
+ flags = INT2FIX(0);
1098
+
1099
+ ret = virConnectDomainXMLToNative(conn(s), StringValueCStr(nativeFormat),
1100
+ StringValueCStr(xml), NUM2UINT(flags));
1101
+ _E(ret == NULL, create_error(e_Error, "virConnectDomainXMLToNative",
1102
+ conn(s)));
1103
+
1104
+ result = rb_str_new2(ret);
1105
+
1106
+ free(ret);
1107
+
1108
+ return result;
1109
+ }
1110
+ #endif
1111
+
1112
+ #if HAVE_TYPE_VIRINTERFACEPTR
1113
+ /*
1114
+ * call-seq:
1115
+ * conn.num_of_interfaces -> fixnum
1116
+ *
1117
+ * Call +virConnectNumOfInterfaces+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectNumOfInterfaces]
1118
+ * to retrieve the number of active interfaces on this connection.
1119
+ */
1120
+ static VALUE libvirt_conn_num_of_interfaces(VALUE s) {
1121
+ gen_conn_num_of(s, Interfaces);
1122
+ }
1123
+
1124
+ /*
1125
+ * call-seq:
1126
+ * conn.list_interfaces -> list
1127
+ *
1128
+ * Call +virConnectListInterfaces+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectListInterfaces]
1129
+ * to retrieve a list of active interface names on this connection.
1130
+ */
1131
+ static VALUE libvirt_conn_list_interfaces(VALUE s) {
1132
+ gen_conn_list_names(s, Interfaces);
1133
+ }
1134
+
1135
+ /*
1136
+ * call-seq:
1137
+ * conn.num_of_defined_interfaces -> fixnum
1138
+ *
1139
+ * Call +virConnectNumOfDefinedInterfaces+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectNumOfDefinedInterfaces]
1140
+ * to retrieve the number of inactive interfaces on this connection.
1141
+ */
1142
+ static VALUE libvirt_conn_num_of_defined_interfaces(VALUE s) {
1143
+ gen_conn_num_of(s, DefinedInterfaces);
1144
+ }
1145
+
1146
+ /*
1147
+ * call-seq:
1148
+ * conn.list_defined_interfaces -> list
1149
+ *
1150
+ * Call +virConnectListDefinedInterfaces+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectListDefinedInterfaces]
1151
+ * to retrieve a list of inactive interface names on this connection.
1152
+ */
1153
+ static VALUE libvirt_conn_list_defined_interfaces(VALUE s) {
1154
+ gen_conn_list_names(s, DefinedInterfaces);
1155
+ }
1156
+
1157
+ extern VALUE interface_new(virInterfacePtr i, VALUE conn);
1158
+ /*
1159
+ * call-seq:
1160
+ * conn.lookup_interface_by_name(name) -> Libvirt::Interface
1161
+ *
1162
+ * Call +virInterfaceLookupByName+[http://www.libvirt.org/html/libvirt-libvirt.html#virInterfaceLookupByName]
1163
+ * to retrieve an interface object by name.
1164
+ */
1165
+ static VALUE libvirt_conn_lookup_interface_by_name(VALUE c, VALUE name) {
1166
+ virInterfacePtr iface;
1167
+ virConnectPtr conn = connect_get(c);
1168
+
1169
+ iface = virInterfaceLookupByName(conn, StringValueCStr(name));
1170
+ _E(iface == NULL, create_error(e_RetrieveError, "virInterfaceLookupByName",
1171
+ conn));
1172
+
1173
+ return interface_new(iface, c);
1174
+ }
1175
+
1176
+ /*
1177
+ * call-seq:
1178
+ * conn.lookup_interface_by_mac(mac) -> Libvirt::Interface
1179
+ *
1180
+ * Call +virInterfaceLookupByMACString+[http://www.libvirt.org/html/libvirt-libvirt.html#virInterfaceLookupByMACString]
1181
+ * to retrieve an interface object by MAC address.
1182
+ */
1183
+ static VALUE libvirt_conn_lookup_interface_by_mac(VALUE c, VALUE mac) {
1184
+ virInterfacePtr iface;
1185
+ virConnectPtr conn = connect_get(c);
1186
+
1187
+ iface = virInterfaceLookupByMACString(conn, StringValueCStr(mac));
1188
+ _E(iface == NULL, create_error(e_RetrieveError,
1189
+ "virInterfaceLookupByMACString", conn));
1190
+
1191
+ return interface_new(iface, c);
1192
+ }
1193
+
1194
+ /*
1195
+ * call-seq:
1196
+ * conn.define_interface_xml(xml, flags=0) -> Libvirt::Interface
1197
+ *
1198
+ * Call +virInterfaceDefineXML+[http://www.libvirt.org/html/libvirt-libvirt.html#virInterfaceDefineXML]
1199
+ * to define a new interface from xml.
1200
+ */
1201
+ static VALUE libvirt_conn_define_interface_xml(int argc, VALUE *argv, VALUE c) {
1202
+ virInterfacePtr iface;
1203
+ virConnectPtr conn = connect_get(c);
1204
+ VALUE xml, flags;
1205
+
1206
+ rb_scan_args(argc, argv, "11", &xml, &flags);
1207
+
1208
+ if (NIL_P(flags))
1209
+ flags = INT2FIX(0);
1210
+
1211
+ iface = virInterfaceDefineXML(conn, StringValueCStr(xml), NUM2UINT(flags));
1212
+ _E(iface == NULL, create_error(e_DefinitionError, "virInterfaceDefineXML",
1213
+ conn));
1214
+
1215
+ return interface_new(iface, c);
1216
+ }
1217
+ #endif
1218
+
1219
+ /*
1220
+ * call-seq:
1221
+ * conn.num_of_networks -> fixnum
1222
+ *
1223
+ * Call +virConnectNumOfNetworks+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectNumOfNetworks]
1224
+ * to retrieve the number of active networks on this connection.
1225
+ */
1226
+ static VALUE libvirt_conn_num_of_networks(VALUE s) {
1227
+ gen_conn_num_of(s, Networks);
1228
+ }
1229
+
1230
+ /*
1231
+ * call-seq:
1232
+ * conn.list_networks -> list
1233
+ *
1234
+ * Call +virConnectListNetworks+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectListNetworks]
1235
+ * to retrieve a list of active network names on this connection.
1236
+ */
1237
+ static VALUE libvirt_conn_list_networks(VALUE s) {
1238
+ gen_conn_list_names(s, Networks);
1239
+ }
1240
+
1241
+ /*
1242
+ * call-seq:
1243
+ * conn.num_of_defined_networks -> fixnum
1244
+ *
1245
+ * Call +virConnectNumOfDefinedNetworks+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectNumOfDefinedNetworks]
1246
+ * to retrieve the number of inactive networks on this connection.
1247
+ */
1248
+ static VALUE libvirt_conn_num_of_defined_networks(VALUE s) {
1249
+ gen_conn_num_of(s, DefinedNetworks);
1250
+ }
1251
+
1252
+ /*
1253
+ * call-seq:
1254
+ * conn.list_of_defined_networks -> list
1255
+ *
1256
+ * Call +virConnectListDefinedNetworks+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectListDefinedNetworks]
1257
+ * to retrieve a list of inactive network names on this connection.
1258
+ */
1259
+ static VALUE libvirt_conn_list_defined_networks(VALUE s) {
1260
+ gen_conn_list_names(s, DefinedNetworks);
1261
+ }
1262
+
1263
+ /*
1264
+ * call-seq:
1265
+ * conn.lookup_network_by_name(name) -> Libvirt::Network
1266
+ *
1267
+ * Call +virNetworkLookupByName+[http://www.libvirt.org/html/libvirt-libvirt.html#virNetworkLookupByName]
1268
+ * to retrieve a network object by name.
1269
+ */
1270
+ static VALUE libvirt_conn_lookup_network_by_name(VALUE c, VALUE name) {
1271
+ virNetworkPtr netw;
1272
+ virConnectPtr conn = connect_get(c);
1273
+
1274
+ netw = virNetworkLookupByName(conn, StringValueCStr(name));
1275
+ _E(netw == NULL, create_error(e_RetrieveError, "virNetworkLookupByName",
1276
+ conn));
1277
+
1278
+ return network_new(netw, c);
1279
+ }
1280
+
1281
+ /*
1282
+ * call-seq:
1283
+ * conn.lookup_network_by_uuid(uuid) -> Libvirt::Network
1284
+ *
1285
+ * Call +virNetworkLookupByUUIDString+[http://www.libvirt.org/html/libvirt-libvirt.html#virNetworkLookupByUUIDString]
1286
+ * to retrieve a network object by UUID.
1287
+ */
1288
+ static VALUE libvirt_conn_lookup_network_by_uuid(VALUE c, VALUE uuid) {
1289
+ virNetworkPtr netw;
1290
+ virConnectPtr conn = connect_get(c);
1291
+
1292
+ netw = virNetworkLookupByUUIDString(conn, StringValueCStr(uuid));
1293
+ _E(netw == NULL, create_error(e_RetrieveError, "virNetworkLookupByUUID",
1294
+ conn));
1295
+
1296
+ return network_new(netw, c);
1297
+ }
1298
+
1299
+ /*
1300
+ * call-seq:
1301
+ * conn.create_network_xml(xml) -> Libvirt::Network
1302
+ *
1303
+ * Call +virNetworkCreateXML+[http://www.libvirt.org/html/libvirt-libvirt.html#virNetworkCreateXML]
1304
+ * to start a new transient network from xml.
1305
+ */
1306
+ static VALUE libvirt_conn_create_network_xml(VALUE c, VALUE xml) {
1307
+ virNetworkPtr netw;
1308
+ virConnectPtr conn = connect_get(c);
1309
+
1310
+ netw = virNetworkCreateXML(conn, StringValueCStr(xml));
1311
+ _E(netw == NULL, create_error(e_Error, "virNetworkCreateXML", conn));
1312
+
1313
+ return network_new(netw, c);
1314
+ }
1315
+
1316
+ /*
1317
+ * call-seq:
1318
+ * conn.define_network_xml(xml) -> Libvirt::Network
1319
+ *
1320
+ * Call +virNetworkDefineXML+[http://www.libvirt.org/html/libvirt-libvirt.html#virNetworkDefineXML]
1321
+ * to define a new permanent network from xml.
1322
+ */
1323
+ static VALUE libvirt_conn_define_network_xml(VALUE c, VALUE xml) {
1324
+ virNetworkPtr netw;
1325
+ virConnectPtr conn = connect_get(c);
1326
+
1327
+ netw = virNetworkDefineXML(conn, StringValueCStr(xml));
1328
+ _E(netw == NULL, create_error(e_DefinitionError, "virNetworkDefineXML",
1329
+ conn));
1330
+
1331
+ return network_new(netw, c);
1332
+ }
1333
+
1334
+ #if HAVE_TYPE_VIRNODEDEVICEPTR
1335
+ extern VALUE nodedevice_new(virNodeDevicePtr s, VALUE conn);
1336
+
1337
+ /*
1338
+ * call-seq:
1339
+ * conn.num_of_nodedevices(cap=nil, flags=0) -> fixnum
1340
+ *
1341
+ * Call +virNodeNumOfDevices+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeNumOfDevices]
1342
+ * to retrieve the number of node devices on this connection.
1343
+ */
1344
+ static VALUE libvirt_conn_num_of_nodedevices(int argc, VALUE *argv, VALUE c) {
1345
+ int result;
1346
+ virConnectPtr conn = connect_get(c);
1347
+ VALUE cap, flags;
1348
+
1349
+ rb_scan_args(argc, argv, "02", &cap, &flags);
1350
+
1351
+ if (NIL_P(flags))
1352
+ flags = INT2FIX(0);
1353
+
1354
+ result = virNodeNumOfDevices(conn, get_string_or_nil(cap), NUM2UINT(flags));
1355
+ _E(result < 0, create_error(e_RetrieveError, "virNodeNumOfDevices", conn));
1356
+
1357
+ return INT2NUM(result);
1358
+ }
1359
+
1360
+ /*
1361
+ * call-seq:
1362
+ * conn.list_nodedevices(cap=nil, flags=0) -> list
1363
+ *
1364
+ * Call +virNodeListDevices+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeListDevices]
1365
+ * to retrieve a list of node device names on this connection.
1366
+ */
1367
+ static VALUE libvirt_conn_list_nodedevices(int argc, VALUE *argv, VALUE c) {
1368
+ int r, num;
1369
+ virConnectPtr conn = connect_get(c);
1370
+ VALUE cap, flags_val;
1371
+ char *capstr;
1372
+ char **names;
1373
+ unsigned int flags;
1374
+
1375
+ rb_scan_args(argc, argv, "02", &cap, &flags_val);
1376
+
1377
+ if (NIL_P(flags_val))
1378
+ flags = 0;
1379
+ else
1380
+ flags = NUM2UINT(flags_val);
1381
+
1382
+ capstr = get_string_or_nil(cap);
1383
+
1384
+ num = virNodeNumOfDevices(conn, capstr, 0);
1385
+ _E(num < 0, create_error(e_RetrieveError, "virNodeNumOfDevices", conn));
1386
+ if (num == 0)
1387
+ /* if num is 0, don't call virNodeListDevices function */
1388
+ return rb_ary_new2(num);
1389
+
1390
+ names = ALLOC_N(char *, num);
1391
+ r = virNodeListDevices(conn, capstr, names, num, flags);
1392
+ if (r < 0) {
1393
+ xfree(names);
1394
+ rb_exc_raise(create_error(e_RetrieveError, "virNodeListDevices", conn));
1395
+ }
1396
+
1397
+ return gen_list(num, &names);
1398
+ }
1399
+
1400
+ /*
1401
+ * call-seq:
1402
+ * conn.lookup_nodedevice_by_name(name) -> Libvirt::NodeDevice
1403
+ *
1404
+ * Call +virNodeDeviceLookupByName+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeDeviceLookupByName]
1405
+ * to retrieve a nodedevice object by name.
1406
+ */
1407
+ static VALUE libvirt_conn_lookup_nodedevice_by_name(VALUE c, VALUE name) {
1408
+ virNodeDevicePtr nodedev;
1409
+ virConnectPtr conn = connect_get(c);
1410
+
1411
+ nodedev = virNodeDeviceLookupByName(conn, StringValueCStr(name));
1412
+ _E(nodedev == NULL, create_error(e_RetrieveError,
1413
+ "virNodeDeviceLookupByName", conn));
1414
+
1415
+ return nodedevice_new(nodedev, c);
1416
+
1417
+ }
1418
+
1419
+ #if HAVE_VIRNODEDEVICECREATEXML
1420
+ /*
1421
+ * call-seq:
1422
+ * conn.create_nodedevice_xml(xml, flags=0) -> Libvirt::NodeDevice
1423
+ *
1424
+ * Call +virNodeDeviceCreateXML+[http://www.libvirt.org/html/libvirt-libvirt.html#virNodeDeviceCreateXML]
1425
+ * to create a new node device from xml.
1426
+ */
1427
+ static VALUE libvirt_conn_create_nodedevice_xml(int argc, VALUE *argv, VALUE c) {
1428
+ virNodeDevicePtr nodedev;
1429
+ virConnectPtr conn = connect_get(c);
1430
+ VALUE xml, flags;
1431
+
1432
+ rb_scan_args(argc, argv, "11", &xml, &flags);
1433
+
1434
+ if (NIL_P(flags))
1435
+ flags = INT2FIX(0);
1436
+
1437
+ nodedev = virNodeDeviceCreateXML(conn, StringValueCStr(xml),
1438
+ NUM2UINT(flags));
1439
+ _E(nodedev == NULL, create_error(e_Error, "virNodeDeviceCreateXML", conn));
1440
+
1441
+ return nodedevice_new(nodedev, c);
1442
+ }
1443
+ #endif
1444
+ #endif
1445
+
1446
+ #if HAVE_TYPE_VIRNWFILTERPTR
1447
+ extern VALUE nwfilter_new(virNWFilterPtr nw, VALUE conn);
1448
+
1449
+ /*
1450
+ * call-seq:
1451
+ * conn.num_of_nwfilters -> fixnum
1452
+ *
1453
+ * Call +virConnectNumOfNWFilters+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectNumOfNWFilters]
1454
+ * to retrieve the number of network filters on this connection.
1455
+ */
1456
+ static VALUE libvirt_conn_num_of_nwfilters(VALUE s) {
1457
+ gen_conn_num_of(s, NWFilters);
1458
+ }
1459
+
1460
+ /*
1461
+ * call-seq:
1462
+ * conn.list_nwfilters -> list
1463
+ *
1464
+ * Call +virConnectListNWFilters+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectListNWFilters]
1465
+ * to retrieve a list of network filter names on this connection.
1466
+ */
1467
+ static VALUE libvirt_conn_list_nwfilters(VALUE s) {
1468
+ gen_conn_list_names(s, NWFilters);
1469
+ }
1470
+
1471
+ /*
1472
+ * call-seq:
1473
+ * conn.lookup_nwfilter_by_name(name) -> Libvirt::NWFilter
1474
+ *
1475
+ * Call +virNWFilterLookupByName+[http://www.libvirt.org/html/libvirt-libvirt.html#virNWFilterLookupByName]
1476
+ * to retrieve a network filter object by name.
1477
+ */
1478
+ static VALUE libvirt_conn_lookup_nwfilter_by_name(VALUE c, VALUE name) {
1479
+ virNWFilterPtr nwfilter;
1480
+ virConnectPtr conn = connect_get(c);
1481
+
1482
+ nwfilter = virNWFilterLookupByName(conn, StringValueCStr(name));
1483
+ _E(nwfilter == NULL, create_error(e_RetrieveError,
1484
+ "virNWFilterLookupByName", conn));
1485
+
1486
+ return nwfilter_new(nwfilter, c);
1487
+ }
1488
+
1489
+ /*
1490
+ * call-seq:
1491
+ * conn.lookup_nwfilter_by_uuid(uuid) -> Libvirt::NWFilter
1492
+ *
1493
+ * Call +virNWFilterLookupByUUIDString+[http://www.libvirt.org/html/libvirt-libvirt.html#virNWFilterLookupByUUIDString]
1494
+ * to retrieve a network filter object by UUID.
1495
+ */
1496
+ static VALUE libvirt_conn_lookup_nwfilter_by_uuid(VALUE c, VALUE uuid) {
1497
+ virNWFilterPtr nwfilter;
1498
+ virConnectPtr conn = connect_get(c);
1499
+
1500
+ nwfilter = virNWFilterLookupByUUIDString(conn, StringValueCStr(uuid));
1501
+ _E(nwfilter == NULL, create_error(e_RetrieveError,
1502
+ "virNWFilterLookupByUUIDString", conn));
1503
+
1504
+ return nwfilter_new(nwfilter, c);
1505
+ }
1506
+
1507
+ /*
1508
+ * call-seq:
1509
+ * conn.define_nwfilter_xml(xml) -> Libvirt::NWFilter
1510
+ *
1511
+ * Call +virNWFilterDefineXML+[http://www.libvirt.org/html/libvirt-libvirt.html#virNWFilterDefineXML]
1512
+ * to define a new network filter from xml.
1513
+ */
1514
+ static VALUE libvirt_conn_define_nwfilter_xml(VALUE c, VALUE xml) {
1515
+ virNWFilterPtr nwfilter;
1516
+ virConnectPtr conn = connect_get(c);
1517
+
1518
+ nwfilter = virNWFilterDefineXML(conn, StringValueCStr(xml));
1519
+ _E(nwfilter == NULL, create_error(e_DefinitionError, "virNWFilterDefineXML",
1520
+ conn));
1521
+
1522
+ return nwfilter_new(nwfilter, c);
1523
+ }
1524
+ #endif
1525
+
1526
+ #if HAVE_TYPE_VIRSECRETPTR
1527
+ extern VALUE secret_new(virSecretPtr s, VALUE conn);
1528
+
1529
+ /*
1530
+ * call-seq:
1531
+ * conn.num_of_secrets -> fixnum
1532
+ *
1533
+ * Call +virConnectNumOfSecrets+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectNumOfSecrets]
1534
+ * to retrieve the number of secrets on this connection.
1535
+ */
1536
+ static VALUE libvirt_conn_num_of_secrets(VALUE s) {
1537
+ gen_conn_num_of(s, Secrets);
1538
+ }
1539
+
1540
+ /*
1541
+ * call-seq:
1542
+ * conn.list_secrets -> list
1543
+ *
1544
+ * Call +virConnectListSecrets+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectListSecrets]
1545
+ * to retrieve a list of secret UUIDs on this connection.
1546
+ */
1547
+ static VALUE libvirt_conn_list_secrets(VALUE s) {
1548
+ gen_conn_list_names(s, Secrets);
1549
+ }
1550
+
1551
+ /*
1552
+ * call-seq:
1553
+ * conn.lookup_secret_by_uuid(uuid) -> Libvirt::Secret
1554
+ *
1555
+ * Call +virSecretLookupByUUID+[http://www.libvirt.org/html/libvirt-libvirt.html#virSecretLookupByUUID]
1556
+ * to retrieve a network object from uuid.
1557
+ */
1558
+ static VALUE libvirt_conn_lookup_secret_by_uuid(VALUE c, VALUE uuid) {
1559
+ virSecretPtr secret;
1560
+ virConnectPtr conn = connect_get(c);
1561
+
1562
+ secret = virSecretLookupByUUIDString(conn, StringValueCStr(uuid));
1563
+ _E(secret == NULL, create_error(e_RetrieveError, "virSecretLookupByUUID",
1564
+ conn));
1565
+
1566
+ return secret_new(secret, c);
1567
+ }
1568
+
1569
+ /*
1570
+ * call-seq:
1571
+ * conn.lookup_secret_by_usage(usagetype, usageID) -> Libvirt::Secret
1572
+ *
1573
+ * Call +virSecretLookupByUsage+[http://www.libvirt.org/html/libvirt-libvirt.html#virSecretLookupByUsage]
1574
+ * to retrieve a secret by usagetype.
1575
+ */
1576
+ static VALUE libvirt_conn_lookup_secret_by_usage(VALUE c, VALUE usagetype, VALUE usageID) {
1577
+ virSecretPtr secret;
1578
+ virConnectPtr conn = connect_get(c);
1579
+
1580
+ secret = virSecretLookupByUsage(conn, NUM2UINT(usagetype),
1581
+ StringValueCStr(usageID));
1582
+ _E(secret == NULL, create_error(e_RetrieveError, "virSecretLookupByUsage",
1583
+ conn));
1584
+
1585
+ return secret_new(secret, c);
1586
+ }
1587
+
1588
+ /*
1589
+ * call-seq:
1590
+ * conn.define_secret_xml(xml, flags=0) -> Libvirt::Secret
1591
+ *
1592
+ * Call +virSecretDefineXML+[http://www.libvirt.org/html/libvirt-libvirt.html#virSecretDefineXML]
1593
+ * to define a new secret from xml.
1594
+ */
1595
+ static VALUE libvirt_conn_define_secret_xml(int argc, VALUE *argv, VALUE c) {
1596
+ virSecretPtr secret;
1597
+ virConnectPtr conn = connect_get(c);
1598
+ VALUE xml, flags;
1599
+
1600
+ rb_scan_args(argc, argv, "11", &xml, &flags);
1601
+
1602
+ if (NIL_P(flags))
1603
+ flags = INT2FIX(0);
1604
+
1605
+ secret = virSecretDefineXML(conn, StringValueCStr(xml), NUM2UINT(flags));
1606
+ _E(secret == NULL, create_error(e_DefinitionError, "virSecretDefineXML",
1607
+ conn));
1608
+
1609
+ return secret_new(secret, c);
1610
+ }
1611
+ #endif
1612
+
1613
+ #if HAVE_TYPE_VIRSTORAGEPOOLPTR
1614
+
1615
+ VALUE pool_new(virStoragePoolPtr n, VALUE conn);
1616
+
1617
+ /*
1618
+ * call-seq:
1619
+ * conn.list_storage_pools -> list
1620
+ *
1621
+ * Call +virConnectListStoragePools+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectListStoragePools]
1622
+ * to retrieve a list of active storage pool names on this connection.
1623
+ */
1624
+ static VALUE libvirt_conn_list_storage_pools(VALUE s) {
1625
+ gen_conn_list_names(s, StoragePools);
1626
+ }
1627
+
1628
+ /*
1629
+ * call-seq:
1630
+ * conn.num_of_storage_pools -> fixnum
1631
+ *
1632
+ * Call +virConnectNumOfStoragePools+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectNumOfStoragePools]
1633
+ * to retrieve the number of active storage pools on this connection.
1634
+ */
1635
+ static VALUE libvirt_conn_num_of_storage_pools(VALUE s) {
1636
+ gen_conn_num_of(s, StoragePools);
1637
+ }
1638
+
1639
+ /*
1640
+ * call-seq:
1641
+ * conn.list_defined_storage_pools -> list
1642
+ *
1643
+ * Call +virConnectListDefinedStoragePools+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectListDefinedStoragePools]
1644
+ * to retrieve a list of inactive storage pool names on this connection.
1645
+ */
1646
+ static VALUE libvirt_conn_list_defined_storage_pools(VALUE s) {
1647
+ gen_conn_list_names(s, DefinedStoragePools);
1648
+ }
1649
+
1650
+ /*
1651
+ * call-seq:
1652
+ * conn.num_of_defined_storage_pools -> fixnum
1653
+ *
1654
+ * Call +virConnectNumOfDefinedStoragePools+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectNumOfDefinedStoragePools]
1655
+ * to retrieve the number of inactive storage pools on this connection.
1656
+ */
1657
+ static VALUE libvirt_conn_num_of_defined_storage_pools(VALUE s) {
1658
+ gen_conn_num_of(s, DefinedStoragePools);
1659
+ }
1660
+
1661
+ /*
1662
+ * call-seq:
1663
+ * conn.lookup_storage_pool_by_name(name) -> Libvirt::StoragePool
1664
+ *
1665
+ * Call +virStoragePoolLookupByName+[http://www.libvirt.org/html/libvirt-libvirt.html#virStoragePoolLookupByName]
1666
+ * to retrieve a storage pool object by name.
1667
+ */
1668
+ static VALUE libvirt_conn_lookup_pool_by_name(VALUE c, VALUE name) {
1669
+ virStoragePoolPtr pool;
1670
+ virConnectPtr conn = connect_get(c);
1671
+
1672
+ pool = virStoragePoolLookupByName(conn, StringValueCStr(name));
1673
+ _E(pool == NULL, create_error(e_RetrieveError, "virStoragePoolLookupByName",
1674
+ conn));
1675
+
1676
+ return pool_new(pool, c);
1677
+ }
1678
+
1679
+ /*
1680
+ * call-seq:
1681
+ * conn.lookup_storage_pool_by_uuid(uuid) -> Libvirt::StoragePool
1682
+ *
1683
+ * Call +virStoragePoolLookupByUUIDString+[http://www.libvirt.org/html/libvirt-libvirt.html#virStoragePoolLookupByUUIDString]
1684
+ * to retrieve a storage pool object by uuid.
1685
+ */
1686
+ static VALUE libvirt_conn_lookup_pool_by_uuid(VALUE c, VALUE uuid) {
1687
+ virStoragePoolPtr pool;
1688
+ virConnectPtr conn = connect_get(c);
1689
+
1690
+ pool = virStoragePoolLookupByUUIDString(conn, StringValueCStr(uuid));
1691
+ _E(pool == NULL, create_error(e_RetrieveError, "virStoragePoolLookupByUUID",
1692
+ conn));
1693
+
1694
+ return pool_new(pool, c);
1695
+ }
1696
+
1697
+ /*
1698
+ * call-seq:
1699
+ * conn.create_storage_pool_xml(xml, flags=0) -> Libvirt::StoragePool
1700
+ *
1701
+ * Call +virStoragePoolCreateXML+[http://www.libvirt.org/html/libvirt-libvirt.html#virStoragePoolCreateXML]
1702
+ * to start a new transient storage pool from xml.
1703
+ */
1704
+ static VALUE libvirt_conn_create_pool_xml(int argc, VALUE *argv, VALUE c) {
1705
+ virStoragePoolPtr pool;
1706
+ virConnectPtr conn = connect_get(c);
1707
+ VALUE xml, flags;
1708
+
1709
+ rb_scan_args(argc, argv, "11", &xml, &flags);
1710
+
1711
+ if (NIL_P(flags))
1712
+ flags = INT2FIX(0);
1713
+
1714
+ pool = virStoragePoolCreateXML(conn, StringValueCStr(xml), NUM2UINT(flags));
1715
+ _E(pool == NULL, create_error(e_Error, "virStoragePoolCreateXML", conn));
1716
+
1717
+ return pool_new(pool, c);
1718
+ }
1719
+
1720
+ /*
1721
+ * call-seq:
1722
+ * conn.define_storage_pool_xml(xml, flags=0) -> Libvirt::StoragePool
1723
+ *
1724
+ * Call +virStoragePoolDefineXML+[http://www.libvirt.org/html/libvirt-libvirt.html#virStoragePoolDefineXML]
1725
+ * to define a permanent storage pool from xml.
1726
+ */
1727
+ static VALUE libvirt_conn_define_pool_xml(int argc, VALUE *argv, VALUE c) {
1728
+ virStoragePoolPtr pool;
1729
+ virConnectPtr conn = connect_get(c);
1730
+ VALUE xml, flags;
1731
+
1732
+ rb_scan_args(argc, argv, "11", &xml, &flags);
1733
+
1734
+ if (NIL_P(flags))
1735
+ flags = INT2FIX(0);
1736
+
1737
+ pool = virStoragePoolDefineXML(conn, StringValueCStr(xml), NUM2UINT(flags));
1738
+ _E(pool == NULL, create_error(e_DefinitionError, "virStoragePoolDefineXML",
1739
+ conn));
1740
+
1741
+ return pool_new(pool, c);
1742
+ }
1743
+
1744
+ /*
1745
+ * call-seq:
1746
+ * conn.discover_storage_pool_sources(type, srcSpec=nil, flags=0) -> string
1747
+ *
1748
+ * Call +virConnectFindStoragePoolSources+[http://www.libvirt.org/html/libvirt-libvirt.html#virConnectFindStoragePoolSources]
1749
+ * to find the storage pool sources corresponding to type.
1750
+ */
1751
+ static VALUE libvirt_conn_find_storage_pool_sources(int argc, VALUE *argv, VALUE c) {
1752
+ VALUE type, srcSpec_val, flags;
1753
+
1754
+ rb_scan_args(argc, argv, "12", &type, &srcSpec_val, &flags);
1755
+
1756
+ if (NIL_P(flags))
1757
+ flags = INT2FIX(0);
1758
+
1759
+ gen_call_string(virConnectFindStoragePoolSources, conn(c), 1,
1760
+ connect_get(c), StringValueCStr(type),
1761
+ get_string_or_nil(srcSpec_val), NUM2UINT(flags));
1762
+ }
1763
+ #endif
1764
+
1765
+ /*
1766
+ * Class Libvirt::Connect
1767
+ */
1768
+ void init_connect()
1769
+ {
1770
+ c_connect = rb_define_class_under(m_libvirt, "Connect", rb_cObject);
1771
+
1772
+ /*
1773
+ * Class Libvirt::Connect::Nodeinfo
1774
+ */
1775
+ c_node_info = rb_define_class_under(c_connect, "Nodeinfo", rb_cObject);
1776
+ rb_define_attr(c_node_info, "model", 1, 0);
1777
+ rb_define_attr(c_node_info, "memory", 1, 0);
1778
+ rb_define_attr(c_node_info, "cpus", 1, 0);
1779
+ rb_define_attr(c_node_info, "mhz", 1, 0);
1780
+ rb_define_attr(c_node_info, "nodes", 1, 0);
1781
+ rb_define_attr(c_node_info, "sockets", 1, 0);
1782
+ rb_define_attr(c_node_info, "cores", 1, 0);
1783
+ rb_define_attr(c_node_info, "threads", 1, 0);
1784
+
1785
+ /*
1786
+ * Class Libvirt::Connect::NodeSecurityModel
1787
+ */
1788
+ c_node_security_model = rb_define_class_under(c_connect,
1789
+ "NodeSecurityModel",
1790
+ rb_cObject);
1791
+ rb_define_attr(c_node_security_model, "model", 1, 0);
1792
+ rb_define_attr(c_node_security_model, "doi", 1, 0);
1793
+
1794
+ rb_define_method(c_connect, "close", libvirt_conn_close, 0);
1795
+ rb_define_method(c_connect, "closed?", libvirt_conn_closed_p, 0);
1796
+ rb_define_method(c_connect, "type", libvirt_conn_type, 0);
1797
+ rb_define_method(c_connect, "version", libvirt_conn_version, 0);
1798
+ #if HAVE_VIRCONNECTGETLIBVERSION
1799
+ rb_define_method(c_connect, "libversion", libvirt_conn_libversion, 0);
1800
+ #endif
1801
+ rb_define_method(c_connect, "hostname", libvirt_conn_hostname, 0);
1802
+ rb_define_method(c_connect, "uri", libvirt_conn_uri, 0);
1803
+ rb_define_method(c_connect, "max_vcpus", libvirt_conn_max_vcpus, -1);
1804
+ rb_define_method(c_connect, "node_get_info", libvirt_conn_node_get_info, 0);
1805
+ rb_define_method(c_connect, "node_free_memory",
1806
+ libvirt_conn_node_free_memory, 0);
1807
+ rb_define_method(c_connect, "node_cells_free_memory",
1808
+ libvirt_conn_node_cells_free_memory, -1);
1809
+ #if HAVE_VIRNODEGETSECURITYMODEL
1810
+ rb_define_method(c_connect, "node_get_security_model",
1811
+ libvirt_conn_node_get_security_model, 0);
1812
+ #endif
1813
+ #if HAVE_VIRCONNECTISENCRYPTED
1814
+ rb_define_method(c_connect, "encrypted?", libvirt_conn_encrypted_p, 0);
1815
+ #endif
1816
+ #if HAVE_VIRCONNECTISSECURE
1817
+ rb_define_method(c_connect, "secure?", libvirt_conn_secure_p, 0);
1818
+ #endif
1819
+ rb_define_method(c_connect, "capabilities", libvirt_conn_capabilities, 0);
1820
+
1821
+ #if HAVE_VIRCONNECTCOMPARECPU
1822
+ rb_define_const(c_connect, "CPU_COMPARE_ERROR",
1823
+ INT2NUM(VIR_CPU_COMPARE_ERROR));
1824
+ rb_define_const(c_connect, "CPU_COMPARE_INCOMPATIBLE",
1825
+ INT2NUM(VIR_CPU_COMPARE_INCOMPATIBLE));
1826
+ rb_define_const(c_connect, "CPU_COMPARE_IDENTICAL",
1827
+ INT2NUM(VIR_CPU_COMPARE_IDENTICAL));
1828
+ rb_define_const(c_connect, "CPU_COMPARE_SUPERSET",
1829
+ INT2NUM(VIR_CPU_COMPARE_SUPERSET));
1830
+
1831
+ rb_define_method(c_connect, "compare_cpu", libvirt_conn_compare_cpu, -1);
1832
+ #endif
1833
+
1834
+ #if HAVE_VIRCONNECTBASELINECPU
1835
+ rb_define_method(c_connect, "baseline_cpu", libvirt_conn_baseline_cpu, -1);
1836
+ #endif
1837
+
1838
+ /* In the libvirt development history, the events were
1839
+ * first defined in commit 1509b8027fd0b73c30aeab443f81dd5a18d80544,
1840
+ * then ADDED and REMOVED were renamed to DEFINED and UNDEFINED at
1841
+ * the same time that the details were added
1842
+ * (d3d54d2fc92e350f250eda26cee5d0342416a9cf). What this means is that
1843
+ * if we have to check for HAVE_CONST_VIR_DOMAIN_EVENT_DEFINED and
1844
+ * HAVE_CONST_VIR_DOMAIN_EVENT_STARTED to untangle these, and then we
1845
+ * can make a decision for many of the events based on that.
1846
+ */
1847
+ #if HAVE_CONST_VIR_DOMAIN_EVENT_DEFINED
1848
+ rb_define_const(c_connect, "DOMAIN_EVENT_DEFINED",
1849
+ INT2NUM(VIR_DOMAIN_EVENT_DEFINED));
1850
+ rb_define_const(c_connect, "DOMAIN_EVENT_DEFINED_ADDED",
1851
+ INT2NUM(VIR_DOMAIN_EVENT_DEFINED_ADDED));
1852
+ rb_define_const(c_connect, "DOMAIN_EVENT_DEFINED_UPDATED",
1853
+ INT2NUM(VIR_DOMAIN_EVENT_DEFINED_UPDATED));
1854
+ rb_define_const(c_connect, "DOMAIN_EVENT_UNDEFINED",
1855
+ INT2NUM(VIR_DOMAIN_EVENT_UNDEFINED));
1856
+ rb_define_const(c_connect, "DOMAIN_EVENT_UNDEFINED_REMOVED",
1857
+ INT2NUM(VIR_DOMAIN_EVENT_UNDEFINED_REMOVED));
1858
+ rb_define_const(c_connect, "DOMAIN_EVENT_STARTED_BOOTED",
1859
+ INT2NUM(VIR_DOMAIN_EVENT_STARTED_BOOTED));
1860
+ rb_define_const(c_connect, "DOMAIN_EVENT_STARTED_MIGRATED",
1861
+ INT2NUM(VIR_DOMAIN_EVENT_STARTED_MIGRATED));
1862
+ rb_define_const(c_connect, "DOMAIN_EVENT_STARTED_RESTORED",
1863
+ INT2NUM(VIR_DOMAIN_EVENT_STARTED_RESTORED));
1864
+ rb_define_const(c_connect, "DOMAIN_EVENT_SUSPENDED_PAUSED",
1865
+ INT2NUM(VIR_DOMAIN_EVENT_SUSPENDED_PAUSED));
1866
+ rb_define_const(c_connect, "DOMAIN_EVENT_SUSPENDED_MIGRATED",
1867
+ INT2NUM(VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED));
1868
+ rb_define_const(c_connect, "DOMAIN_EVENT_RESUMED_UNPAUSED",
1869
+ INT2NUM(VIR_DOMAIN_EVENT_RESUMED_UNPAUSED));
1870
+ rb_define_const(c_connect, "DOMAIN_EVENT_RESUMED_MIGRATED",
1871
+ INT2NUM(VIR_DOMAIN_EVENT_RESUMED_MIGRATED));
1872
+ rb_define_const(c_connect, "DOMAIN_EVENT_STOPPED_SHUTDOWN",
1873
+ INT2NUM(VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN));
1874
+ rb_define_const(c_connect, "DOMAIN_EVENT_STOPPED_DESTROYED",
1875
+ INT2NUM(VIR_DOMAIN_EVENT_STOPPED_DESTROYED));
1876
+ rb_define_const(c_connect, "DOMAIN_EVENT_STOPPED_CRASHED",
1877
+ INT2NUM(VIR_DOMAIN_EVENT_STOPPED_CRASHED));
1878
+ rb_define_const(c_connect, "DOMAIN_EVENT_STOPPED_MIGRATED",
1879
+ INT2NUM(VIR_DOMAIN_EVENT_STOPPED_MIGRATED));
1880
+ rb_define_const(c_connect, "DOMAIN_EVENT_STOPPED_SAVED",
1881
+ INT2NUM(VIR_DOMAIN_EVENT_STOPPED_SAVED));
1882
+ rb_define_const(c_connect, "DOMAIN_EVENT_STOPPED_FAILED",
1883
+ INT2NUM(VIR_DOMAIN_EVENT_STOPPED_FAILED));
1884
+ #endif
1885
+ #if HAVE_CONST_VIR_DOMAIN_EVENT_STARTED
1886
+ rb_define_const(c_connect, "DOMAIN_EVENT_STARTED",
1887
+ INT2NUM(VIR_DOMAIN_EVENT_STARTED));
1888
+ rb_define_const(c_connect, "DOMAIN_EVENT_SUSPENDED",
1889
+ INT2NUM(VIR_DOMAIN_EVENT_SUSPENDED));
1890
+ rb_define_const(c_connect, "DOMAIN_EVENT_RESUMED",
1891
+ INT2NUM(VIR_DOMAIN_EVENT_RESUMED));
1892
+ rb_define_const(c_connect, "DOMAIN_EVENT_STOPPED",
1893
+ INT2NUM(VIR_DOMAIN_EVENT_STOPPED));
1894
+ #endif
1895
+ #if HAVE_TYPE_VIRDOMAINSNAPSHOTPTR
1896
+ rb_define_const(c_connect, "DOMAIN_EVENT_STARTED_FROM_SNAPSHOT",
1897
+ INT2NUM(VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT));
1898
+ rb_define_const(c_connect, "DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT",
1899
+ INT2NUM(VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT));
1900
+ #endif
1901
+ #if HAVE_CONST_VIR_DOMAIN_EVENT_SUSPENDED_IOERROR
1902
+ rb_define_const(c_connect, "DOMAIN_EVENT_SUSPENDED_IOERROR",
1903
+ INT2NUM(VIR_DOMAIN_EVENT_SUSPENDED_IOERROR));
1904
+ rb_define_const(c_connect, "DOMAIN_EVENT_SUSPENDED_WATCHDOG",
1905
+ INT2NUM(VIR_DOMAIN_EVENT_SUSPENDED_WATCHDOG));
1906
+ #endif
1907
+ #if HAVE_CONST_VIR_DOMAIN_EVENT_ID_WATCHDOG
1908
+ rb_define_const(c_connect, "DOMAIN_EVENT_ID_WATCHDOG",
1909
+ INT2NUM(VIR_DOMAIN_EVENT_ID_WATCHDOG));
1910
+ rb_define_const(c_connect, "DOMAIN_EVENT_WATCHDOG_NONE",
1911
+ INT2NUM(VIR_DOMAIN_EVENT_WATCHDOG_NONE));
1912
+ rb_define_const(c_connect, "DOMAIN_EVENT_WATCHDOG_PAUSE",
1913
+ INT2NUM(VIR_DOMAIN_EVENT_WATCHDOG_PAUSE));
1914
+ rb_define_const(c_connect, "DOMAIN_EVENT_WATCHDOG_RESET",
1915
+ INT2NUM(VIR_DOMAIN_EVENT_WATCHDOG_RESET));
1916
+ rb_define_const(c_connect, "DOMAIN_EVENT_WATCHDOG_POWEROFF",
1917
+ INT2NUM(VIR_DOMAIN_EVENT_WATCHDOG_POWEROFF));
1918
+ rb_define_const(c_connect, "DOMAIN_EVENT_WATCHDOG_SHUTDOWN",
1919
+ INT2NUM(VIR_DOMAIN_EVENT_WATCHDOG_SHUTDOWN));
1920
+ rb_define_const(c_connect, "DOMAIN_EVENT_WATCHDOG_DEBUG",
1921
+ INT2NUM(VIR_DOMAIN_EVENT_WATCHDOG_DEBUG));
1922
+ #endif
1923
+ #if HAVE_CONST_VIR_DOMAIN_EVENT_ID_IO_ERROR
1924
+ rb_define_const(c_connect, "DOMAIN_EVENT_ID_IO_ERROR",
1925
+ INT2NUM(VIR_DOMAIN_EVENT_ID_IO_ERROR));
1926
+ rb_define_const(c_connect, "DOMAIN_EVENT_IO_ERROR_NONE",
1927
+ INT2NUM(VIR_DOMAIN_EVENT_IO_ERROR_NONE));
1928
+ rb_define_const(c_connect, "DOMAIN_EVENT_IO_ERROR_PAUSE",
1929
+ INT2NUM(VIR_DOMAIN_EVENT_IO_ERROR_PAUSE));
1930
+ rb_define_const(c_connect, "DOMAIN_EVENT_IO_ERROR_REPORT",
1931
+ INT2NUM(VIR_DOMAIN_EVENT_IO_ERROR_REPORT));
1932
+ #endif
1933
+ #if HAVE_CONST_VIR_DOMAIN_EVENT_ID_GRAPHICS
1934
+ rb_define_const(c_connect, "DOMAIN_EVENT_ID_GRAPHICS",
1935
+ INT2NUM(VIR_DOMAIN_EVENT_ID_GRAPHICS));
1936
+ rb_define_const(c_connect, "DOMAIN_EVENT_GRAPHICS_CONNECT",
1937
+ INT2NUM(VIR_DOMAIN_EVENT_GRAPHICS_CONNECT));
1938
+ rb_define_const(c_connect, "DOMAIN_EVENT_GRAPHICS_INITIALIZE",
1939
+ INT2NUM(VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE));
1940
+ rb_define_const(c_connect, "DOMAIN_EVENT_GRAPHICS_DISCONNECT",
1941
+ INT2NUM(VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT));
1942
+ rb_define_const(c_connect, "DOMAIN_EVENT_GRAPHICS_ADDRESS_IPV4",
1943
+ INT2NUM(VIR_DOMAIN_EVENT_GRAPHICS_ADDRESS_IPV4));
1944
+ rb_define_const(c_connect, "DOMAIN_EVENT_GRAPHICS_ADDRESS_IPV6",
1945
+ INT2NUM(VIR_DOMAIN_EVENT_GRAPHICS_ADDRESS_IPV6));
1946
+ #endif
1947
+ #if HAVE_VIRCONNECTDOMAINEVENTREGISTERANY
1948
+ rb_define_const(c_connect, "DOMAIN_EVENT_ID_LIFECYCLE",
1949
+ INT2NUM(VIR_DOMAIN_EVENT_ID_LIFECYCLE));
1950
+ #endif
1951
+ #if HAVE_CONST_VIR_DOMAIN_EVENT_ID_REBOOT
1952
+ rb_define_const(c_connect, "DOMAIN_EVENT_ID_REBOOT",
1953
+ INT2NUM(VIR_DOMAIN_EVENT_ID_REBOOT));
1954
+ #endif
1955
+ #if HAVE_CONST_VIR_DOMAIN_EVENT_ID_RTC_CHANGE
1956
+ rb_define_const(c_connect, "DOMAIN_EVENT_ID_RTC_CHANGE",
1957
+ INT2NUM(VIR_DOMAIN_EVENT_ID_RTC_CHANGE));
1958
+ #endif
1959
+ #if HAVE_CONST_VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON
1960
+ rb_define_const(c_connect, "DOMAIN_EVENT_ID_IO_ERROR_REASON",
1961
+ INT2NUM(VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON));
1962
+ #endif
1963
+
1964
+ #if HAVE_VIRCONNECTDOMAINEVENTREGISTER
1965
+ rb_define_method(c_connect, "domain_event_register",
1966
+ libvirt_conn_domain_event_register, -1);
1967
+ rb_define_method(c_connect, "domain_event_deregister",
1968
+ libvirt_conn_domain_event_deregister, 0);
1969
+ #endif
1970
+
1971
+ #if HAVE_VIRCONNECTDOMAINEVENTREGISTERANY
1972
+ rb_define_method(c_connect, "domain_event_register_any",
1973
+ libvirt_conn_domain_event_register_any, -1);
1974
+ rb_define_method(c_connect, "domain_event_deregister_any",
1975
+ libvirt_conn_domain_event_deregister_any, 1);
1976
+ #endif
1977
+
1978
+ /* Domain creation/lookup */
1979
+ rb_define_method(c_connect, "num_of_domains",
1980
+ libvirt_conn_num_of_domains, 0);
1981
+ rb_define_method(c_connect, "list_domains", libvirt_conn_list_domains, 0);
1982
+ rb_define_method(c_connect, "num_of_defined_domains",
1983
+ libvirt_conn_num_of_defined_domains, 0);
1984
+ rb_define_method(c_connect, "list_defined_domains",
1985
+ libvirt_conn_list_defined_domains, 0);
1986
+ rb_define_method(c_connect, "create_domain_linux",
1987
+ libvirt_conn_create_linux, -1);
1988
+ #if HAVE_VIRDOMAINCREATEXML
1989
+ rb_define_method(c_connect, "create_domain_xml",
1990
+ libvirt_conn_create_xml, -1);
1991
+ #endif
1992
+ rb_define_method(c_connect, "lookup_domain_by_name",
1993
+ libvirt_conn_lookup_domain_by_name, 1);
1994
+ rb_define_method(c_connect, "lookup_domain_by_id",
1995
+ libvirt_conn_lookup_domain_by_id, 1);
1996
+ rb_define_method(c_connect, "lookup_domain_by_uuid",
1997
+ libvirt_conn_lookup_domain_by_uuid, 1);
1998
+ rb_define_method(c_connect, "define_domain_xml",
1999
+ libvirt_conn_define_domain_xml, 1);
2000
+
2001
+ #if HAVE_VIRCONNECTDOMAINXMLFROMNATIVE
2002
+ rb_define_method(c_connect, "domain_xml_from_native",
2003
+ libvirt_conn_domain_xml_from_native, -1);
2004
+ #endif
2005
+ #if HAVE_VIRCONNECTDOMAINXMLTONATIVE
2006
+ rb_define_method(c_connect, "domain_xml_to_native",
2007
+ libvirt_conn_domain_xml_to_native, -1);
2008
+ #endif
2009
+
2010
+ #if HAVE_TYPE_VIRINTERFACEPTR
2011
+ /* Interface lookup/creation methods */
2012
+ rb_define_method(c_connect, "num_of_interfaces",
2013
+ libvirt_conn_num_of_interfaces, 0);
2014
+ rb_define_method(c_connect, "list_interfaces",
2015
+ libvirt_conn_list_interfaces, 0);
2016
+ rb_define_method(c_connect, "num_of_defined_interfaces",
2017
+ libvirt_conn_num_of_defined_interfaces, 0);
2018
+ rb_define_method(c_connect, "list_defined_interfaces",
2019
+ libvirt_conn_list_defined_interfaces, 0);
2020
+ rb_define_method(c_connect, "lookup_interface_by_name",
2021
+ libvirt_conn_lookup_interface_by_name, 1);
2022
+ rb_define_method(c_connect, "lookup_interface_by_mac",
2023
+ libvirt_conn_lookup_interface_by_mac, 1);
2024
+ rb_define_method(c_connect, "define_interface_xml",
2025
+ libvirt_conn_define_interface_xml, -1);
2026
+ #endif
2027
+
2028
+ /* Network lookup/creation methods */
2029
+ rb_define_method(c_connect, "num_of_networks",
2030
+ libvirt_conn_num_of_networks, 0);
2031
+ rb_define_method(c_connect, "list_networks", libvirt_conn_list_networks, 0);
2032
+ rb_define_method(c_connect, "num_of_defined_networks",
2033
+ libvirt_conn_num_of_defined_networks, 0);
2034
+ rb_define_method(c_connect, "list_defined_networks",
2035
+ libvirt_conn_list_defined_networks, 0);
2036
+ rb_define_method(c_connect, "lookup_network_by_name",
2037
+ libvirt_conn_lookup_network_by_name, 1);
2038
+ rb_define_method(c_connect, "lookup_network_by_uuid",
2039
+ libvirt_conn_lookup_network_by_uuid, 1);
2040
+ rb_define_method(c_connect, "create_network_xml",
2041
+ libvirt_conn_create_network_xml, 1);
2042
+ rb_define_method(c_connect, "define_network_xml",
2043
+ libvirt_conn_define_network_xml, 1);
2044
+
2045
+ /* Node device lookup/creation methods */
2046
+ #if HAVE_TYPE_VIRNODEDEVICEPTR
2047
+ rb_define_method(c_connect, "num_of_nodedevices",
2048
+ libvirt_conn_num_of_nodedevices, -1);
2049
+ rb_define_method(c_connect, "list_nodedevices",
2050
+ libvirt_conn_list_nodedevices, -1);
2051
+ rb_define_method(c_connect, "lookup_nodedevice_by_name",
2052
+ libvirt_conn_lookup_nodedevice_by_name, 1);
2053
+ #if HAVE_VIRNODEDEVICECREATEXML
2054
+ rb_define_method(c_connect, "create_nodedevice_xml",
2055
+ libvirt_conn_create_nodedevice_xml, -1);
2056
+ #endif
2057
+ #endif
2058
+
2059
+ #if HAVE_TYPE_VIRNWFILTERPTR
2060
+ /* NWFilter lookup/creation methods */
2061
+ rb_define_method(c_connect, "num_of_nwfilters",
2062
+ libvirt_conn_num_of_nwfilters, 0);
2063
+ rb_define_method(c_connect, "list_nwfilters",
2064
+ libvirt_conn_list_nwfilters, 0);
2065
+ rb_define_method(c_connect, "lookup_nwfilter_by_name",
2066
+ libvirt_conn_lookup_nwfilter_by_name, 1);
2067
+ rb_define_method(c_connect, "lookup_nwfilter_by_uuid",
2068
+ libvirt_conn_lookup_nwfilter_by_uuid, 1);
2069
+ rb_define_method(c_connect, "define_nwfilter_xml",
2070
+ libvirt_conn_define_nwfilter_xml, 1);
2071
+ #endif
2072
+
2073
+ #if HAVE_TYPE_VIRSECRETPTR
2074
+ /* Secret lookup/creation methods */
2075
+ rb_define_method(c_connect, "num_of_secrets",
2076
+ libvirt_conn_num_of_secrets, 0);
2077
+ rb_define_method(c_connect, "list_secrets",
2078
+ libvirt_conn_list_secrets, 0);
2079
+ rb_define_method(c_connect, "lookup_secret_by_uuid",
2080
+ libvirt_conn_lookup_secret_by_uuid, 1);
2081
+ rb_define_method(c_connect, "lookup_secret_by_usage",
2082
+ libvirt_conn_lookup_secret_by_usage, 2);
2083
+ rb_define_method(c_connect, "define_secret_xml",
2084
+ libvirt_conn_define_secret_xml, -1);
2085
+ #endif
2086
+
2087
+ #if HAVE_TYPE_VIRSTORAGEPOOLPTR
2088
+ /* StoragePool lookup/creation methods */
2089
+ rb_define_method(c_connect, "num_of_storage_pools",
2090
+ libvirt_conn_num_of_storage_pools, 0);
2091
+ rb_define_method(c_connect, "list_storage_pools",
2092
+ libvirt_conn_list_storage_pools, 0);
2093
+ rb_define_method(c_connect, "num_of_defined_storage_pools",
2094
+ libvirt_conn_num_of_defined_storage_pools, 0);
2095
+ rb_define_method(c_connect, "list_defined_storage_pools",
2096
+ libvirt_conn_list_defined_storage_pools, 0);
2097
+ rb_define_method(c_connect, "lookup_storage_pool_by_name",
2098
+ libvirt_conn_lookup_pool_by_name, 1);
2099
+ rb_define_method(c_connect, "lookup_storage_pool_by_uuid",
2100
+ libvirt_conn_lookup_pool_by_uuid, 1);
2101
+ rb_define_method(c_connect, "create_storage_pool_xml",
2102
+ libvirt_conn_create_pool_xml, -1);
2103
+ rb_define_method(c_connect, "define_storage_pool_xml",
2104
+ libvirt_conn_define_pool_xml, -1);
2105
+ rb_define_method(c_connect, "discover_storage_pool_sources",
2106
+ libvirt_conn_find_storage_pool_sources, -1);
2107
+ #endif
392
2108
  }