diff mbox

[4/4] discover/network: Add find_interface_by_uuid

Message ID 20160906014554.20634-5-sam@mendozajonas.com
State Accepted
Headers show

Commit Message

Sam Mendoza-Jonas Sept. 6, 2016, 1:45 a.m. UTC
Currently in network_register_device() and network_unregister_device()
the appropriate interface is searched for by name. However it is
possible in some scenarios for multiple interfaces to have the same
name, so instead search by UUID to be sure that the correct interface is
being selected.

Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
---
 discover/network.c | 61 +++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 40 insertions(+), 21 deletions(-)
diff mbox

Patch

diff --git a/discover/network.c b/discover/network.c
index 0161c69..1851fed 100644
--- a/discover/network.c
+++ b/discover/network.c
@@ -65,6 +65,25 @@  struct network {
 	bool			dry_run;
 };
 
+static char *mac_bytes_to_string(void *ctx, uint8_t *addr, int len)
+{
+	const int l = strlen("xx:");
+	char *buf;
+	int i;
+
+	if (len <= 0)
+		return talloc_strdup(ctx, "");
+
+	buf = talloc_array(ctx, char, (len * l) + 1);
+
+	for (i = 0; i < len; i++)
+		sprintf(buf + (l * i), "%02x:", addr[i]);
+
+	*(buf + (l * len) - 1) = '\0';
+
+	return buf;
+}
+
 static const struct interface_config *find_config_by_hwaddr(
 		uint8_t *hwaddr)
 {
@@ -109,6 +128,25 @@  static struct interface *find_interface_by_name(struct network *network,
 	return NULL;
 }
 
+static struct interface *find_interface_by_uuid(struct network *network,
+		const char *uuid)
+{
+	struct interface *interface;
+	char *mac;
+
+	list_for_each_entry(&network->interfaces, interface, list) {
+		mac = mac_bytes_to_string(interface, interface->hwaddr,
+					sizeof(interface->hwaddr));
+		if (!strcmp(mac, uuid)) {
+			talloc_free(mac);
+			return interface;
+		}
+		talloc_free(mac);
+	}
+
+	return NULL;
+}
+
 uint8_t *find_mac_by_name(void *ctx, struct network *network,
 		const char *name)
 {
@@ -175,25 +213,6 @@  static int network_send_link_query(struct network *network)
 	return 0;
 }
 
-static char *mac_bytes_to_string(void *ctx, uint8_t *addr, int len)
-{
-	const int l = strlen("xx:");
-	char *buf;
-	int i;
-
-	if (len <= 0)
-		return talloc_strdup(ctx, "");
-
-	buf = talloc_array(ctx, char, (len * l) + 1);
-
-	for (i = 0; i < len; i++)
-		sprintf(buf + (l * i), "%02x:", addr[i]);
-
-	*(buf + (l * len) - 1) = '\0';
-
-	return buf;
-}
-
 static void add_interface(struct network *network,
 		struct interface *interface)
 {
@@ -222,7 +241,7 @@  void network_register_device(struct network *network,
 {
 	struct interface *iface;
 
-	iface = find_interface_by_name(network, dev->device->id);
+	iface = find_interface_by_uuid(network, dev->uuid);
 	if (!iface)
 		return;
 
@@ -236,7 +255,7 @@  void network_unregister_device(struct network *network,
 {
 	struct interface *iface;
 
-	iface = find_interface_by_name(network, dev->device->id);
+	iface = find_interface_by_uuid(network, dev->uuid);
 	if (!iface)
 		return;