X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=libvirt%2Flibvirt_c_oneoffs.c;h=4d69bd1d6f479d5944fb04c0d78efd6d3747b3ec;hb=4d988dada41d62c5f40a24c69220184ff6b079e0;hp=14045f643decd5ae74f8d4a81128fdfa0abf8f74;hpb=3b39f65412f3583fb4a3c7c833da09e7c22a64a9;p=ocaml-libvirt.git diff --git a/libvirt/libvirt_c_oneoffs.c b/libvirt/libvirt_c_oneoffs.c index 14045f6..4d69bd1 100644 --- a/libvirt/libvirt_c_oneoffs.c +++ b/libvirt/libvirt_c_oneoffs.c @@ -194,6 +194,96 @@ ocaml_libvirt_connect_node_get_cells_free_memory (value connv, #endif } +#ifdef HAVE_WEAK_SYMBOLS +#ifdef HAVE_VIRCONNECTLISTALLDOMAINS +extern int virConnectListAllDomains (virConnectPtr conn, + virDomainPtr **domains, + virDomainInfo **infos, + int stateflags) + __attribute__((weak)); +#endif +#endif + +CAMLprim value +ocaml_libvirt_connect_list_all_domains (value connv, + value wantinfov, + value flagsv) +{ +#ifdef HAVE_VIRCONNECTLISTALLDOMAINS + CAMLparam3 (connv, wantinfov, flagsv); + CAMLlocal4 (flagv, rv, rv1, rv2); + CAMLlocal2 (v1, v2); + virConnectPtr conn = Connect_val (connv); + virDomainPtr *domains; + virDomainInfo *infos; + int want_info, i, r, flag, flags = 0; + + /* ?want_info */ + if (wantinfov == Val_int (0)) /* None == true */ + want_info = 1; + else + want_info = Bool_val (Field (wantinfov, 0)); + + /* Iterate over the list of flags. */ + for (; flagsv != Val_int (0); flagsv = Field (flagsv, 1)) { + flagv = Field (flagsv, 0); + flag = Int_val (flagv); + switch (flag) { + case 0: flags |= VIR_DOMAIN_LIST_NOSTATE; break; + case 1: flags |= VIR_DOMAIN_LIST_RUNNING; break; + case 2: flags |= VIR_DOMAIN_LIST_BLOCKED; break; + case 3: flags |= VIR_DOMAIN_LIST_PAUSED; break; + case 4: flags |= VIR_DOMAIN_LIST_SHUTDOWN; break; + case 5: flags |= VIR_DOMAIN_LIST_SHUTOFF; break; + case 6: flags |= VIR_DOMAIN_LIST_CRASHED; break; + case 7: flags |= VIR_DOMAIN_LIST_ACTIVE; break; + case 8: flags |= VIR_DOMAIN_LIST_INACTIVE; break; + case 9: flags |= VIR_DOMAIN_LIST_ALL; break; + } + } + + WEAK_SYMBOL_CHECK (virConnectListAllDomains); + NONBLOCKING (r = virConnectListAllDomains (conn, &domains, + want_info ? &infos : NULL, + flags)); + CHECK_ERROR (r == -1, conn, "virConnectListAllDomains"); + + /* Convert the result into a pair of arrays. */ + rv1 = caml_alloc (r, 0); + for (i = 0; i < r; ++i) { + v1 = Val_domain (domains[i], connv); + Store_field (rv1, i, v1); + } + free (domains); + + if (want_info) { + rv2 = caml_alloc (r, 0); + + for (i = 0; i < r; ++i) { + v1 = caml_alloc (5, 0); + Store_field (v1, 0, Val_int (infos[i].state)); + v2 = caml_copy_int64 (infos[i].maxMem); Store_field (v1, 1, v2); + v2 = caml_copy_int64 (infos[i].memory); Store_field (v1, 2, v2); + Store_field (v1, 3, Val_int (infos[i].nrVirtCpu)); + v2 = caml_copy_int64 (infos[i].cpuTime); Store_field (v1, 4, v2); + + Store_field (rv2, i, v1); + } + + free (infos); + } + else + rv2 = caml_alloc (0, 0); /* zero-length array */ + + rv = caml_alloc_tuple (2); + Store_field (rv, 0, rv1); + Store_field (rv, 1, rv2); + CAMLreturn (rv); +#else + not_supported ("virConnectListAllDomains"); +#endif +} + CAMLprim value ocaml_libvirt_domain_get_id (value domv) { @@ -549,7 +639,7 @@ ocaml_libvirt_domain_migrate_native (value domv, value dconnv, value flagsv, val for (; flagsv != Val_int (0); flagsv = Field (flagsv, 1)) { flagv = Field (flagsv, 0); - if (flagv == Int_val(0)) + if (flagv == Val_int (0)) flags |= VIR_MIGRATE_LIVE; } @@ -713,7 +803,7 @@ ocaml_libvirt_domain_block_peek_bytecode (value *argv, int argn) #ifdef HAVE_WEAK_SYMBOLS #ifdef HAVE_VIRDOMAINMEMORYPEEK extern int virDomainMemoryPeek (virDomainPtr domain, - unsigned long long offset, + unsigned long long start, size_t size, void *buffer, unsigned int flags) @@ -722,7 +812,7 @@ extern int virDomainMemoryPeek (virDomainPtr domain, #endif CAMLprim value -ocaml_libvirt_domain_memory_peek_native (value domv, int flagsv, value offsetv, value sizev, value bufferv, value boffv) +ocaml_libvirt_domain_memory_peek_native (value domv, value flagsv, value offsetv, value sizev, value bufferv, value boffv) { #ifdef HAVE_VIRDOMAINMEMORYPEEK CAMLparam5 (domv, flagsv, offsetv, sizev, bufferv); @@ -739,13 +829,13 @@ ocaml_libvirt_domain_memory_peek_native (value domv, int flagsv, value offsetv, /* Check that the return buffer is big enough. */ if (caml_string_length (bufferv) < boff + size) - caml_failwith ("virDomainBlockPeek: return buffer too short"); + caml_failwith ("virDomainMemoryPeek: return buffer too short"); /* Do flags. */ for (; flagsv != Val_int (0); flagsv = Field (flagsv, 1)) { flagv = Field (flagsv, 0); - if (flagv == Int_val (0)) + if (flagv == Val_int (0)) flags |= VIR_MEMORY_VIRTUAL; }