[libvirt] [PATCHv3 2/2] interface: add udev based backend for virInterface
Eric Blake
eblake at redhat.com
Wed Sep 19 22:29:40 UTC 2012
On 09/17/2012 07:27 PM, Doug Goldstein wrote:
> Add a read-only udev based backend for virInterface. Useful for distros
> that do not have netcf support yet. Multiple libvirt based utilities use
> a HAL based fallback when virInterface is not available which is less
> than ideal. This implements:
> * virConnectNumOfInterfaces()
> * virConnectListInterfaces()
> * virConnectNumOfDefinedInterfaces()
> * virConnectListDefinedInterfaces()
> * virConnectInterfaceLookupByName()
> * virConnectInterfaceLookupByMACString()
I know there was some initial hesitation when you posted v2, but I
personally like the idea. I'll wait another 24 hours for feedback, in
case anyone is worried that this is too close to the release and/or not
the right thing to be doing. If we get other affirmative response (or
even silence), then I'll probably apply a fixed v4 of this patch, as
udev is indeed nicer than HAL for a fallback when netcf is not present.
Again, missing a change to po/POTFILES.in, based on 'make syntax-check'.
> +++ b/.gnulib
> @@ -1 +1 @@
> -Subproject commit 440a1dbe523e37f206252cb034c3a62f26867e42
> +Subproject commit 271dd74fdf54ec2a03e73a5173b0b5697f6088f1
You do NOT want a gnulib submodule update in this patch.
> diff --git a/configure.ac b/configure.ac
> index 1a44d21..e7757dd 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -2803,11 +2803,15 @@ if test "$with_interface:$with_netcf" = "check:yes" ; then
> fi
>
> if test "$with_interface:$with_netcf" = "check:no" ; then
> - with_interface=no
> + if test "$with_udev" = "yes" ; then
> + with_interface=yes
> + else
> + with_interface=no
> + fi
> fi
>
> -if test "$with_interface:$with_netcf" = "yes:no" ; then
> - AC_MSG_ERROR([Requested the Interface driver without netcf support])
> +if test "$with_interface:$with_netcf:$with_udev" = "yes:no:no" ; then
> + AC_MSG_ERROR([Requested the Interface driver without netcf or udev support])
> fi
This might be simpler to merge into a case statement:
case $with_interface:$with_netcf:$with_udev in
check:*yes*) with_interface=yes ;;
check:no:no) with_interface=no ;;
yes:no:no) AC_MSG_ERROR(...) ;;
esac
> +++ b/src/interface/interface_backend_udev.c
Another syntax-check failure:
trailing_blank
src/interface/interface_backend_udev.c:58:
src/interface/interface_backend_udev.c:193:
src/interface/interface_backend_udev.c:277:
src/interface/interface_backend_udev.c:320:}
src/interface/interface_backend_udev.c:377:}
> +
> + /* We don't want to see the TUN devices that QEMU creates for other gets
s/gets/guests/
> +static virDrvOpenStatus
> +udevIfaceOpenInterface(virConnectPtr conn,
> + virConnectAuthPtr auth ATTRIBUTE_UNUSED,
> + unsigned int flags ATTRIBUTE_UNUSED)
> +{
Fails 'make syntax-check':
src/interface/interface_backend_udev.c:85:
unsigned int flags ATTRIBUTE_UNUSED)
maint.mk: flags should be checked with virCheckFlags
You need to remove the attribute, and add virCheckFlags(0,
VIR_DRV_OPEN_ERROR), if you truly don't care about the flags.
> +static int
> +udevIfaceListInterfaces(virConnectPtr conn, char **const names, int names_len)
> +{
> + /* For each item so we can count */
> + udev_list_entry_foreach(dev_entry, devices) {
> + struct udev_device *dev;
> + const char *path;
> +
> + path = udev_list_entry_get_name(dev_entry);
> + dev = udev_device_new_from_syspath(udev, path);
> + names[count] = strdup(udev_device_get_sysname(dev));
Missing a check for allocation error and a subsequent
virReportOOMError(). If it fails midway through the loop, you also have
to clean up the partial results.
> +static int
> +udevIfaceListDefinedInterfaces(virConnectPtr conn,
> + char **const names,
> + int names_len)
> +{
> +
> + /* For each item so we can count */
> + udev_list_entry_foreach(dev_entry, devices) {
> + struct udev_device *dev;
> + const char *path;
> +
> + path = udev_list_entry_get_name(dev_entry);
> + dev = udev_device_new_from_syspath(udev, path);
> + names[count] = strdup(udev_device_get_sysname(dev));
Another strdup that must be checked.
> +static virInterfaceDriver udevIfaceDriver = {
> + "Interface",
> + .open = udevIfaceOpenInterface, /* 0.7.0 */
> + .close = udevIfaceCloseInterface, /* 0.7.0 */
> + .numOfInterfaces = udevIfaceNumOfInterfaces, /* 0.7.0 */
> + .listInterfaces = udevIfaceListInterfaces, /* 0.7.0 */
> + .numOfDefinedInterfaces = udevIfaceNumOfDefinedInterfaces, /* 0.7.0 */
> + .listDefinedInterfaces = udevIfaceListDefinedInterfaces, /* 0.7.0 */
> + .interfaceLookupByName = udevIfaceLookupByName, /* 0.7.0 */
> + .interfaceLookupByMACString = udevIfaceLookupByMACString, /* 0.7.0 */
0.10.2 (if it goes into this release) or 0.10.3 for all of these comments.
> +++ b/tools/virsh.c
> @@ -2712,6 +2712,9 @@ vshShowVersion(vshControl *ctl ATTRIBUTE_UNUSED)
> #if defined(WITH_NETCF)
> vshPrint(ctl, " netcf");
> #endif
> +#if !defined(WITH_NETCF) && defined(HAVE_UDEV)
> + vshPrint(ctl, " udev");
> +#endif
> #endif
Rather than nested #if, here, I'd go with:
# if defined(WITH_NETCF)
vshPrint(ctl, " netcf");
# elif defined(HAVE_UDEV)
vshPrint(ctl, " udev");
# endif
(indented to keep cppi happy, another one of those syntax checks).
--
Eric Blake eblake at redhat.com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 617 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120919/3f0d5e28/attachment-0001.sig>
More information about the libvir-list
mailing list