Remove backwards compatability logic to simplify the bindings
[ocaml-libvirt.git] / libvirt / libvirt_c_oneoffs.c
index 29a1c05..42301b7 100644 (file)
@@ -129,47 +129,25 @@ ocaml_libvirt_connect_get_node_info (value connv)
   CAMLreturn (rv);
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRNODEGETFREEMEMORY
-extern unsigned long long virNodeGetFreeMemory (virConnectPtr conn)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 ocaml_libvirt_connect_node_get_free_memory (value connv)
 {
-#ifdef HAVE_VIRNODEGETFREEMEMORY
   CAMLparam1 (connv);
   CAMLlocal1 (rv);
   virConnectPtr conn = Connect_val (connv);
   unsigned long long r;
 
-  WEAK_SYMBOL_CHECK (virNodeGetFreeMemory);
   NONBLOCKING (r = virNodeGetFreeMemory (conn));
   CHECK_ERROR (r == 0, conn, "virNodeGetFreeMemory");
 
   rv = caml_copy_int64 ((int64) r);
   CAMLreturn (rv);
-#else
-  not_supported ("virNodeGetFreeMemory");
-#endif
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRNODEGETCELLSFREEMEMORY
-extern int virNodeGetCellsFreeMemory (virConnectPtr conn,
-                                     unsigned long long *freeMems,
-                                     int startCell, int maxCells)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 ocaml_libvirt_connect_node_get_cells_free_memory (value connv,
                                                  value startv, value maxv)
 {
-#ifdef HAVE_VIRNODEGETCELLSFREEMEMORY
   CAMLparam3 (connv, startv, maxv);
   CAMLlocal2 (rv, iv);
   virConnectPtr conn = Connect_val (connv);
@@ -178,7 +156,6 @@ ocaml_libvirt_connect_node_get_cells_free_memory (value connv,
   int r, i;
   unsigned long long freemems[max];
 
-  WEAK_SYMBOL_CHECK (virNodeGetCellsFreeMemory);
   NONBLOCKING (r = virNodeGetCellsFreeMemory (conn, freemems, start, max));
   CHECK_ERROR (r == -1, conn, "virNodeGetCellsFreeMemory");
 
@@ -189,9 +166,6 @@ ocaml_libvirt_connect_node_get_cells_free_memory (value connv,
   }
 
   CAMLreturn (rv);
-#else
-  not_supported ("virNodeGetCellsFreeMemory");
-#endif
 }
 
 CAMLprim value
@@ -280,18 +254,9 @@ ocaml_libvirt_domain_get_info (value domv)
   CAMLreturn (rv);
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRDOMAINGETSCHEDULERTYPE
-extern char *virDomainGetSchedulerType(virDomainPtr domain,
-                                      int *nparams)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 ocaml_libvirt_domain_get_scheduler_type (value domv)
 {
-#ifdef HAVE_VIRDOMAINGETSCHEDULERTYPE
   CAMLparam1 (domv);
   CAMLlocal2 (rv, strv);
   virDomainPtr dom = Domain_val (domv);
@@ -299,7 +264,6 @@ ocaml_libvirt_domain_get_scheduler_type (value domv)
   char *r;
   int nparams;
 
-  WEAK_SYMBOL_CHECK (virDomainGetSchedulerType);
   NONBLOCKING (r = virDomainGetSchedulerType (dom, &nparams));
   CHECK_ERROR (!r, conn, "virDomainGetSchedulerType");
 
@@ -308,24 +272,11 @@ ocaml_libvirt_domain_get_scheduler_type (value domv)
   free (r);
   Store_field (rv, 1, nparams);
   CAMLreturn (rv);
-#else
-  not_supported ("virDomainGetSchedulerType");
-#endif
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRDOMAINGETSCHEDULERPARAMETERS
-extern int virDomainGetSchedulerParameters (virDomainPtr domain,
-                                           virSchedParameterPtr params,
-                                           int *nparams)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 ocaml_libvirt_domain_get_scheduler_parameters (value domv, value nparamsv)
 {
-#ifdef HAVE_VIRDOMAINGETSCHEDULERPARAMETERS
   CAMLparam2 (domv, nparamsv);
   CAMLlocal4 (rv, v, v2, v3);
   virDomainPtr dom = Domain_val (domv);
@@ -334,7 +285,6 @@ ocaml_libvirt_domain_get_scheduler_parameters (value domv, value nparamsv)
   virSchedParameter params[nparams];
   int r, i;
 
-  WEAK_SYMBOL_CHECK (virDomainGetSchedulerParameters);
   NONBLOCKING (r = virDomainGetSchedulerParameters (dom, params, &nparams));
   CHECK_ERROR (r == -1, conn, "virDomainGetSchedulerParameters");
 
@@ -373,24 +323,11 @@ ocaml_libvirt_domain_get_scheduler_parameters (value domv, value nparamsv)
     Store_field (v, 1, v2);
   }
   CAMLreturn (rv);
-#else
-  not_supported ("virDomainGetSchedulerParameters");
-#endif
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRDOMAINSETSCHEDULERPARAMETERS
-extern int virDomainSetSchedulerParameters (virDomainPtr domain,
-                                           virSchedParameterPtr params,
-                                           int nparams)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 ocaml_libvirt_domain_set_scheduler_parameters (value domv, value paramsv)
 {
-#ifdef HAVE_VIRDOMAINSETSCHEDULERPARAMETERS
   CAMLparam2 (domv, paramsv);
   CAMLlocal1 (v);
   virDomainPtr dom = Domain_val (domv);
@@ -436,14 +373,10 @@ ocaml_libvirt_domain_set_scheduler_parameters (value domv, value paramsv)
     }
   }
 
-  WEAK_SYMBOL_CHECK (virDomainSetSchedulerParameters);
   NONBLOCKING (r = virDomainSetSchedulerParameters (dom, params, nparams));
   CHECK_ERROR (r == -1, conn, "virDomainSetSchedulerParameters");
 
   CAMLreturn (Val_unit);
-#else
-  not_supported ("virDomainSetSchedulerParameters");
-#endif
 }
 
 CAMLprim value
@@ -519,19 +452,112 @@ ocaml_libvirt_domain_get_vcpus (value domv, value maxinfov, value maplenv)
   CAMLreturn (rv);
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRDOMAINMIGRATE
-extern virDomainPtr virDomainMigrate (virDomainPtr domain, virConnectPtr dconn,
-                                     unsigned long flags, const char *dname,
-                                     const char *uri, unsigned long bandwidth)
-  __attribute__((weak));
-#endif
-#endif
+CAMLprim value
+ocaml_libvirt_domain_get_cpu_stats (value domv)
+{
+  CAMLparam1 (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");
+
+  /* get percpu information */
+  NONBLOCKING (nparams = virDomainGetCPUStats(dom, NULL, 0, 0, 1, 0));
+  CHECK_ERROR (nparams < 0, conn, "virDomainGetCPUStats");
+
+  if ((params = malloc(sizeof(*params) * nparams * 128)) == NULL)
+    caml_failwith ("virDomainGetCPUStats: malloc");
+
+  cpustats = caml_alloc (nr_pcpus, 0); /* cpustats: array of params(list of typed_param) */
+  cpu = 0;
+  while (cpu < nr_pcpus) {
+    ncpus = nr_pcpus - cpu > 128 ? 128 : nr_pcpus - cpu;
+
+    NONBLOCKING (r = virDomainGetCPUStats(dom, params, nparams, cpu, ncpus, 0));
+    CHECK_ERROR (r < 0, conn, "virDomainGetCPUStats");
+
+    for (i = 0; i < ncpus; i++) {
+      /* list of typed_param: single linked list of param_nodes */
+      param_head = Val_emptylist; /* param_head: the head param_node of list of typed_param */
+
+      if (params[i * nparams].type == 0) {
+        Store_field(cpustats, cpu + i, param_head);
+        continue;
+      }
+
+      for (j = r - 1; j >= 0; j--) {
+        pos = i * nparams + j;
+          if (params[pos].type == 0)
+            continue;
+
+        param_node = caml_alloc(2, 0); /* param_node: typed_param, next param_node */
+        Store_field(param_node, 1, param_head);
+        param_head = param_node;
+
+        typed_param = caml_alloc(2, 0); /* typed_param: field name(string), typed_param_value */
+        Store_field(param_node, 0, typed_param);
+        Store_field(typed_param, 0, caml_copy_string(params[pos].field));
+
+        /* typed_param_value: value with the corresponding type tag */
+        switch(params[pos].type) {
+        case VIR_TYPED_PARAM_INT:
+          typed_param_value = caml_alloc (1, 0);
+          v = caml_copy_int32 (params[pos].value.i);
+          break;
+        case VIR_TYPED_PARAM_UINT:
+          typed_param_value = caml_alloc (1, 1);
+          v = caml_copy_int32 (params[pos].value.ui);
+          break;
+        case VIR_TYPED_PARAM_LLONG:
+          typed_param_value = caml_alloc (1, 2);
+          v = caml_copy_int64 (params[pos].value.l);
+          break;
+        case VIR_TYPED_PARAM_ULLONG:
+          typed_param_value = caml_alloc (1, 3);
+          v = caml_copy_int64 (params[pos].value.ul);
+          break;
+        case VIR_TYPED_PARAM_DOUBLE:
+          typed_param_value = caml_alloc (1, 4);
+          v = caml_copy_double (params[pos].value.d);
+          break;
+        case VIR_TYPED_PARAM_BOOLEAN:
+          typed_param_value = caml_alloc (1, 5);
+          v = Val_bool (params[pos].value.b);
+          break;
+        case VIR_TYPED_PARAM_STRING:
+          typed_param_value = caml_alloc (1, 6);
+          v = caml_copy_string (params[pos].value.s);
+          free (params[pos].value.s);
+          break;
+        default:
+            /* XXX Memory leak on this path, if there are more
+             * VIR_TYPED_PARAM_STRING past this point in the array.
+             */
+          free (params);
+          caml_failwith ("virDomainGetCPUStats: "
+                         "unknown parameter type returned");
+        }
+        Store_field (typed_param_value, 0, v);
+        Store_field (typed_param, 1, typed_param_value);
+      }
+      Store_field (cpustats, cpu + i, param_head);
+    }
+    cpu += ncpus;
+  }
+  free(params);
+  CAMLreturn (cpustats);
+}
 
 CAMLprim value
 ocaml_libvirt_domain_migrate_native (value domv, value dconnv, value flagsv, value optdnamev, value opturiv, value optbandwidthv, value unitv)
 {
-#ifdef HAVE_VIRDOMAINMIGRATE
   CAMLparam5 (domv, dconnv, flagsv, optdnamev, opturiv);
   CAMLxparam2 (optbandwidthv, unitv);
   CAMLlocal2 (flagv, rv);
@@ -557,17 +583,12 @@ ocaml_libvirt_domain_migrate_native (value domv, value dconnv, value flagsv, val
   else                         /* Some bandwidth */
     bandwidth = Int_val (Field (optbandwidthv, 0));
 
-  WEAK_SYMBOL_CHECK (virDomainMigrate);
   NONBLOCKING (r = virDomainMigrate (dom, dconn, flags, dname, uri, bandwidth));
   CHECK_ERROR (!r, conn, "virDomainMigrate");
 
   rv = Val_domain (r, dconnv);
 
   CAMLreturn (rv);
-
-#else /* virDomainMigrate not supported */
-  not_supported ("virDomainMigrate");
-#endif
 }
 
 CAMLprim value
@@ -578,20 +599,9 @@ ocaml_libvirt_domain_migrate_bytecode (value *argv, int argn)
                                              argv[6]);
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRDOMAINBLOCKSTATS
-extern int virDomainBlockStats (virDomainPtr dom,
-                               const char *path,
-                               virDomainBlockStatsPtr stats,
-                               size_t size)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 ocaml_libvirt_domain_block_stats (value domv, value pathv)
 {
-#if HAVE_VIRDOMAINBLOCKSTATS
   CAMLparam2 (domv, pathv);
   CAMLlocal2 (rv,v);
   virDomainPtr dom = Domain_val (domv);
@@ -600,7 +610,6 @@ ocaml_libvirt_domain_block_stats (value domv, value pathv)
   struct _virDomainBlockStats stats;
   int r;
 
-  WEAK_SYMBOL_CHECK (virDomainBlockStats);
   NONBLOCKING (r = virDomainBlockStats (dom, path, &stats, sizeof stats));
   CHECK_ERROR (r == -1, conn, "virDomainBlockStats");
 
@@ -612,25 +621,11 @@ ocaml_libvirt_domain_block_stats (value domv, value pathv)
   v = caml_copy_int64 (stats.errs); Store_field (rv, 4, v);
 
   CAMLreturn (rv);
-#else
-  not_supported ("virDomainBlockStats");
-#endif
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRDOMAININTERFACESTATS
-extern int virDomainInterfaceStats (virDomainPtr dom,
-                                   const char *path,
-                                   virDomainInterfaceStatsPtr stats,
-                                   size_t size)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 ocaml_libvirt_domain_interface_stats (value domv, value pathv)
 {
-#if HAVE_VIRDOMAININTERFACESTATS
   CAMLparam2 (domv, pathv);
   CAMLlocal2 (rv,v);
   virDomainPtr dom = Domain_val (domv);
@@ -639,7 +634,6 @@ ocaml_libvirt_domain_interface_stats (value domv, value pathv)
   struct _virDomainInterfaceStats stats;
   int r;
 
-  WEAK_SYMBOL_CHECK (virDomainInterfaceStats);
   NONBLOCKING (r = virDomainInterfaceStats (dom, path, &stats, sizeof stats));
   CHECK_ERROR (r == -1, conn, "virDomainInterfaceStats");
 
@@ -654,27 +648,11 @@ ocaml_libvirt_domain_interface_stats (value domv, value pathv)
   v = caml_copy_int64 (stats.tx_drop); Store_field (rv, 7, v);
 
   CAMLreturn (rv);
-#else
-  not_supported ("virDomainInterfaceStats");
-#endif
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRDOMAINBLOCKPEEK
-extern int virDomainBlockPeek (virDomainPtr domain,
-                               const char *path,
-                               unsigned long long offset,
-                               size_t size,
-                               void *buffer,
-                               unsigned int flags)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 ocaml_libvirt_domain_block_peek_native (value domv, value pathv, value offsetv, value sizev, value bufferv, value boffv)
 {
-#ifdef HAVE_VIRDOMAINBLOCKPEEK
   CAMLparam5 (domv, pathv, offsetv, sizev, bufferv);
   CAMLxparam1 (boffv);
   virDomainPtr dom = Domain_val (domv);
@@ -690,16 +668,11 @@ ocaml_libvirt_domain_block_peek_native (value domv, value pathv, value offsetv,
   if (caml_string_length (bufferv) < boff + size)
     caml_failwith ("virDomainBlockPeek: return buffer too short");
 
-  WEAK_SYMBOL_CHECK (virDomainBlockPeek);
   /* NB. not NONBLOCKING because buffer might move (XXX) */
   r = virDomainBlockPeek (dom, path, offset, size, buffer+boff, 0);
   CHECK_ERROR (r == -1, conn, "virDomainBlockPeek");
 
   CAMLreturn (Val_unit);
-
-#else /* virDomainBlockPeek not supported */
-  not_supported ("virDomainBlockPeek");
-#endif
 }
 
 CAMLprim value
@@ -709,21 +682,9 @@ ocaml_libvirt_domain_block_peek_bytecode (value *argv, int argn)
                                                  argv[3], argv[4], argv[5]);
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRDOMAINMEMORYPEEK
-extern int virDomainMemoryPeek (virDomainPtr domain,
-                                unsigned long long start,
-                                size_t size,
-                                void *buffer,
-                                unsigned int flags)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 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);
   CAMLxparam1 (boffv);
   CAMLlocal1 (flagv);
@@ -748,16 +709,11 @@ ocaml_libvirt_domain_memory_peek_native (value domv, value flagsv, value offsetv
         flags |= VIR_MEMORY_VIRTUAL;
     }
 
-  WEAK_SYMBOL_CHECK (virDomainMemoryPeek);
   /* NB. not NONBLOCKING because buffer might move (XXX) */
   r = virDomainMemoryPeek (dom, offset, size, buffer+boff, flags);
   CHECK_ERROR (r == -1, conn, "virDomainMemoryPeek");
 
   CAMLreturn (Val_unit);
-
-#else /* virDomainMemoryPeek not supported */
-  not_supported ("virDomainMemoryPeek");
-#endif
 }
 
 CAMLprim value
@@ -767,17 +723,9 @@ ocaml_libvirt_domain_memory_peek_bytecode (value *argv, int argn)
                                                   argv[3], argv[4], argv[5]);
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRSTORAGEPOOLGETINFO
-extern int virStoragePoolGetInfo(virStoragePoolPtr pool, virStoragePoolInfoPtr info)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 ocaml_libvirt_storage_pool_get_info (value poolv)
 {
-#if HAVE_VIRSTORAGEPOOLGETINFO
   CAMLparam1 (poolv);
   CAMLlocal2 (rv, v);
   virStoragePoolPtr pool = Pool_val (poolv);
@@ -785,7 +733,6 @@ ocaml_libvirt_storage_pool_get_info (value poolv)
   virStoragePoolInfo info;
   int r;
 
-  WEAK_SYMBOL_CHECK (virStoragePoolGetInfo);
   NONBLOCKING (r = virStoragePoolGetInfo (pool, &info));
   CHECK_ERROR (r == -1, conn, "virStoragePoolGetInfo");
 
@@ -796,22 +743,11 @@ ocaml_libvirt_storage_pool_get_info (value poolv)
   v = caml_copy_int64 (info.available); Store_field (rv, 3, v);
 
   CAMLreturn (rv);
-#else
-  not_supported ("virStoragePoolGetInfo");
-#endif
 }
 
-#ifdef HAVE_WEAK_SYMBOLS
-#ifdef HAVE_VIRSTORAGEVOLGETINFO
-extern int virStorageVolGetInfo(virStorageVolPtr vol, virStorageVolInfoPtr info)
-  __attribute__((weak));
-#endif
-#endif
-
 CAMLprim value
 ocaml_libvirt_storage_vol_get_info (value volv)
 {
-#if HAVE_VIRSTORAGEVOLGETINFO
   CAMLparam1 (volv);
   CAMLlocal2 (rv, v);
   virStorageVolPtr vol = Volume_val (volv);
@@ -819,19 +755,15 @@ ocaml_libvirt_storage_vol_get_info (value volv)
   virStorageVolInfo info;
   int r;
 
-  WEAK_SYMBOL_CHECK (virStorageVolGetInfo);
   NONBLOCKING (r = virStorageVolGetInfo (vol, &info));
   CHECK_ERROR (r == -1, conn, "virStorageVolGetInfo");
 
   rv = caml_alloc (3, 0);
   Store_field (rv, 0, Val_int (info.type));
   v = caml_copy_int64 (info.capacity); Store_field (rv, 1, v);
-  v = caml_copy_int64 (info.allocation); Store_field (rv, 1, v);
+  v = caml_copy_int64 (info.allocation); Store_field (rv, 2, v);
 
   CAMLreturn (rv);
-#else
-  not_supported ("virStorageVolGetInfo");
-#endif
 }
 
 /*----------------------------------------------------------------------*/