Always build all available backends to avoid bit-rot. At run time we
select the correct backend and load it by attempting netcf first and
then udev.
---
src/Makefile.am | 6 ++--
src/interface/interface_backend_netcf.c | 2 +-
src/interface/interface_backend_udev.c | 6 +++-
src/interface/interface_driver.c | 37 +++++++++++++++++++++++++++++++
src/interface/interface_driver.h | 3 ++
5 files changed, 48 insertions(+), 6 deletions(-)
create mode 100644 src/interface/interface_driver.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 98448c1..34bc75c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -557,18 +557,18 @@ INTERFACE_DRIVER_SOURCES =
if WITH_INTERFACE
INTERFACE_DRIVER_SOURCES += \
- interface/interface_driver.h
+ interface/interface_driver.h \
+ interface/interface_driver.c
if WITH_NETCF
INTERFACE_DRIVER_SOURCES += \
interface/interface_backend_netcf.c
-else
+endif
if HAVE_UDEV
INTERFACE_DRIVER_SOURCES += \
interface/interface_backend_udev.c
endif
endif
-endif
SECRET_DRIVER_SOURCES = \
secret/secret_driver.h secret/secret_driver.c
diff --git a/src/interface/interface_backend_netcf.c
b/src/interface/interface_backend_netcf.c
index b857ac7..140fa9f 100644
--- a/src/interface/interface_backend_netcf.c
+++ b/src/interface/interface_backend_netcf.c
@@ -805,7 +805,7 @@ static virInterfaceDriver interfaceDriver = {
#endif /* HAVE_NETCF_TRANSACTIONS */
};
-int interfaceRegister(void) {
+int netcfIfaceRegister(void) {
virRegisterInterfaceDriver(&interfaceDriver);
return 0;
}
diff --git a/src/interface/interface_backend_udev.c
b/src/interface/interface_backend_udev.c
index bb161ab..b001e6e 100644
--- a/src/interface/interface_backend_udev.c
+++ b/src/interface/interface_backend_udev.c
@@ -503,9 +503,11 @@ static virInterfaceDriver udevIfaceDriver = {
};
int
-interfaceRegister(void) {
- if (virRegisterInterfaceDriver(&udevIfaceDriver) < 0)
+udevIfaceRegister(void) {
+ if (virRegisterInterfaceDriver(&udevIfaceDriver) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("failed to register udev interface driver"));
+ return -1;
+ }
return 0;
}
diff --git a/src/interface/interface_driver.c b/src/interface/interface_driver.c
new file mode 100644
index 0000000..fbf861e
--- /dev/null
+++ b/src/interface/interface_driver.c
@@ -0,0 +1,37 @@
+/*
+ * interface_driver.c: loads the appropriate backend
+ *
+ * Copyright (C) 2012 Doug Goldstein <cardoe(a)cardoe.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; If not, see
+ * <
http://www.gnu.org/licenses/>.
+ */
+#include <config.h>
+
+#include "interface_driver.h"
+
+int
+interfaceRegister(void) {
+#ifdef WITH_NETCF
+ /* Attempt to load the netcf based backend first */
+ if (netcfIfaceRegister() == 0)
+ return 0;
+#endif /* WITH_NETCF */
+#if HAVE_UDEV
+ /* If there's no netcf or it failed to load, register the udev backend */
+ if (udevIfaceRegister() == 0)
+ return 0;
+#endif /* HAVE_UDEV */
+ return -1;
+}
diff --git a/src/interface/interface_driver.h b/src/interface/interface_driver.h
index 67b6218..80ada5c 100644
--- a/src/interface/interface_driver.h
+++ b/src/interface/interface_driver.h
@@ -26,4 +26,7 @@
int interfaceRegister(void);
+int netcfIfaceRegister(void);
+int udevIfaceRegister(void);
+
#endif /* __VIR_INTERFACE__DRIVER_H */
--
1.7.8.6