<div dir="ltr">Adding one minor change to copyrights header...<br><br><br><br>- Move all capabilities functions to separate file<br>
- Add initCPU<br>
---<br>
src/Makefile.am | 2 +<br>
src/bhyve/bhyve_capabilities.c | 105 ++++++++++++++++++++++++++++++<div id=":gty" class="">+++++++++++<br>
src/bhyve/bhyve_capabilities.h | 30 ++++++++++++<br>
src/bhyve/bhyve_driver.c | 56 +++++++++++++---------<br>
4 files changed, 171 insertions(+), 22 deletions(-)<br>
create mode 100644 src/bhyve/bhyve_capabilities.c<br>
create mode 100644 src/bhyve/bhyve_capabilities.h<br>
<br>
diff --git a/src/Makefile.am b/src/Makefile.am<br>
index 55427ed..c715422 100644<br>
--- a/src/Makefile.am<br>
+++ b/src/Makefile.am<br>
@@ -780,6 +780,8 @@ PARALLELS_DRIVER_SOURCES = \<br>
parallels/parallels_network.c<br>
<br>
BHYVE_DRIVER_SOURCES = \<br>
+ bhyve/bhyve_capabilities.c \<br>
+ bhyve/bhyve_capabilities.h \<br>
bhyve/bhyve_command.c \<br>
bhyve/bhyve_command.h \<br>
bhyve/bhyve_driver.h \<br>
diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c<br>
new file mode 100644<br>
index 0000000..b8a9db4<br>
--- /dev/null<br>
+++ b/src/bhyve/bhyve_capabilities.c<br>
@@ -0,0 +1,105 @@<br>
+/*<br>
+ * bhyve_capabilities.c: bhyve capabilities module<br>
+ *<br>
+ * Copyright (C) 2014 Semihalf<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library. If not, see<br>
+ * <<a href="http://www.gnu.org/licenses/" target="_blank">http://www.gnu.org/licenses/</a>>.<br>
+ *<br>
+ */<br>
+#include <config.h><br>
+#include <sys/utsname.h><br>
+<br>
+#include "viralloc.h"<br>
+#include "virlog.h"<br>
+#include "virstring.h"<br>
+#include "cpu/cpu.h"<br>
+#include "nodeinfo.h"<br>
+#include "bhyve_utils.h"<br>
+#include "domain_conf.h"<br>
+#include "vircommand.h"<br>
+#include "bhyve_capabilities.h"<br>
+<br>
+#define VIR_FROM_THIS VIR_FROM_BHYVE<br>
+<br>
+VIR_LOG_INIT("bhyve.bhyve_capabilities");<br>
+<br>
+static int<br>
+virBhyveCapsInitCPU(virCapsPtr caps,<br>
+ virArch arch)<br>
+{<br>
+ virCPUDefPtr cpu = NULL;<br>
+ virCPUDataPtr data = NULL;<br>
+ virNodeInfo nodeinfo;<br>
+ int ret = -1;<br>
+<br>
+ if (VIR_ALLOC(cpu) < 0)<br>
+ goto error;<br>
+<br>
+ cpu->arch = arch;<br>
+<br>
+ if (nodeGetInfo(&nodeinfo))<br>
+ goto error;<br>
+<br>
+ cpu->type = VIR_CPU_TYPE_HOST;<br>
+ cpu->sockets = nodeinfo.sockets;<br>
+ cpu->cores = nodeinfo.cores;<br>
+ cpu->threads = nodeinfo.threads;<br>
+ caps->host.cpu = cpu;<br>
+<br>
+ if (!(data = cpuNodeData(arch))<br>
+ || cpuDecode(cpu, data, NULL, 0, NULL) < 0)<br>
+ goto cleanup;<br>
+<br>
+ ret = 0;<br>
+<br>
+ cleanup:<br>
+ cpuDataFree(data);<br>
+<br>
+ return ret;<br>
+<br>
+ error:<br>
+ virCPUDefFree(cpu);<br>
+ goto cleanup;<br>
+}<br>
+<br>
+virCapsPtr<br>
+virBhyveCapsBuild(void)<br>
+{<br>
+ virCapsPtr caps;<br>
+ virCapsGuestPtr guest;<br>
+<br>
+ if ((caps = virCapabilitiesNew(virArchFromHost(),<br>
+ 0, 0)) == NULL)<br>
+ return NULL;<br>
+<br>
+ if ((guest = virCapabilitiesAddGuest(caps, "hvm",<br>
+ VIR_ARCH_X86_64,<br>
+ "bhyve",<br>
+ NULL, 0, NULL)) == NULL)<br>
+ goto error;<br>
+<br>
+ if (virCapabilitiesAddGuestDomain(guest,<br>
+ "bhyve", NULL, NULL, 0, NULL) == NULL)<br>
+ goto error;<br>
+<br>
+ if (virBhyveCapsInitCPU(caps, virArchFromHost()) < 0)<br>
+ VIR_WARN("Failed to get host CPU");<br>
+<br>
+ return caps;<br>
+<br>
+ error:<br>
+ virObjectUnref(caps);<br>
+ return NULL;<br>
+}<br>
diff --git a/src/bhyve/bhyve_capabilities.h b/src/bhyve/bhyve_capabilities.h<br>
new file mode 100644<br>
index 0000000..efe496e<br>
--- /dev/null<br>
+++ b/src/bhyve/bhyve_capabilities.h<br>
@@ -0,0 +1,30 @@<br>
+/*<br>
+ * bhyve_capabilities.h: bhyve capabilities module<br>
+ *<br>
+ * Copyright (C) 2014 Semihalf<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library. If not, see<br>
+ * <<a href="http://www.gnu.org/licenses/" target="_blank">http://www.gnu.org/licenses/</a>>.<br>
+ *<br>
+ */<br>
+<br>
+#ifndef _BHYVE_CAPABILITIES<br>
+#define _BHYVE_CAPABILITIES<br>
+<br>
+#include "capabilities.h"<br>
+<br>
+virCapsPtr virBhyveCapsBuild(void);<br>
+<br>
+#endif<br>
+<br>
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c<br>
index 3321a79..ef9192a 100644<br>
--- a/src/bhyve/bhyve_driver.c<br>
+++ b/src/bhyve/bhyve_driver.c<br>
@@ -53,6 +53,7 @@<br>
#include "bhyve_driver.h"<br>
#include "bhyve_process.h"<br>
#include "bhyve_utils.h"<br>
+#include "bhyve_capabilities.h"<br>
<br>
#define VIR_FROM_THIS VIR_FROM_BHYVE<br>
<br>
@@ -72,44 +73,49 @@ bhyveDriverUnlock(bhyveConnPtr driver)<br>
virMutexUnlock(&driver->lock);<br>
}<br>
<br>
+/**<br>
+ * bhyveDriverGetCapabilities:<br>
+ *<br>
+ * Get a reference to the virCapsPtr instance for the<br>
+ * driver.<br>
+ *<br>
+ * The caller must release the reference with virObjetUnref<br>
+ *<br>
+ * Returns: a reference to a virCapsPtr instance or NULL<br>
+ */<br>
static virCapsPtr<br>
-bhyveBuildCapabilities(void)<br>
+bhyveDriverGetCapabilities(bhyveConnPtr driver)<br>
{<br>
- virCapsPtr caps;<br>
- virCapsGuestPtr guest;<br>
+ virCapsPtr ret = NULL;<br>
<br>
- if ((caps = virCapabilitiesNew(virArchFromHost(),<br>
- 0, 0)) == NULL)<br>
+ if(driver == NULL)<br>
return NULL;<br>
<br>
- if ((guest = virCapabilitiesAddGuest(caps, "hvm",<br>
- VIR_ARCH_X86_64,<br>
- "bhyve",<br>
- NULL, 0, NULL)) == NULL)<br>
- goto error;<br>
+ ret = virObjectRef(driver->caps);<br>
<br>
- if (virCapabilitiesAddGuestDomain(guest,<br>
- "bhyve", NULL, NULL, 0, NULL) == NULL)<br>
- goto error;<br>
-<br>
- return caps;<br>
-<br>
- error:<br>
- virObjectUnref(caps);<br>
- return NULL;<br>
+ return ret;<br>
}<br>
<br>
static char *<br>
bhyveConnectGetCapabilities(virConnectPtr conn)<br>
{<br>
bhyveConnPtr privconn = conn->privateData;<br>
+ virCapsPtr caps;<br>
char *xml;<br>
<br>
if (virConnectGetCapabilitiesEnsureACL(conn) < 0)<br>
return NULL;<br>
<br>
- if ((xml = virCapabilitiesFormatXML(privconn->caps)) == NULL)<br>
+ caps = bhyveDriverGetCapabilities(privconn);<br>
+ if (!caps)<br>
+ virReportError(VIR_ERR_INTERNAL_ERROR,<br>
+ _("Unable to get Capabilities"));<br>
+<br>
+ if ((xml = virCapabilitiesFormatXML(privconn->caps)) == NULL) {<br>
+ virObjectUnref(caps);<br>
virReportOOMError();<br>
+ }<br>
+ virObjectUnref(caps);<br>
<br>
return xml;<br>
}<br>
@@ -326,8 +332,13 @@ bhyveDomainDefineXML(virConnectPtr conn, const char *xml)<br>
virDomainDefPtr def = NULL;<br>
virDomainDefPtr oldDef = NULL;<br>
virDomainObjPtr vm = NULL;<br>
+ virCapsPtr caps = NULL;<br>
+<br>
+ caps = bhyveDriverGetCapabilities(privconn);<br>
+ if (!caps)<br>
+ return NULL;<br>
<br>
- if ((def = virDomainDefParseString(xml, privconn->caps, privconn->xmlopt,<br>
+ if ((def = virDomainDefParseString(xml, caps, privconn->xmlopt,<br>
1 << VIR_DOMAIN_VIRT_BHYVE,<br>
VIR_DOMAIN_XML_INACTIVE)) == NULL)<br>
goto cleanup;<br>
@@ -350,6 +361,7 @@ bhyveDomainDefineXML(virConnectPtr conn, const char *xml)<br>
goto cleanup;<br>
<br>
cleanup:<br>
+ virObjectUnref(caps);<br>
virDomainDefFree(def);<br>
virObjectUnlock(vm);<br>
<br>
@@ -704,7 +716,7 @@ bhyveStateInitialize(bool priveleged ATTRIBUTE_UNUSED,<br>
if (!(bhyve_driver->closeCallbacks = virCloseCallbacksNew()))<br>
goto cleanup;<br>
<br>
- if (!(bhyve_driver->caps = bhyveBuildCapabilities()))<br>
+ if (!(bhyve_driver->caps = virBhyveCapsBuild()))<br>
goto cleanup;<br>
<br>
if (!(bhyve_driver->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))</div><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-03-31 12:54 GMT+02:00 Wojciech Macek <span dir="ltr"><<a href="mailto:wma@semihalf.com" target="_blank">wma@semihalf.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">- Move all capabilities functions to separate file<br>
- Add initCPU<br>
---<br>
src/Makefile.am | 2 +<br>
src/bhyve/bhyve_capabilities.c | 105 +++++++++++++++++++++++++++++++++++++++++<br>
src/bhyve/bhyve_capabilities.h | 30 ++++++++++++<br>
src/bhyve/bhyve_driver.c | 56 +++++++++++++---------<br>
4 files changed, 171 insertions(+), 22 deletions(-)<br>
create mode 100644 src/bhyve/bhyve_capabilities.c<br>
create mode 100644 src/bhyve/bhyve_capabilities.h<br>
<br>
diff --git a/src/Makefile.am b/src/Makefile.am<br>
index 55427ed..c715422 100644<br>
--- a/src/Makefile.am<br>
+++ b/src/Makefile.am<br>
@@ -780,6 +780,8 @@ PARALLELS_DRIVER_SOURCES = \<br>
parallels/parallels_network.c<br>
<br>
BHYVE_DRIVER_SOURCES = \<br>
+ bhyve/bhyve_capabilities.c \<br>
+ bhyve/bhyve_capabilities.h \<br>
bhyve/bhyve_command.c \<br>
bhyve/bhyve_command.h \<br>
bhyve/bhyve_driver.h \<br>
diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c<br>
new file mode 100644<br>
index 0000000..b8a9db4<br>
--- /dev/null<br>
+++ b/src/bhyve/bhyve_capabilities.c<br>
@@ -0,0 +1,105 @@<br>
+/*<br>
+ * bhyve_capabilities.c: bhyve capabilities module<br>
+ *<br>
+ * Copyright (C) 2014 Wojciech Macek <<a href="mailto:wma@semihalf.com">wma@semihalf.com</a>><br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library. If not, see<br>
+ * <<a href="http://www.gnu.org/licenses/" target="_blank">http://www.gnu.org/licenses/</a>>.<br>
+ *<br>
+ */<br>
+#include <config.h><br>
+#include <sys/utsname.h><br>
+<br>
+#include "viralloc.h"<br>
+#include "virlog.h"<br>
+#include "virstring.h"<br>
+#include "cpu/cpu.h"<br>
+#include "nodeinfo.h"<br>
+#include "bhyve_utils.h"<br>
+#include "domain_conf.h"<br>
+#include "vircommand.h"<br>
+#include "bhyve_capabilities.h"<br>
+<br>
+#define VIR_FROM_THIS VIR_FROM_BHYVE<br>
+<br>
+VIR_LOG_INIT("bhyve.bhyve_capabilities");<br>
+<br>
+static int<br>
+virBhyveCapsInitCPU(virCapsPtr caps,<br>
+ virArch arch)<br>
+{<br>
+ virCPUDefPtr cpu = NULL;<br>
+ virCPUDataPtr data = NULL;<br>
+ virNodeInfo nodeinfo;<br>
+ int ret = -1;<br>
+<br>
+ if (VIR_ALLOC(cpu) < 0)<br>
+ goto error;<br>
+<br>
+ cpu->arch = arch;<br>
+<br>
+ if (nodeGetInfo(&nodeinfo))<br>
+ goto error;<br>
+<br>
+ cpu->type = VIR_CPU_TYPE_HOST;<br>
+ cpu->sockets = nodeinfo.sockets;<br>
+ cpu->cores = nodeinfo.cores;<br>
+ cpu->threads = nodeinfo.threads;<br>
+ caps->host.cpu = cpu;<br>
+<br>
+ if (!(data = cpuNodeData(arch))<br>
+ || cpuDecode(cpu, data, NULL, 0, NULL) < 0)<br>
+ goto cleanup;<br>
+<br>
+ ret = 0;<br>
+<br>
+ cleanup:<br>
+ cpuDataFree(data);<br>
+<br>
+ return ret;<br>
+<br>
+ error:<br>
+ virCPUDefFree(cpu);<br>
+ goto cleanup;<br>
+}<br>
+<br>
+virCapsPtr<br>
+virBhyveCapsBuild(void)<br>
+{<br>
+ virCapsPtr caps;<br>
+ virCapsGuestPtr guest;<br>
+<br>
+ if ((caps = virCapabilitiesNew(virArchFromHost(),<br>
+ 0, 0)) == NULL)<br>
+ return NULL;<br>
+<br>
+ if ((guest = virCapabilitiesAddGuest(caps, "hvm",<br>
+ VIR_ARCH_X86_64,<br>
+ "bhyve",<br>
+ NULL, 0, NULL)) == NULL)<br>
+ goto error;<br>
+<br>
+ if (virCapabilitiesAddGuestDomain(guest,<br>
+ "bhyve", NULL, NULL, 0, NULL) == NULL)<br>
+ goto error;<br>
+<br>
+ if (virBhyveCapsInitCPU(caps, virArchFromHost()) < 0)<br>
+ VIR_WARN("Failed to get host CPU");<br>
+<br>
+ return caps;<br>
+<br>
+ error:<br>
+ virObjectUnref(caps);<br>
+ return NULL;<br>
+}<br>
diff --git a/src/bhyve/bhyve_capabilities.h b/src/bhyve/bhyve_capabilities.h<br>
new file mode 100644<br>
index 0000000..efe496e<br>
--- /dev/null<br>
+++ b/src/bhyve/bhyve_capabilities.h<br>
@@ -0,0 +1,30 @@<br>
+/*<br>
+ * bhyve_capabilities.h: bhyve capabilities module<br>
+ *<br>
+ * Copyright (C) 2014 Wojciech Macek <<a href="mailto:wma@semihalf.com">wma@semihalf.com</a>><br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library. If not, see<br>
+ * <<a href="http://www.gnu.org/licenses/" target="_blank">http://www.gnu.org/licenses/</a>>.<br>
+ *<br>
+ */<br>
+<br>
+#ifndef _BHYVE_CAPABILITIES<br>
+#define _BHYVE_CAPABILITIES<br>
+<br>
+#include "capabilities.h"<br>
+<br>
+virCapsPtr virBhyveCapsBuild(void);<br>
+<br>
+#endif<br>
+<br>
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c<br>
index 3321a79..ef9192a 100644<br>
--- a/src/bhyve/bhyve_driver.c<br>
+++ b/src/bhyve/bhyve_driver.c<br>
@@ -53,6 +53,7 @@<br>
#include "bhyve_driver.h"<br>
#include "bhyve_process.h"<br>
#include "bhyve_utils.h"<br>
+#include "bhyve_capabilities.h"<br>
<br>
#define VIR_FROM_THIS VIR_FROM_BHYVE<br>
<br>
@@ -72,44 +73,49 @@ bhyveDriverUnlock(bhyveConnPtr driver)<br>
virMutexUnlock(&driver->lock);<br>
}<br>
<br>
+/**<br>
+ * bhyveDriverGetCapabilities:<br>
+ *<br>
+ * Get a reference to the virCapsPtr instance for the<br>
+ * driver.<br>
+ *<br>
+ * The caller must release the reference with virObjetUnref<br>
+ *<br>
+ * Returns: a reference to a virCapsPtr instance or NULL<br>
+ */<br>
static virCapsPtr<br>
-bhyveBuildCapabilities(void)<br>
+bhyveDriverGetCapabilities(bhyveConnPtr driver)<br>
{<br>
- virCapsPtr caps;<br>
- virCapsGuestPtr guest;<br>
+ virCapsPtr ret = NULL;<br>
<br>
- if ((caps = virCapabilitiesNew(virArchFromHost(),<br>
- 0, 0)) == NULL)<br>
+ if(driver == NULL)<br>
return NULL;<br>
<br>
- if ((guest = virCapabilitiesAddGuest(caps, "hvm",<br>
- VIR_ARCH_X86_64,<br>
- "bhyve",<br>
- NULL, 0, NULL)) == NULL)<br>
- goto error;<br>
+ ret = virObjectRef(driver->caps);<br>
<br>
- if (virCapabilitiesAddGuestDomain(guest,<br>
- "bhyve", NULL, NULL, 0, NULL) == NULL)<br>
- goto error;<br>
-<br>
- return caps;<br>
-<br>
- error:<br>
- virObjectUnref(caps);<br>
- return NULL;<br>
+ return ret;<br>
}<br>
<br>
static char *<br>
bhyveConnectGetCapabilities(virConnectPtr conn)<br>
{<br>
bhyveConnPtr privconn = conn->privateData;<br>
+ virCapsPtr caps;<br>
char *xml;<br>
<br>
if (virConnectGetCapabilitiesEnsureACL(conn) < 0)<br>
return NULL;<br>
<br>
- if ((xml = virCapabilitiesFormatXML(privconn->caps)) == NULL)<br>
+ caps = bhyveDriverGetCapabilities(privconn);<br>
+ if (!caps)<br>
+ virReportError(VIR_ERR_INTERNAL_ERROR,<br>
+ _("Unable to get Capabilities"));<br>
+<br>
+ if ((xml = virCapabilitiesFormatXML(privconn->caps)) == NULL) {<br>
+ virObjectUnref(caps);<br>
virReportOOMError();<br>
+ }<br>
+ virObjectUnref(caps);<br>
<br>
return xml;<br>
}<br>
@@ -326,8 +332,13 @@ bhyveDomainDefineXML(virConnectPtr conn, const char *xml)<br>
virDomainDefPtr def = NULL;<br>
virDomainDefPtr oldDef = NULL;<br>
virDomainObjPtr vm = NULL;<br>
+ virCapsPtr caps = NULL;<br>
+<br>
+ caps = bhyveDriverGetCapabilities(privconn);<br>
+ if (!caps)<br>
+ return NULL;<br>
<br>
- if ((def = virDomainDefParseString(xml, privconn->caps, privconn->xmlopt,<br>
+ if ((def = virDomainDefParseString(xml, caps, privconn->xmlopt,<br>
1 << VIR_DOMAIN_VIRT_BHYVE,<br>
VIR_DOMAIN_XML_INACTIVE)) == NULL)<br>
goto cleanup;<br>
@@ -350,6 +361,7 @@ bhyveDomainDefineXML(virConnectPtr conn, const char *xml)<br>
goto cleanup;<br>
<br>
cleanup:<br>
+ virObjectUnref(caps);<br>
virDomainDefFree(def);<br>
virObjectUnlock(vm);<br>
<br>
@@ -704,7 +716,7 @@ bhyveStateInitialize(bool priveleged ATTRIBUTE_UNUSED,<br>
if (!(bhyve_driver->closeCallbacks = virCloseCallbacksNew()))<br>
goto cleanup;<br>
<br>
- if (!(bhyve_driver->caps = bhyveBuildCapabilities()))<br>
+ if (!(bhyve_driver->caps = virBhyveCapsBuild()))<br>
goto cleanup;<br>
<br>
if (!(bhyve_driver->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.9.0<br>
<br>
</font></span></blockquote></div><br></div>