[Libvir] ignore leading zeros, too [Change MAC address to case insensitive
Jim Meyering
jim at meyering.net
Fri Feb 29 11:59:39 UTC 2008
"Daniel P. Berrange" <berrange at redhat.com> wrote:
> On Tue, Feb 26, 2008 at 12:13:43PM +0100, Jim Meyering wrote:
>> "Richard W.M. Jones" <rjones at redhat.com> 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 at redhat.com>
---
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
More information about the libvir-list
mailing list