On 05/09/2011 03:28 PM, Michal Privoznik wrote:
---
configure.ac | 5 +++++
src/interface/netcf_driver.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 41 insertions(+), 0 deletions(-)
diff --git a/configure.ac b/configure.ac
index dcec371..041d738 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1483,6 +1483,11 @@ if test "$with_netcf" = "yes" || test
"$with_netcf" = "check"; then
if test "$with_netcf" = "yes" ; then
AC_DEFINE_UNQUOTED([WITH_NETCF], 1,
[whether libnetcf is available to configure physical host network interfaces])
+ AC_CHECK_LIB([netcf], [ncf_change_start], [new_netcf=1], [new_netcf=0])
I've changed the name, as danpb suggested, to "ncf_change_begin".
Also, it might be more future-proof to use something more specific than
"new_netcf". Maybe netcf_transactions, or something like that.
+ if test "$new_netcf" = "1" ; then
+ AC_DEFINE_UNQUOTED([HAVE_NCF_CHANGE_START], ["1"],
+ [we have sufficiently new version of netcf for transaction network API])
+ fi
fi
fi
AM_CONDITIONAL([WITH_NETCF], [test "$with_netcf" = "yes"])
diff --git a/src/interface/netcf_driver.c b/src/interface/netcf_driver.c
index fc7979c..082c4eb 100644
--- a/src/interface/netcf_driver.c
+++ b/src/interface/netcf_driver.c
@@ -30,6 +30,7 @@
#include "netcf_driver.h"
#include "interface_conf.h"
#include "memory.h"
+#include "logging.h"
#define VIR_FROM_THIS VIR_FROM_INTERFACE
@@ -540,6 +541,35 @@ cleanup:
return ret;
}
+#ifdef HAVE_NCF_CHANGE_START
+static int interfaceChangeStart(virConnectPtr conn ATTRIBUTE_UNUSED,
+ unsigned int flags ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG0("A long time ago in a galaxy far, far away....");
+ /* Nothing here yet */
Actually, you can put the function call in here even before you have a
version of netcf that has it. This one will look something like this:
static int interfaceChangeStart(virConnectPtr conn, unsigned int flags)
{
struct interface_driver *driver = conn->interfacePrivateData;
int ret;
virCheckFlags(0, -1); /* currently flags must be 0 */
interfaceDriverLock(driver);
ret = ncf_change_begin(driver->netcf, 0);
if (ret < 0) {
const char *errmsg, *details;
int errcode = ncf_error(driver->netcf, &errmsg, &details);
interfaceReportError(netcf_to_vir_err(errcode),
_("failed to begin transaction (netcf: %s
- %s)"),
errmsg, details ? details : "");
}
interfaceDriverUnlock(driver);
return ret;
}
The others are identical except for function name.
+
+ return 0;
+}
+
+static int interfaceChangeCommit(virConnectPtr conn ATTRIBUTE_UNUSED,
+ unsigned int flags ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG0("I am fish");
+ /* Nothing here yet */
+
+ return 0;
+}
+
+static int interfaceChangeRollback(virConnectPtr conn ATTRIBUTE_UNUSED,
+ unsigned int flags ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG0("Hello, IT. Have you tried turning it off and on again?");
+ /* Nothing here yet */
+
+ return 0;
+}
+#endif /* HAVE_NCF_CHANGE_START */
+
static virInterfaceDriver interfaceDriver = {
"Interface",
interfaceOpenInterface, /* open */
@@ -556,9 +586,15 @@ static virInterfaceDriver interfaceDriver = {
interfaceCreate, /* interfaceCreate */
interfaceDestroy, /* interfaceDestroy */
interfaceIsActive, /* interfaceIsActive */
+#ifdef HAVE_NCF_CHANGE_START
+ interfaceChangeStart, /* interfaceChangeStart */
+ interfaceChangeCommit, /* interfaceChangeCommit */
+ interfaceChangeRollback, /* interfaceChangeRollback */
+#else
NULL, /* interfaceChangeStart */
NULL, /* interfaceChangeCommit */
NULL, /* interfaceChangeRollback */
+#endif /* HAVE_NCF_CHANGE_START */
};
int interfaceRegister(void) {