Index: vl.c =================================================================== RCS file: /sources/qemu/qemu/vl.c,v retrieving revision 1.376 diff -u -r1.376 vl.c --- vl.c 4 Dec 2007 00:10:34 -0000 1.376 +++ vl.c 4 Dec 2007 22:58:58 -0000 @@ -3452,18 +3452,32 @@ static int parse_macaddr(uint8_t *macaddr, const char *p) { int i; - for(i = 0; i < 6; i++) { - macaddr[i] = strtol(p, (char **)&p, 16); - if (i == 5) { - if (*p != '\0') - return -1; - } else { - if (*p != ':') - return -1; - p++; - } + char *last_char; + long int offset; + + errno = 0; + offset = strtol(p, &last_char, 0); + if ((0 == errno) && ('\0' == *last_char) && (offset >= 0) && (offset <= 0xFFFFFF)) { + macaddr[3] = (offset & 0xFF0000) >> 16; + macaddr[4] = (offset & 0xFF00) >> 8; + macaddr[5] = offset & 0xFF; + return 0; + } else { + for(i = 0; i < 6; i++) { + macaddr[i] = strtol(p, (char **)&p, 16); + if (i == 5) { + if (*p != '\0') + return -1; + } else { + if (*p != ':' && *p != '-') + return -1; + p++; + } + } + return 0; } - return 0; + + return -1; } static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)