]> git.ozlabs.org Git - ppp.git/commitdiff
Implement get_first_ethernet() for Linux systems properly
authorPali Rohár <pali@kernel.org>
Wed, 30 Dec 2020 10:00:11 +0000 (11:00 +0100)
committerPali Rohár <pali@kernel.org>
Wed, 30 Dec 2020 10:00:11 +0000 (11:00 +0100)
Use if_nameindex() for enumerating network interfaces and choose the first
one with ARPHRD_ETHER ifr_hwaddr.sa_family.

Signed-off-by: Pali Rohár <pali@kernel.org>
pppd/sys-linux.c

index 6e1423808458c32f61e57293fdfcd486fffaeb29..df5cebb55951cfa8960ee3f8f2686d9f9a8caa99 100644 (file)
@@ -2101,10 +2101,43 @@ get_if_hwaddr(u_char *addr, char *name)
  * get_first_ethernet - return the name of the first ethernet-style
  * interface on this system.
  */
+static char first_ether_name[IF_NAMESIZE];
 char *
 get_first_ethernet(void)
 {
-       return "eth0";
+       struct if_nameindex *if_ni, *i;
+       struct ifreq ifreq;
+       int ret, sock_fd;
+
+       sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+       if (sock_fd < 0)
+               return NULL;
+
+       if_ni = if_nameindex();
+       if (!if_ni) {
+               close(sock_fd);
+               return NULL;
+       }
+
+       first_ether_name[0] = 0;
+
+       for (i = if_ni; !(i->if_index == 0 && i->if_name == NULL); i++) {
+               memset(&ifreq.ifr_hwaddr, 0, sizeof(struct sockaddr));
+               strlcpy(ifreq.ifr_name, i->if_name, sizeof(ifreq.ifr_name));
+               ret = ioctl(sock_fd, SIOCGIFHWADDR, &ifreq);
+               if (ret >= 0 && ifreq.ifr_hwaddr.sa_family == ARPHRD_ETHER) {
+                       strlcpy(first_ether_name, i->if_name, sizeof(first_ether_name));
+                       break;
+               }
+       }
+
+       if_freenameindex(if_ni);
+       close(sock_fd);
+
+       if (!first_ether_name[0])
+               return NULL;
+
+       return first_ether_name;
 }
 
 /********************************************************************