"Daniel P. Berrange" <berrange@xxxxxxxxxx> wrote: > On Tue, Feb 26, 2008 at 12:13:43PM +0100, Jim Meyering wrote: >> "Richard W.M. Jones" <rjones@xxxxxxxxxx> wrote: >> > I'll apply this today (using our STRCASEEQ macros) if no one else >> > objects. >> >> What do you think about using a MAC-address-specific comparison >> function? I.e., one that is not only case-independent, but that also >> knows leading zeros are unnecessary? >> >> i.e., it would admit that these two match: >> >> 00:0A:FF:3A:00:09 >> 0:a:ff:3a:0:9 > > Yes, we should add a helper function for comparing mac addresses for > equality. With this patch, they now match: Also ignore leading zeros when comparing MAC addresses. * src/util.c: Include <ctype.h>. (TOLOWER): Define. (__virMacAddrCompare): Rewrite to also ignore leading zeros. Signed-off-by: Jim Meyering <meyering@xxxxxxxxxx> --- src/util.c | 34 +++++++++++++++++++++++++++++----- 1 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/util.c b/src/util.c index 4d61540..edaa5aa 100644 --- a/src/util.c +++ b/src/util.c @@ -35,6 +35,7 @@ #include <sys/stat.h> #include <sys/wait.h> #include <string.h> +#include <ctype.h> #ifdef HAVE_PATHS_H #include <paths.h> @@ -50,6 +51,8 @@ #define MAX_ERROR_LEN 1024 +#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) + #define virLog(msg...) fprintf(stderr, msg) #ifndef PROXY @@ -654,14 +657,35 @@ virParseNumber(const char **str) return (ret); } -/* Use this function when comparing two MAC addresses. It deals with - * string case compare and will eventually be extended to understand - * that 01:02:03:04:05:06 is the same as 1:2:3:4:5:6. +/* Compare two MAC addresses, ignoring differences in case, + * as well as leading zeros. */ int -__virMacAddrCompare (const char *mac1, const char *mac2) +__virMacAddrCompare (const char *p, const char *q) { - return strcasecmp (mac1, mac2); + unsigned char c, d; + do { + while (*p == '0' && isxdigit (p[1])) + ++p; + while (*q == '0' && isxdigit (q[1])) + ++q; + c = TOLOWER (*p); + d = TOLOWER (*q); + + if (c == 0 || d == 0) + break; + + ++p; + ++q; + } while (c == d); + + if (UCHAR_MAX <= INT_MAX) + return c - d; + + /* On machines where 'char' and 'int' are types of the same size, the + difference of two 'unsigned char' values - including the sign bit - + doesn't fit in an 'int'. */ + return (c > d ? 1 : c < d ? -1 : 0); } /* -- 1.5.4.3.326.g7655e3 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list