]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
* src/util.c src/util.h src/xml.c: applied patch from Hiroyuki Kaguchi
authorDaniel Veillard <veillard@redhat.com>
Thu, 20 Mar 2008 11:24:30 +0000 (11:24 +0000)
committerDaniel Veillard <veillard@redhat.com>
Thu, 20 Mar 2008 11:24:30 +0000 (11:24 +0000)
  fixing Ethernet MAC addresses parsingand separating as an util
  function, with added comments from Jim Meyering
Daniel

ChangeLog
src/util.c
src/util.h
src/xml.c

index dd19a6cb54a312c814c9743ee5d899942711fbf1..f0ee76755be30b4e540d1a5cc3ef67e6ea349ccf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Mar 20 12:23:03 CET 2008 Daniel Veillard <veillard@redhat.com>
+
+       * src/util.c src/util.h src/xml.c: applied patch from Hiroyuki Kaguchi
+         fixing Ethernet MAC addresses parsingand separating as an util
+         function, with added comments from Jim Meyering
+
 Wed Mar 19 15:31:34 CET 2008 Daniel Veillard <veillard@redhat.com>
 
        * src/qemu_conf.c src/qemu_conf.h src/qemu_driver.c: applied patch
index edaa5aaf3434d45ad27109601e50ef8bd565c339..69e899fa41fbe3875c8ce9025aa113241a435085 100644 (file)
@@ -688,6 +688,51 @@ __virMacAddrCompare (const char *p, const char *q)
     return (c > d ? 1 : c < d ? -1 : 0);
 }
 
+/**
+ * virParseMacAddr:
+ * @str: string representation of MAC address, e.g., "0:1E:FC:E:3a:CB"
+ * @addr: 6-byte MAC address
+ *
+ * Parse a MAC address
+ *
+ * Return 0 upon success, or -1 in case of error.
+ */
+int
+virParseMacAddr(const char* str, unsigned char *addr)
+{
+    int i;
+
+    errno = 0;
+    for (i = 0; i < 6; i++) {
+        char *end_ptr;
+        unsigned long result;
+
+        /* This is solely to avoid accepting the leading
+         * space or "+" that strtoul would otherwise accept.
+         */
+        if (!isxdigit(*str))
+            break;
+
+        result = strtoul(str, &end_ptr, 16);
+
+        if ((end_ptr - str) < 1 || 2 < (end_ptr - str) ||
+            (errno != 0) ||
+            (0xFF < result))
+            break;
+
+        addr[i] = (unsigned char) result;
+
+       if ((i == 5) && (*end_ptr == '\0'))
+           return 0;
+       if (*end_ptr != ':')
+           break;
+
+        str = end_ptr + 1;
+    }
+
+    return -1;
+}
+
 /*
  * Local variables:
  *  indent-tabs-mode: nil
index 25a3ab831953f8320732ed0d2c15327e2c0c627a..62cef51218072df0fda2341d51044c47d51de6bc 100644 (file)
@@ -85,4 +85,6 @@ int __virMacAddrCompare (const char *mac1, const char *mac2);
 void virSkipSpaces(const char **str);
 int virParseNumber(const char **str);
 
+int virParseMacAddr(const char* str, unsigned char *addr);
+
 #endif /* __VIR_UTIL_H__ */
index 475772c73e679d52044d1c1e8a7fa4063e507d5a..16dddf555b2020f55077df3c618f315418bf6538 100644 (file)
--- a/src/xml.c
+++ b/src/xml.c
@@ -1233,22 +1233,8 @@ virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED,
 
     virBufferAddLit(buf, "(vif ");
     if (mac != NULL) {
-        unsigned int addr[12];
-        int tmp = sscanf((const char *) mac,
-                    "%01x%01x:%01x%01x:%01x%01x:%01x%01x:%01x%01x:%01x%01x",
-                         (unsigned int *) &addr[0],
-                         (unsigned int *) &addr[1],
-                         (unsigned int *) &addr[2],
-                         (unsigned int *) &addr[3],
-                         (unsigned int *) &addr[4],
-                         (unsigned int *) &addr[5],
-                         (unsigned int *) &addr[6],
-                         (unsigned int *) &addr[7],
-                         (unsigned int *) &addr[8],
-                         (unsigned int *) &addr[9],
-                         (unsigned int *) &addr[10],
-                         (unsigned int *) &addr[11]);
-        if (tmp != 12 || strlen((const char *) mac) != 17) {
+        unsigned char addr[6];
+        if (virParseMacAddr((const char*) mac, addr) == -1) {
             virXMLError(conn, VIR_ERR_INVALID_MAC, (const char *) mac, 0);
             goto error;
         }