| diff -rupN orig/uuid.c patched/uuid.c |
| --- orig/uuid.c 2008-03-07 11:49:59.000000000 +0100 |
| +++ patched/uuid.c 2019-11-05 17:51:43.000000000 +0100 |
| @@ -135,7 +135,7 @@ uuid_rc_t uuid_create(uuid_t **uuid) |
| /* resolve MAC address for insertion into node field of UUIDs */ |
| if (!mac_address((unsigned char *)(obj->mac), sizeof(obj->mac))) { |
| memset(obj->mac, 0, sizeof(obj->mac)); |
| - obj->mac[0] = BM_OCTET(1,0,0,0,0,0,0,0); |
| + obj->mac[0] = IEEE_MAC_MCBIT; |
| } |
| |
| /* initialize time attributes */ |
| @@ -967,7 +967,7 @@ static uuid_rc_t uuid_make_v1(uuid_t *uu |
| * GENERATE NODE |
| */ |
| |
| - if ((mode & UUID_MAKE_MC) || (uuid->mac[0] & BM_OCTET(1,0,0,0,0,0,0,0))) { |
| + if ((mode & UUID_MAKE_MC) || (uuid->mac[0] & IEEE_MAC_MCBIT)) { |
| /* generate random IEEE 802 local multicast MAC address */ |
| if (prng_data(uuid->prng, (void *)&(uuid->obj.node), sizeof(uuid->obj.node)) != PRNG_RC_OK) |
| return UUID_RC_INT; |
| @@ -1214,4 +1214,3 @@ unsigned long uuid_version(void) |
| { |
| return (unsigned long)(_UUID_VERSION); |
| } |
| - |
| diff -rupN orig/uuid_mac.c patched/uuid_mac.c |
| --- orig/uuid_mac.c 2008-03-07 11:49:59.000000000 +0100 |
| +++ patched/uuid_mac.c 2019-11-07 14:09:09.000000000 +0100 |
| @@ -122,26 +122,40 @@ int mac_address(unsigned char *data_ptr, |
| } |
| #endif |
| |
| -#if defined(HAVE_NET_IF_H) && defined(SIOCGIFHWADDR) |
| +#if defined(HAVE_NET_IF_H) && defined(SIOCGIFCONF) && defined(SIOCGIFHWADDR) |
| /* use SIOCGIFHWADDR ioctl(2) on Linux class platforms */ |
| { |
| - struct ifreq ifr; |
| + struct ifreq ifrs[16]; |
| + struct ifconf ifc; |
| struct sockaddr *sa; |
| int s; |
| - int i; |
| + int i, j; |
| + int empty; |
| |
| if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) |
| return FALSE; |
| - sprintf(ifr.ifr_name, "eth0"); |
| - if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) { |
| + ifc.ifc_len = sizeof(ifrs); |
| + ifc.ifc_req = ifrs; |
| + if (ioctl(s, SIOCGIFCONF, &ifc) < 0) { |
| close(s); |
| return FALSE; |
| } |
| - sa = (struct sockaddr *)&ifr.ifr_addr; |
| - for (i = 0; i < MAC_LEN; i++) |
| - data_ptr[i] = (unsigned char)(sa->sa_data[i] & 0xff); |
| + for (i = 0; i < ifc.ifc_len / sizeof(ifrs[0]); i++) { |
| + if (ioctl(s, SIOCGIFHWADDR, &ifrs[i]) < 0) |
| + continue; |
| + sa = (struct sockaddr *)&(ifrs[i].ifr_hwaddr); |
| + empty = TRUE; |
| + for (j = 0; j < MAC_LEN; j++) { |
| + empty &= (sa->sa_data[j] & 0xff) == 0x00; |
| + data_ptr[j] = (unsigned char)(sa->sa_data[j] & 0xff); |
| + } |
| + if (empty) |
| + continue; |
| + close(s); |
| + return TRUE; |
| + } |
| close(s); |
| - return TRUE; |
| + return FALSE; |
| } |
| #endif |
| |
| @@ -180,4 +194,3 @@ int mac_address(unsigned char *data_ptr, |
| |
| return FALSE; |
| } |
| - |