Store interface index on Windows
authorJoseph C. Lehner <joseph.c.lehner@gmail.com>
Tue, 9 Aug 2016 07:49:29 +0000 (09:49 +0200)
committerJoseph C. Lehner <joseph.c.lehner@gmail.com>
Tue, 9 Aug 2016 07:49:29 +0000 (09:49 +0200)
ethsock.c

index 8f970e1d458e9aa980a82a723ffec8c271d12f41..7c1822c973a51c30b47c801b1e9dd796b1412a79 100644 (file)
--- a/ethsock.c
+++ b/ethsock.c
@@ -29,6 +29,7 @@ struct ethsock
        int fd;
 #else
        HANDLE handle;
+       DWORD index;
 #endif
        unsigned timeout;
        uint8_t hwaddr[6];
@@ -75,7 +76,7 @@ static inline bool sockaddr_get_hwaddr(struct sockaddr *sa, uint8_t *hwaddr)
        return true;
 }
 
-static bool get_hwaddr_from_intf(const char *intf, uint8_t *hwaddr)
+static bool get_intf_info(const char *intf, uint8_t *hwaddr, void *dummy)
 {
        struct ifaddrs *ifas, *ifa;
        bool found;
@@ -119,7 +120,7 @@ void win_perror2(const char *msg, DWORD err)
        }
 }
 
-static bool get_hwaddr_from_intf(const char *intf, uint8_t *hwaddr)
+static bool get_intf_info(const char *intf, uint8_t *hwaddr, DWORD *index)
 {
        PIP_ADAPTER_INFO adapters, adapter;
        DWORD ret;
@@ -147,10 +148,10 @@ static bool get_hwaddr_from_intf(const char *intf, uint8_t *hwaddr)
                         * AdapterName from GetAdaptersInfo is just "{GUID}".*/
                        if (strstr(intf, adapter->AdapterName)) {
                                if (adapter->AddressLength == 6) {
-                                       for (i = 0; i != 6; ++i) {
-                                               hwaddr[i] = adapter->Address[i];
+                                       memcpy(hwaddr, adapter->Address, 6);
+                                       if (index) {
+                                               *index = adapter->Index;
                                        }
-
                                        found = true;
                                        break;
                                }
@@ -289,8 +290,13 @@ struct ethsock *ethsock_create(const char *intf, uint16_t protocol)
                goto cleanup_pcap;
        }
 
-       if (!get_hwaddr_from_intf(intf, sock->hwaddr)) {
-               fprintf(stderr, "Failed to get MAC address of interface.\n");
+#ifndef NMRPFLASH_WINDOWS
+       err = !get_intf_info(intf, sock->hwaddr, NULL);
+#else
+       err = !get_intf_info(intf, sock->hwaddr, &sock->index);
+#endif
+       if (err) {
+               fprintf(stderr, "Failed to get interface info.\n");
                goto cleanup_malloc;
        }
 
@@ -458,7 +464,7 @@ static bool get_hwaddr_from_pcap(const pcap_if_t *dev, uint8_t *hwaddr)
        }
 #endif
 
-       return get_hwaddr_from_intf(dev->name, hwaddr);
+       return get_intf_info(dev->name, hwaddr, NULL);
 }
 
 int ethsock_list_all(void)