Prepare for multiple-interface support

We want to support inarp on any system interface. This change prepares
for that by splitting the interface into into a separate array.

We only have one element in that array at present.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
diff --git a/inarp.c b/inarp.c
index f24fb4a..31f7b51 100644
--- a/inarp.c
+++ b/inarp.c
@@ -46,11 +46,16 @@
 	struct in_addr	dest_ip;
 } __attribute__((packed));
 
-struct inarp_ctx {
-	int		socket;
-	const char	*ifname;
+struct interface {
 	int		ifindex;
-	struct eth_addr	local_mac;
+	char		ifname[IFNAMSIZ+1];
+	struct eth_addr	eth_addr;
+};
+
+struct inarp_ctx {
+	int			socket;
+	struct interface	*interfaces;
+	unsigned int		n_interfaces;
 };
 
 static int send_arp_packet(int fd,
@@ -189,6 +194,7 @@
 	struct arp_packet inarp_req;
 	struct in_addr local_ip;
 	struct inarp_ctx inarp;
+	struct interface *iface;
 	ssize_t len;
 	int ret;
 
@@ -197,27 +203,33 @@
 		return EXIT_FAILURE;
 	}
 
-	memset(&inarp, 0, sizeof(inarp));
-	inarp.ifname = argv[1];
-
-	if (strlen(inarp.ifname) > IFNAMSIZ)
+	if (strlen(argv[1]) > IFNAMSIZ)
 		errx(EXIT_FAILURE, "Interface name '%s' is invalid",
-				inarp.ifname);
+				argv[1]);
+
+	memset(&inarp, 0, sizeof(inarp));
+
+	/* prepare for a single interface */
+	inarp.interfaces = calloc(1, sizeof(inarp.interfaces[0]));
+	inarp.n_interfaces = 1;
+	iface = &inarp.interfaces[0];
+
+	strncpy(iface->ifname, argv[1], sizeof(iface->ifname));
 
 	inarp.socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP));
 	if (inarp.socket < 0)
 		err(EXIT_FAILURE, "Error opening ARP socket");
 
-	ret = get_ifindex(inarp.socket, inarp.ifname, &inarp.ifindex);
+	ret = get_ifindex(inarp.socket, iface->ifname, &iface->ifindex);
 	if (ret)
 		exit(EXIT_FAILURE);
 
-	ret = get_local_hwaddr(inarp.socket, inarp.ifname, &inarp.local_mac);
+	ret = get_local_hwaddr(inarp.socket, iface->ifname, &iface->eth_addr);
 	if (ret)
 		exit(EXIT_FAILURE);
 
-	printf("%s MAC address: %s\n", inarp.ifname,
-			eth_mac_to_str(&inarp.local_mac));
+	printf("%s MAC address: %s\n", iface->ifname,
+			eth_mac_to_str(&iface->eth_addr));
 
 	while (1) {
 		len = recvfrom(inarp.socket, &inarp_req, sizeof(inarp_req), 0,
@@ -237,13 +249,13 @@
 			continue;
 
 		/* ... for us? */
-		if (memcmp(&inarp.local_mac, inarp_req.eh.h_dest, ETH_ALEN))
+		if (memcmp(&iface->eth_addr, inarp_req.eh.h_dest, ETH_ALEN))
 			continue;
 
 		printf("src mac:  %s\n", eth_mac_to_str(&inarp_req.src_mac));
 		printf("src ip:   %s\n", inet_ntoa(inarp_req.src_ip));
 
-		ret = get_local_ipaddr(inarp.socket, inarp.ifname, &local_ip);
+		ret = get_local_ipaddr(inarp.socket, iface->ifname, &local_ip);
 		/* if we don't have a local IP address to send, just drop the
 		 * request */
 		if (ret)
@@ -251,7 +263,7 @@
 
 		printf("local ip: %s\n", inet_ntoa(local_ip));
 
-		send_arp_packet(inarp.socket, inarp.ifindex,
+		send_arp_packet(inarp.socket, iface->ifindex,
 				&inarp_req.dest_mac,
 				&local_ip,
 				&inarp_req.src_mac,