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@xxxxxxxxxx> + * + * 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list