diff --git a/0001-Suppress-errors-to-stderr-and-use-thread-local-virEr.patch b/0001-Suppress-errors-to-stderr-and-use-thread-local-virEr.patch new file mode 100644 index 0000000..f365534 --- /dev/null +++ b/0001-Suppress-errors-to-stderr-and-use-thread-local-virEr.patch @@ -0,0 +1,1864 @@ +From 68fae1ec3de46fd9eec88fb7c1894ea7ed85ccc9 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 17 Mar 2015 12:51:50 +0000 +Subject: [PATCH 1/2] Suppress errors to stderr and use thread-local + virErrorPtr + +This allows us to capture errors that happen during virConnectOpen, +without spewing error messages on stderr. + +The patch is rather large, only because we don't need to pass the +virConnectPtr argument to CHECK_ERROR/_raise_virterror any longer. +--- + libvirt/generator.pl | 66 ++++++------ + libvirt/libvirt_c.c | 241 +++++++++++++++++-------------------------- + libvirt/libvirt_c_epilogue.c | 4 +- + libvirt/libvirt_c_oneoffs.c | 94 +++++++---------- + libvirt/libvirt_c_prologue.c | 6 +- + 5 files changed, 169 insertions(+), 242 deletions(-) + +diff --git a/libvirt/generator.pl b/libvirt/generator.pl +index 421592b..34801ba 100755 +--- a/libvirt/generator.pl ++++ b/libvirt/generator.pl +@@ -343,17 +343,13 @@ sub gen_unpack_args + if ($_ eq "conn") { + "virConnectPtr conn = Connect_val (connv);" + } elsif ($_ eq "dom") { +- "virDomainPtr dom = Domain_val (domv);\n". +- " virConnectPtr conn = Connect_domv (domv);" ++ "virDomainPtr dom = Domain_val (domv);" + } elsif ($_ eq "net") { +- "virNetworkPtr net = Network_val (netv);\n". +- " virConnectPtr conn = Connect_netv (netv);" ++ "virNetworkPtr net = Network_val (netv);" + } elsif ($_ eq "pool") { +- "virStoragePoolPtr pool = Pool_val (poolv);\n". +- " virConnectPtr conn = Connect_polv (poolv);" ++ "virStoragePoolPtr pool = Pool_val (poolv);" + } elsif ($_ eq "vol") { +- "virStorageVolPtr vol = Volume_val (volv);\n". +- " virConnectPtr conn = Connect_volv (volv);" ++ "virStorageVolPtr vol = Volume_val (volv);" + } else { + die "unknown short name $_" + } +@@ -402,7 +398,7 @@ sub gen_c_code + char *r; + + NONBLOCKING (r = $c_name ($1)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + rv = caml_copy_string (r); + free (r); +@@ -415,7 +411,7 @@ sub gen_c_code + const char *r; + + NONBLOCKING (r = $c_name ($1)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + rv = caml_copy_string (r); + CAMLreturn (rv); +@@ -426,7 +422,7 @@ sub gen_c_code + int r; + + NONBLOCKING (r = $c_name ($1)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + CAMLreturn (Val_int (r)); + " +@@ -438,7 +434,7 @@ sub gen_c_code + int r; + + NONBLOCKING (r = $c_name ($1, uuid)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + /* UUIDs are byte arrays with a fixed length. */ + rv = caml_alloc_string (VIR_UUID_BUFLEN); +@@ -453,7 +449,7 @@ sub gen_c_code + int r; + + NONBLOCKING (r = $c_name ($1, uuid)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + rv = caml_copy_string (uuid); + CAMLreturn (rv); +@@ -464,7 +460,7 @@ sub gen_c_code + int r, b; + + NONBLOCKING (r = $c_name ($1, &b)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + CAMLreturn (b ? Val_true : Val_false); + " +@@ -476,7 +472,7 @@ sub gen_c_code + b = bv == Val_true ? 1 : 0; + + NONBLOCKING (r = $c_name ($1, b)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + CAMLreturn (Val_unit); + " +@@ -498,7 +494,7 @@ sub gen_c_code + } + + NONBLOCKING (r = $c_name (conn, ids, i)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + rv = caml_alloc (r, 0); + for (i = 0; i < r; ++i) +@@ -525,7 +521,7 @@ sub gen_c_code + } + + NONBLOCKING (r = $c_name ($1, names, i)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + rv = caml_alloc (r, 0); + for (i = 0; i < r; ++i) { +@@ -543,7 +539,7 @@ sub gen_c_code + char *r; + + NONBLOCKING (r = $c_name ($1, 0)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + rv = caml_copy_string (r); + free (r); +@@ -555,7 +551,7 @@ sub gen_c_code + int r; + + NONBLOCKING (r = $c_name ($1, 0)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + CAMLreturn (Val_unit); + " +@@ -565,7 +561,7 @@ sub gen_c_code + int r; + + NONBLOCKING (r = $c_name ($1)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + CAMLreturn (Val_unit); + " +@@ -575,7 +571,7 @@ sub gen_c_code + int r; + + NONBLOCKING (r = $c_name ($1)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + /* So that we don't double-free in the finalizer: */ + " . gen_free_arg ($1) . " +@@ -589,7 +585,7 @@ sub gen_c_code + int r; + + NONBLOCKING (r = $c_name ($1, str)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + CAMLreturn (Val_unit); + " +@@ -601,7 +597,7 @@ sub gen_c_code + int r; + + NONBLOCKING (r = $c_name ($1, str, 0)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + CAMLreturn (Val_unit); + " +@@ -614,7 +610,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1, str)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + " . gen_pack_result ($2) . " + +@@ -629,7 +625,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1, str, 0)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + " . gen_pack_result ($2) . " + +@@ -645,7 +641,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1, str, u)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + " . gen_pack_result ($2) . " + +@@ -659,7 +655,7 @@ sub gen_c_code + int r; + + NONBLOCKING (r = $c_name ($1, i)); +- CHECK_ERROR (r == -1, conn, \"$c_name\"); ++ CHECK_ERROR (r == -1, \"$c_name\"); + + CAMLreturn (Val_unit); + " +@@ -673,7 +669,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1, i)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + " . gen_pack_result ($3) . " + +@@ -688,7 +684,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1, uuid)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + " . gen_pack_result ($2) . " + +@@ -702,7 +698,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1, 0)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + " . gen_pack_result ($2) . " + +@@ -716,7 +712,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + " . gen_pack_result ($2) . " + +@@ -731,7 +727,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1, str)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + connv = Field ($3v, 1); + " . gen_pack_result ($2) . " +@@ -747,7 +743,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1, str, 0)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + connv = Field ($3v, 1); + " . gen_pack_result ($2) . " +@@ -762,7 +758,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1, 0)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + connv = Field ($3v, 1); + " . gen_pack_result ($2) . " +@@ -777,7 +773,7 @@ sub gen_c_code + $c_ret_type r; + + NONBLOCKING (r = $c_name ($1)); +- CHECK_ERROR (!r, conn, \"$c_name\"); ++ CHECK_ERROR (!r, \"$c_name\"); + + connv = Field ($3v, 1); + " . gen_pack_result ($2) . " +diff --git a/libvirt/libvirt_c.c b/libvirt/libvirt_c.c +index 6e56682..8d51944 100644 +--- a/libvirt/libvirt_c.c ++++ b/libvirt/libvirt_c.c +@@ -61,7 +61,7 @@ ocaml_libvirt_connect_close (value connv) + int r; + + NONBLOCKING (r = virConnectClose (conn)); +- CHECK_ERROR (r == -1, conn, "virConnectClose"); ++ CHECK_ERROR (r == -1, "virConnectClose"); + + /* So that we don't double-free in the finalizer: */ + Connect_val (connv) = NULL; +@@ -83,7 +83,7 @@ ocaml_libvirt_connect_get_hostname (value connv) + char *r; + + NONBLOCKING (r = virConnectGetHostname (conn)); +- CHECK_ERROR (!r, conn, "virConnectGetHostname"); ++ CHECK_ERROR (!r, "virConnectGetHostname"); + + rv = caml_copy_string (r); + free (r); +@@ -104,7 +104,7 @@ ocaml_libvirt_connect_get_uri (value connv) + char *r; + + NONBLOCKING (r = virConnectGetURI (conn)); +- CHECK_ERROR (!r, conn, "virConnectGetURI"); ++ CHECK_ERROR (!r, "virConnectGetURI"); + + rv = caml_copy_string (r); + free (r); +@@ -125,7 +125,7 @@ ocaml_libvirt_connect_get_type (value connv) + const char *r; + + NONBLOCKING (r = virConnectGetType (conn)); +- CHECK_ERROR (!r, conn, "virConnectGetType"); ++ CHECK_ERROR (!r, "virConnectGetType"); + + rv = caml_copy_string (r); + CAMLreturn (rv); +@@ -144,7 +144,7 @@ ocaml_libvirt_connect_num_of_domains (value connv) + int r; + + NONBLOCKING (r = virConnectNumOfDomains (conn)); +- CHECK_ERROR (r == -1, conn, "virConnectNumOfDomains"); ++ CHECK_ERROR (r == -1, "virConnectNumOfDomains"); + + CAMLreturn (Val_int (r)); + } +@@ -174,7 +174,7 @@ ocaml_libvirt_connect_list_domains (value connv, value iv) + } + + NONBLOCKING (r = virConnectListDomains (conn, ids, i)); +- CHECK_ERROR (r == -1, conn, "virConnectListDomains"); ++ CHECK_ERROR (r == -1, "virConnectListDomains"); + + rv = caml_alloc (r, 0); + for (i = 0; i < r; ++i) +@@ -196,7 +196,7 @@ ocaml_libvirt_connect_num_of_defined_domains (value connv) + int r; + + NONBLOCKING (r = virConnectNumOfDefinedDomains (conn)); +- CHECK_ERROR (r == -1, conn, "virConnectNumOfDefinedDomains"); ++ CHECK_ERROR (r == -1, "virConnectNumOfDefinedDomains"); + + CAMLreturn (Val_int (r)); + } +@@ -227,7 +227,7 @@ ocaml_libvirt_connect_list_defined_domains (value connv, value iv) + } + + NONBLOCKING (r = virConnectListDefinedDomains (conn, names, i)); +- CHECK_ERROR (r == -1, conn, "virConnectListDefinedDomains"); ++ CHECK_ERROR (r == -1, "virConnectListDefinedDomains"); + + rv = caml_alloc (r, 0); + for (i = 0; i < r; ++i) { +@@ -252,7 +252,7 @@ ocaml_libvirt_connect_num_of_networks (value connv) + int r; + + NONBLOCKING (r = virConnectNumOfNetworks (conn)); +- CHECK_ERROR (r == -1, conn, "virConnectNumOfNetworks"); ++ CHECK_ERROR (r == -1, "virConnectNumOfNetworks"); + + CAMLreturn (Val_int (r)); + } +@@ -283,7 +283,7 @@ ocaml_libvirt_connect_list_networks (value connv, value iv) + } + + NONBLOCKING (r = virConnectListNetworks (conn, names, i)); +- CHECK_ERROR (r == -1, conn, "virConnectListNetworks"); ++ CHECK_ERROR (r == -1, "virConnectListNetworks"); + + rv = caml_alloc (r, 0); + for (i = 0; i < r; ++i) { +@@ -308,7 +308,7 @@ ocaml_libvirt_connect_num_of_defined_networks (value connv) + int r; + + NONBLOCKING (r = virConnectNumOfDefinedNetworks (conn)); +- CHECK_ERROR (r == -1, conn, "virConnectNumOfDefinedNetworks"); ++ CHECK_ERROR (r == -1, "virConnectNumOfDefinedNetworks"); + + CAMLreturn (Val_int (r)); + } +@@ -339,7 +339,7 @@ ocaml_libvirt_connect_list_defined_networks (value connv, value iv) + } + + NONBLOCKING (r = virConnectListDefinedNetworks (conn, names, i)); +- CHECK_ERROR (r == -1, conn, "virConnectListDefinedNetworks"); ++ CHECK_ERROR (r == -1, "virConnectListDefinedNetworks"); + + rv = caml_alloc (r, 0); + for (i = 0; i < r; ++i) { +@@ -364,7 +364,7 @@ ocaml_libvirt_connect_num_of_storage_pools (value connv) + int r; + + NONBLOCKING (r = virConnectNumOfStoragePools (conn)); +- CHECK_ERROR (r == -1, conn, "virConnectNumOfStoragePools"); ++ CHECK_ERROR (r == -1, "virConnectNumOfStoragePools"); + + CAMLreturn (Val_int (r)); + } +@@ -395,7 +395,7 @@ ocaml_libvirt_connect_list_storage_pools (value connv, value iv) + } + + NONBLOCKING (r = virConnectListStoragePools (conn, names, i)); +- CHECK_ERROR (r == -1, conn, "virConnectListStoragePools"); ++ CHECK_ERROR (r == -1, "virConnectListStoragePools"); + + rv = caml_alloc (r, 0); + for (i = 0; i < r; ++i) { +@@ -420,7 +420,7 @@ ocaml_libvirt_connect_num_of_defined_storage_pools (value connv) + int r; + + NONBLOCKING (r = virConnectNumOfDefinedStoragePools (conn)); +- CHECK_ERROR (r == -1, conn, "virConnectNumOfDefinedStoragePools"); ++ CHECK_ERROR (r == -1, "virConnectNumOfDefinedStoragePools"); + + CAMLreturn (Val_int (r)); + } +@@ -451,7 +451,7 @@ ocaml_libvirt_connect_list_defined_storage_pools (value connv, value iv) + } + + NONBLOCKING (r = virConnectListDefinedStoragePools (conn, names, i)); +- CHECK_ERROR (r == -1, conn, "virConnectListDefinedStoragePools"); ++ CHECK_ERROR (r == -1, "virConnectListDefinedStoragePools"); + + rv = caml_alloc (r, 0); + for (i = 0; i < r; ++i) { +@@ -477,7 +477,7 @@ ocaml_libvirt_connect_get_capabilities (value connv) + char *r; + + NONBLOCKING (r = virConnectGetCapabilities (conn)); +- CHECK_ERROR (!r, conn, "virConnectGetCapabilities"); ++ CHECK_ERROR (!r, "virConnectGetCapabilities"); + + rv = caml_copy_string (r); + free (r); +@@ -498,7 +498,7 @@ ocaml_libvirt_connect_domain_event_deregister_any (value connv, value iv) + int r; + + NONBLOCKING (r = virConnectDomainEventDeregisterAny (conn, i)); +- CHECK_ERROR (r == -1, conn, "virConnectDomainEventDeregisterAny"); ++ CHECK_ERROR (r == -1, "virConnectDomainEventDeregisterAny"); + + CAMLreturn (Val_unit); + } +@@ -518,7 +518,7 @@ ocaml_libvirt_domain_create_linux (value connv, value strv) + virDomainPtr r; + + NONBLOCKING (r = virDomainCreateLinux (conn, str, 0)); +- CHECK_ERROR (!r, conn, "virDomainCreateLinux"); ++ CHECK_ERROR (!r, "virDomainCreateLinux"); + + rv = Val_domain (r, connv); + +@@ -541,7 +541,7 @@ ocaml_libvirt_domain_create_xml (value connv, value strv, value uv) + virDomainPtr r; + + NONBLOCKING (r = virDomainCreateXML (conn, str, u)); +- CHECK_ERROR (!r, conn, "virDomainCreateXML"); ++ CHECK_ERROR (!r, "virDomainCreateXML"); + + rv = Val_domain (r, connv); + +@@ -558,11 +558,10 @@ ocaml_libvirt_domain_free (value domv) + CAMLparam1 (domv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r; + + NONBLOCKING (r = virDomainFree (dom)); +- CHECK_ERROR (r == -1, conn, "virDomainFree"); ++ CHECK_ERROR (r == -1, "virDomainFree"); + + /* So that we don't double-free in the finalizer: */ + Domain_val (domv) = NULL; +@@ -580,11 +579,10 @@ ocaml_libvirt_domain_destroy (value domv) + CAMLparam1 (domv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r; + + NONBLOCKING (r = virDomainDestroy (dom)); +- CHECK_ERROR (r == -1, conn, "virDomainDestroy"); ++ CHECK_ERROR (r == -1, "virDomainDestroy"); + + /* So that we don't double-free in the finalizer: */ + Domain_val (domv) = NULL; +@@ -607,7 +605,7 @@ ocaml_libvirt_domain_lookup_by_name (value connv, value strv) + virDomainPtr r; + + NONBLOCKING (r = virDomainLookupByName (conn, str)); +- CHECK_ERROR (!r, conn, "virDomainLookupByName"); ++ CHECK_ERROR (!r, "virDomainLookupByName"); + + rv = Val_domain (r, connv); + +@@ -629,7 +627,7 @@ ocaml_libvirt_domain_lookup_by_id (value connv, value iv) + virDomainPtr r; + + NONBLOCKING (r = virDomainLookupByID (conn, i)); +- CHECK_ERROR (!r, conn, "virDomainLookupByID"); ++ CHECK_ERROR (!r, "virDomainLookupByID"); + + rv = Val_domain (r, connv); + +@@ -651,7 +649,7 @@ ocaml_libvirt_domain_lookup_by_uuid (value connv, value uuidv) + virDomainPtr r; + + NONBLOCKING (r = virDomainLookupByUUID (conn, uuid)); +- CHECK_ERROR (!r, conn, "virDomainLookupByUUID"); ++ CHECK_ERROR (!r, "virDomainLookupByUUID"); + + rv = Val_domain (r, connv); + +@@ -673,7 +671,7 @@ ocaml_libvirt_domain_lookup_by_uuid_string (value connv, value strv) + virDomainPtr r; + + NONBLOCKING (r = virDomainLookupByUUIDString (conn, str)); +- CHECK_ERROR (!r, conn, "virDomainLookupByUUIDString"); ++ CHECK_ERROR (!r, "virDomainLookupByUUIDString"); + + rv = Val_domain (r, connv); + +@@ -691,11 +689,10 @@ ocaml_libvirt_domain_get_name (value domv) + + CAMLlocal1 (rv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + const char *r; + + NONBLOCKING (r = virDomainGetName (dom)); +- CHECK_ERROR (!r, conn, "virDomainGetName"); ++ CHECK_ERROR (!r, "virDomainGetName"); + + rv = caml_copy_string (r); + CAMLreturn (rv); +@@ -712,11 +709,10 @@ ocaml_libvirt_domain_get_os_type (value domv) + + CAMLlocal1 (rv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + char *r; + + NONBLOCKING (r = virDomainGetOSType (dom)); +- CHECK_ERROR (!r, conn, "virDomainGetOSType"); ++ CHECK_ERROR (!r, "virDomainGetOSType"); + + rv = caml_copy_string (r); + free (r); +@@ -734,11 +730,10 @@ ocaml_libvirt_domain_get_xml_desc (value domv) + + CAMLlocal1 (rv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + char *r; + + NONBLOCKING (r = virDomainGetXMLDesc (dom, 0)); +- CHECK_ERROR (!r, conn, "virDomainGetXMLDesc"); ++ CHECK_ERROR (!r, "virDomainGetXMLDesc"); + + rv = caml_copy_string (r); + free (r); +@@ -756,12 +751,11 @@ ocaml_libvirt_domain_get_uuid (value domv) + + CAMLlocal1 (rv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + unsigned char uuid[VIR_UUID_BUFLEN]; + int r; + + NONBLOCKING (r = virDomainGetUUID (dom, uuid)); +- CHECK_ERROR (r == -1, conn, "virDomainGetUUID"); ++ CHECK_ERROR (r == -1, "virDomainGetUUID"); + + /* UUIDs are byte arrays with a fixed length. */ + rv = caml_alloc_string (VIR_UUID_BUFLEN); +@@ -780,12 +774,11 @@ ocaml_libvirt_domain_get_uuid_string (value domv) + + CAMLlocal1 (rv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + char uuid[VIR_UUID_STRING_BUFLEN]; + int r; + + NONBLOCKING (r = virDomainGetUUIDString (dom, uuid)); +- CHECK_ERROR (r == -1, conn, "virDomainGetUUIDString"); ++ CHECK_ERROR (r == -1, "virDomainGetUUIDString"); + + rv = caml_copy_string (uuid); + CAMLreturn (rv); +@@ -801,11 +794,10 @@ ocaml_libvirt_domain_get_max_vcpus (value domv) + CAMLparam1 (domv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r; + + NONBLOCKING (r = virDomainGetMaxVcpus (dom)); +- CHECK_ERROR (r == -1, conn, "virDomainGetMaxVcpus"); ++ CHECK_ERROR (r == -1, "virDomainGetMaxVcpus"); + + CAMLreturn (Val_int (r)); + } +@@ -820,12 +812,11 @@ ocaml_libvirt_domain_save (value domv, value strv) + CAMLparam2 (domv, strv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + char *str = String_val (strv); + int r; + + NONBLOCKING (r = virDomainSave (dom, str)); +- CHECK_ERROR (r == -1, conn, "virDomainSave"); ++ CHECK_ERROR (r == -1, "virDomainSave"); + + CAMLreturn (Val_unit); + } +@@ -844,7 +835,7 @@ ocaml_libvirt_domain_restore (value connv, value strv) + int r; + + NONBLOCKING (r = virDomainRestore (conn, str)); +- CHECK_ERROR (r == -1, conn, "virDomainRestore"); ++ CHECK_ERROR (r == -1, "virDomainRestore"); + + CAMLreturn (Val_unit); + } +@@ -860,12 +851,11 @@ ocaml_libvirt_domain_core_dump (value domv, value strv) + + CAMLlocal1 (rv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + char *str = String_val (strv); + int r; + + NONBLOCKING (r = virDomainCoreDump (dom, str, 0)); +- CHECK_ERROR (!r, conn, "virDomainCoreDump"); ++ CHECK_ERROR (!r, "virDomainCoreDump"); + + CAMLreturn (Val_unit); + } +@@ -880,11 +870,10 @@ ocaml_libvirt_domain_suspend (value domv) + CAMLparam1 (domv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r; + + NONBLOCKING (r = virDomainSuspend (dom)); +- CHECK_ERROR (r == -1, conn, "virDomainSuspend"); ++ CHECK_ERROR (r == -1, "virDomainSuspend"); + + CAMLreturn (Val_unit); + } +@@ -899,11 +888,10 @@ ocaml_libvirt_domain_resume (value domv) + CAMLparam1 (domv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r; + + NONBLOCKING (r = virDomainResume (dom)); +- CHECK_ERROR (r == -1, conn, "virDomainResume"); ++ CHECK_ERROR (r == -1, "virDomainResume"); + + CAMLreturn (Val_unit); + } +@@ -918,11 +906,10 @@ ocaml_libvirt_domain_shutdown (value domv) + CAMLparam1 (domv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r; + + NONBLOCKING (r = virDomainShutdown (dom)); +- CHECK_ERROR (r == -1, conn, "virDomainShutdown"); ++ CHECK_ERROR (r == -1, "virDomainShutdown"); + + CAMLreturn (Val_unit); + } +@@ -937,11 +924,10 @@ ocaml_libvirt_domain_reboot (value domv) + CAMLparam1 (domv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r; + + NONBLOCKING (r = virDomainReboot (dom, 0)); +- CHECK_ERROR (r == -1, conn, "virDomainReboot"); ++ CHECK_ERROR (r == -1, "virDomainReboot"); + + CAMLreturn (Val_unit); + } +@@ -961,7 +947,7 @@ ocaml_libvirt_domain_define_xml (value connv, value strv) + virDomainPtr r; + + NONBLOCKING (r = virDomainDefineXML (conn, str)); +- CHECK_ERROR (!r, conn, "virDomainDefineXML"); ++ CHECK_ERROR (!r, "virDomainDefineXML"); + + rv = Val_domain (r, connv); + +@@ -978,11 +964,10 @@ ocaml_libvirt_domain_undefine (value domv) + CAMLparam1 (domv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r; + + NONBLOCKING (r = virDomainUndefine (dom)); +- CHECK_ERROR (r == -1, conn, "virDomainUndefine"); ++ CHECK_ERROR (r == -1, "virDomainUndefine"); + + CAMLreturn (Val_unit); + } +@@ -997,11 +982,10 @@ ocaml_libvirt_domain_create (value domv) + CAMLparam1 (domv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r; + + NONBLOCKING (r = virDomainCreate (dom)); +- CHECK_ERROR (r == -1, conn, "virDomainCreate"); ++ CHECK_ERROR (r == -1, "virDomainCreate"); + + CAMLreturn (Val_unit); + } +@@ -1016,12 +1000,11 @@ ocaml_libvirt_domain_attach_device (value domv, value strv) + CAMLparam2 (domv, strv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + char *str = String_val (strv); + int r; + + NONBLOCKING (r = virDomainAttachDevice (dom, str)); +- CHECK_ERROR (r == -1, conn, "virDomainAttachDevice"); ++ CHECK_ERROR (r == -1, "virDomainAttachDevice"); + + CAMLreturn (Val_unit); + } +@@ -1036,12 +1019,11 @@ ocaml_libvirt_domain_detach_device (value domv, value strv) + CAMLparam2 (domv, strv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + char *str = String_val (strv); + int r; + + NONBLOCKING (r = virDomainDetachDevice (dom, str)); +- CHECK_ERROR (r == -1, conn, "virDomainDetachDevice"); ++ CHECK_ERROR (r == -1, "virDomainDetachDevice"); + + CAMLreturn (Val_unit); + } +@@ -1056,11 +1038,10 @@ ocaml_libvirt_domain_get_autostart (value domv) + CAMLparam1 (domv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r, b; + + NONBLOCKING (r = virDomainGetAutostart (dom, &b)); +- CHECK_ERROR (r == -1, conn, "virDomainGetAutostart"); ++ CHECK_ERROR (r == -1, "virDomainGetAutostart"); + + CAMLreturn (b ? Val_true : Val_false); + } +@@ -1075,13 +1056,12 @@ ocaml_libvirt_domain_set_autostart (value domv, value bv) + CAMLparam2 (domv, bv); + + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r, b; + + b = bv == Val_true ? 1 : 0; + + NONBLOCKING (r = virDomainSetAutostart (dom, b)); +- CHECK_ERROR (r == -1, conn, "virDomainSetAutostart"); ++ CHECK_ERROR (r == -1, "virDomainSetAutostart"); + + CAMLreturn (Val_unit); + } +@@ -1096,11 +1076,10 @@ ocaml_libvirt_network_free (value netv) + CAMLparam1 (netv); + + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + int r; + + NONBLOCKING (r = virNetworkFree (net)); +- CHECK_ERROR (r == -1, conn, "virNetworkFree"); ++ CHECK_ERROR (r == -1, "virNetworkFree"); + + /* So that we don't double-free in the finalizer: */ + Network_val (netv) = NULL; +@@ -1118,11 +1097,10 @@ ocaml_libvirt_network_destroy (value netv) + CAMLparam1 (netv); + + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + int r; + + NONBLOCKING (r = virNetworkDestroy (net)); +- CHECK_ERROR (r == -1, conn, "virNetworkDestroy"); ++ CHECK_ERROR (r == -1, "virNetworkDestroy"); + + /* So that we don't double-free in the finalizer: */ + Network_val (netv) = NULL; +@@ -1145,7 +1123,7 @@ ocaml_libvirt_network_lookup_by_name (value connv, value strv) + virNetworkPtr r; + + NONBLOCKING (r = virNetworkLookupByName (conn, str)); +- CHECK_ERROR (!r, conn, "virNetworkLookupByName"); ++ CHECK_ERROR (!r, "virNetworkLookupByName"); + + rv = Val_network (r, connv); + +@@ -1167,7 +1145,7 @@ ocaml_libvirt_network_lookup_by_uuid (value connv, value uuidv) + virNetworkPtr r; + + NONBLOCKING (r = virNetworkLookupByUUID (conn, uuid)); +- CHECK_ERROR (!r, conn, "virNetworkLookupByUUID"); ++ CHECK_ERROR (!r, "virNetworkLookupByUUID"); + + rv = Val_network (r, connv); + +@@ -1189,7 +1167,7 @@ ocaml_libvirt_network_lookup_by_uuid_string (value connv, value strv) + virNetworkPtr r; + + NONBLOCKING (r = virNetworkLookupByUUIDString (conn, str)); +- CHECK_ERROR (!r, conn, "virNetworkLookupByUUIDString"); ++ CHECK_ERROR (!r, "virNetworkLookupByUUIDString"); + + rv = Val_network (r, connv); + +@@ -1207,11 +1185,10 @@ ocaml_libvirt_network_get_name (value netv) + + CAMLlocal1 (rv); + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + const char *r; + + NONBLOCKING (r = virNetworkGetName (net)); +- CHECK_ERROR (!r, conn, "virNetworkGetName"); ++ CHECK_ERROR (!r, "virNetworkGetName"); + + rv = caml_copy_string (r); + CAMLreturn (rv); +@@ -1228,11 +1205,10 @@ ocaml_libvirt_network_get_xml_desc (value netv) + + CAMLlocal1 (rv); + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + char *r; + + NONBLOCKING (r = virNetworkGetXMLDesc (net, 0)); +- CHECK_ERROR (!r, conn, "virNetworkGetXMLDesc"); ++ CHECK_ERROR (!r, "virNetworkGetXMLDesc"); + + rv = caml_copy_string (r); + free (r); +@@ -1250,11 +1226,10 @@ ocaml_libvirt_network_get_bridge_name (value netv) + + CAMLlocal1 (rv); + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + char *r; + + NONBLOCKING (r = virNetworkGetBridgeName (net)); +- CHECK_ERROR (!r, conn, "virNetworkGetBridgeName"); ++ CHECK_ERROR (!r, "virNetworkGetBridgeName"); + + rv = caml_copy_string (r); + free (r); +@@ -1272,12 +1247,11 @@ ocaml_libvirt_network_get_uuid (value netv) + + CAMLlocal1 (rv); + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + unsigned char uuid[VIR_UUID_BUFLEN]; + int r; + + NONBLOCKING (r = virNetworkGetUUID (net, uuid)); +- CHECK_ERROR (r == -1, conn, "virNetworkGetUUID"); ++ CHECK_ERROR (r == -1, "virNetworkGetUUID"); + + /* UUIDs are byte arrays with a fixed length. */ + rv = caml_alloc_string (VIR_UUID_BUFLEN); +@@ -1296,12 +1270,11 @@ ocaml_libvirt_network_get_uuid_string (value netv) + + CAMLlocal1 (rv); + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + char uuid[VIR_UUID_STRING_BUFLEN]; + int r; + + NONBLOCKING (r = virNetworkGetUUIDString (net, uuid)); +- CHECK_ERROR (r == -1, conn, "virNetworkGetUUIDString"); ++ CHECK_ERROR (r == -1, "virNetworkGetUUIDString"); + + rv = caml_copy_string (uuid); + CAMLreturn (rv); +@@ -1317,11 +1290,10 @@ ocaml_libvirt_network_undefine (value netv) + CAMLparam1 (netv); + + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + int r; + + NONBLOCKING (r = virNetworkUndefine (net)); +- CHECK_ERROR (r == -1, conn, "virNetworkUndefine"); ++ CHECK_ERROR (r == -1, "virNetworkUndefine"); + + CAMLreturn (Val_unit); + } +@@ -1341,7 +1313,7 @@ ocaml_libvirt_network_create_xml (value connv, value strv) + virNetworkPtr r; + + NONBLOCKING (r = virNetworkCreateXML (conn, str)); +- CHECK_ERROR (!r, conn, "virNetworkCreateXML"); ++ CHECK_ERROR (!r, "virNetworkCreateXML"); + + rv = Val_network (r, connv); + +@@ -1363,7 +1335,7 @@ ocaml_libvirt_network_define_xml (value connv, value strv) + virNetworkPtr r; + + NONBLOCKING (r = virNetworkDefineXML (conn, str)); +- CHECK_ERROR (!r, conn, "virNetworkDefineXML"); ++ CHECK_ERROR (!r, "virNetworkDefineXML"); + + rv = Val_network (r, connv); + +@@ -1380,11 +1352,10 @@ ocaml_libvirt_network_create (value netv) + CAMLparam1 (netv); + + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + int r; + + NONBLOCKING (r = virNetworkCreate (net)); +- CHECK_ERROR (r == -1, conn, "virNetworkCreate"); ++ CHECK_ERROR (r == -1, "virNetworkCreate"); + + CAMLreturn (Val_unit); + } +@@ -1399,11 +1370,10 @@ ocaml_libvirt_network_get_autostart (value netv) + CAMLparam1 (netv); + + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + int r, b; + + NONBLOCKING (r = virNetworkGetAutostart (net, &b)); +- CHECK_ERROR (r == -1, conn, "virNetworkGetAutostart"); ++ CHECK_ERROR (r == -1, "virNetworkGetAutostart"); + + CAMLreturn (b ? Val_true : Val_false); + } +@@ -1418,13 +1388,12 @@ ocaml_libvirt_network_set_autostart (value netv, value bv) + CAMLparam2 (netv, bv); + + virNetworkPtr net = Network_val (netv); +- virConnectPtr conn = Connect_netv (netv); + int r, b; + + b = bv == Val_true ? 1 : 0; + + NONBLOCKING (r = virNetworkSetAutostart (net, b)); +- CHECK_ERROR (r == -1, conn, "virNetworkSetAutostart"); ++ CHECK_ERROR (r == -1, "virNetworkSetAutostart"); + + CAMLreturn (Val_unit); + } +@@ -1439,11 +1408,10 @@ ocaml_libvirt_storage_pool_free (value poolv) + CAMLparam1 (poolv); + + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + int r; + + NONBLOCKING (r = virStoragePoolFree (pool)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolFree"); ++ CHECK_ERROR (r == -1, "virStoragePoolFree"); + + /* So that we don't double-free in the finalizer: */ + Pool_val (poolv) = NULL; +@@ -1461,11 +1429,10 @@ ocaml_libvirt_storage_pool_destroy (value poolv) + CAMLparam1 (poolv); + + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + int r; + + NONBLOCKING (r = virStoragePoolDestroy (pool)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolDestroy"); ++ CHECK_ERROR (r == -1, "virStoragePoolDestroy"); + + /* So that we don't double-free in the finalizer: */ + Pool_val (poolv) = NULL; +@@ -1488,7 +1455,7 @@ ocaml_libvirt_storage_pool_lookup_by_name (value connv, value strv) + virStoragePoolPtr r; + + NONBLOCKING (r = virStoragePoolLookupByName (conn, str)); +- CHECK_ERROR (!r, conn, "virStoragePoolLookupByName"); ++ CHECK_ERROR (!r, "virStoragePoolLookupByName"); + + rv = Val_pool (r, connv); + +@@ -1510,7 +1477,7 @@ ocaml_libvirt_storage_pool_lookup_by_uuid (value connv, value uuidv) + virStoragePoolPtr r; + + NONBLOCKING (r = virStoragePoolLookupByUUID (conn, uuid)); +- CHECK_ERROR (!r, conn, "virStoragePoolLookupByUUID"); ++ CHECK_ERROR (!r, "virStoragePoolLookupByUUID"); + + rv = Val_pool (r, connv); + +@@ -1532,7 +1499,7 @@ ocaml_libvirt_storage_pool_lookup_by_uuid_string (value connv, value strv) + virStoragePoolPtr r; + + NONBLOCKING (r = virStoragePoolLookupByUUIDString (conn, str)); +- CHECK_ERROR (!r, conn, "virStoragePoolLookupByUUIDString"); ++ CHECK_ERROR (!r, "virStoragePoolLookupByUUIDString"); + + rv = Val_pool (r, connv); + +@@ -1550,11 +1517,10 @@ ocaml_libvirt_storage_pool_get_name (value poolv) + + CAMLlocal1 (rv); + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + const char *r; + + NONBLOCKING (r = virStoragePoolGetName (pool)); +- CHECK_ERROR (!r, conn, "virStoragePoolGetName"); ++ CHECK_ERROR (!r, "virStoragePoolGetName"); + + rv = caml_copy_string (r); + CAMLreturn (rv); +@@ -1571,11 +1537,10 @@ ocaml_libvirt_storage_pool_get_xml_desc (value poolv) + + CAMLlocal1 (rv); + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + char *r; + + NONBLOCKING (r = virStoragePoolGetXMLDesc (pool, 0)); +- CHECK_ERROR (!r, conn, "virStoragePoolGetXMLDesc"); ++ CHECK_ERROR (!r, "virStoragePoolGetXMLDesc"); + + rv = caml_copy_string (r); + free (r); +@@ -1593,12 +1558,11 @@ ocaml_libvirt_storage_pool_get_uuid (value poolv) + + CAMLlocal1 (rv); + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + unsigned char uuid[VIR_UUID_BUFLEN]; + int r; + + NONBLOCKING (r = virStoragePoolGetUUID (pool, uuid)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolGetUUID"); ++ CHECK_ERROR (r == -1, "virStoragePoolGetUUID"); + + /* UUIDs are byte arrays with a fixed length. */ + rv = caml_alloc_string (VIR_UUID_BUFLEN); +@@ -1617,12 +1581,11 @@ ocaml_libvirt_storage_pool_get_uuid_string (value poolv) + + CAMLlocal1 (rv); + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + char uuid[VIR_UUID_STRING_BUFLEN]; + int r; + + NONBLOCKING (r = virStoragePoolGetUUIDString (pool, uuid)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolGetUUIDString"); ++ CHECK_ERROR (r == -1, "virStoragePoolGetUUIDString"); + + rv = caml_copy_string (uuid); + CAMLreturn (rv); +@@ -1643,7 +1606,7 @@ ocaml_libvirt_storage_pool_create_xml (value connv, value strv) + virStoragePoolPtr r; + + NONBLOCKING (r = virStoragePoolCreateXML (conn, str, 0)); +- CHECK_ERROR (!r, conn, "virStoragePoolCreateXML"); ++ CHECK_ERROR (!r, "virStoragePoolCreateXML"); + + rv = Val_pool (r, connv); + +@@ -1665,7 +1628,7 @@ ocaml_libvirt_storage_pool_define_xml (value connv, value strv) + virStoragePoolPtr r; + + NONBLOCKING (r = virStoragePoolDefineXML (conn, str, 0)); +- CHECK_ERROR (!r, conn, "virStoragePoolDefineXML"); ++ CHECK_ERROR (!r, "virStoragePoolDefineXML"); + + rv = Val_pool (r, connv); + +@@ -1682,12 +1645,11 @@ ocaml_libvirt_storage_pool_build (value poolv, value iv) + CAMLparam2 (poolv, iv); + + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + unsigned int i = Int_val (iv); + int r; + + NONBLOCKING (r = virStoragePoolBuild (pool, i)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolBuild"); ++ CHECK_ERROR (r == -1, "virStoragePoolBuild"); + + CAMLreturn (Val_unit); + } +@@ -1702,11 +1664,10 @@ ocaml_libvirt_storage_pool_undefine (value poolv) + CAMLparam1 (poolv); + + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + int r; + + NONBLOCKING (r = virStoragePoolUndefine (pool)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolUndefine"); ++ CHECK_ERROR (r == -1, "virStoragePoolUndefine"); + + CAMLreturn (Val_unit); + } +@@ -1721,11 +1682,10 @@ ocaml_libvirt_storage_pool_create (value poolv) + CAMLparam1 (poolv); + + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + int r; + + NONBLOCKING (r = virStoragePoolCreate (pool, 0)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolCreate"); ++ CHECK_ERROR (r == -1, "virStoragePoolCreate"); + + CAMLreturn (Val_unit); + } +@@ -1740,12 +1700,11 @@ ocaml_libvirt_storage_pool_delete (value poolv, value iv) + CAMLparam2 (poolv, iv); + + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + unsigned int i = Int_val (iv); + int r; + + NONBLOCKING (r = virStoragePoolDelete (pool, i)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolDelete"); ++ CHECK_ERROR (r == -1, "virStoragePoolDelete"); + + CAMLreturn (Val_unit); + } +@@ -1760,11 +1719,10 @@ ocaml_libvirt_storage_pool_refresh (value poolv) + CAMLparam1 (poolv); + + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + int r; + + NONBLOCKING (r = virStoragePoolRefresh (pool, 0)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolRefresh"); ++ CHECK_ERROR (r == -1, "virStoragePoolRefresh"); + + CAMLreturn (Val_unit); + } +@@ -1779,11 +1737,10 @@ ocaml_libvirt_storage_pool_get_autostart (value poolv) + CAMLparam1 (poolv); + + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + int r, b; + + NONBLOCKING (r = virStoragePoolGetAutostart (pool, &b)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolGetAutostart"); ++ CHECK_ERROR (r == -1, "virStoragePoolGetAutostart"); + + CAMLreturn (b ? Val_true : Val_false); + } +@@ -1798,13 +1755,12 @@ ocaml_libvirt_storage_pool_set_autostart (value poolv, value bv) + CAMLparam2 (poolv, bv); + + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + int r, b; + + b = bv == Val_true ? 1 : 0; + + NONBLOCKING (r = virStoragePoolSetAutostart (pool, b)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolSetAutostart"); ++ CHECK_ERROR (r == -1, "virStoragePoolSetAutostart"); + + CAMLreturn (Val_unit); + } +@@ -1819,11 +1775,10 @@ ocaml_libvirt_storage_pool_num_of_volumes (value poolv) + CAMLparam1 (poolv); + + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + int r; + + NONBLOCKING (r = virStoragePoolNumOfVolumes (pool)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolNumOfVolumes"); ++ CHECK_ERROR (r == -1, "virStoragePoolNumOfVolumes"); + + CAMLreturn (Val_int (r)); + } +@@ -1839,7 +1794,6 @@ ocaml_libvirt_storage_pool_list_volumes (value poolv, value iv) + + CAMLlocal2 (rv, strv); + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + int i = Int_val (iv); + char *names[i]; + int r; +@@ -1855,7 +1809,7 @@ ocaml_libvirt_storage_pool_list_volumes (value poolv, value iv) + } + + NONBLOCKING (r = virStoragePoolListVolumes (pool, names, i)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolListVolumes"); ++ CHECK_ERROR (r == -1, "virStoragePoolListVolumes"); + + rv = caml_alloc (r, 0); + for (i = 0; i < r; ++i) { +@@ -1877,11 +1831,10 @@ ocaml_libvirt_storage_vol_free (value volv) + CAMLparam1 (volv); + + virStorageVolPtr vol = Volume_val (volv); +- virConnectPtr conn = Connect_volv (volv); + int r; + + NONBLOCKING (r = virStorageVolFree (vol)); +- CHECK_ERROR (r == -1, conn, "virStorageVolFree"); ++ CHECK_ERROR (r == -1, "virStorageVolFree"); + + /* So that we don't double-free in the finalizer: */ + Volume_val (volv) = NULL; +@@ -1899,12 +1852,11 @@ ocaml_libvirt_storage_vol_delete (value volv, value iv) + CAMLparam2 (volv, iv); + + virStorageVolPtr vol = Volume_val (volv); +- virConnectPtr conn = Connect_volv (volv); + unsigned int i = Int_val (iv); + int r; + + NONBLOCKING (r = virStorageVolDelete (vol, i)); +- CHECK_ERROR (r == -1, conn, "virStorageVolDelete"); ++ CHECK_ERROR (r == -1, "virStorageVolDelete"); + + CAMLreturn (Val_unit); + } +@@ -1920,12 +1872,11 @@ ocaml_libvirt_storage_vol_lookup_by_name (value poolv, value strv) + + CAMLlocal2 (rv, connv); + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + char *str = String_val (strv); + virStorageVolPtr r; + + NONBLOCKING (r = virStorageVolLookupByName (pool, str)); +- CHECK_ERROR (!r, conn, "virStorageVolLookupByName"); ++ CHECK_ERROR (!r, "virStorageVolLookupByName"); + + connv = Field (poolv, 1); + rv = Val_volume (r, connv); +@@ -1948,7 +1899,7 @@ ocaml_libvirt_storage_vol_lookup_by_key (value connv, value strv) + virStorageVolPtr r; + + NONBLOCKING (r = virStorageVolLookupByKey (conn, str)); +- CHECK_ERROR (!r, conn, "virStorageVolLookupByKey"); ++ CHECK_ERROR (!r, "virStorageVolLookupByKey"); + + rv = Val_volume (r, connv); + +@@ -1970,7 +1921,7 @@ ocaml_libvirt_storage_vol_lookup_by_path (value connv, value strv) + virStorageVolPtr r; + + NONBLOCKING (r = virStorageVolLookupByPath (conn, str)); +- CHECK_ERROR (!r, conn, "virStorageVolLookupByPath"); ++ CHECK_ERROR (!r, "virStorageVolLookupByPath"); + + rv = Val_volume (r, connv); + +@@ -1988,12 +1939,11 @@ ocaml_libvirt_storage_vol_create_xml (value poolv, value strv) + + CAMLlocal2 (rv, connv); + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + char *str = String_val (strv); + virStorageVolPtr r; + + NONBLOCKING (r = virStorageVolCreateXML (pool, str, 0)); +- CHECK_ERROR (!r, conn, "virStorageVolCreateXML"); ++ CHECK_ERROR (!r, "virStorageVolCreateXML"); + + connv = Field (poolv, 1); + rv = Val_volume (r, connv); +@@ -2012,11 +1962,10 @@ ocaml_libvirt_storage_vol_get_xml_desc (value volv) + + CAMLlocal1 (rv); + virStorageVolPtr vol = Volume_val (volv); +- virConnectPtr conn = Connect_volv (volv); + char *r; + + NONBLOCKING (r = virStorageVolGetXMLDesc (vol, 0)); +- CHECK_ERROR (!r, conn, "virStorageVolGetXMLDesc"); ++ CHECK_ERROR (!r, "virStorageVolGetXMLDesc"); + + rv = caml_copy_string (r); + free (r); +@@ -2034,11 +1983,10 @@ ocaml_libvirt_storage_vol_get_path (value volv) + + CAMLlocal1 (rv); + virStorageVolPtr vol = Volume_val (volv); +- virConnectPtr conn = Connect_volv (volv); + char *r; + + NONBLOCKING (r = virStorageVolGetPath (vol)); +- CHECK_ERROR (!r, conn, "virStorageVolGetPath"); ++ CHECK_ERROR (!r, "virStorageVolGetPath"); + + rv = caml_copy_string (r); + free (r); +@@ -2056,11 +2004,10 @@ ocaml_libvirt_storage_vol_get_key (value volv) + + CAMLlocal1 (rv); + virStorageVolPtr vol = Volume_val (volv); +- virConnectPtr conn = Connect_volv (volv); + const char *r; + + NONBLOCKING (r = virStorageVolGetKey (vol)); +- CHECK_ERROR (!r, conn, "virStorageVolGetKey"); ++ CHECK_ERROR (!r, "virStorageVolGetKey"); + + rv = caml_copy_string (r); + CAMLreturn (rv); +@@ -2077,11 +2024,10 @@ ocaml_libvirt_storage_vol_get_name (value volv) + + CAMLlocal1 (rv); + virStorageVolPtr vol = Volume_val (volv); +- virConnectPtr conn = Connect_volv (volv); + const char *r; + + NONBLOCKING (r = virStorageVolGetName (vol)); +- CHECK_ERROR (!r, conn, "virStorageVolGetName"); ++ CHECK_ERROR (!r, "virStorageVolGetName"); + + rv = caml_copy_string (r); + CAMLreturn (rv); +@@ -2098,11 +2044,10 @@ ocaml_libvirt_storage_pool_lookup_by_volume (value volv) + + CAMLlocal2 (rv, connv); + virStorageVolPtr vol = Volume_val (volv); +- virConnectPtr conn = Connect_volv (volv); + virStoragePoolPtr r; + + NONBLOCKING (r = virStoragePoolLookupByVolume (vol)); +- CHECK_ERROR (!r, conn, "virStoragePoolLookupByVolume"); ++ CHECK_ERROR (!r, "virStoragePoolLookupByVolume"); + + connv = Field (volv, 1); + rv = Val_pool (r, connv); +diff --git a/libvirt/libvirt_c_epilogue.c b/libvirt/libvirt_c_epilogue.c +index 4649724..4972e50 100644 +--- a/libvirt/libvirt_c_epilogue.c ++++ b/libvirt/libvirt_c_epilogue.c +@@ -57,14 +57,14 @@ option_default (value option, value deflt) + #endif + + static void +-_raise_virterror (virConnectPtr conn, const char *fn) ++_raise_virterror (const char *fn) + { + CAMLparam0 (); + CAMLlocal1 (rv); + virErrorPtr errp; + struct _virError err; + +- errp = conn ? virConnGetLastError (conn) : virGetLastError (); ++ errp = virGetLastError (); + + if (!errp) { + /* Fake a _virError structure. */ +diff --git a/libvirt/libvirt_c_oneoffs.c b/libvirt/libvirt_c_oneoffs.c +index 06b3852..32e5a4b 100644 +--- a/libvirt/libvirt_c_oneoffs.c ++++ b/libvirt/libvirt_c_oneoffs.c +@@ -32,7 +32,7 @@ ocaml_libvirt_get_version (value driverv, value unit) + + typeVer_ptr = driver ? &typeVer : NULL; + NONBLOCKING (r = virGetVersion (&libVer, driver, typeVer_ptr)); +- CHECK_ERROR (r == -1, NULL, "virGetVersion"); ++ CHECK_ERROR (r == -1, "virGetVersion"); + + rv = caml_alloc_tuple (2); + Store_field (rv, 0, Val_int (libVer)); +@@ -53,7 +53,7 @@ ocaml_libvirt_connect_open (value namev, value unit) + virConnectPtr conn; + + NONBLOCKING (conn = virConnectOpen (name)); +- CHECK_ERROR (!conn, NULL, "virConnectOpen"); ++ CHECK_ERROR (!conn, "virConnectOpen"); + + rv = Val_connect (conn); + +@@ -69,7 +69,7 @@ ocaml_libvirt_connect_open_readonly (value namev, value unit) + virConnectPtr conn; + + NONBLOCKING (conn = virConnectOpenReadOnly (name)); +- CHECK_ERROR (!conn, NULL, "virConnectOpen"); ++ CHECK_ERROR (!conn, "virConnectOpen"); + + rv = Val_connect (conn); + +@@ -85,7 +85,7 @@ ocaml_libvirt_connect_get_version (value connv) + int r; + + NONBLOCKING (r = virConnectGetVersion (conn, &hvVer)); +- CHECK_ERROR (r == -1, conn, "virConnectGetVersion"); ++ CHECK_ERROR (r == -1, "virConnectGetVersion"); + + CAMLreturn (Val_int (hvVer)); + } +@@ -99,7 +99,7 @@ ocaml_libvirt_connect_get_max_vcpus (value connv, value typev) + int r; + + NONBLOCKING (r = virConnectGetMaxVcpus (conn, type)); +- CHECK_ERROR (r == -1, conn, "virConnectGetMaxVcpus"); ++ CHECK_ERROR (r == -1, "virConnectGetMaxVcpus"); + + CAMLreturn (Val_int (r)); + } +@@ -114,7 +114,7 @@ ocaml_libvirt_connect_get_node_info (value connv) + int r; + + NONBLOCKING (r = virNodeGetInfo (conn, &info)); +- CHECK_ERROR (r == -1, conn, "virNodeGetInfo"); ++ CHECK_ERROR (r == -1, "virNodeGetInfo"); + + rv = caml_alloc (8, 0); + v = caml_copy_string (info.model); Store_field (rv, 0, v); +@@ -138,7 +138,7 @@ ocaml_libvirt_connect_node_get_free_memory (value connv) + unsigned long long r; + + NONBLOCKING (r = virNodeGetFreeMemory (conn)); +- CHECK_ERROR (r == 0, conn, "virNodeGetFreeMemory"); ++ CHECK_ERROR (r == 0, "virNodeGetFreeMemory"); + + rv = caml_copy_int64 ((int64_t) r); + CAMLreturn (rv); +@@ -157,7 +157,7 @@ ocaml_libvirt_connect_node_get_cells_free_memory (value connv, + unsigned long long freemems[max]; + + NONBLOCKING (r = virNodeGetCellsFreeMemory (conn, freemems, start, max)); +- CHECK_ERROR (r == -1, conn, "virNodeGetCellsFreeMemory"); ++ CHECK_ERROR (r == -1, "virNodeGetCellsFreeMemory"); + + rv = caml_alloc (r, 0); + for (i = 0; i < r; ++i) { +@@ -179,7 +179,7 @@ ocaml_libvirt_connect_set_keep_alive(value connv, + int r; + + NONBLOCKING(r = virConnectSetKeepAlive(conn, interval, count)); +- CHECK_ERROR (r == -1, conn, "virConnectSetKeepAlive"); ++ CHECK_ERROR (r == -1, "virConnectSetKeepAlive"); + + CAMLreturn(Val_unit); + } +@@ -190,7 +190,6 @@ ocaml_libvirt_domain_get_id (value domv) + { + CAMLparam1 (domv); + virDomainPtr dom = Domain_val (domv); +- /*virConnectPtr conn = Connect_domv (domv);*/ + unsigned int r; + + NONBLOCKING (r = virDomainGetID (dom)); +@@ -208,11 +207,10 @@ ocaml_libvirt_domain_get_max_memory (value domv) + CAMLparam1 (domv); + CAMLlocal1 (rv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + unsigned long r; + + NONBLOCKING (r = virDomainGetMaxMemory (dom)); +- CHECK_ERROR (r == 0 /* [sic] */, conn, "virDomainGetMaxMemory"); ++ CHECK_ERROR (r == 0 /* [sic] */, "virDomainGetMaxMemory"); + + rv = caml_copy_int64 (r); + CAMLreturn (rv); +@@ -223,12 +221,11 @@ ocaml_libvirt_domain_set_max_memory (value domv, value memv) + { + CAMLparam2 (domv, memv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + unsigned long mem = Int64_val (memv); + int r; + + NONBLOCKING (r = virDomainSetMaxMemory (dom, mem)); +- CHECK_ERROR (r == -1, conn, "virDomainSetMaxMemory"); ++ CHECK_ERROR (r == -1, "virDomainSetMaxMemory"); + + CAMLreturn (Val_unit); + } +@@ -238,12 +235,11 @@ ocaml_libvirt_domain_set_memory (value domv, value memv) + { + CAMLparam2 (domv, memv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + unsigned long mem = Int64_val (memv); + int r; + + NONBLOCKING (r = virDomainSetMemory (dom, mem)); +- CHECK_ERROR (r == -1, conn, "virDomainSetMemory"); ++ CHECK_ERROR (r == -1, "virDomainSetMemory"); + + CAMLreturn (Val_unit); + } +@@ -254,12 +250,11 @@ ocaml_libvirt_domain_get_info (value domv) + CAMLparam1 (domv); + CAMLlocal2 (rv, v); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + virDomainInfo info; + int r; + + NONBLOCKING (r = virDomainGetInfo (dom, &info)); +- CHECK_ERROR (r == -1, conn, "virDomainGetInfo"); ++ CHECK_ERROR (r == -1, "virDomainGetInfo"); + + rv = caml_alloc (5, 0); + Store_field (rv, 0, Val_int (info.state)); // These flags are compatible. +@@ -277,12 +272,11 @@ ocaml_libvirt_domain_get_scheduler_type (value domv) + CAMLparam1 (domv); + CAMLlocal2 (rv, strv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + char *r; + int nparams; + + NONBLOCKING (r = virDomainGetSchedulerType (dom, &nparams)); +- CHECK_ERROR (!r, conn, "virDomainGetSchedulerType"); ++ CHECK_ERROR (!r, "virDomainGetSchedulerType"); + + rv = caml_alloc_tuple (2); + strv = caml_copy_string (r); Store_field (rv, 0, strv); +@@ -297,13 +291,12 @@ ocaml_libvirt_domain_get_scheduler_parameters (value domv, value nparamsv) + CAMLparam2 (domv, nparamsv); + CAMLlocal4 (rv, v, v2, v3); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int nparams = Int_val (nparamsv); + virSchedParameter params[nparams]; + int r, i; + + NONBLOCKING (r = virDomainGetSchedulerParameters (dom, params, &nparams)); +- CHECK_ERROR (r == -1, conn, "virDomainGetSchedulerParameters"); ++ CHECK_ERROR (r == -1, "virDomainGetSchedulerParameters"); + + rv = caml_alloc (nparams, 0); + for (i = 0; i < nparams; ++i) { +@@ -348,7 +341,6 @@ ocaml_libvirt_domain_set_scheduler_parameters (value domv, value paramsv) + CAMLparam2 (domv, paramsv); + CAMLlocal1 (v); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int nparams = Wosize_val (paramsv); + virSchedParameter params[nparams]; + int r, i; +@@ -391,7 +383,7 @@ ocaml_libvirt_domain_set_scheduler_parameters (value domv, value paramsv) + } + + NONBLOCKING (r = virDomainSetSchedulerParameters (dom, params, nparams)); +- CHECK_ERROR (r == -1, conn, "virDomainSetSchedulerParameters"); ++ CHECK_ERROR (r == -1, "virDomainSetSchedulerParameters"); + + CAMLreturn (Val_unit); + } +@@ -401,11 +393,10 @@ ocaml_libvirt_domain_set_vcpus (value domv, value nvcpusv) + { + CAMLparam2 (domv, nvcpusv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int r, nvcpus = Int_val (nvcpusv); + + NONBLOCKING (r = virDomainSetVcpus (dom, nvcpus)); +- CHECK_ERROR (r == -1, conn, "virDomainSetVcpus"); ++ CHECK_ERROR (r == -1, "virDomainSetVcpus"); + + CAMLreturn (Val_unit); + } +@@ -415,14 +406,13 @@ ocaml_libvirt_domain_pin_vcpu (value domv, value vcpuv, value cpumapv) + { + CAMLparam3 (domv, vcpuv, cpumapv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int maplen = caml_string_length (cpumapv); + unsigned char *cpumap = (unsigned char *) String_val (cpumapv); + int vcpu = Int_val (vcpuv); + int r; + + NONBLOCKING (r = virDomainPinVcpu (dom, vcpu, cpumap, maplen)); +- CHECK_ERROR (r == -1, conn, "virDomainPinVcpu"); ++ CHECK_ERROR (r == -1, "virDomainPinVcpu"); + + CAMLreturn (Val_unit); + } +@@ -433,7 +423,6 @@ ocaml_libvirt_domain_get_vcpus (value domv, value maxinfov, value maplenv) + CAMLparam3 (domv, maxinfov, maplenv); + CAMLlocal5 (rv, infov, strv, v, v2); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int maxinfo = Int_val (maxinfov); + int maplen = Int_val (maplenv); + virVcpuInfo info[maxinfo]; +@@ -444,7 +433,7 @@ ocaml_libvirt_domain_get_vcpus (value domv, value maxinfov, value maplenv) + memset (cpumaps, 0, maxinfo * maplen); + + NONBLOCKING (r = virDomainGetVcpus (dom, info, maxinfo, cpumaps, maplen)); +- CHECK_ERROR (r == -1, conn, "virDomainPinVcpu"); ++ CHECK_ERROR (r == -1, "virDomainPinVcpu"); + + /* Copy the virVcpuInfo structures. */ + infov = caml_alloc (maxinfo, 0); +@@ -476,18 +465,17 @@ ocaml_libvirt_domain_get_cpu_stats (value domv) + CAMLlocal5 (cpustats, param_head, param_node, typed_param, typed_param_value); + CAMLlocal1 (v); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + virTypedParameterPtr params; + int r, cpu, ncpus, nparams, i, j, pos; + int nr_pcpus; + + /* get number of pcpus */ + NONBLOCKING (nr_pcpus = virDomainGetCPUStats(dom, NULL, 0, 0, 0, 0)); +- CHECK_ERROR (nr_pcpus < 0, conn, "virDomainGetCPUStats"); ++ CHECK_ERROR (nr_pcpus < 0, "virDomainGetCPUStats"); + + /* get percpu information */ + NONBLOCKING (nparams = virDomainGetCPUStats(dom, NULL, 0, 0, 1, 0)); +- CHECK_ERROR (nparams < 0, conn, "virDomainGetCPUStats"); ++ CHECK_ERROR (nparams < 0, "virDomainGetCPUStats"); + + if ((params = malloc(sizeof(*params) * nparams * 128)) == NULL) + caml_failwith ("virDomainGetCPUStats: malloc"); +@@ -498,7 +486,7 @@ ocaml_libvirt_domain_get_cpu_stats (value domv) + ncpus = nr_pcpus - cpu > 128 ? 128 : nr_pcpus - cpu; + + NONBLOCKING (r = virDomainGetCPUStats(dom, params, nparams, cpu, ncpus, 0)); +- CHECK_ERROR (r < 0, conn, "virDomainGetCPUStats"); ++ CHECK_ERROR (r < 0, "virDomainGetCPUStats"); + + for (i = 0; i < ncpus; i++) { + /* list of typed_param: single linked list of param_nodes */ +@@ -579,7 +567,6 @@ ocaml_libvirt_domain_migrate_native (value domv, value dconnv, value flagsv, val + CAMLxparam2 (optbandwidthv, unitv); + CAMLlocal2 (flagv, rv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + virConnectPtr dconn = Connect_val (dconnv); + int flags = 0; + const char *dname = Optstring_val (optdnamev); +@@ -601,7 +588,7 @@ ocaml_libvirt_domain_migrate_native (value domv, value dconnv, value flagsv, val + bandwidth = Int_val (Field (optbandwidthv, 0)); + + NONBLOCKING (r = virDomainMigrate (dom, dconn, flags, dname, uri, bandwidth)); +- CHECK_ERROR (!r, conn, "virDomainMigrate"); ++ CHECK_ERROR (!r, "virDomainMigrate"); + + rv = Val_domain (r, dconnv); + +@@ -622,13 +609,12 @@ ocaml_libvirt_domain_block_stats (value domv, value pathv) + CAMLparam2 (domv, pathv); + CAMLlocal2 (rv,v); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + char *path = String_val (pathv); + struct _virDomainBlockStats stats; + int r; + + NONBLOCKING (r = virDomainBlockStats (dom, path, &stats, sizeof stats)); +- CHECK_ERROR (r == -1, conn, "virDomainBlockStats"); ++ CHECK_ERROR (r == -1, "virDomainBlockStats"); + + rv = caml_alloc (5, 0); + v = caml_copy_int64 (stats.rd_req); Store_field (rv, 0, v); +@@ -646,13 +632,12 @@ ocaml_libvirt_domain_interface_stats (value domv, value pathv) + CAMLparam2 (domv, pathv); + CAMLlocal2 (rv,v); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + char *path = String_val (pathv); + struct _virDomainInterfaceStats stats; + int r; + + NONBLOCKING (r = virDomainInterfaceStats (dom, path, &stats, sizeof stats)); +- CHECK_ERROR (r == -1, conn, "virDomainInterfaceStats"); ++ CHECK_ERROR (r == -1, "virDomainInterfaceStats"); + + rv = caml_alloc (8, 0); + v = caml_copy_int64 (stats.rx_bytes); Store_field (rv, 0, v); +@@ -673,7 +658,6 @@ ocaml_libvirt_domain_block_peek_native (value domv, value pathv, value offsetv, + CAMLparam5 (domv, pathv, offsetv, sizev, bufferv); + CAMLxparam1 (boffv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + const char *path = String_val (pathv); + unsigned long long offset = Int64_val (offsetv); + size_t size = Int_val (sizev); +@@ -687,7 +671,7 @@ ocaml_libvirt_domain_block_peek_native (value domv, value pathv, value offsetv, + + /* NB. not NONBLOCKING because buffer might move (XXX) */ + r = virDomainBlockPeek (dom, path, offset, size, buffer+boff, 0); +- CHECK_ERROR (r == -1, conn, "virDomainBlockPeek"); ++ CHECK_ERROR (r == -1, "virDomainBlockPeek"); + + CAMLreturn (Val_unit); + } +@@ -706,7 +690,6 @@ ocaml_libvirt_domain_memory_peek_native (value domv, value flagsv, value offsetv + CAMLxparam1 (boffv); + CAMLlocal1 (flagv); + virDomainPtr dom = Domain_val (domv); +- virConnectPtr conn = Connect_domv (domv); + int flags = 0; + unsigned long long offset = Int64_val (offsetv); + size_t size = Int_val (sizev); +@@ -728,7 +711,7 @@ ocaml_libvirt_domain_memory_peek_native (value domv, value flagsv, value offsetv + + /* NB. not NONBLOCKING because buffer might move (XXX) */ + r = virDomainMemoryPeek (dom, offset, size, buffer+boff, flags); +- CHECK_ERROR (r == -1, conn, "virDomainMemoryPeek"); ++ CHECK_ERROR (r == -1, "virDomainMemoryPeek"); + + CAMLreturn (Val_unit); + } +@@ -1042,7 +1025,6 @@ CAMLprim value + ocaml_libvirt_event_add_timeout (value connv, value ms, value callback_id) + { + CAMLparam3 (connv, ms, callback_id); +- virConnectPtr conn = Connect_val (connv); + void *opaque; + virFreeCallback freecb = free; + virEventTimeoutCallback cb = timeout_callback; +@@ -1055,7 +1037,7 @@ ocaml_libvirt_event_add_timeout (value connv, value ms, value callback_id) + caml_failwith ("virEventAddTimeout: malloc"); + *((long*)opaque) = Int64_val(callback_id); + NONBLOCKING(r = virEventAddTimeout(Int_val(ms), cb, opaque, freecb)); +- CHECK_ERROR(r == -1, conn, "virEventAddTimeout"); ++ CHECK_ERROR(r == -1, "virEventAddTimeout"); + + CAMLreturn(Val_int(r)); + } +@@ -1064,11 +1046,10 @@ CAMLprim value + ocaml_libvirt_event_remove_timeout (value connv, value timer_id) + { + CAMLparam2 (connv, timer_id); +- virConnectPtr conn = Connect_val (connv); + int r; + + NONBLOCKING(r = virEventRemoveTimeout(Int_val(timer_id))); +- CHECK_ERROR(r == -1, conn, "virEventRemoveTimeout"); ++ CHECK_ERROR(r == -1, "virEventRemoveTimeout"); + + CAMLreturn(Val_int(r)); + } +@@ -1146,7 +1127,7 @@ ocaml_libvirt_connect_domain_event_register_any(value connv, value domv, value c + caml_failwith ("virConnectDomainEventRegisterAny: malloc"); + *((long*)opaque) = Int64_val(callback_id); + NONBLOCKING(r = virConnectDomainEventRegisterAny(conn, dom, eventID, cb, opaque, freecb)); +- CHECK_ERROR(r == -1, conn, "virConnectDomainEventRegisterAny"); ++ CHECK_ERROR(r == -1, "virConnectDomainEventRegisterAny"); + + CAMLreturn(Val_int(r)); + } +@@ -1157,12 +1138,11 @@ ocaml_libvirt_storage_pool_get_info (value poolv) + CAMLparam1 (poolv); + CAMLlocal2 (rv, v); + virStoragePoolPtr pool = Pool_val (poolv); +- virConnectPtr conn = Connect_polv (poolv); + virStoragePoolInfo info; + int r; + + NONBLOCKING (r = virStoragePoolGetInfo (pool, &info)); +- CHECK_ERROR (r == -1, conn, "virStoragePoolGetInfo"); ++ CHECK_ERROR (r == -1, "virStoragePoolGetInfo"); + + rv = caml_alloc (4, 0); + Store_field (rv, 0, Val_int (info.state)); +@@ -1179,12 +1159,11 @@ ocaml_libvirt_storage_vol_get_info (value volv) + CAMLparam1 (volv); + CAMLlocal2 (rv, v); + virStorageVolPtr vol = Volume_val (volv); +- virConnectPtr conn = Connect_volv (volv); + virStorageVolInfo info; + int r; + + NONBLOCKING (r = virStorageVolGetInfo (vol, &info)); +- CHECK_ERROR (r == -1, conn, "virStorageVolGetInfo"); ++ CHECK_ERROR (r == -1, "virStorageVolGetInfo"); + + rv = caml_alloc (3, 0); + Store_field (rv, 0, Val_int (info.type)); +@@ -1239,6 +1218,12 @@ ocaml_libvirt_virterror_reset_last_conn_error (value connv) + + /*----------------------------------------------------------------------*/ + ++static void ++ignore_errors (void *user_data, virErrorPtr error) ++{ ++ /* do nothing */ ++} ++ + /* Initialise the library. */ + CAMLprim value + ocaml_libvirt_init (value unit) +@@ -1247,8 +1232,9 @@ ocaml_libvirt_init (value unit) + CAMLlocal1 (rv); + int r; + ++ virSetErrorFunc (NULL, ignore_errors); + r = virInitialize (); +- CHECK_ERROR (r == -1, NULL, "virInitialize"); ++ CHECK_ERROR (r == -1, "virInitialize"); + + CAMLreturn (Val_unit); + } +diff --git a/libvirt/libvirt_c_prologue.c b/libvirt/libvirt_c_prologue.c +index 7d9c0f5..bf972e9 100644 +--- a/libvirt/libvirt_c_prologue.c ++++ b/libvirt/libvirt_c_prologue.c +@@ -24,7 +24,7 @@ static char *Optstring_val (value strv); + typedef value (*Val_ptr_t) (void *); + static value Val_opt (void *ptr, Val_ptr_t Val_ptr); + /*static value option_default (value option, value deflt);*/ +-static void _raise_virterror (virConnectPtr conn, const char *fn) Noreturn; ++static void _raise_virterror (const char *fn) Noreturn; + static void not_supported (const char *fn) Noreturn; + static value Val_virterror (virErrorPtr err); + +@@ -43,8 +43,8 @@ static value Val_virterror (virErrorPtr err); + /* Check error condition from a libvirt function, and automatically raise + * an exception if one is found. + */ +-#define CHECK_ERROR(cond, conn, fn) \ +- do { if (cond) _raise_virterror (conn, fn); } while (0) ++#define CHECK_ERROR(cond, fn) \ ++ do { if (cond) _raise_virterror (fn); } while (0) + + /*----------------------------------------------------------------------*/ + +-- +2.3.1 + diff --git a/0002-Don-t-bother-checking-return-from-virInitialize.patch b/0002-Don-t-bother-checking-return-from-virInitialize.patch new file mode 100644 index 0000000..bbf01a6 --- /dev/null +++ b/0002-Don-t-bother-checking-return-from-virInitialize.patch @@ -0,0 +1,32 @@ +From 06b24089986523806d386b9e3cfa4fcf5eeb87e6 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 17 Mar 2015 12:53:29 +0000 +Subject: [PATCH 2/2] Don't bother checking return from virInitialize. + +The Perl bindings don't do this, and it seems that the call can never +fail, or if it does we don't care. +--- + libvirt/libvirt_c_oneoffs.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/libvirt/libvirt_c_oneoffs.c b/libvirt/libvirt_c_oneoffs.c +index 32e5a4b..5d82194 100644 +--- a/libvirt/libvirt_c_oneoffs.c ++++ b/libvirt/libvirt_c_oneoffs.c +@@ -1229,12 +1229,9 @@ CAMLprim value + ocaml_libvirt_init (value unit) + { + CAMLparam1 (unit); +- CAMLlocal1 (rv); +- int r; + + virSetErrorFunc (NULL, ignore_errors); +- r = virInitialize (); +- CHECK_ERROR (r == -1, "virInitialize"); ++ virInitialize (); + + CAMLreturn (Val_unit); + } +-- +2.3.1 + diff --git a/ocaml-libvirt.spec b/ocaml-libvirt.spec index 36b8151..4dfda0a 100644 --- a/ocaml-libvirt.spec +++ b/ocaml-libvirt.spec @@ -2,7 +2,7 @@ Name: ocaml-libvirt Version: 0.6.1.4 -Release: 5%{?dist} +Release: 6%{?dist} Summary: OCaml binding for libvirt License: LGPLv2+ @@ -15,6 +15,10 @@ Patch1: 0001-Use-C99-standard-int64_t-instead-of-OCaml-defined-an.patch # Upstream patch to add virDomainCreateXML binding. Patch2: 0001-Add-a-binding-for-virDomainCreateXML.patch +# Upstream patches to fix error handling. +Patch3: 0001-Suppress-errors-to-stderr-and-use-thread-local-virEr.patch +Patch4: 0002-Don-t-bother-checking-return-from-virInitialize.patch + ExcludeArch: sparc64 s390 s390x BuildRequires: ocaml >= 3.10.0 @@ -45,6 +49,8 @@ developing applications that use %{name}. %patch1 -p1 %patch2 -p1 +%patch3 -p1 +%patch4 -p1 %build @@ -92,6 +98,9 @@ make install-byte %changelog +* Tue Mar 17 2015 Richard W.M. Jones - 0.6.1.4-6 +- Add upstream patches to fix error handling. + * Fri Mar 6 2015 Richard W.M. Jones - 0.6.1.4-5 - Add binding for virDomainCreateXML.