On Tue, May 21, 2013 at 17:05:09 +0800, Guan Nan Ren wrote:
virConnectListAllInterfaces should support to list all of interfaces when the value of flags is 0. The behaviour is consistent with other virConnectListAll* APIs --- diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c index cbba4fd..c6e069a 100644 --- a/src/interface/interface_backend_netcf.c +++ b/src/interface/interface_backend_netcf.c ... @@ -361,16 +359,17 @@ netcfConnectListAllInterfaces(virConnectPtr conn, /* XXX: Filter the result, need to be splitted once new filter flags * except active|inactive are supported. */ - if (((status & NETCF_IFACE_ACTIVE) && - (flags & VIR_CONNECT_LIST_INTERFACES_ACTIVE)) || - ((status & NETCF_IFACE_INACTIVE) && - (flags & VIR_CONNECT_LIST_INTERFACES_INACTIVE))) { - if (ifaces) { - iface_obj = virGetInterface(conn, ncf_if_name(iface), - ncf_if_mac_string(iface)); - tmp_iface_objs[niface_objs] = iface_obj; - } - niface_objs++; + if (MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) && + !((MATCH(VIR_CONNECT_LIST_INTERFACES_ACTIVE) && + (status & NETCF_IFACE_ACTIVE)) || + (MATCH(VIR_CONNECT_LIST_INTERFACES_INACTIVE) && + (status & NETCF_IFACE_INACTIVE)))) + continue;
IMHO this is much harder to read. I'd just rewrite the original condition as (i.e., !MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) is the part that was missing): if (!MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) || (MATCH(VIR_CONNECT_LIST_INTERFACES_ACTIVE) && (status & NETCF_IFACE_ACTIVE)) || (MATCH(VIR_CONNECT_LIST_INTERFACES_INACTIVE) && (status & NETCF_IFACE_INACTIVE))) Moreover, your version is wrong as it skips ncf_if_free(iface) in case iface should be skipped.
+ + if (ifaces) { + iface_obj = virGetInterface(conn, ncf_if_name(iface), + ncf_if_mac_string(iface)); + tmp_iface_objs[niface_objs++] = iface_obj; }
ncf_if_free(iface); diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c index 1fd7d46..242fc15 100644 --- a/src/interface/interface_backend_udev.c +++ b/src/interface/interface_backend_udev.c ... @@ -363,18 +362,15 @@ udevConnectListAllInterfaces(virConnectPtr conn, status = STREQ(udev_device_get_sysattr_value(dev, "operstate"), "up");
/* Filter the results */ - if (status && (flags & VIR_CONNECT_LIST_INTERFACES_ACTIVE)) - add_to_list = 1; - else if (!status && (flags & VIR_CONNECT_LIST_INTERFACES_INACTIVE)) - add_to_list = 1; + if (MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) && + !((MATCH(VIR_CONNECT_LIST_INTERFACES_ACTIVE) && status) || + (MATCH(VIR_CONNECT_LIST_INTERFACES_INACTIVE) && !status))) + continue;
Same bug in skipping udev_device_unref(dev). And similarly hard to read test :-)
/* If we matched a filter, then add it */ - if (add_to_list) { - if (ifaces) { - iface_obj = virGetInterface(conn, name, macaddr); - ifaces_list[count] = iface_obj; - } - count++; + if (ifaces) { + iface_obj = virGetInterface(conn, name, macaddr); + ifaces_list[count++] = iface_obj; } udev_device_unref(dev); }
Jirka