On 08/09/2016 08:39 AM, Jason Miesionczek wrote:
---
src/hyperv/hyperv_driver.c | 106 +++++++++++++++++++++++++++++++++++++++++++-
src/hyperv/hyperv_private.h | 2 +
2 files changed, 107 insertions(+), 1 deletion(-)
diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
index b642a02..4a5e80d 100644
--- a/src/hyperv/hyperv_driver.c
+++ b/src/hyperv/hyperv_driver.c
@@ -35,6 +35,7 @@
#include "hyperv_wmi.h"
#include "openwsman.h"
#include "virstring.h"
+#include "virtypedparam.h"
#define VIR_FROM_THIS VIR_FROM_HYPERV
@@ -51,11 +52,15 @@ hypervFreePrivate(hypervPrivate **priv)
wsmc_release((*priv)->client);
}
+ if ((*priv)->caps != NULL)
+ virObjectUnref((*priv)->caps);
+
hypervFreeParsedUri(&(*priv)->parsedUri);
VIR_FREE(*priv);
}
-
+/* Forward declaration of hypervCapsInit */
+static virCapsPtr hypervCapsInit(hypervPrivate *priv);
Ewww.... Why not define the function right here then?
static virDrvOpenStatus
hypervConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
@@ -183,6 +188,12 @@ hypervConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
goto cleanup;
}
+ /* Setup capabilities */
+ priv->caps = hypervCapsInit(priv);
+ if (priv->caps == NULL) {
+ goto cleanup;
+ }
+
If there's only 1 line, then no need for { }
This occurs multiple times in this file.
You need to run "make check syntax-check"
I would change to :
if (!(priv->caps = hypervCapsInit(priv)))
goto cleanup;
conn->privateData = priv;
priv = NULL;
result = VIR_DRV_OPEN_SUCCESS;
@@ -1324,7 +1335,19 @@ hypervConnectListAllDomains(virConnectPtr conn,
}
#undef MATCH
Try to go with 2 blank lines between functions - it's the new normal for
our reviews...
+static char*
static char *
+hypervConnectGetCapabilities(virConnectPtr conn)
+{
+ hypervPrivate *priv = conn->privateData;
+ char *xml = virCapabilitiesFormatXML(priv->caps);
+ if (xml == NULL) {
+ virReportOOMError();
This should be unnecessary. If there was a failure to memory allocation
it would already be messaged. If there was some other failure, then
you're overwriting that error.
+ return NULL;
+ }
So this simply becomes:
return virCapabilitiesFormatXML(priv->caps);
+
+ return xml;
+}
static virHypervisorDriver hypervHypervisorDriver = {
@@ -1361,8 +1384,89 @@ static virHypervisorDriver hypervHypervisorDriver = {
.domainHasManagedSaveImage = hypervDomainHasManagedSaveImage, /* 0.9.5 */
.domainManagedSaveRemove = hypervDomainManagedSaveRemove, /* 0.9.5 */
.connectIsAlive = hypervConnectIsAlive, /* 0.9.8 */
+ .connectGetCapabilities = hypervConnectGetCapabilities, /* 1.2.10 */
s/1.2.10/2.3.0/
(at the very earliest)
};
blank line
+/* Retrieves host system UUID */
+static int
+hypervLookupHostSystemBiosUuid(hypervPrivate *priv, unsigned char *uuid)
+{
+ Win32_ComputerSystemProduct *computerSystem = NULL;
+ virBuffer query = VIR_BUFFER_INITIALIZER;
+ int result = -1;
+
+ virBufferAddLit(&query, WIN32_COMPUTERSYSTEMPRODUCT_WQL_SELECT);
+
+ if (hypervGetWin32ComputerSystemProductList(priv, &query, &computerSystem)
< 0) {
+ goto cleanup;
+ }
Unnecessary {}
+
+ if (computerSystem == NULL) {
+ virReportError(VIR_ERR_NO_DOMAIN,
You need to a "%s, " e.g.:
virReportError(VIR_ERR_NO_DOMAIN, "%s",
(something syntax-check would complain about)
+ _("Unable to get
Win32_ComputerSystemProduct"));
+ goto cleanup;
+ }
+
+ if (virUUIDParse(computerSystem->data->UUID, uuid) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Could not parse UUID from string '%s'"),
+ computerSystem->data->UUID);
+ goto cleanup;
+ }
+
+ result = 0;
+
+ cleanup:
+ hypervFreeObject(priv, (hypervObject *)computerSystem);
+ virBufferFreeAndReset(&query);
+
+ return result;
+}
+
+
Only 2 blank lines necessary
+
+static virCapsPtr hypervCapsInit(hypervPrivate *priv)
static virCapsPtr
hypervCapsInit(hypervPrivate *priv)
> +{
> + virCapsPtr caps = NULL;
> + virCapsGuestPtr guest = NULL;
> +
> + caps = virCapabilitiesNew(VIR_ARCH_X86_64, 1, 1);
> +
> + if (caps == NULL) {
> + virReportOOMError();
+ return NULL;
+ }
Unnecessary OOM
if (!(caps = virCapabilitiesNew(VIR_ARCH_X86_64, 1, 1)))
return NULL;
+
+ /* virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 }); */
+
+ if (hypervLookupHostSystemBiosUuid(priv,caps->host.host_uuid) < 0) {
s/priv,caps/priv, caps/
Need a space between args - syntax-check complaint.
+ goto failure;
+ }
Unnecessary {}
s/failure/error/
> +
> + /* i686 */
> + guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_I686,
NULL, NULL, 0, NULL);
> + if (guest == NULL) {
+ goto failure;
+ }
> + if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_HYPERV,
NULL, NULL, 0, NULL) == NULL) {
+ goto failure;
+ }
> +
> + /* x86_64 */
> + guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, VIR_ARCH_X86_64,
NULL, NULL, 0, NULL);
> + if (guest == NULL) {
+ goto failure;
+ }
> + if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_HYPERV,
NULL, NULL, 0, NULL) == NULL) {
+ goto failure;
+ }
These are all really long lines... They all fail syntax-check due to {}
issues... Try to have each line be 80 columns, consider
if (!(guest = virCapabilitiesAddGuest(...)))
goto error;
if (!
+
+ return caps;
+
+ failure:
We use error for error labels not failure
John
> + virObjectUnref(caps);
> + return NULL;
> +}
>
>
> static void
> diff --git a/src/hyperv/hyperv_private.h b/src/hyperv/hyperv_private.h
> index 574bb5f..d9aa0bd 100644
> --- a/src/hyperv/hyperv_private.h
> +++ b/src/hyperv/hyperv_private.h
> @@ -26,6 +26,7 @@
> # include "internal.h"
> # include "virerror.h"
> # include "hyperv_util.h"
> +# include "capabilities.h"
> # include "openwsman.h"
>
> typedef struct _hypervPrivate hypervPrivate;
> @@ -33,6 +34,7 @@ typedef struct _hypervPrivate hypervPrivate;
> struct _hypervPrivate {
> hypervParsedUri *parsedUri;
> WsManClient *client;
> + virCapsPtr caps;
};
> #endif /* __HYPERV_PRIVATE_H__ */
>