From 869f8d0e7d1a850adf4c61cf57fdd6b4769cd1fe Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Mon, 3 Mar 2008 20:39:52 +0000 Subject: [PATCH] Also ignore leading zeros when comparing MAC addresses. * src/util.c: Include . (TOLOWER): Define. (__virMacAddrCompare): Rewrite to also ignore leading zeros. --- ChangeLog | 7 +++++++ src/util.c | 34 +++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9c1a1e2d5d..779d60371a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mon Mar 3 21:39:17 CET 2008 Jim Meyering + + Also ignore leading zeros when comparing MAC addresses. + * src/util.c: Include . + (TOLOWER): Define. + (__virMacAddrCompare): Rewrite to also ignore leading zeros. + Mon Mar 3 21:17:29 CET 2008 Daniel Veillard * src/capabilities.c: Cole Robinson pointed out a well formedness diff --git a/src/util.c b/src/util.c index 4d6154077c..edaa5aaf34 100644 --- a/src/util.c +++ b/src/util.c @@ -35,6 +35,7 @@ #include #include #include +#include #ifdef HAVE_PATHS_H #include @@ -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); } /*