commit eed577a75f4e9ce9658cd83d729a561e18b39b70
parent 801a44b69bb6d791197e3cd4a442ba1cc079a4cf
Author: sin <sin@2f30.org>
Date:   Thu,  4 Sep 2014 15:04:26 +0100
Add support for renaming network interfaces
Since this is the brand new thing, add support for renaming
network interfaces in smdev.  Simply populate the small mac2names[]
table in config.h.
By default smdev does not rename network interfaces.  There's no
command line switch to enable renaming, just add entries to the
table and off you go.
Diffstat:
2 files changed, 55 insertions(+), 0 deletions(-)
diff --git a/config.def.h b/config.def.h
@@ -40,3 +40,10 @@ struct rule {
 	{ "fuse",         "root", "root",  0666, NULL,      NULL                           },
 	{ ".*",           "root", "root",  0660, NULL,      NULL                           },
 };
+
+struct mac2name {
+	unsigned char mac[6];
+	const char *name;
+} mac2names[] = {
+	{ .mac = { 0 }, .name = NULL }
+};
diff --git a/smdev.c b/smdev.c
@@ -1,7 +1,13 @@
 /* See LICENSE file for copyright and license details. */
+#include <sys/ioctl.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#include <linux/if_packet.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <ifaddrs.h>
+
 #include <errno.h>
 #include <fcntl.h>
 #include <grp.h>
@@ -55,6 +61,7 @@ static int createdev(struct event *ev);
 static int doevent(struct event *ev);
 static int craftev(char *sysfspath);
 static void populatedev(const char *path);
+static int ifrename(void);
 
 static void
 usage(void)
@@ -88,6 +95,8 @@ main(int argc, char *argv[])
 		if (pregcache[i].cached)
 			regfree(&pregcache[i].preg);
 
+	ifrename();
+
 	return 0;
 }
 
@@ -386,3 +395,42 @@ populatedev(const char *path)
 		free(cwd);
 	}
 }
+
+static int
+ifrename(void)
+{
+	struct ifaddrs *ifas, *ifa;
+	struct ifreq ifr;
+	int sd;
+	int i;
+	int r;
+
+	sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
+	if (sd < 0)
+		eprintf("socket:");
+	r = getifaddrs(&ifas);
+	if (r < 0)
+		eprintf("getifaddrs:");
+	for (ifa = ifas; ifa; ifa = ifa->ifa_next) {
+		if (ifa->ifa_flags & IFF_LOOPBACK)
+			continue;
+		if (ifa->ifa_addr->sa_family == AF_PACKET) {
+			struct sockaddr_ll *sa = (struct sockaddr_ll *)ifa->ifa_addr;
+			for (i = 0; mac2names[i].name; i++) {
+				if (memcmp(mac2names[i].mac, sa->sll_addr, 6) != 0)
+					continue;
+				memset(&ifr, 0, sizeof(ifr));
+				strlcpy(ifr.ifr_name,
+					ifa->ifa_name, sizeof(ifr.ifr_name));
+				strlcpy(ifr.ifr_newname,
+					mac2names[i].name, sizeof(ifr.ifr_newname));
+				r = ioctl(sd, SIOCSIFNAME, &ifr);
+				if (r < 0)
+					eprintf("SIOCSIFNAME:");
+			}
+		}
+	}
+
+	close(sd);
+	return 0;
+}