aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@redhat.com>2009-02-26 16:14:50 +0000
committerDaniel Veillard <veillard@redhat.com>2009-02-26 16:14:50 +0000
commit66780313c291d8b3a80776948e2f344d25f830e4 (patch)
treefb6e577dddd934a671072ba59a904deafb8a8dd3 /examples/hellolibvirt
parent* src/remote_internal.c: fix autostart of session daemon, patch (diff)
downloadlibvirt-66780313c291d8b3a80776948e2f344d25f830e4.tar.gz
libvirt-66780313c291d8b3a80776948e2f344d25f830e4.tar.bz2
libvirt-66780313c291d8b3a80776948e2f344d25f830e4.zip
New example program
* Makefile.am configure.in examples/hellolibvirt/Makefile.am examples/hellolibvirt/hellolibvirt.c: new trivial example program by David Allan Daniel
Diffstat (limited to 'examples/hellolibvirt')
-rw-r--r--examples/hellolibvirt/Makefile.am5
-rw-r--r--examples/hellolibvirt/hellolibvirt.c205
2 files changed, 210 insertions, 0 deletions
diff --git a/examples/hellolibvirt/Makefile.am b/examples/hellolibvirt/Makefile.am
new file mode 100644
index 000000000..6ef2cc822
--- /dev/null
+++ b/examples/hellolibvirt/Makefile.am
@@ -0,0 +1,5 @@
+INCLUDES = -I@top_srcdir@/include
+noinst_PROGRAMS = hellolibvirt
+hellolibvirt_CFLAGS = $(WARN_CFLAGS)
+hellolibvirt_SOURCES = hellolibvirt.c
+hellolibvirt_LDADD = @top_builddir@/src/libvirt.la
diff --git a/examples/hellolibvirt/hellolibvirt.c b/examples/hellolibvirt/hellolibvirt.c
new file mode 100644
index 000000000..234637e53
--- /dev/null
+++ b/examples/hellolibvirt/hellolibvirt.c
@@ -0,0 +1,205 @@
+/* This file contains trivial example code to connect to the running
+ * hypervisor and gather a few bits of information. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <libvirt/libvirt.h>
+#include <libvirt/virterror.h>
+
+static void
+showError(virConnectPtr conn)
+{
+ int ret;
+ virErrorPtr err;
+
+ err = malloc(sizeof(*err));
+ if (NULL == err) {
+ printf("Could not allocate memory for error data\n");
+ goto out;
+ }
+
+ ret = virConnCopyLastError(conn, err);
+
+ switch (ret) {
+ case 0:
+ printf("No error found\n");
+ break;
+
+ case -1:
+ printf("Parameter error when attempting to get last error\n");
+ break;
+
+ default:
+ printf("libvirt reported: \"%s\"\n", err->message);
+ break;
+ }
+
+ virResetError(err);
+ free(err);
+
+out:
+ return;
+}
+
+
+static int
+showHypervisorInfo(virConnectPtr conn)
+{
+ int ret = 0;
+ unsigned long hvVer, major, minor, release;
+ const char *hvType;
+
+ /* virConnectGetType returns a pointer to a static string, so no
+ * allocation or freeing is necessary; it is possible for the call
+ * to fail if, for example, there is no connection to a
+ * hypervisor, so check what it returns. */
+ hvType = virConnectGetType(conn);
+ if (NULL == hvType) {
+ ret = 1;
+ printf("Failed to get hypervisor type\n");
+ showError(conn);
+ goto out;
+ }
+
+ if (0 != virConnectGetVersion(conn, &hvVer)) {
+ ret = 1;
+ printf("Failed to get hypervisor version\n");
+ showError(conn);
+ goto out;
+ }
+
+ major = hvVer / 1000000;
+ hvVer %= 1000000;
+ minor = hvVer / 1000;
+ release = hvVer % 1000;
+
+ printf("Hypervisor: \"%s\" version: %lu.%lu.%lu\n",
+ hvType,
+ major,
+ minor,
+ release);
+
+out:
+ return ret;
+}
+
+
+static int
+showDomains(virConnectPtr conn)
+{
+ int ret = 0, i, numNames, numInactiveDomains, numActiveDomains;
+ char **nameList = NULL;
+
+ numActiveDomains = virConnectNumOfDomains(conn);
+ if (-1 == numActiveDomains) {
+ ret = 1;
+ printf("Failed to get number of active domains\n");
+ showError(conn);
+ goto out;
+ }
+
+ numInactiveDomains = virConnectNumOfDefinedDomains(conn);
+ if (-1 == numInactiveDomains) {
+ ret = 1;
+ printf("Failed to get number of inactive domains\n");
+ showError(conn);
+ goto out;
+ }
+
+ printf("There are %d active and %d inactive domains\n",
+ numActiveDomains, numInactiveDomains);
+
+ nameList = malloc(sizeof(*nameList) * numInactiveDomains);
+
+ if (NULL == nameList) {
+ ret = 1;
+ printf("Could not allocate memory for list of inactive domains\n");
+ goto out;
+ }
+
+ numNames = virConnectListDefinedDomains(conn,
+ nameList,
+ numInactiveDomains);
+
+ if (-1 == numNames) {
+ ret = 1;
+ printf("Could not get list of defined domains from hypervisor\n");
+ showError(conn);
+ goto out;
+ }
+
+ if (numNames > 0) {
+ printf("Inactive domains:\n");
+ }
+
+ for (i = 0 ; i < numNames ; i++) {
+ printf(" %s\n", *(nameList + i));
+ /* The API documentation doesn't say so, but the names
+ * returned by virConnectListDefinedDomains are strdup'd and
+ * must be freed here. */
+ free(*(nameList + i));
+ }
+
+out:
+ free(nameList);
+ return ret;
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ int ret = 0;
+ virConnectPtr conn;
+ char *uri;
+
+ printf("Attempting to connect to hypervisor\n");
+
+ uri = (argc > 0 ? argv[1] : NULL);
+
+ /* virConnectOpenAuth is called here with all default parameters,
+ * except, possibly, the URI of the hypervisor. */
+ conn = virConnectOpenAuth(uri, virConnectAuthPtrDefault, 0);
+
+ if (NULL == conn) {
+ ret = 1;
+ printf("No connection to hypervisor\n");
+ showError(conn);
+ goto out;
+ }
+
+ uri = virConnectGetURI(conn);
+ if (NULL == uri) {
+ ret = 1;
+ printf("Failed to get URI for hypervisor connection\n");
+ showError(conn);
+ goto disconnect;
+ }
+
+ printf("Connected to hypervisor at \"%s\"\n", uri);
+ free(uri);
+
+ if (0 != showHypervisorInfo(conn)) {
+ ret = 1;
+ goto disconnect;
+ }
+
+ if (0 != showDomains(conn)) {
+ ret = 1;
+ goto disconnect;
+ }
+
+disconnect:
+ if (0 != virConnectClose(conn)) {
+ printf("Failed to disconnect from hypervisor\n");
+ showError(conn);
+ ret = 1;
+ } else {
+ printf("Disconnected from hypervisor\n");
+ }
+
+out:
+ return ret;
+}