1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
/* This file contains trivial example code to connect to the running
* hypervisor and gather a few bits of information about domains.
* Similar API's exist for storage pools, networks, and interfaces. */
#include <stdio.h>
#include <stdlib.h>
#include <libvirt/libvirt.h>
#include <libvirt/virterror.h>
static int
showHypervisorInfo(virConnectPtr conn)
{
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 (!hvType) {
printf("Failed to get hypervisor type: %s\n",
virGetLastErrorMessage());
return 1;
}
if (0 != virConnectGetVersion(conn, &hvVer)) {
printf("Failed to get hypervisor version: %s\n",
virGetLastErrorMessage());
return 1;
}
major = hvVer / 1000000;
hvVer %= 1000000;
minor = hvVer / 1000;
release = hvVer % 1000;
printf("Hypervisor: \"%s\" version: %lu.%lu.%lu\n",
hvType,
major,
minor,
release);
return 0;
}
static int
showDomains(virConnectPtr conn)
{
int numNames, numInactiveDomains, numActiveDomains;
ssize_t i;
int flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE |
VIR_CONNECT_LIST_DOMAINS_INACTIVE;
virDomainPtr *nameList = NULL;
/* NB: The return from the virConnectNum*() APIs is only useful for
* the current call. A domain could be started or stopped and any
* assumptions made purely on these return values could result in
* unexpected results */
numActiveDomains = virConnectNumOfDomains(conn);
if (numActiveDomains == -1) {
printf("Failed to get number of active domains: %s\n",
virGetLastErrorMessage());
return 1;
}
numInactiveDomains = virConnectNumOfDefinedDomains(conn);
if (numInactiveDomains == -1) {
printf("Failed to get number of inactive domains: %s\n",
virGetLastErrorMessage());
return 1;
}
printf("There are %d active and %d inactive domains\n",
numActiveDomains, numInactiveDomains);
/* Return a list of all active and inactive domains. Using this API
* instead of virConnectListDomains() and virConnectListDefinedDomains()
* is preferred since it "solves" an inherit race between separated API
* calls if domains are started or stopped between calls */
numNames = virConnectListAllDomains(conn,
&nameList,
flags);
if (numNames == -1) {
printf("Failed to get a list of all domains: %s\n",
virGetLastErrorMessage());
return 1;
}
for (i = 0; i < numNames; i++) {
int active = virDomainIsActive(nameList[i]);
printf(" %8s (%s)\n",
virDomainGetName(nameList[i]),
(active == 1 ? "active" : "non-active"));
/* must free the returned named per the API documentation */
virDomainFree(nameList[i]);
}
free(nameList);
return 0;
}
int
main(int argc, char *argv[])
{
int ret = 0;
virConnectPtr conn;
char *uri = NULL;
printf("Attempting to connect to hypervisor\n");
if (argc > 1)
uri = argv[1];
/* virConnectOpenAuth is called here with all default parameters,
* except, possibly, the URI of the hypervisor. */
conn = virConnectOpenAuth(uri, virConnectAuthPtrDefault, 0);
if (!conn) {
printf("No connection to hypervisor: %s\n",
virGetLastErrorMessage());
return 1;
}
uri = virConnectGetURI(conn);
if (!uri) {
ret = 1;
printf("Failed to get URI for hypervisor connection: %s\n",
virGetLastErrorMessage());
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: %s\n",
virGetLastErrorMessage());
ret = 1;
} else {
printf("Disconnected from hypervisor\n");
}
return ret;
}
|