On 04/30/2014 06:02 PM, Michal Privoznik wrote: > My ACK was premature .. > > On 24.04.2014 15:19, Ján Tomko wrote: >> Instead of guessing it from the interface name, look into >> /proc/net/vlan/<interface>. >> >> This works for devices not named <real_device>.<vlan ID>, >> avoiding an error flood when virt-manager keeps asking about >> them every second: >> >> https://bugzilla.redhat.com/show_bug.cgi?id=966329 >> --- >> src/interface/interface_backend_udev.c | 67 >> ++++++++++++++++++++++++++-------- >> 1 file changed, 51 insertions(+), 16 deletions(-) >> >> diff --git a/src/interface/interface_backend_udev.c >> b/src/interface/interface_backend_udev.c >> index b05ac0e..bec8c45 100644 >> --- a/src/interface/interface_backend_udev.c >> +++ b/src/interface/interface_backend_udev.c >> @@ -20,11 +20,13 @@ >> */ >> #include <config.h> >> >> +#include <ctype.h> >> #include <errno.h> >> #include <dirent.h> >> #include <libudev.h> >> >> #include "virerror.h" >> +#include "virfile.h" >> #include "c-ctype.h" >> #include "datatypes.h" >> #include "domain_conf.h" >> @@ -966,31 +968,64 @@ udevGetIfaceDefVlan(struct udev *udev ATTRIBUTE_UNUSED, >> const char *name, >> virInterfaceDef *ifacedef) >> { >> - const char *vid; >> + char *procpath = NULL; >> + char *buf = NULL; >> + char *vid_pos, *dev_pos; >> + size_t vid_len, dev_len; >> + const char *vid_prefix = "VID: "; >> + const char *dev_prefix = "\nDevice: "; >> + int ret = -1; >> + >> + if (virAsprintf(&procpath, "/proc/net/vlan/%s", name) < 0) >> + goto cleanup; >> + >> + if (virFileReadAll(procpath, BUFSIZ, &buf) < 0) >> + goto cleanup; >> >> - /* Find the DEVICE.VID again */ >> - vid = strrchr(name, '.'); >> - if (!vid) { >> + if ((vid_pos = strstr(buf, vid_prefix)) == NULL) { >> virReportError(VIR_ERR_INTERNAL_ERROR, >> _("failed to find the VID for the VLAN device '%s'"), >> name); >> - return -1; >> + goto cleanup; >> } >> + vid_pos += strlen(vid_prefix); >> >> - /* Set the VLAN specifics */ >> - if (VIR_STRDUP(ifacedef->data.vlan.tag, vid + 1) < 0) >> - goto error; >> - if (VIR_STRNDUP(ifacedef->data.vlan.devname, >> - name, (vid - name)) < 0) >> - goto error; >> + if ((vid_len = strspn(vid_pos, "0123456789")) == 0 || >> + !isspace(vid_pos[vid_len])) { > > s/isspace/c_isspace/ > > With this change my ACK still stands. > I've changed it to c_isspace and pushed. Jan
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list