]> git.ozlabs.org Git - ppp.git/commitdiff
Merge pull request #182 from pali/get_if_hwaddr
authorPaul Mackerras <paulus@ozlabs.org>
Thu, 31 Dec 2020 04:25:36 +0000 (15:25 +1100)
committerGitHub <noreply@github.com>
Thu, 31 Dec 2020 04:25:36 +0000 (15:25 +1100)
Fix indicating failure in Linux get_if_hwaddr() function

1  2 
pppd/sys-linux.c

diff --combined pppd/sys-linux.c
index df5cebb55951cfa8960ee3f8f2686d9f9a8caa99,fd758da9445746f5e1a7e23f9f468b2e27b09774..28bc4be1a689681e400b14bb4d4226898d75e992
@@@ -2087,7 -2087,7 +2087,7 @@@ get_if_hwaddr(u_char *addr, char *name
  
        sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (sock_fd < 0)
-               return 0;
+               return -1;
        memset(&ifreq.ifr_hwaddr, 0, sizeof(struct sockaddr));
        strlcpy(ifreq.ifr_name, name, sizeof(ifreq.ifr_name));
        ret = ioctl(sock_fd, SIOCGIFHWADDR, &ifreq);
   * 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;
  }
  
  /********************************************************************